aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-03-16 16:02:06 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-05-29 19:48:41 -0400
commita8875a092af5d9f88f6c335dd07d8988e80e1343 (patch)
tree708eecc791fee7e21ddb5c8edfa3171c43fb52d4 /arch/arm/mm
parent8abd259f657d5742f96ffd46ed65feb11c44b1fb (diff)
ARM: l2c: implement L2C-310 erratum 752271 in core L2C code
Rather than having SoCs work around L2C erratum themselves, move them into core code. This erratum affects the double linefill feature which needs to be disabled for r3p0 to r3p1-50rel0. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mm')
-rw-r--r--arch/arm/mm/cache-l2x0.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
index 369a9d01d94f..84933f48edea 100644
--- a/arch/arm/mm/cache-l2x0.c
+++ b/arch/arm/mm/cache-l2x0.c
@@ -480,6 +480,11 @@ static const struct l2c_init_data l2c220_data = {
480 * hit the line between the clean operation and invalidate operation, 480 * hit the line between the clean operation and invalidate operation,
481 * resulting in the store being lost. 481 * resulting in the store being lost.
482 * 482 *
483 * 752271: PL310 R3P0->R3P1-50REL0, fixed R3P2.
484 * Affects: 8x64-bit (double fill) line fetches
485 * double fill line fetches can fail to cause dirty data to be evicted
486 * from the cache before the new data overwrites the second line.
487 *
483 * 753970: PL310 R3P0, fixed R3P1. 488 * 753970: PL310 R3P0, fixed R3P1.
484 * Affects: sync 489 * Affects: sync
485 * prevents merging writes after the sync operation, until another L2C 490 * prevents merging writes after the sync operation, until another L2C
@@ -628,7 +633,7 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,
628 struct outer_cache_fns *fns) 633 struct outer_cache_fns *fns)
629{ 634{
630 unsigned revision = cache_id & L2X0_CACHE_ID_RTL_MASK; 635 unsigned revision = cache_id & L2X0_CACHE_ID_RTL_MASK;
631 const char *errata[4]; 636 const char *errata[8];
632 unsigned n = 0; 637 unsigned n = 0;
633 638
634 /* For compatibility */ 639 /* For compatibility */
@@ -651,6 +656,17 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,
651 errata[n++] = "727915"; 656 errata[n++] = "727915";
652 } 657 }
653 658
659 if (revision >= L310_CACHE_ID_RTL_R3P0 &&
660 revision < L310_CACHE_ID_RTL_R3P2) {
661 u32 val = readl_relaxed(base + L2X0_PREFETCH_CTRL);
662 /* I don't think bit23 is required here... but iMX6 does so */
663 if (val & (BIT(30) | BIT(23))) {
664 val &= ~(BIT(30) | BIT(23));
665 l2c_write_sec(val, base, L2X0_PREFETCH_CTRL);
666 errata[n++] = "752271";
667 }
668 }
669
654 if (IS_ENABLED(CONFIG_PL310_ERRATA_753970) && 670 if (IS_ENABLED(CONFIG_PL310_ERRATA_753970) &&
655 revision == L310_CACHE_ID_RTL_R3P0) { 671 revision == L310_CACHE_ID_RTL_R3P0) {
656 sync_reg_offset = L2X0_DUMMY_REG; 672 sync_reg_offset = L2X0_DUMMY_REG;