diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-09 11:58:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-09 11:58:57 -0500 |
commit | 5c49985c21bba4d2f899e3a97121868a5c58a876 (patch) | |
tree | f877cde6c0effa6c8cd6e1d0d7e116358eb41ee8 | |
parent | 57a0c1e2d6cb70ad0f8549ae730fc58fd0553429 (diff) | |
parent | 8a3a180d21793f2e4386b3cb61c48322564fc80a (diff) |
Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM fixes from Russell King.
* 'fixes' of git://git.linaro.org/people/rmk/linux-arm:
ARM: 7616/1: cache-l2x0: aurora: Use writel_relaxed instead of writel
ARM: 7615/1: cache-l2x0: aurora: Invalidate during clean operation with WT enable
ARM: 7614/1: mm: fix wrong branch from Cortex-A9 to PJ4b
ARM: 7612/1: imx: Do not select some errata that depends on !ARCH_MULTIPLATFORM
ARM: 7611/1: VIC: fix bug in VIC irqdomain code
ARM: 7610/1: versatile: bump IRQ numbers
ARM: 7609/1: disable errata work-arounds which access secure registers
ARM: 7608/1: l2x0: Only set .set_debug on PL310 r3p0 and earlier
-rw-r--r-- | arch/arm/Kconfig | 6 | ||||
-rw-r--r-- | arch/arm/common/vic.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-imx/Kconfig | 2 | ||||
-rw-r--r-- | arch/arm/mach-versatile/include/mach/irqs.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-vexpress/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mm/cache-l2x0.c | 34 | ||||
-rw-r--r-- | arch/arm/mm/proc-v7.S | 4 |
7 files changed, 40 insertions, 22 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ab864d9545dd..67874b82a4ed 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1229,6 +1229,7 @@ config ARM_ERRATA_430973 | |||
1229 | config ARM_ERRATA_458693 | 1229 | config ARM_ERRATA_458693 |
1230 | bool "ARM errata: Processor deadlock when a false hazard is created" | 1230 | bool "ARM errata: Processor deadlock when a false hazard is created" |
1231 | depends on CPU_V7 | 1231 | depends on CPU_V7 |
1232 | depends on !ARCH_MULTIPLATFORM | ||
1232 | help | 1233 | help |
1233 | This option enables the workaround for the 458693 Cortex-A8 (r2p0) | 1234 | This option enables the workaround for the 458693 Cortex-A8 (r2p0) |
1234 | erratum. For very specific sequences of memory operations, it is | 1235 | erratum. For very specific sequences of memory operations, it is |
@@ -1242,6 +1243,7 @@ config ARM_ERRATA_458693 | |||
1242 | config ARM_ERRATA_460075 | 1243 | config ARM_ERRATA_460075 |
1243 | bool "ARM errata: Data written to the L2 cache can be overwritten with stale data" | 1244 | bool "ARM errata: Data written to the L2 cache can be overwritten with stale data" |
1244 | depends on CPU_V7 | 1245 | depends on CPU_V7 |
1246 | depends on !ARCH_MULTIPLATFORM | ||
1245 | help | 1247 | help |
1246 | This option enables the workaround for the 460075 Cortex-A8 (r2p0) | 1248 | This option enables the workaround for the 460075 Cortex-A8 (r2p0) |
1247 | erratum. Any asynchronous access to the L2 cache may encounter a | 1249 | erratum. Any asynchronous access to the L2 cache may encounter a |
@@ -1254,6 +1256,7 @@ config ARM_ERRATA_460075 | |||
1254 | config ARM_ERRATA_742230 | 1256 | config ARM_ERRATA_742230 |
1255 | bool "ARM errata: DMB operation may be faulty" | 1257 | bool "ARM errata: DMB operation may be faulty" |
1256 | depends on CPU_V7 && SMP | 1258 | depends on CPU_V7 && SMP |
1259 | depends on !ARCH_MULTIPLATFORM | ||
1257 | help | 1260 | help |
1258 | This option enables the workaround for the 742230 Cortex-A9 | 1261 | This option enables the workaround for the 742230 Cortex-A9 |
1259 | (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction | 1262 | (r1p0..r2p2) erratum. Under rare circumstances, a DMB instruction |
@@ -1266,6 +1269,7 @@ config ARM_ERRATA_742230 | |||
1266 | config ARM_ERRATA_742231 | 1269 | config ARM_ERRATA_742231 |
1267 | bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption" | 1270 | bool "ARM errata: Incorrect hazard handling in the SCU may lead to data corruption" |
1268 | depends on CPU_V7 && SMP | 1271 | depends on CPU_V7 && SMP |
1272 | depends on !ARCH_MULTIPLATFORM | ||
1269 | help | 1273 | help |
1270 | This option enables the workaround for the 742231 Cortex-A9 | 1274 | This option enables the workaround for the 742231 Cortex-A9 |
1271 | (r2p0..r2p2) erratum. Under certain conditions, specific to the | 1275 | (r2p0..r2p2) erratum. Under certain conditions, specific to the |
@@ -1316,6 +1320,7 @@ config PL310_ERRATA_727915 | |||
1316 | config ARM_ERRATA_743622 | 1320 | config ARM_ERRATA_743622 |
1317 | bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" | 1321 | bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" |
1318 | depends on CPU_V7 | 1322 | depends on CPU_V7 |
1323 | depends on !ARCH_MULTIPLATFORM | ||
1319 | help | 1324 | help |
1320 | This option enables the workaround for the 743622 Cortex-A9 | 1325 | This option enables the workaround for the 743622 Cortex-A9 |
1321 | (r2p*) erratum. Under very rare conditions, a faulty | 1326 | (r2p*) erratum. Under very rare conditions, a faulty |
@@ -1329,6 +1334,7 @@ config ARM_ERRATA_743622 | |||
1329 | config ARM_ERRATA_751472 | 1334 | config ARM_ERRATA_751472 |
1330 | bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" | 1335 | bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation" |
1331 | depends on CPU_V7 | 1336 | depends on CPU_V7 |
1337 | depends on !ARCH_MULTIPLATFORM | ||
1332 | help | 1338 | help |
1333 | This option enables the workaround for the 751472 Cortex-A9 (prior | 1339 | This option enables the workaround for the 751472 Cortex-A9 (prior |
1334 | to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the | 1340 | to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the |
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index e4df17ca90c7..8f324b99416e 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c | |||
@@ -206,6 +206,7 @@ static void __init vic_register(void __iomem *base, unsigned int irq, | |||
206 | struct device_node *node) | 206 | struct device_node *node) |
207 | { | 207 | { |
208 | struct vic_device *v; | 208 | struct vic_device *v; |
209 | int i; | ||
209 | 210 | ||
210 | if (vic_id >= ARRAY_SIZE(vic_devices)) { | 211 | if (vic_id >= ARRAY_SIZE(vic_devices)) { |
211 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); | 212 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); |
@@ -220,6 +221,10 @@ static void __init vic_register(void __iomem *base, unsigned int irq, | |||
220 | vic_id++; | 221 | vic_id++; |
221 | v->domain = irq_domain_add_simple(node, fls(valid_sources), irq, | 222 | v->domain = irq_domain_add_simple(node, fls(valid_sources), irq, |
222 | &vic_irqdomain_ops, v); | 223 | &vic_irqdomain_ops, v); |
224 | /* create an IRQ mapping for each valid IRQ */ | ||
225 | for (i = 0; i < fls(valid_sources); i++) | ||
226 | if (valid_sources & (1 << i)) | ||
227 | irq_create_mapping(v->domain, i); | ||
223 | } | 228 | } |
224 | 229 | ||
225 | static void vic_ack_irq(struct irq_data *d) | 230 | static void vic_ack_irq(struct irq_data *d) |
@@ -416,9 +421,9 @@ int __init vic_of_init(struct device_node *node, struct device_node *parent) | |||
416 | return -EIO; | 421 | return -EIO; |
417 | 422 | ||
418 | /* | 423 | /* |
419 | * Passing -1 as first IRQ makes the simple domain allocate descriptors | 424 | * Passing 0 as first IRQ makes the simple domain allocate descriptors |
420 | */ | 425 | */ |
421 | __vic_init(regs, -1, ~0, ~0, node); | 426 | __vic_init(regs, 0, ~0, ~0, node); |
422 | 427 | ||
423 | return 0; | 428 | return 0; |
424 | } | 429 | } |
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 1ad0d76de8c7..3e628fd7a674 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -841,8 +841,6 @@ config SOC_IMX6Q | |||
841 | select ARCH_HAS_CPUFREQ | 841 | select ARCH_HAS_CPUFREQ |
842 | select ARCH_HAS_OPP | 842 | select ARCH_HAS_OPP |
843 | select ARM_CPU_SUSPEND if PM | 843 | select ARM_CPU_SUSPEND if PM |
844 | select ARM_ERRATA_743622 | ||
845 | select ARM_ERRATA_751472 | ||
846 | select ARM_ERRATA_754322 | 844 | select ARM_ERRATA_754322 |
847 | select ARM_ERRATA_764369 if SMP | 845 | select ARM_ERRATA_764369 if SMP |
848 | select ARM_ERRATA_775420 | 846 | select ARM_ERRATA_775420 |
diff --git a/arch/arm/mach-versatile/include/mach/irqs.h b/arch/arm/mach-versatile/include/mach/irqs.h index bf44c61bd1f6..0fd771ca617b 100644 --- a/arch/arm/mach-versatile/include/mach/irqs.h +++ b/arch/arm/mach-versatile/include/mach/irqs.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * IRQ interrupts definitions are the same as the INT definitions | 25 | * IRQ interrupts definitions are the same as the INT definitions |
26 | * held within platform.h | 26 | * held within platform.h |
27 | */ | 27 | */ |
28 | #define IRQ_VIC_START 0 | 28 | #define IRQ_VIC_START 32 |
29 | #define IRQ_WDOGINT (IRQ_VIC_START + INT_WDOGINT) | 29 | #define IRQ_WDOGINT (IRQ_VIC_START + INT_WDOGINT) |
30 | #define IRQ_SOFTINT (IRQ_VIC_START + INT_SOFTINT) | 30 | #define IRQ_SOFTINT (IRQ_VIC_START + INT_SOFTINT) |
31 | #define IRQ_COMMRx (IRQ_VIC_START + INT_COMMRx) | 31 | #define IRQ_COMMRx (IRQ_VIC_START + INT_COMMRx) |
@@ -100,7 +100,7 @@ | |||
100 | /* | 100 | /* |
101 | * Secondary interrupt controller | 101 | * Secondary interrupt controller |
102 | */ | 102 | */ |
103 | #define IRQ_SIC_START 32 | 103 | #define IRQ_SIC_START 64 |
104 | #define IRQ_SIC_MMCI0B (IRQ_SIC_START + SIC_INT_MMCI0B) | 104 | #define IRQ_SIC_MMCI0B (IRQ_SIC_START + SIC_INT_MMCI0B) |
105 | #define IRQ_SIC_MMCI1B (IRQ_SIC_START + SIC_INT_MMCI1B) | 105 | #define IRQ_SIC_MMCI1B (IRQ_SIC_START + SIC_INT_MMCI1B) |
106 | #define IRQ_SIC_KMI0 (IRQ_SIC_START + SIC_INT_KMI0) | 106 | #define IRQ_SIC_KMI0 (IRQ_SIC_START + SIC_INT_KMI0) |
@@ -120,7 +120,7 @@ | |||
120 | #define IRQ_SIC_PCI1 (IRQ_SIC_START + SIC_INT_PCI1) | 120 | #define IRQ_SIC_PCI1 (IRQ_SIC_START + SIC_INT_PCI1) |
121 | #define IRQ_SIC_PCI2 (IRQ_SIC_START + SIC_INT_PCI2) | 121 | #define IRQ_SIC_PCI2 (IRQ_SIC_START + SIC_INT_PCI2) |
122 | #define IRQ_SIC_PCI3 (IRQ_SIC_START + SIC_INT_PCI3) | 122 | #define IRQ_SIC_PCI3 (IRQ_SIC_START + SIC_INT_PCI3) |
123 | #define IRQ_SIC_END 63 | 123 | #define IRQ_SIC_END 95 |
124 | 124 | ||
125 | #define IRQ_GPIO0_START (IRQ_SIC_END + 1) | 125 | #define IRQ_GPIO0_START (IRQ_SIC_END + 1) |
126 | #define IRQ_GPIO0_END (IRQ_GPIO0_START + 31) | 126 | #define IRQ_GPIO0_END (IRQ_GPIO0_START + 31) |
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 99e63f5f99d1..52d315b792c8 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig | |||
@@ -42,7 +42,6 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA | |||
42 | bool "Enable A5 and A9 only errata work-arounds" | 42 | bool "Enable A5 and A9 only errata work-arounds" |
43 | default y | 43 | default y |
44 | select ARM_ERRATA_720789 | 44 | select ARM_ERRATA_720789 |
45 | select ARM_ERRATA_751472 | ||
46 | select PL310_ERRATA_753970 if CACHE_PL310 | 45 | select PL310_ERRATA_753970 if CACHE_PL310 |
47 | help | 46 | help |
48 | Provides common dependencies for Versatile Express platforms | 47 | Provides common dependencies for Versatile Express platforms |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 6911b8b2745c..c2f37390308a 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
@@ -352,7 +352,8 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) | |||
352 | /* Unmapped register. */ | 352 | /* Unmapped register. */ |
353 | sync_reg_offset = L2X0_DUMMY_REG; | 353 | sync_reg_offset = L2X0_DUMMY_REG; |
354 | #endif | 354 | #endif |
355 | outer_cache.set_debug = pl310_set_debug; | 355 | if ((cache_id & L2X0_CACHE_ID_RTL_MASK) <= L2X0_CACHE_ID_RTL_R3P0) |
356 | outer_cache.set_debug = pl310_set_debug; | ||
356 | break; | 357 | break; |
357 | case L2X0_CACHE_ID_PART_L210: | 358 | case L2X0_CACHE_ID_PART_L210: |
358 | ways = (aux >> 13) & 0xf; | 359 | ways = (aux >> 13) & 0xf; |
@@ -459,8 +460,8 @@ static void aurora_pa_range(unsigned long start, unsigned long end, | |||
459 | unsigned long flags; | 460 | unsigned long flags; |
460 | 461 | ||
461 | raw_spin_lock_irqsave(&l2x0_lock, flags); | 462 | raw_spin_lock_irqsave(&l2x0_lock, flags); |
462 | writel(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); | 463 | writel_relaxed(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); |
463 | writel(end, l2x0_base + offset); | 464 | writel_relaxed(end, l2x0_base + offset); |
464 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | 465 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); |
465 | 466 | ||
466 | cache_sync(); | 467 | cache_sync(); |
@@ -505,15 +506,21 @@ static void aurora_clean_range(unsigned long start, unsigned long end) | |||
505 | 506 | ||
506 | static void aurora_flush_range(unsigned long start, unsigned long end) | 507 | static void aurora_flush_range(unsigned long start, unsigned long end) |
507 | { | 508 | { |
508 | if (!l2_wt_override) { | 509 | start &= ~(CACHE_LINE_SIZE - 1); |
509 | start &= ~(CACHE_LINE_SIZE - 1); | 510 | end = ALIGN(end, CACHE_LINE_SIZE); |
510 | end = ALIGN(end, CACHE_LINE_SIZE); | 511 | while (start != end) { |
511 | while (start != end) { | 512 | unsigned long range_end = calc_range_end(start, end); |
512 | unsigned long range_end = calc_range_end(start, end); | 513 | /* |
514 | * If L2 is forced to WT, the L2 will always be clean and we | ||
515 | * just need to invalidate. | ||
516 | */ | ||
517 | if (l2_wt_override) | ||
513 | aurora_pa_range(start, range_end - CACHE_LINE_SIZE, | 518 | aurora_pa_range(start, range_end - CACHE_LINE_SIZE, |
514 | AURORA_FLUSH_RANGE_REG); | 519 | AURORA_INVAL_RANGE_REG); |
515 | start = range_end; | 520 | else |
516 | } | 521 | aurora_pa_range(start, range_end - CACHE_LINE_SIZE, |
522 | AURORA_FLUSH_RANGE_REG); | ||
523 | start = range_end; | ||
517 | } | 524 | } |
518 | } | 525 | } |
519 | 526 | ||
@@ -668,8 +675,9 @@ static void pl310_resume(void) | |||
668 | static void aurora_resume(void) | 675 | static void aurora_resume(void) |
669 | { | 676 | { |
670 | if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) { | 677 | if (!(readl(l2x0_base + L2X0_CTRL) & L2X0_CTRL_EN)) { |
671 | writel(l2x0_saved_regs.aux_ctrl, l2x0_base + L2X0_AUX_CTRL); | 678 | writel_relaxed(l2x0_saved_regs.aux_ctrl, |
672 | writel(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL); | 679 | l2x0_base + L2X0_AUX_CTRL); |
680 | writel_relaxed(l2x0_saved_regs.ctrl, l2x0_base + L2X0_CTRL); | ||
673 | } | 681 | } |
674 | } | 682 | } |
675 | 683 | ||
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 350f6a74992b..3a3c015f8d5c 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -169,6 +169,7 @@ __v7_ca15mp_setup: | |||
169 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits | 169 | orreq r0, r0, r10 @ Enable CPU-specific SMP bits |
170 | mcreq p15, 0, r0, c1, c0, 1 | 170 | mcreq p15, 0, r0, c1, c0, 1 |
171 | #endif | 171 | #endif |
172 | b __v7_setup | ||
172 | 173 | ||
173 | __v7_pj4b_setup: | 174 | __v7_pj4b_setup: |
174 | #ifdef CONFIG_CPU_PJ4B | 175 | #ifdef CONFIG_CPU_PJ4B |
@@ -245,7 +246,8 @@ __v7_setup: | |||
245 | ldr r10, =0x00000c08 @ Cortex-A8 primary part number | 246 | ldr r10, =0x00000c08 @ Cortex-A8 primary part number |
246 | teq r0, r10 | 247 | teq r0, r10 |
247 | bne 2f | 248 | bne 2f |
248 | #ifdef CONFIG_ARM_ERRATA_430973 | 249 | #if defined(CONFIG_ARM_ERRATA_430973) && !defined(CONFIG_ARCH_MULTIPLATFORM) |
250 | |||
249 | teq r5, #0x00100000 @ only present in r1p* | 251 | teq r5, #0x00100000 @ only present in r1p* |
250 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register | 252 | mrceq p15, 0, r10, c1, c0, 1 @ read aux control register |
251 | orreq r10, r10, #(1 << 6) @ set IBE to 1 | 253 | orreq r10, r10, #(1 << 6) @ set IBE to 1 |