aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;