diff options
Diffstat (limited to 'arch/blackfin/kernel/setup.c')
-rw-r--r-- | arch/blackfin/kernel/setup.c | 91 |
1 files changed, 63 insertions, 28 deletions
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index ac71dc15cbdb..536bd9d7e0cf 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
30 | #include <asm/fixed_code.h> | 30 | #include <asm/fixed_code.h> |
31 | #include <asm/early_printk.h> | 31 | #include <asm/early_printk.h> |
32 | #include <asm/irq_handler.h> | ||
32 | 33 | ||
33 | u16 _bfin_swrst; | 34 | u16 _bfin_swrst; |
34 | EXPORT_SYMBOL(_bfin_swrst); | 35 | EXPORT_SYMBOL(_bfin_swrst); |
@@ -105,6 +106,8 @@ void __cpuinit bfin_setup_caches(unsigned int cpu) | |||
105 | bfin_dcache_init(dcplb_tbl[cpu]); | 106 | bfin_dcache_init(dcplb_tbl[cpu]); |
106 | #endif | 107 | #endif |
107 | 108 | ||
109 | bfin_setup_cpudata(cpu); | ||
110 | |||
108 | /* | 111 | /* |
109 | * In cache coherence emulation mode, we need to have the | 112 | * In cache coherence emulation mode, we need to have the |
110 | * D-cache enabled before running any atomic operation which | 113 | * D-cache enabled before running any atomic operation which |
@@ -163,7 +166,6 @@ void __cpuinit bfin_setup_cpudata(unsigned int cpu) | |||
163 | { | 166 | { |
164 | struct blackfin_cpudata *cpudata = &per_cpu(cpu_data, cpu); | 167 | struct blackfin_cpudata *cpudata = &per_cpu(cpu_data, cpu); |
165 | 168 | ||
166 | cpudata->idle = current; | ||
167 | cpudata->imemctl = bfin_read_IMEM_CONTROL(); | 169 | cpudata->imemctl = bfin_read_IMEM_CONTROL(); |
168 | cpudata->dmemctl = bfin_read_DMEM_CONTROL(); | 170 | cpudata->dmemctl = bfin_read_DMEM_CONTROL(); |
169 | } | 171 | } |
@@ -215,11 +217,48 @@ void __init bfin_relocate_l1_mem(void) | |||
215 | 217 | ||
216 | early_dma_memcpy_done(); | 218 | early_dma_memcpy_done(); |
217 | 219 | ||
220 | #if defined(CONFIG_SMP) && defined(CONFIG_ICACHE_FLUSH_L1) | ||
221 | blackfin_iflush_l1_entry[0] = (unsigned long)blackfin_icache_flush_range_l1; | ||
222 | #endif | ||
223 | |||
218 | /* if necessary, copy L2 text/data to L2 SRAM */ | 224 | /* if necessary, copy L2 text/data to L2 SRAM */ |
219 | if (L2_LENGTH && l2_len) | 225 | if (L2_LENGTH && l2_len) |
220 | memcpy(_stext_l2, _l2_lma, l2_len); | 226 | memcpy(_stext_l2, _l2_lma, l2_len); |
221 | } | 227 | } |
222 | 228 | ||
229 | #ifdef CONFIG_SMP | ||
230 | void __init bfin_relocate_coreb_l1_mem(void) | ||
231 | { | ||
232 | unsigned long text_l1_len = (unsigned long)_text_l1_len; | ||
233 | unsigned long data_l1_len = (unsigned long)_data_l1_len; | ||
234 | unsigned long data_b_l1_len = (unsigned long)_data_b_l1_len; | ||
235 | |||
236 | blackfin_dma_early_init(); | ||
237 | |||
238 | /* if necessary, copy L1 text to L1 instruction SRAM */ | ||
239 | if (L1_CODE_LENGTH && text_l1_len) | ||
240 | early_dma_memcpy((void *)COREB_L1_CODE_START, _text_l1_lma, | ||
241 | text_l1_len); | ||
242 | |||
243 | /* if necessary, copy L1 data to L1 data bank A SRAM */ | ||
244 | if (L1_DATA_A_LENGTH && data_l1_len) | ||
245 | early_dma_memcpy((void *)COREB_L1_DATA_A_START, _data_l1_lma, | ||
246 | data_l1_len); | ||
247 | |||
248 | /* if necessary, copy L1 data B to L1 data bank B SRAM */ | ||
249 | if (L1_DATA_B_LENGTH && data_b_l1_len) | ||
250 | early_dma_memcpy((void *)COREB_L1_DATA_B_START, _data_b_l1_lma, | ||
251 | data_b_l1_len); | ||
252 | |||
253 | early_dma_memcpy_done(); | ||
254 | |||
255 | #ifdef CONFIG_ICACHE_FLUSH_L1 | ||
256 | blackfin_iflush_l1_entry[1] = (unsigned long)blackfin_icache_flush_range_l1 - | ||
257 | (unsigned long)_stext_l1 + COREB_L1_CODE_START; | ||
258 | #endif | ||
259 | } | ||
260 | #endif | ||
261 | |||
223 | #ifdef CONFIG_ROMKERNEL | 262 | #ifdef CONFIG_ROMKERNEL |
224 | void __init bfin_relocate_xip_data(void) | 263 | void __init bfin_relocate_xip_data(void) |
225 | { | 264 | { |
@@ -814,6 +853,7 @@ void __init native_machine_early_platform_add_devices(void) | |||
814 | 853 | ||
815 | void __init setup_arch(char **cmdline_p) | 854 | void __init setup_arch(char **cmdline_p) |
816 | { | 855 | { |
856 | u32 mmr; | ||
817 | unsigned long sclk, cclk; | 857 | unsigned long sclk, cclk; |
818 | 858 | ||
819 | native_machine_early_platform_add_devices(); | 859 | native_machine_early_platform_add_devices(); |
@@ -865,10 +905,10 @@ void __init setup_arch(char **cmdline_p) | |||
865 | bfin_write_EBIU_FCTL(CONFIG_EBIU_FCTLVAL); | 905 | bfin_write_EBIU_FCTL(CONFIG_EBIU_FCTLVAL); |
866 | #endif | 906 | #endif |
867 | #ifdef CONFIG_BFIN_HYSTERESIS_CONTROL | 907 | #ifdef CONFIG_BFIN_HYSTERESIS_CONTROL |
868 | bfin_write_PORTF_HYSTERISIS(HYST_PORTF_0_15); | 908 | bfin_write_PORTF_HYSTERESIS(HYST_PORTF_0_15); |
869 | bfin_write_PORTG_HYSTERISIS(HYST_PORTG_0_15); | 909 | bfin_write_PORTG_HYSTERESIS(HYST_PORTG_0_15); |
870 | bfin_write_PORTH_HYSTERISIS(HYST_PORTH_0_15); | 910 | bfin_write_PORTH_HYSTERESIS(HYST_PORTH_0_15); |
871 | bfin_write_MISCPORT_HYSTERISIS((bfin_read_MISCPORT_HYSTERISIS() & | 911 | bfin_write_MISCPORT_HYSTERESIS((bfin_read_MISCPORT_HYSTERESIS() & |
872 | ~HYST_NONEGPIO_MASK) | HYST_NONEGPIO); | 912 | ~HYST_NONEGPIO_MASK) | HYST_NONEGPIO); |
873 | #endif | 913 | #endif |
874 | 914 | ||
@@ -884,17 +924,14 @@ void __init setup_arch(char **cmdline_p) | |||
884 | bfin_read_IMDMA_D1_IRQ_STATUS(); | 924 | bfin_read_IMDMA_D1_IRQ_STATUS(); |
885 | } | 925 | } |
886 | #endif | 926 | #endif |
887 | printk(KERN_INFO "Hardware Trace "); | ||
888 | if (bfin_read_TBUFCTL() & 0x1) | ||
889 | printk(KERN_CONT "Active "); | ||
890 | else | ||
891 | printk(KERN_CONT "Off "); | ||
892 | if (bfin_read_TBUFCTL() & 0x2) | ||
893 | printk(KERN_CONT "and Enabled\n"); | ||
894 | else | ||
895 | printk(KERN_CONT "and Disabled\n"); | ||
896 | 927 | ||
897 | printk(KERN_INFO "Boot Mode: %i\n", bfin_read_SYSCR() & 0xF); | 928 | mmr = bfin_read_TBUFCTL(); |
929 | printk(KERN_INFO "Hardware Trace %s and %sabled\n", | ||
930 | (mmr & 0x1) ? "active" : "off", | ||
931 | (mmr & 0x2) ? "en" : "dis"); | ||
932 | |||
933 | mmr = bfin_read_SYSCR(); | ||
934 | printk(KERN_INFO "Boot Mode: %i\n", mmr & 0xF); | ||
898 | 935 | ||
899 | /* Newer parts mirror SWRST bits in SYSCR */ | 936 | /* Newer parts mirror SWRST bits in SYSCR */ |
900 | #if defined(CONFIG_BF53x) || defined(CONFIG_BF561) || \ | 937 | #if defined(CONFIG_BF53x) || defined(CONFIG_BF561) || \ |
@@ -902,7 +939,7 @@ void __init setup_arch(char **cmdline_p) | |||
902 | _bfin_swrst = bfin_read_SWRST(); | 939 | _bfin_swrst = bfin_read_SWRST(); |
903 | #else | 940 | #else |
904 | /* Clear boot mode field */ | 941 | /* Clear boot mode field */ |
905 | _bfin_swrst = bfin_read_SYSCR() & ~0xf; | 942 | _bfin_swrst = mmr & ~0xf; |
906 | #endif | 943 | #endif |
907 | 944 | ||
908 | #ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT | 945 | #ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT |
@@ -999,8 +1036,6 @@ void __init setup_arch(char **cmdline_p) | |||
999 | static int __init topology_init(void) | 1036 | static int __init topology_init(void) |
1000 | { | 1037 | { |
1001 | unsigned int cpu; | 1038 | unsigned int cpu; |
1002 | /* Record CPU-private information for the boot processor. */ | ||
1003 | bfin_setup_cpudata(0); | ||
1004 | 1039 | ||
1005 | for_each_possible_cpu(cpu) { | 1040 | for_each_possible_cpu(cpu) { |
1006 | register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu); | 1041 | register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu); |
@@ -1246,12 +1281,14 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1246 | dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS, | 1281 | dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS, |
1247 | BFIN_DLINES); | 1282 | BFIN_DLINES); |
1248 | #ifdef __ARCH_SYNC_CORE_DCACHE | 1283 | #ifdef __ARCH_SYNC_CORE_DCACHE |
1249 | seq_printf(m, "SMP Dcache Flushes\t: %lu\n\n", dcache_invld_count[cpu_num]); | 1284 | seq_printf(m, "dcache flushes\t: %lu\n", dcache_invld_count[cpu_num]); |
1250 | #endif | 1285 | #endif |
1251 | #ifdef __ARCH_SYNC_CORE_ICACHE | 1286 | #ifdef __ARCH_SYNC_CORE_ICACHE |
1252 | seq_printf(m, "SMP Icache Flushes\t: %lu\n\n", icache_invld_count[cpu_num]); | 1287 | seq_printf(m, "icache flushes\t: %lu\n", icache_invld_count[cpu_num]); |
1253 | #endif | 1288 | #endif |
1254 | 1289 | ||
1290 | seq_printf(m, "\n"); | ||
1291 | |||
1255 | if (cpu_num != num_possible_cpus() - 1) | 1292 | if (cpu_num != num_possible_cpus() - 1) |
1256 | return 0; | 1293 | return 0; |
1257 | 1294 | ||
@@ -1275,13 +1312,11 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1275 | " in data cache\n"); | 1312 | " in data cache\n"); |
1276 | } | 1313 | } |
1277 | seq_printf(m, "board name\t: %s\n", bfin_board_name); | 1314 | seq_printf(m, "board name\t: %s\n", bfin_board_name); |
1278 | seq_printf(m, "board memory\t: %ld kB (0x%p -> 0x%p)\n", | 1315 | seq_printf(m, "board memory\t: %ld kB (0x%08lx -> 0x%08lx)\n", |
1279 | physical_mem_end >> 10, (void *)0, (void *)physical_mem_end); | 1316 | physical_mem_end >> 10, 0ul, physical_mem_end); |
1280 | seq_printf(m, "kernel memory\t: %d kB (0x%p -> 0x%p)\n", | 1317 | seq_printf(m, "kernel memory\t: %d kB (0x%08lx -> 0x%08lx)\n", |
1281 | ((int)memory_end - (int)_rambase) >> 10, | 1318 | ((int)memory_end - (int)_rambase) >> 10, |
1282 | (void *)_rambase, | 1319 | _rambase, memory_end); |
1283 | (void *)memory_end); | ||
1284 | seq_printf(m, "\n"); | ||
1285 | 1320 | ||
1286 | return 0; | 1321 | return 0; |
1287 | } | 1322 | } |
@@ -1289,7 +1324,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1289 | static void *c_start(struct seq_file *m, loff_t *pos) | 1324 | static void *c_start(struct seq_file *m, loff_t *pos) |
1290 | { | 1325 | { |
1291 | if (*pos == 0) | 1326 | if (*pos == 0) |
1292 | *pos = first_cpu(cpu_online_map); | 1327 | *pos = cpumask_first(cpu_online_mask); |
1293 | if (*pos >= num_online_cpus()) | 1328 | if (*pos >= num_online_cpus()) |
1294 | return NULL; | 1329 | return NULL; |
1295 | 1330 | ||
@@ -1298,7 +1333,7 @@ static void *c_start(struct seq_file *m, loff_t *pos) | |||
1298 | 1333 | ||
1299 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) | 1334 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) |
1300 | { | 1335 | { |
1301 | *pos = next_cpu(*pos, cpu_online_map); | 1336 | *pos = cpumask_next(*pos, cpu_online_mask); |
1302 | 1337 | ||
1303 | return c_start(m, pos); | 1338 | return c_start(m, pos); |
1304 | } | 1339 | } |