diff options
Diffstat (limited to 'arch/blackfin/kernel')
-rw-r--r-- | arch/blackfin/kernel/cplb-mpu/cplbinit.c | 10 | ||||
-rw-r--r-- | arch/blackfin/kernel/cplb-mpu/cplbmgr.c | 36 | ||||
-rw-r--r-- | arch/blackfin/kernel/setup.c | 96 |
3 files changed, 107 insertions, 35 deletions
diff --git a/arch/blackfin/kernel/cplb-mpu/cplbinit.c b/arch/blackfin/kernel/cplb-mpu/cplbinit.c index c006a44527bf..36193eed9a1f 100644 --- a/arch/blackfin/kernel/cplb-mpu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-mpu/cplbinit.c | |||
@@ -46,13 +46,13 @@ void __init generate_cplb_tables_cpu(unsigned int cpu) | |||
46 | 46 | ||
47 | printk(KERN_INFO "MPU: setting up cplb tables with memory protection\n"); | 47 | printk(KERN_INFO "MPU: setting up cplb tables with memory protection\n"); |
48 | 48 | ||
49 | #ifdef CONFIG_BFIN_ICACHE | 49 | #ifdef CONFIG_BFIN_EXTMEM_ICACHEABLE |
50 | i_cache = CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; | 50 | i_cache = CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; |
51 | #endif | 51 | #endif |
52 | 52 | ||
53 | #ifdef CONFIG_BFIN_DCACHE | 53 | #ifdef CONFIG_BFIN_EXTMEM_DCACHEABLE |
54 | d_cache = CPLB_L1_CHBL; | 54 | d_cache = CPLB_L1_CHBL; |
55 | #ifdef CONFIG_BFIN_WT | 55 | #ifdef CONFIG_BFIN_EXTMEM_WRITETROUGH |
56 | d_cache |= CPLB_L1_AOW | CPLB_WT; | 56 | d_cache |= CPLB_L1_AOW | CPLB_WT; |
57 | #endif | 57 | #endif |
58 | #endif | 58 | #endif |
@@ -91,9 +91,9 @@ void __init generate_cplb_tables_cpu(unsigned int cpu) | |||
91 | /* Cover L2 memory */ | 91 | /* Cover L2 memory */ |
92 | #if L2_LENGTH > 0 | 92 | #if L2_LENGTH > 0 |
93 | dcplb_tbl[cpu][i_d].addr = L2_START; | 93 | dcplb_tbl[cpu][i_d].addr = L2_START; |
94 | dcplb_tbl[cpu][i_d++].data = L2_DMEMORY | PAGE_SIZE_1MB; | 94 | dcplb_tbl[cpu][i_d++].data = L2_DMEMORY; |
95 | icplb_tbl[cpu][i_i].addr = L2_START; | 95 | icplb_tbl[cpu][i_i].addr = L2_START; |
96 | icplb_tbl[cpu][i_i++].data = L2_IMEMORY | PAGE_SIZE_1MB; | 96 | icplb_tbl[cpu][i_i++].data = L2_IMEMORY; |
97 | #endif | 97 | #endif |
98 | 98 | ||
99 | first_mask_dcplb = i_d; | 99 | first_mask_dcplb = i_d; |
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++) { |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index b2782eae31e1..8d7892820130 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -117,15 +117,49 @@ void __cpuinit bfin_setup_caches(unsigned int cpu) | |||
117 | */ | 117 | */ |
118 | #ifdef CONFIG_BFIN_ICACHE | 118 | #ifdef CONFIG_BFIN_ICACHE |
119 | printk(KERN_INFO "Instruction Cache Enabled for CPU%u\n", cpu); | 119 | printk(KERN_INFO "Instruction Cache Enabled for CPU%u\n", cpu); |
120 | printk(KERN_INFO " External memory:" | ||
121 | # ifdef CONFIG_BFIN_EXTMEM_ICACHEABLE | ||
122 | " cacheable" | ||
123 | # else | ||
124 | " uncacheable" | ||
125 | # endif | ||
126 | " in instruction cache\n"); | ||
127 | if (L2_LENGTH) | ||
128 | printk(KERN_INFO " L2 SRAM :" | ||
129 | # ifdef CONFIG_BFIN_L2_ICACHEABLE | ||
130 | " cacheable" | ||
131 | # else | ||
132 | " uncacheable" | ||
133 | # endif | ||
134 | " in instruction cache\n"); | ||
135 | |||
136 | #else | ||
137 | printk(KERN_INFO "Instruction Cache Disabled for CPU%u\n", cpu); | ||
120 | #endif | 138 | #endif |
139 | |||
121 | #ifdef CONFIG_BFIN_DCACHE | 140 | #ifdef CONFIG_BFIN_DCACHE |
122 | printk(KERN_INFO "Data Cache Enabled for CPU%u" | 141 | printk(KERN_INFO "Data Cache Enabled for CPU%u\n", cpu); |
123 | # if defined CONFIG_BFIN_WB | 142 | printk(KERN_INFO " External memory:" |
124 | " (write-back)" | 143 | # if defined CONFIG_BFIN_EXTMEM_WRITEBACK |
125 | # elif defined CONFIG_BFIN_WT | 144 | " cacheable (write-back)" |
126 | " (write-through)" | 145 | # elif defined CONFIG_BFIN_EXTMEM_WRITETHROUGH |
146 | " cacheable (write-through)" | ||
147 | # else | ||
148 | " uncacheable" | ||
149 | # endif | ||
150 | " in data cache\n"); | ||
151 | if (L2_LENGTH) | ||
152 | printk(KERN_INFO " L2 SRAM :" | ||
153 | # if defined CONFIG_BFIN_L2_WRITEBACK | ||
154 | " cacheable (write-back)" | ||
155 | # elif defined CONFIG_BFIN_L2_WRITETHROUGH | ||
156 | " cacheable (write-through)" | ||
157 | # else | ||
158 | " uncacheable" | ||
127 | # endif | 159 | # endif |
128 | "\n", cpu); | 160 | " in data cache\n"); |
161 | #else | ||
162 | printk(KERN_INFO "Data Cache Disabled for CPU%u\n", cpu); | ||
129 | #endif | 163 | #endif |
130 | } | 164 | } |
131 | 165 | ||
@@ -516,7 +550,7 @@ static __init void memory_setup(void) | |||
516 | && ((unsigned long *)mtd_phys)[1] == ROMSB_WORD1) | 550 | && ((unsigned long *)mtd_phys)[1] == ROMSB_WORD1) |
517 | mtd_size = | 551 | mtd_size = |
518 | PAGE_ALIGN(be32_to_cpu(((unsigned long *)mtd_phys)[2])); | 552 | PAGE_ALIGN(be32_to_cpu(((unsigned long *)mtd_phys)[2])); |
519 | # if (defined(CONFIG_BFIN_ICACHE) && ANOMALY_05000263) | 553 | # if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263) |
520 | /* Due to a Hardware Anomaly we need to limit the size of usable | 554 | /* Due to a Hardware Anomaly we need to limit the size of usable |
521 | * instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on | 555 | * instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on |
522 | * 05000263 - Hardware loop corrupted when taking an ICPLB exception | 556 | * 05000263 - Hardware loop corrupted when taking an ICPLB exception |
@@ -544,7 +578,7 @@ static __init void memory_setup(void) | |||
544 | dma_memcpy((void *)uclinux_ram_map.phys, _end, uclinux_ram_map.size); | 578 | dma_memcpy((void *)uclinux_ram_map.phys, _end, uclinux_ram_map.size); |
545 | #endif /* CONFIG_MTD_UCLINUX */ | 579 | #endif /* CONFIG_MTD_UCLINUX */ |
546 | 580 | ||
547 | #if (defined(CONFIG_BFIN_ICACHE) && ANOMALY_05000263) | 581 | #if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263) |
548 | /* Due to a Hardware Anomaly we need to limit the size of usable | 582 | /* Due to a Hardware Anomaly we need to limit the size of usable |
549 | * instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on | 583 | * instruction memory to max 60MB, 56 if HUNT_FOR_ZERO is on |
550 | * 05000263 - Hardware loop corrupted when taking an ICPLB exception | 584 | * 05000263 - Hardware loop corrupted when taking an ICPLB exception |
@@ -1158,16 +1192,25 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1158 | icache_size = 0; | 1192 | icache_size = 0; |
1159 | 1193 | ||
1160 | seq_printf(m, "cache size\t: %d KB(L1 icache) " | 1194 | seq_printf(m, "cache size\t: %d KB(L1 icache) " |
1161 | "%d KB(L1 dcache%s) %d KB(L2 cache)\n", | 1195 | "%d KB(L1 dcache) %d KB(L2 cache)\n", |
1162 | icache_size, dcache_size, | 1196 | icache_size, dcache_size, 0); |
1163 | #if defined CONFIG_BFIN_WB | ||
1164 | "-wb" | ||
1165 | #elif defined CONFIG_BFIN_WT | ||
1166 | "-wt" | ||
1167 | #endif | ||
1168 | "", 0); | ||
1169 | |||
1170 | seq_printf(m, "%s\n", cache); | 1197 | seq_printf(m, "%s\n", cache); |
1198 | seq_printf(m, "external memory\t: " | ||
1199 | #if defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) | ||
1200 | "cacheable" | ||
1201 | #else | ||
1202 | "uncacheable" | ||
1203 | #endif | ||
1204 | " in instruction cache\n"); | ||
1205 | seq_printf(m, "external memory\t: " | ||
1206 | #if defined(CONFIG_BFIN_EXTMEM_WRITEBACK) | ||
1207 | "cacheable (write-back)" | ||
1208 | #elif defined(CONFIG_BFIN_EXTMEM_WRITETHROUGH) | ||
1209 | "cacheable (write-through)" | ||
1210 | #else | ||
1211 | "uncacheable" | ||
1212 | #endif | ||
1213 | " in data cache\n"); | ||
1171 | 1214 | ||
1172 | if (icache_size) | 1215 | if (icache_size) |
1173 | seq_printf(m, "icache setup\t: %d Sub-banks/%d Ways, %d Lines/Way\n", | 1216 | seq_printf(m, "icache setup\t: %d Sub-banks/%d Ways, %d Lines/Way\n", |
@@ -1240,8 +1283,25 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1240 | if (cpu_num != num_possible_cpus() - 1) | 1283 | if (cpu_num != num_possible_cpus() - 1) |
1241 | return 0; | 1284 | return 0; |
1242 | 1285 | ||
1243 | if (L2_LENGTH) | 1286 | if (L2_LENGTH) { |
1244 | seq_printf(m, "L2 SRAM\t\t: %dKB\n", L2_LENGTH/0x400); | 1287 | seq_printf(m, "L2 SRAM\t\t: %dKB\n", L2_LENGTH/0x400); |
1288 | seq_printf(m, "L2 SRAM\t\t: " | ||
1289 | #if defined(CONFIG_BFIN_L2_ICACHEABLE) | ||
1290 | "cacheable" | ||
1291 | #else | ||
1292 | "uncacheable" | ||
1293 | #endif | ||
1294 | " in instruction cache\n"); | ||
1295 | seq_printf(m, "L2 SRAM\t\t: " | ||
1296 | #if defined(CONFIG_BFIN_L2_WRITEBACK) | ||
1297 | "cacheable (write-back)" | ||
1298 | #elif defined(CONFIG_BFIN_L2_WRITETHROUGH) | ||
1299 | "cacheable (write-through)" | ||
1300 | #else | ||
1301 | "uncacheable" | ||
1302 | #endif | ||
1303 | " in data cache\n"); | ||
1304 | } | ||
1245 | seq_printf(m, "board name\t: %s\n", bfin_board_name); | 1305 | seq_printf(m, "board name\t: %s\n", bfin_board_name); |
1246 | seq_printf(m, "board memory\t: %ld kB (0x%p -> 0x%p)\n", | 1306 | seq_printf(m, "board memory\t: %ld kB (0x%p -> 0x%p)\n", |
1247 | physical_mem_end >> 10, (void *)0, (void *)physical_mem_end); | 1307 | physical_mem_end >> 10, (void *)0, (void *)physical_mem_end); |