diff options
Diffstat (limited to 'arch/blackfin/kernel/cplb-mpu/cplbmgr.c')
-rw-r--r-- | arch/blackfin/kernel/cplb-mpu/cplbmgr.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/arch/blackfin/kernel/cplb-mpu/cplbmgr.c b/arch/blackfin/kernel/cplb-mpu/cplbmgr.c index 784923e52a9a..bcdfe9b0b71f 100644 --- a/arch/blackfin/kernel/cplb-mpu/cplbmgr.c +++ b/arch/blackfin/kernel/cplb-mpu/cplbmgr.c | |||
@@ -150,15 +150,19 @@ static noinline int dcplb_miss(unsigned int cpu) | |||
150 | nr_dcplb_miss[cpu]++; | 150 | nr_dcplb_miss[cpu]++; |
151 | 151 | ||
152 | d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; | 152 | d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; |
153 | #ifdef CONFIG_BFIN_DCACHE | 153 | #ifdef CONFIG_BFIN_EXTMEM_DCACHEABLE |
154 | if (bfin_addr_dcacheable(addr)) { | 154 | if (bfin_addr_dcacheable(addr)) { |
155 | d_data |= CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; | 155 | d_data |= CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; |
156 | #ifdef CONFIG_BFIN_WT | 156 | # ifdef CONFIG_BFIN_EXTMEM_WRITETHROUGH |
157 | d_data |= CPLB_L1_AOW | CPLB_WT; | 157 | d_data |= CPLB_L1_AOW | CPLB_WT; |
158 | #endif | 158 | # endif |
159 | } | 159 | } |
160 | #endif | 160 | #endif |
161 | if (addr >= physical_mem_end) { | 161 | |
162 | if (L2_LENGTH && addr >= L2_START && addr < L2_START + L2_LENGTH) { | ||
163 | addr = L2_START; | ||
164 | d_data = L2_DMEMORY; | ||
165 | } else if (addr >= physical_mem_end) { | ||
162 | if (addr >= ASYNC_BANK0_BASE && addr < ASYNC_BANK3_BASE + ASYNC_BANK3_SIZE | 166 | if (addr >= ASYNC_BANK0_BASE && addr < ASYNC_BANK3_BASE + ASYNC_BANK3_SIZE |
163 | && (status & FAULT_USERSUPV)) { | 167 | && (status & FAULT_USERSUPV)) { |
164 | addr &= ~0x3fffff; | 168 | addr &= ~0x3fffff; |
@@ -235,7 +239,7 @@ static noinline int icplb_miss(unsigned int cpu) | |||
235 | 239 | ||
236 | i_data = CPLB_VALID | CPLB_PORTPRIO | PAGE_SIZE_4KB; | 240 | i_data = CPLB_VALID | CPLB_PORTPRIO | PAGE_SIZE_4KB; |
237 | 241 | ||
238 | #ifdef CONFIG_BFIN_ICACHE | 242 | #ifdef CONFIG_BFIN_EXTMEM_ICACHEABLE |
239 | /* | 243 | /* |
240 | * Normal RAM, and possibly the reserved memory area, are | 244 | * Normal RAM, and possibly the reserved memory area, are |
241 | * cacheable. | 245 | * cacheable. |
@@ -245,7 +249,10 @@ static noinline int icplb_miss(unsigned int cpu) | |||
245 | i_data |= CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; | 249 | i_data |= CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; |
246 | #endif | 250 | #endif |
247 | 251 | ||
248 | if (addr >= physical_mem_end) { | 252 | if (L2_LENGTH && addr >= L2_START && addr < L2_START + L2_LENGTH) { |
253 | addr = L2_START; | ||
254 | i_data = L2_IMEMORY; | ||
255 | } else if (addr >= physical_mem_end) { | ||
249 | if (addr >= BOOT_ROM_START && addr < BOOT_ROM_START + BOOT_ROM_LENGTH | 256 | if (addr >= BOOT_ROM_START && addr < BOOT_ROM_START + BOOT_ROM_LENGTH |
250 | && (status & FAULT_USERSUPV)) { | 257 | && (status & FAULT_USERSUPV)) { |
251 | addr &= ~(1 * 1024 * 1024 - 1); | 258 | addr &= ~(1 * 1024 * 1024 - 1); |
@@ -365,13 +372,18 @@ void set_mask_dcplbs(unsigned long *masks, unsigned int cpu) | |||
365 | local_irq_save_hw(flags); | 372 | local_irq_save_hw(flags); |
366 | current_rwx_mask[cpu] = masks; | 373 | current_rwx_mask[cpu] = masks; |
367 | 374 | ||
368 | d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; | 375 | if (L2_LENGTH && addr >= L2_START && addr < L2_START + L2_LENGTH) { |
369 | #ifdef CONFIG_BFIN_DCACHE | 376 | addr = L2_START; |
370 | d_data |= CPLB_L1_CHBL; | 377 | d_data = L2_DMEMORY; |
371 | #ifdef CONFIG_BFIN_WT | 378 | } else { |
372 | d_data |= CPLB_L1_AOW | CPLB_WT; | 379 | d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; |
373 | #endif | 380 | #ifdef CONFIG_BFIN_EXTMEM_DCACHEABLE |
381 | d_data |= CPLB_L1_CHBL; | ||
382 | # ifdef CONFIG_BFIN_EXTMEM_WRITETHROUGH | ||
383 | d_data |= CPLB_L1_AOW | CPLB_WT; | ||
384 | # endif | ||
374 | #endif | 385 | #endif |
386 | } | ||
375 | 387 | ||
376 | disable_dcplb(); | 388 | disable_dcplb(); |
377 | for (i = first_mask_dcplb; i < first_switched_dcplb; i++) { | 389 | for (i = first_mask_dcplb; i < first_switched_dcplb; i++) { |