diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-01-19 17:33:18 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-01-19 17:33:18 -0500 |
commit | 5d5c303ea095bdd3a2b073075920bf159457069a (patch) | |
tree | 0b18b45e92bdba4df1c3346fe4110bf2ff79b9e2 | |
parent | 6a0141a0966cfbd765bff065c3eb61b09a92318e (diff) | |
parent | 8a644c64a9f1aefb99fdc4413e6b7fee17809e38 (diff) |
Merge tag 'mips_fixes_5.0_2' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
Pull MIPS fixes from Paul Burton:
- Fix IPI handling for Lantiq SoCs, which was broken by changes made
back in v4.12.
- Enable OF/DT serial support in ath79_defconfig to give us working
serial by default.
- Fix 64b builds for the Jazz platform.
- Set up a struct device for the BCM47xx SoC to allow BCM47xx drivers
to perform DMA again following the major DMA mapping changes made in
v4.19.
- Disable MSI on Cavium Octeon systems when the pcie_disable command
line parameter introduced in v3.3 is used, in order to avoid
inadvetently accessing PCIe controller registers despite the command
line.
- Fix a build failure for Cavium Octeon kernels with kexec enabled,
introduced in v4.20.
- Fix a regression in the behaviour of semctl/shmctl/msgctl IPC
syscalls for kernels including n32 support but not o32 support caused
by some cleanup in v3.19.
* tag 'mips_fixes_5.0_2' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux:
MIPS: OCTEON: fix kexec support
mips: fix n32 compat_ipc_parse_version
Disable MSI also when pcie-octeon.pcie_disable on
MIPS: BCM47XX: Setup struct device for the SoC
MIPS: jazz: fix 64bit build
MIPS: ath79: Enable OF serial ports in the default config
MIPS: lantiq: Use CP0_LEGACY_COMPARE_IRQ
MIPS: lantiq: Fix IPI interrupt handling
-rw-r--r-- | arch/mips/Kconfig | 1 | ||||
-rw-r--r-- | arch/mips/bcm47xx/setup.c | 31 | ||||
-rw-r--r-- | arch/mips/cavium-octeon/setup.c | 2 | ||||
-rw-r--r-- | arch/mips/configs/ath79_defconfig | 1 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h | 2 | ||||
-rw-r--r-- | arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h | 2 | ||||
-rw-r--r-- | arch/mips/jazz/jazzdma.c | 5 | ||||
-rw-r--r-- | arch/mips/lantiq/irq.c | 77 | ||||
-rw-r--r-- | arch/mips/pci/msi-octeon.c | 4 | ||||
-rw-r--r-- | include/linux/bcma/bcma_soc.h | 1 |
10 files changed, 47 insertions, 79 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 787290781b8c..0d14f51d0002 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -3155,6 +3155,7 @@ config MIPS32_O32 | |||
3155 | config MIPS32_N32 | 3155 | config MIPS32_N32 |
3156 | bool "Kernel support for n32 binaries" | 3156 | bool "Kernel support for n32 binaries" |
3157 | depends on 64BIT | 3157 | depends on 64BIT |
3158 | select ARCH_WANT_COMPAT_IPC_PARSE_VERSION | ||
3158 | select COMPAT | 3159 | select COMPAT |
3159 | select MIPS32_COMPAT | 3160 | select MIPS32_COMPAT |
3160 | select SYSVIPC_COMPAT if SYSVIPC | 3161 | select SYSVIPC_COMPAT if SYSVIPC |
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c index 6054d49e608e..fe3773539eff 100644 --- a/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c | |||
@@ -173,6 +173,31 @@ void __init plat_mem_setup(void) | |||
173 | pm_power_off = bcm47xx_machine_halt; | 173 | pm_power_off = bcm47xx_machine_halt; |
174 | } | 174 | } |
175 | 175 | ||
176 | #ifdef CONFIG_BCM47XX_BCMA | ||
177 | static struct device * __init bcm47xx_setup_device(void) | ||
178 | { | ||
179 | struct device *dev; | ||
180 | int err; | ||
181 | |||
182 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
183 | if (!dev) | ||
184 | return NULL; | ||
185 | |||
186 | err = dev_set_name(dev, "bcm47xx_soc"); | ||
187 | if (err) { | ||
188 | pr_err("Failed to set SoC device name: %d\n", err); | ||
189 | kfree(dev); | ||
190 | return NULL; | ||
191 | } | ||
192 | |||
193 | err = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); | ||
194 | if (err) | ||
195 | pr_err("Failed to set SoC DMA mask: %d\n", err); | ||
196 | |||
197 | return dev; | ||
198 | } | ||
199 | #endif | ||
200 | |||
176 | /* | 201 | /* |
177 | * This finishes bus initialization doing things that were not possible without | 202 | * This finishes bus initialization doing things that were not possible without |
178 | * kmalloc. Make sure to call it late enough (after mm_init). | 203 | * kmalloc. Make sure to call it late enough (after mm_init). |
@@ -183,6 +208,10 @@ void __init bcm47xx_bus_setup(void) | |||
183 | if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA) { | 208 | if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA) { |
184 | int err; | 209 | int err; |
185 | 210 | ||
211 | bcm47xx_bus.bcma.dev = bcm47xx_setup_device(); | ||
212 | if (!bcm47xx_bus.bcma.dev) | ||
213 | panic("Failed to setup SoC device\n"); | ||
214 | |||
186 | err = bcma_host_soc_init(&bcm47xx_bus.bcma); | 215 | err = bcma_host_soc_init(&bcm47xx_bus.bcma); |
187 | if (err) | 216 | if (err) |
188 | panic("Failed to initialize BCMA bus (err %d)", err); | 217 | panic("Failed to initialize BCMA bus (err %d)", err); |
@@ -235,6 +264,8 @@ static int __init bcm47xx_register_bus_complete(void) | |||
235 | #endif | 264 | #endif |
236 | #ifdef CONFIG_BCM47XX_BCMA | 265 | #ifdef CONFIG_BCM47XX_BCMA |
237 | case BCM47XX_BUS_TYPE_BCMA: | 266 | case BCM47XX_BUS_TYPE_BCMA: |
267 | if (device_register(bcm47xx_bus.bcma.dev)) | ||
268 | pr_err("Failed to register SoC device\n"); | ||
238 | bcma_bus_register(&bcm47xx_bus.bcma.bus); | 269 | bcma_bus_register(&bcm47xx_bus.bcma.bus); |
239 | break; | 270 | break; |
240 | #endif | 271 | #endif |
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index 2c79ab52977a..8bf43c5a7bc7 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c | |||
@@ -98,7 +98,7 @@ static void octeon_kexec_smp_down(void *ignored) | |||
98 | " sync \n" | 98 | " sync \n" |
99 | " synci ($0) \n"); | 99 | " synci ($0) \n"); |
100 | 100 | ||
101 | relocated_kexec_smp_wait(NULL); | 101 | kexec_reboot(); |
102 | } | 102 | } |
103 | #endif | 103 | #endif |
104 | 104 | ||
diff --git a/arch/mips/configs/ath79_defconfig b/arch/mips/configs/ath79_defconfig index 4e4ec779f182..6f981af67826 100644 --- a/arch/mips/configs/ath79_defconfig +++ b/arch/mips/configs/ath79_defconfig | |||
@@ -66,6 +66,7 @@ CONFIG_SERIAL_8250_CONSOLE=y | |||
66 | # CONFIG_SERIAL_8250_PCI is not set | 66 | # CONFIG_SERIAL_8250_PCI is not set |
67 | CONFIG_SERIAL_8250_NR_UARTS=1 | 67 | CONFIG_SERIAL_8250_NR_UARTS=1 |
68 | CONFIG_SERIAL_8250_RUNTIME_UARTS=1 | 68 | CONFIG_SERIAL_8250_RUNTIME_UARTS=1 |
69 | CONFIG_SERIAL_OF_PLATFORM=y | ||
69 | CONFIG_SERIAL_AR933X=y | 70 | CONFIG_SERIAL_AR933X=y |
70 | CONFIG_SERIAL_AR933X_CONSOLE=y | 71 | CONFIG_SERIAL_AR933X_CONSOLE=y |
71 | # CONFIG_HW_RANDOM is not set | 72 | # CONFIG_HW_RANDOM is not set |
diff --git a/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h b/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h index c6b63a409641..6dd8ad2409dc 100644 --- a/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h +++ b/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h | |||
@@ -18,8 +18,6 @@ | |||
18 | #define INT_NUM_EXTRA_START (INT_NUM_IM4_IRL0 + 32) | 18 | #define INT_NUM_EXTRA_START (INT_NUM_IM4_IRL0 + 32) |
19 | #define INT_NUM_IM_OFFSET (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0) | 19 | #define INT_NUM_IM_OFFSET (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0) |
20 | 20 | ||
21 | #define MIPS_CPU_TIMER_IRQ 7 | ||
22 | |||
23 | #define MAX_IM 5 | 21 | #define MAX_IM 5 |
24 | 22 | ||
25 | #endif /* _FALCON_IRQ__ */ | 23 | #endif /* _FALCON_IRQ__ */ |
diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h index 141076325307..0b424214a5e9 100644 --- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h +++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h | |||
@@ -19,8 +19,6 @@ | |||
19 | 19 | ||
20 | #define LTQ_DMA_CH0_INT (INT_NUM_IM2_IRL0) | 20 | #define LTQ_DMA_CH0_INT (INT_NUM_IM2_IRL0) |
21 | 21 | ||
22 | #define MIPS_CPU_TIMER_IRQ 7 | ||
23 | |||
24 | #define MAX_IM 5 | 22 | #define MAX_IM 5 |
25 | 23 | ||
26 | #endif | 24 | #endif |
diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index 6256d35dbf4d..bedb5047aff3 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c | |||
@@ -74,14 +74,15 @@ static int __init vdma_init(void) | |||
74 | get_order(VDMA_PGTBL_SIZE)); | 74 | get_order(VDMA_PGTBL_SIZE)); |
75 | BUG_ON(!pgtbl); | 75 | BUG_ON(!pgtbl); |
76 | dma_cache_wback_inv((unsigned long)pgtbl, VDMA_PGTBL_SIZE); | 76 | dma_cache_wback_inv((unsigned long)pgtbl, VDMA_PGTBL_SIZE); |
77 | pgtbl = (VDMA_PGTBL_ENTRY *)KSEG1ADDR(pgtbl); | 77 | pgtbl = (VDMA_PGTBL_ENTRY *)CKSEG1ADDR((unsigned long)pgtbl); |
78 | 78 | ||
79 | /* | 79 | /* |
80 | * Clear the R4030 translation table | 80 | * Clear the R4030 translation table |
81 | */ | 81 | */ |
82 | vdma_pgtbl_init(); | 82 | vdma_pgtbl_init(); |
83 | 83 | ||
84 | r4030_write_reg32(JAZZ_R4030_TRSTBL_BASE, CPHYSADDR(pgtbl)); | 84 | r4030_write_reg32(JAZZ_R4030_TRSTBL_BASE, |
85 | CPHYSADDR((unsigned long)pgtbl)); | ||
85 | r4030_write_reg32(JAZZ_R4030_TRSTBL_LIM, VDMA_PGTBL_SIZE); | 86 | r4030_write_reg32(JAZZ_R4030_TRSTBL_LIM, VDMA_PGTBL_SIZE); |
86 | r4030_write_reg32(JAZZ_R4030_TRSTBL_INV, 0); | 87 | r4030_write_reg32(JAZZ_R4030_TRSTBL_INV, 0); |
87 | 88 | ||
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c index f0bc3312ed11..6549499eb202 100644 --- a/arch/mips/lantiq/irq.c +++ b/arch/mips/lantiq/irq.c | |||
@@ -224,9 +224,11 @@ static struct irq_chip ltq_eiu_type = { | |||
224 | .irq_set_type = ltq_eiu_settype, | 224 | .irq_set_type = ltq_eiu_settype, |
225 | }; | 225 | }; |
226 | 226 | ||
227 | static void ltq_hw_irqdispatch(int module) | 227 | static void ltq_hw_irq_handler(struct irq_desc *desc) |
228 | { | 228 | { |
229 | int module = irq_desc_get_irq(desc) - 2; | ||
229 | u32 irq; | 230 | u32 irq; |
231 | int hwirq; | ||
230 | 232 | ||
231 | irq = ltq_icu_r32(module, LTQ_ICU_IM0_IOSR); | 233 | irq = ltq_icu_r32(module, LTQ_ICU_IM0_IOSR); |
232 | if (irq == 0) | 234 | if (irq == 0) |
@@ -237,7 +239,8 @@ static void ltq_hw_irqdispatch(int module) | |||
237 | * other bits might be bogus | 239 | * other bits might be bogus |
238 | */ | 240 | */ |
239 | irq = __fls(irq); | 241 | irq = __fls(irq); |
240 | do_IRQ((int)irq + MIPS_CPU_IRQ_CASCADE + (INT_NUM_IM_OFFSET * module)); | 242 | hwirq = irq + MIPS_CPU_IRQ_CASCADE + (INT_NUM_IM_OFFSET * module); |
243 | generic_handle_irq(irq_linear_revmap(ltq_domain, hwirq)); | ||
241 | 244 | ||
242 | /* if this is a EBU irq, we need to ack it or get a deadlock */ | 245 | /* if this is a EBU irq, we need to ack it or get a deadlock */ |
243 | if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT) | 246 | if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT) |
@@ -245,49 +248,6 @@ static void ltq_hw_irqdispatch(int module) | |||
245 | LTQ_EBU_PCC_ISTAT); | 248 | LTQ_EBU_PCC_ISTAT); |
246 | } | 249 | } |
247 | 250 | ||
248 | #define DEFINE_HWx_IRQDISPATCH(x) \ | ||
249 | static void ltq_hw ## x ## _irqdispatch(void) \ | ||
250 | { \ | ||
251 | ltq_hw_irqdispatch(x); \ | ||
252 | } | ||
253 | DEFINE_HWx_IRQDISPATCH(0) | ||
254 | DEFINE_HWx_IRQDISPATCH(1) | ||
255 | DEFINE_HWx_IRQDISPATCH(2) | ||
256 | DEFINE_HWx_IRQDISPATCH(3) | ||
257 | DEFINE_HWx_IRQDISPATCH(4) | ||
258 | |||
259 | #if MIPS_CPU_TIMER_IRQ == 7 | ||
260 | static void ltq_hw5_irqdispatch(void) | ||
261 | { | ||
262 | do_IRQ(MIPS_CPU_TIMER_IRQ); | ||
263 | } | ||
264 | #else | ||
265 | DEFINE_HWx_IRQDISPATCH(5) | ||
266 | #endif | ||
267 | |||
268 | static void ltq_hw_irq_handler(struct irq_desc *desc) | ||
269 | { | ||
270 | ltq_hw_irqdispatch(irq_desc_get_irq(desc) - 2); | ||
271 | } | ||
272 | |||
273 | asmlinkage void plat_irq_dispatch(void) | ||
274 | { | ||
275 | unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; | ||
276 | int irq; | ||
277 | |||
278 | if (!pending) { | ||
279 | spurious_interrupt(); | ||
280 | return; | ||
281 | } | ||
282 | |||
283 | pending >>= CAUSEB_IP; | ||
284 | while (pending) { | ||
285 | irq = fls(pending) - 1; | ||
286 | do_IRQ(MIPS_CPU_IRQ_BASE + irq); | ||
287 | pending &= ~BIT(irq); | ||
288 | } | ||
289 | } | ||
290 | |||
291 | static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) | 251 | static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) |
292 | { | 252 | { |
293 | struct irq_chip *chip = <q_irq_type; | 253 | struct irq_chip *chip = <q_irq_type; |
@@ -343,38 +303,13 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent) | |||
343 | for (i = 0; i < MAX_IM; i++) | 303 | for (i = 0; i < MAX_IM; i++) |
344 | irq_set_chained_handler(i + 2, ltq_hw_irq_handler); | 304 | irq_set_chained_handler(i + 2, ltq_hw_irq_handler); |
345 | 305 | ||
346 | if (cpu_has_vint) { | ||
347 | pr_info("Setting up vectored interrupts\n"); | ||
348 | set_vi_handler(2, ltq_hw0_irqdispatch); | ||
349 | set_vi_handler(3, ltq_hw1_irqdispatch); | ||
350 | set_vi_handler(4, ltq_hw2_irqdispatch); | ||
351 | set_vi_handler(5, ltq_hw3_irqdispatch); | ||
352 | set_vi_handler(6, ltq_hw4_irqdispatch); | ||
353 | set_vi_handler(7, ltq_hw5_irqdispatch); | ||
354 | } | ||
355 | |||
356 | ltq_domain = irq_domain_add_linear(node, | 306 | ltq_domain = irq_domain_add_linear(node, |
357 | (MAX_IM * INT_NUM_IM_OFFSET) + MIPS_CPU_IRQ_CASCADE, | 307 | (MAX_IM * INT_NUM_IM_OFFSET) + MIPS_CPU_IRQ_CASCADE, |
358 | &irq_domain_ops, 0); | 308 | &irq_domain_ops, 0); |
359 | 309 | ||
360 | #ifndef CONFIG_MIPS_MT_SMP | ||
361 | set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | | ||
362 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5); | ||
363 | #else | ||
364 | set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 | | ||
365 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5); | ||
366 | #endif | ||
367 | |||
368 | /* tell oprofile which irq to use */ | 310 | /* tell oprofile which irq to use */ |
369 | ltq_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ); | 311 | ltq_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ); |
370 | 312 | ||
371 | /* | ||
372 | * if the timer irq is not one of the mips irqs we need to | ||
373 | * create a mapping | ||
374 | */ | ||
375 | if (MIPS_CPU_TIMER_IRQ != 7) | ||
376 | irq_create_mapping(ltq_domain, MIPS_CPU_TIMER_IRQ); | ||
377 | |||
378 | /* the external interrupts are optional and xway only */ | 313 | /* the external interrupts are optional and xway only */ |
379 | eiu_node = of_find_compatible_node(NULL, NULL, "lantiq,eiu-xway"); | 314 | eiu_node = of_find_compatible_node(NULL, NULL, "lantiq,eiu-xway"); |
380 | if (eiu_node && !of_address_to_resource(eiu_node, 0, &res)) { | 315 | if (eiu_node && !of_address_to_resource(eiu_node, 0, &res)) { |
@@ -411,7 +346,7 @@ EXPORT_SYMBOL_GPL(get_c0_perfcount_int); | |||
411 | 346 | ||
412 | unsigned int get_c0_compare_int(void) | 347 | unsigned int get_c0_compare_int(void) |
413 | { | 348 | { |
414 | return MIPS_CPU_TIMER_IRQ; | 349 | return CP0_LEGACY_COMPARE_IRQ; |
415 | } | 350 | } |
416 | 351 | ||
417 | static struct of_device_id __initdata of_irq_ids[] = { | 352 | static struct of_device_id __initdata of_irq_ids[] = { |
diff --git a/arch/mips/pci/msi-octeon.c b/arch/mips/pci/msi-octeon.c index 2a5bb849b10e..288b58b00dc8 100644 --- a/arch/mips/pci/msi-octeon.c +++ b/arch/mips/pci/msi-octeon.c | |||
@@ -369,7 +369,9 @@ int __init octeon_msi_initialize(void) | |||
369 | int irq; | 369 | int irq; |
370 | struct irq_chip *msi; | 370 | struct irq_chip *msi; |
371 | 371 | ||
372 | if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_PCIE) { | 372 | if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_INVALID) { |
373 | return 0; | ||
374 | } else if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_PCIE) { | ||
373 | msi_rcv_reg[0] = CVMX_PEXP_NPEI_MSI_RCV0; | 375 | msi_rcv_reg[0] = CVMX_PEXP_NPEI_MSI_RCV0; |
374 | msi_rcv_reg[1] = CVMX_PEXP_NPEI_MSI_RCV1; | 376 | msi_rcv_reg[1] = CVMX_PEXP_NPEI_MSI_RCV1; |
375 | msi_rcv_reg[2] = CVMX_PEXP_NPEI_MSI_RCV2; | 377 | msi_rcv_reg[2] = CVMX_PEXP_NPEI_MSI_RCV2; |
diff --git a/include/linux/bcma/bcma_soc.h b/include/linux/bcma/bcma_soc.h index 7cca5f859a90..f3c43519baa7 100644 --- a/include/linux/bcma/bcma_soc.h +++ b/include/linux/bcma/bcma_soc.h | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | struct bcma_soc { | 7 | struct bcma_soc { |
8 | struct bcma_bus bus; | 8 | struct bcma_bus bus; |
9 | struct device *dev; | ||
9 | }; | 10 | }; |
10 | 11 | ||
11 | int __init bcma_host_soc_register(struct bcma_soc *soc); | 12 | int __init bcma_host_soc_register(struct bcma_soc *soc); |