Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/mpic: Remove MPIC_BROKEN_FRR_NIRQS and duplicate irq_count

The mpic->irq_count variable is only used as a software error-checking
limit to determine whether or not an IRQ number is valid. In board code
which does not manually specify an IRQ count to mpic_alloc(), i.e. 0, it
is automatically detected from the number of ISUs and the ISU size.

In practice, all hardware ends up with irq_count == num_sources, so all
of the runtime checks on mpic->irq_count should just check the value of
mpic->num_sources instead.

When platform hardware does not correctly report the number of IRQs,
which only happens on the MPC85xx/MPC86xx, the MPIC_BROKEN_FRR_NIRQS
flag is used to override the detected value of num_sources with the
manual irq_count parameter. Since there's no need to manually specify
the number of IRQs except in this case, the extra flag can be eliminated
and the test changed to "irq_count != 0".

Signed-off-by: Kyle Moffett <Kyle.D.Moffett@boeing.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Kyle Moffett and committed by
Benjamin Herrenschmidt
5019609f 9ca163c8

+25 -38
-3
arch/powerpc/include/asm/mpic.h
··· 273 273 unsigned int isu_size; 274 274 unsigned int isu_shift; 275 275 unsigned int isu_mask; 276 - unsigned int irq_count; 277 276 /* Number of sources */ 278 277 unsigned int num_sources; 279 278 /* default senses array */ ··· 362 363 #define MPIC_ENABLE_MCK 0x00000200 363 364 /* Disable bias among target selection, spread interrupts evenly */ 364 365 #define MPIC_NO_BIAS 0x00000400 365 - /* Ignore NIRQS as reported by FRR */ 366 - #define MPIC_BROKEN_FRR_NIRQS 0x00000800 367 366 /* Destination only supports a single CPU at a time */ 368 367 #define MPIC_SINGLE_DEST_CPU 0x00001000 369 368 /* Enable CoreInt delivery of interrupts */
+1 -2
arch/powerpc/platforms/85xx/corenet_ds.c
··· 36 36 void __init corenet_ds_pic_init(void) 37 37 { 38 38 struct mpic *mpic; 39 - unsigned int flags = MPIC_BIG_ENDIAN | 40 - MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU; 39 + unsigned int flags = MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU; 41 40 42 41 if (ppc_md.get_irq == mpic_get_coreint_irq) 43 42 flags |= MPIC_ENABLE_COREINT;
+1 -1
arch/powerpc/platforms/85xx/mpc8536_ds.c
··· 38 38 { 39 39 struct mpic *mpic = mpic_alloc(NULL, 0, 40 40 MPIC_WANTS_RESET | 41 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, 41 + MPIC_BIG_ENDIAN, 42 42 0, 256, " OpenPIC "); 43 43 BUG_ON(mpic == NULL); 44 44 mpic_init(mpic);
+2 -2
arch/powerpc/platforms/85xx/mpc85xx_ds.c
··· 72 72 73 73 if (of_flat_dt_is_compatible(root, "fsl,MPC8572DS-CAMP")) { 74 74 mpic = mpic_alloc(NULL, 0, 75 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | 75 + MPIC_BIG_ENDIAN | 76 76 MPIC_SINGLE_DEST_CPU, 77 77 0, 256, " OpenPIC "); 78 78 } else { 79 79 mpic = mpic_alloc(NULL, 0, 80 80 MPIC_WANTS_RESET | 81 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | 81 + MPIC_BIG_ENDIAN | 82 82 MPIC_SINGLE_DEST_CPU, 83 83 0, 256, " OpenPIC "); 84 84 }
+1 -1
arch/powerpc/platforms/85xx/mpc85xx_mds.c
··· 436 436 { 437 437 struct mpic *mpic = mpic_alloc(NULL, 0, 438 438 MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | 439 - MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, 439 + MPIC_SINGLE_DEST_CPU, 440 440 0, 256, " OpenPIC "); 441 441 BUG_ON(mpic == NULL); 442 442
+2 -2
arch/powerpc/platforms/85xx/mpc85xx_rdb.c
··· 49 49 50 50 if (of_flat_dt_is_compatible(root, "fsl,MPC85XXRDB-CAMP")) { 51 51 mpic = mpic_alloc(NULL, 0, 52 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | 52 + MPIC_BIG_ENDIAN | 53 53 MPIC_SINGLE_DEST_CPU, 54 54 0, 256, " OpenPIC "); 55 55 } else { 56 56 mpic = mpic_alloc(NULL, 0, 57 57 MPIC_WANTS_RESET | 58 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | 58 + MPIC_BIG_ENDIAN | 59 59 MPIC_SINGLE_DEST_CPU, 60 60 0, 256, " OpenPIC "); 61 61 }
+1 -1
arch/powerpc/platforms/85xx/p1010rdb.c
··· 34 34 { 35 35 struct mpic *mpic = mpic_alloc(NULL, 0, 36 36 MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | 37 - MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, 37 + MPIC_SINGLE_DEST_CPU, 38 38 0, 256, " OpenPIC "); 39 39 40 40 BUG_ON(mpic == NULL);
+1 -1
arch/powerpc/platforms/85xx/p1022_ds.c
··· 244 244 { 245 245 struct mpic *mpic = mpic_alloc(NULL, 0, 246 246 MPIC_WANTS_RESET | 247 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | 247 + MPIC_BIG_ENDIAN | 248 248 MPIC_SINGLE_DEST_CPU, 249 249 0, 256, " OpenPIC "); 250 250 BUG_ON(mpic == NULL);
+1 -1
arch/powerpc/platforms/85xx/p1023_rds.c
··· 95 95 { 96 96 struct mpic *mpic = mpic_alloc(NULL, 0, 97 97 MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | 98 - MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, 98 + MPIC_SINGLE_DEST_CPU, 99 99 0, 256, " OpenPIC "); 100 100 101 101 BUG_ON(mpic == NULL);
+1 -1
arch/powerpc/platforms/85xx/xes_mpc85xx.c
··· 45 45 { 46 46 struct mpic *mpic = mpic_alloc(NULL, 0, 47 47 MPIC_WANTS_RESET | 48 - MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, 48 + MPIC_BIG_ENDIAN, 49 49 0, 256, " OpenPIC "); 50 50 BUG_ON(mpic == NULL); 51 51 mpic_init(mpic);
+1 -1
arch/powerpc/platforms/86xx/pic.c
··· 39 39 40 40 struct mpic *mpic = mpic_alloc(NULL, 0, 41 41 MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | 42 - MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, 42 + MPIC_SINGLE_DEST_CPU, 43 43 0, 256, " MPIC "); 44 44 BUG_ON(mpic == NULL); 45 45
+1 -2
arch/powerpc/platforms/embedded6xx/holly.c
··· 157 157 mpic = mpic_alloc(NULL, 0, 158 158 MPIC_BIG_ENDIAN | MPIC_WANTS_RESET | 159 159 MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108, 160 - 24, 161 - NR_IRQS-4, /* num_sources used */ 160 + 24, 0, 162 161 "Tsi108_PIC"); 163 162 164 163 BUG_ON(mpic == NULL);
+1 -1
arch/powerpc/platforms/embedded6xx/linkstation.c
··· 83 83 struct mpic *mpic; 84 84 85 85 mpic = mpic_alloc(NULL, 0, MPIC_WANTS_RESET, 86 - 4, 32, " EPIC "); 86 + 4, 0, " EPIC "); 87 87 BUG_ON(mpic == NULL); 88 88 89 89 /* PCI IRQs */
+1 -2
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
··· 111 111 mpic = mpic_alloc(NULL, 0, 112 112 MPIC_BIG_ENDIAN | MPIC_WANTS_RESET | 113 113 MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108, 114 - 24, 115 - NR_IRQS-4, /* num_sources used */ 114 + 24, 0, 116 115 "Tsi108_PIC"); 117 116 118 117 BUG_ON(mpic == NULL);
+1 -1
arch/powerpc/platforms/embedded6xx/storcenter.c
··· 85 85 struct mpic *mpic; 86 86 87 87 mpic = mpic_alloc(NULL, 0, MPIC_WANTS_RESET, 88 - 16, 32, " OpenPIC "); 88 + 16, 0, " OpenPIC "); 89 89 BUG_ON(mpic == NULL); 90 90 91 91 /*
+1 -3
arch/powerpc/platforms/pseries/setup.c
··· 190 190 BUG_ON(openpic_addr == 0); 191 191 192 192 /* Setup the openpic driver */ 193 - mpic = mpic_alloc(pSeries_mpic_node, openpic_addr, 0, 194 - 16, 250, /* isu size, irq count */ 195 - " MPIC "); 193 + mpic = mpic_alloc(pSeries_mpic_node, openpic_addr, 0, 16, 0, " MPIC "); 196 194 BUG_ON(mpic == NULL); 197 195 198 196 /* Add ISUs */
+6 -11
arch/powerpc/sysdev/mpic.c
··· 873 873 DBG("mpic: set_irq_type(mpic:@%p,virq:%d,src:0x%x,type:0x%x)\n", 874 874 mpic, d->irq, src, flow_type); 875 875 876 - if (src >= mpic->irq_count) 876 + if (src >= mpic->num_sources) 877 877 return -EINVAL; 878 878 879 879 if (flow_type == IRQ_TYPE_NONE) ··· 909 909 DBG("mpic: set_vector(mpic:@%p,virq:%d,src:%d,vector:0x%x)\n", 910 910 mpic, virq, src, vector); 911 911 912 - if (src >= mpic->irq_count) 912 + if (src >= mpic->num_sources) 913 913 return; 914 914 915 915 vecpri = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI)); ··· 926 926 DBG("mpic: set_destination(mpic:@%p,virq:%d,src:%d,cpuid:0x%x)\n", 927 927 mpic, virq, src, cpuid); 928 928 929 - if (src >= mpic->irq_count) 929 + if (src >= mpic->num_sources) 930 930 return; 931 931 932 932 mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), 1 << cpuid); ··· 1006 1006 return 0; 1007 1007 } 1008 1008 1009 - if (hw >= mpic->irq_count) 1009 + if (hw >= mpic->num_sources) 1010 1010 return -EINVAL; 1011 1011 1012 1012 mpic_msi_reserve_hwirq(mpic, hw); ··· 1221 1221 mpic->hc_tm.name = name; 1222 1222 1223 1223 mpic->isu_size = isu_size; 1224 - mpic->irq_count = irq_count; 1225 1224 mpic->num_sources = 0; /* so far */ 1226 1225 1227 1226 if (mpic->flags & MPIC_LARGE_VECTORS) ··· 1313 1314 */ 1314 1315 greg_feature = mpic_read(mpic->gregs, MPIC_INFO(GREG_FEATURE_0)); 1315 1316 if (isu_size == 0) { 1316 - if (mpic->flags & MPIC_BROKEN_FRR_NIRQS) 1317 - mpic->num_sources = mpic->irq_count; 1317 + if (irq_count) 1318 + mpic->num_sources = irq_count; 1318 1319 else 1319 1320 mpic->num_sources = 1320 1321 ((greg_feature & MPIC_GREG_FEATURE_LAST_SRC_MASK) ··· 1448 1449 (10 << MPIC_VECPRI_PRIORITY_SHIFT) | 1449 1450 (mpic->ipi_vecs[0] + i)); 1450 1451 } 1451 - 1452 - /* Initialize interrupt sources */ 1453 - if (mpic->irq_count == 0) 1454 - mpic->irq_count = mpic->num_sources; 1455 1452 1456 1453 /* Do the HT PIC fixups on U3 broken mpic */ 1457 1454 DBG("MPIC flags: %x\n", mpic->flags);
+2 -2
arch/powerpc/sysdev/mpic_msi.c
··· 54 54 for (i = 100; i < 105; i++) 55 55 msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i); 56 56 57 - for (i = 124; i < mpic->irq_count; i++) 57 + for (i = 124; i < mpic->num_sources; i++) 58 58 msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i); 59 59 60 60 ··· 83 83 { 84 84 int rc; 85 85 86 - rc = msi_bitmap_alloc(&mpic->msi_bitmap, mpic->irq_count, 86 + rc = msi_bitmap_alloc(&mpic->msi_bitmap, mpic->num_sources, 87 87 mpic->irqhost->of_node); 88 88 if (rc) 89 89 return rc;