diff options
| -rw-r--r-- | arch/arm/include/asm/hardware/cache-l2x0.h | 9 | ||||
| -rw-r--r-- | arch/arm/mm/cache-l2x0.c | 21 |
2 files changed, 28 insertions, 2 deletions
diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index bfa706ffd968..99a6ed7e1bfd 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h | |||
| @@ -45,8 +45,13 @@ | |||
| 45 | #define L2X0_CLEAN_INV_LINE_PA 0x7F0 | 45 | #define L2X0_CLEAN_INV_LINE_PA 0x7F0 |
| 46 | #define L2X0_CLEAN_INV_LINE_IDX 0x7F8 | 46 | #define L2X0_CLEAN_INV_LINE_IDX 0x7F8 |
| 47 | #define L2X0_CLEAN_INV_WAY 0x7FC | 47 | #define L2X0_CLEAN_INV_WAY 0x7FC |
| 48 | #define L2X0_LOCKDOWN_WAY_D 0x900 | 48 | /* |
| 49 | #define L2X0_LOCKDOWN_WAY_I 0x904 | 49 | * The lockdown registers repeat 8 times for L310, the L210 has only one |
| 50 | * D and one I lockdown register at 0x0900 and 0x0904. | ||
| 51 | */ | ||
| 52 | #define L2X0_LOCKDOWN_WAY_D_BASE 0x900 | ||
| 53 | #define L2X0_LOCKDOWN_WAY_I_BASE 0x904 | ||
| 54 | #define L2X0_LOCKDOWN_STRIDE 0x08 | ||
| 50 | #define L2X0_TEST_OPERATION 0xF00 | 55 | #define L2X0_TEST_OPERATION 0xF00 |
| 51 | #define L2X0_LINE_DATA 0xF10 | 56 | #define L2X0_LINE_DATA 0xF10 |
| 52 | #define L2X0_LINE_TAG 0xF30 | 57 | #define L2X0_LINE_TAG 0xF30 |
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 44c086710d2b..9ecfdb511951 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
| @@ -277,6 +277,25 @@ static void l2x0_disable(void) | |||
| 277 | spin_unlock_irqrestore(&l2x0_lock, flags); | 277 | spin_unlock_irqrestore(&l2x0_lock, flags); |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static void __init l2x0_unlock(__u32 cache_id) | ||
| 281 | { | ||
| 282 | int lockregs; | ||
| 283 | int i; | ||
| 284 | |||
| 285 | if (cache_id == L2X0_CACHE_ID_PART_L310) | ||
| 286 | lockregs = 8; | ||
| 287 | else | ||
| 288 | /* L210 and unknown types */ | ||
| 289 | lockregs = 1; | ||
| 290 | |||
| 291 | for (i = 0; i < lockregs; i++) { | ||
| 292 | writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE + | ||
| 293 | i * L2X0_LOCKDOWN_STRIDE); | ||
| 294 | writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE + | ||
| 295 | i * L2X0_LOCKDOWN_STRIDE); | ||
| 296 | } | ||
| 297 | } | ||
| 298 | |||
| 280 | void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) | 299 | void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) |
| 281 | { | 300 | { |
| 282 | __u32 aux; | 301 | __u32 aux; |
| @@ -328,6 +347,8 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) | |||
| 328 | * accessing the below registers will fault. | 347 | * accessing the below registers will fault. |
| 329 | */ | 348 | */ |
| 330 | if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { | 349 | if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { |
| 350 | /* Make sure that I&D is not locked down when starting */ | ||
| 351 | l2x0_unlock(cache_id); | ||
| 331 | 352 | ||
| 332 | /* l2x0 controller is disabled */ | 353 | /* l2x0 controller is disabled */ |
| 333 | writel_relaxed(aux, l2x0_base + L2X0_AUX_CTRL); | 354 | writel_relaxed(aux, l2x0_base + L2X0_AUX_CTRL); |
