diff options
-rw-r--r-- | arch/arm/mm/cache-l2x0.c | 18 |
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; |