diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-09-06 22:32:21 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-09-06 22:32:21 -0400 |
| commit | a22a9a90cfbcc91c3e0f8dc8549535e2786d3e7e (patch) | |
| tree | 799e60e111e2f5179c7ffd81483abd1d2397003b | |
| parent | 70bb08962ea9bd50797ae9f16b2493f5f7c65053 (diff) | |
| parent | 0011036beeffeada15acd1936d67988de21ca65e (diff) | |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
[MIPS] Probe initrd header only if explicitly specified
[MIPS] TX39xx: Add missing local_flush_icache_range initialization
[MIPS] TXx9: Fix txx9_pcode initialization
[MIPS] Fix WARNING: at kernel/smp.c:290
[MIPS] Fix data bus error recovery
| -rw-r--r-- | arch/mips/Kconfig | 9 | ||||
| -rw-r--r-- | arch/mips/kernel/setup.c | 33 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 18 | ||||
| -rw-r--r-- | arch/mips/mm/c-r3k.c | 1 | ||||
| -rw-r--r-- | arch/mips/mm/c-r4k.c | 18 | ||||
| -rw-r--r-- | arch/mips/mm/c-tx39.c | 2 | ||||
| -rw-r--r-- | arch/mips/mm/cache.c | 1 | ||||
| -rw-r--r-- | arch/mips/mm/tlbex.c | 6 | ||||
| -rw-r--r-- | arch/mips/txx9/generic/setup.c | 1 | ||||
| -rw-r--r-- | include/asm-mips/cacheflush.h | 1 |
10 files changed, 59 insertions, 31 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 4da736e25333..49896a2a1d72 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1886,6 +1886,15 @@ config STACKTRACE_SUPPORT | |||
| 1886 | 1886 | ||
| 1887 | source "init/Kconfig" | 1887 | source "init/Kconfig" |
| 1888 | 1888 | ||
| 1889 | config PROBE_INITRD_HEADER | ||
| 1890 | bool "Probe initrd header created by addinitrd" | ||
| 1891 | depends on BLK_DEV_INITRD | ||
| 1892 | help | ||
| 1893 | Probe initrd header at the last page of kernel image. | ||
| 1894 | Say Y here if you are using arch/mips/boot/addinitrd.c to | ||
| 1895 | add initrd or initramfs image to the kernel image. | ||
| 1896 | Otherwise, say N. | ||
| 1897 | |||
| 1889 | menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)" | 1898 | menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)" |
| 1890 | 1899 | ||
| 1891 | config HW_HAS_EISA | 1900 | config HW_HAS_EISA |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 2aae76bce293..16f8edfe5cdc 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
| @@ -160,30 +160,33 @@ early_param("rd_size", rd_size_early); | |||
| 160 | static unsigned long __init init_initrd(void) | 160 | static unsigned long __init init_initrd(void) |
| 161 | { | 161 | { |
| 162 | unsigned long end; | 162 | unsigned long end; |
| 163 | u32 *initrd_header; | ||
| 164 | 163 | ||
| 165 | /* | 164 | /* |
| 166 | * Board specific code or command line parser should have | 165 | * Board specific code or command line parser should have |
| 167 | * already set up initrd_start and initrd_end. In these cases | 166 | * already set up initrd_start and initrd_end. In these cases |
| 168 | * perfom sanity checks and use them if all looks good. | 167 | * perfom sanity checks and use them if all looks good. |
| 169 | */ | 168 | */ |
| 170 | if (initrd_start && initrd_end > initrd_start) | 169 | if (!initrd_start || initrd_end <= initrd_start) { |
| 171 | goto sanitize; | 170 | #ifdef CONFIG_PROBE_INITRD_HEADER |
| 171 | u32 *initrd_header; | ||
| 172 | 172 | ||
| 173 | /* | 173 | /* |
| 174 | * See if initrd has been added to the kernel image by | 174 | * See if initrd has been added to the kernel image by |
| 175 | * arch/mips/boot/addinitrd.c. In that case a header is | 175 | * arch/mips/boot/addinitrd.c. In that case a header is |
| 176 | * prepended to initrd and is made up by 8 bytes. The fisrt | 176 | * prepended to initrd and is made up by 8 bytes. The first |
| 177 | * word is a magic number and the second one is the size of | 177 | * word is a magic number and the second one is the size of |
| 178 | * initrd. Initrd start must be page aligned in any cases. | 178 | * initrd. Initrd start must be page aligned in any cases. |
| 179 | */ | 179 | */ |
| 180 | initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8; | 180 | initrd_header = __va(PAGE_ALIGN(__pa_symbol(&_end) + 8)) - 8; |
| 181 | if (initrd_header[0] != 0x494E5244) | 181 | if (initrd_header[0] != 0x494E5244) |
| 182 | goto disable; | ||
| 183 | initrd_start = (unsigned long)(initrd_header + 2); | ||
| 184 | initrd_end = initrd_start + initrd_header[1]; | ||
| 185 | #else | ||
| 182 | goto disable; | 186 | goto disable; |
| 183 | initrd_start = (unsigned long)(initrd_header + 2); | 187 | #endif |
| 184 | initrd_end = initrd_start + initrd_header[1]; | 188 | } |
| 185 | 189 | ||
| 186 | sanitize: | ||
| 187 | if (initrd_start & ~PAGE_MASK) { | 190 | if (initrd_start & ~PAGE_MASK) { |
| 188 | pr_err("initrd start must be page aligned\n"); | 191 | pr_err("initrd start must be page aligned\n"); |
| 189 | goto disable; | 192 | goto disable; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 426cced1e9dc..6bee29097a56 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -373,8 +373,8 @@ void __noreturn die(const char * str, const struct pt_regs * regs) | |||
| 373 | do_exit(SIGSEGV); | 373 | do_exit(SIGSEGV); |
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | extern const struct exception_table_entry __start___dbe_table[]; | 376 | extern struct exception_table_entry __start___dbe_table[]; |
| 377 | extern const struct exception_table_entry __stop___dbe_table[]; | 377 | extern struct exception_table_entry __stop___dbe_table[]; |
| 378 | 378 | ||
| 379 | __asm__( | 379 | __asm__( |
| 380 | " .section __dbe_table, \"a\"\n" | 380 | " .section __dbe_table, \"a\"\n" |
| @@ -1200,7 +1200,7 @@ void *set_except_vector(int n, void *addr) | |||
| 1200 | if (n == 0 && cpu_has_divec) { | 1200 | if (n == 0 && cpu_has_divec) { |
| 1201 | *(u32 *)(ebase + 0x200) = 0x08000000 | | 1201 | *(u32 *)(ebase + 0x200) = 0x08000000 | |
| 1202 | (0x03ffffff & (handler >> 2)); | 1202 | (0x03ffffff & (handler >> 2)); |
| 1203 | flush_icache_range(ebase + 0x200, ebase + 0x204); | 1203 | local_flush_icache_range(ebase + 0x200, ebase + 0x204); |
| 1204 | } | 1204 | } |
| 1205 | return (void *)old_handler; | 1205 | return (void *)old_handler; |
| 1206 | } | 1206 | } |
| @@ -1283,7 +1283,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1283 | *w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff); | 1283 | *w = (*w & 0xffff0000) | (((u32)handler >> 16) & 0xffff); |
| 1284 | w = (u32 *)(b + ori_offset); | 1284 | w = (u32 *)(b + ori_offset); |
| 1285 | *w = (*w & 0xffff0000) | ((u32)handler & 0xffff); | 1285 | *w = (*w & 0xffff0000) | ((u32)handler & 0xffff); |
| 1286 | flush_icache_range((unsigned long)b, (unsigned long)(b+handler_len)); | 1286 | local_flush_icache_range((unsigned long)b, |
| 1287 | (unsigned long)(b+handler_len)); | ||
| 1287 | } | 1288 | } |
| 1288 | else { | 1289 | else { |
| 1289 | /* | 1290 | /* |
| @@ -1295,7 +1296,8 @@ static void *set_vi_srs_handler(int n, vi_handler_t addr, int srs) | |||
| 1295 | w = (u32 *)b; | 1296 | w = (u32 *)b; |
| 1296 | *w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */ | 1297 | *w++ = 0x08000000 | (((u32)handler >> 2) & 0x03fffff); /* j handler */ |
| 1297 | *w = 0; | 1298 | *w = 0; |
| 1298 | flush_icache_range((unsigned long)b, (unsigned long)(b+8)); | 1299 | local_flush_icache_range((unsigned long)b, |
| 1300 | (unsigned long)(b+8)); | ||
| 1299 | } | 1301 | } |
| 1300 | 1302 | ||
| 1301 | return (void *)old_handler; | 1303 | return (void *)old_handler; |
| @@ -1515,7 +1517,7 @@ void __cpuinit per_cpu_trap_init(void) | |||
| 1515 | void __init set_handler(unsigned long offset, void *addr, unsigned long size) | 1517 | void __init set_handler(unsigned long offset, void *addr, unsigned long size) |
| 1516 | { | 1518 | { |
| 1517 | memcpy((void *)(ebase + offset), addr, size); | 1519 | memcpy((void *)(ebase + offset), addr, size); |
| 1518 | flush_icache_range(ebase + offset, ebase + offset + size); | 1520 | local_flush_icache_range(ebase + offset, ebase + offset + size); |
| 1519 | } | 1521 | } |
| 1520 | 1522 | ||
| 1521 | static char panic_null_cerr[] __cpuinitdata = | 1523 | static char panic_null_cerr[] __cpuinitdata = |
| @@ -1680,6 +1682,8 @@ void __init trap_init(void) | |||
| 1680 | signal32_init(); | 1682 | signal32_init(); |
| 1681 | #endif | 1683 | #endif |
| 1682 | 1684 | ||
| 1683 | flush_icache_range(ebase, ebase + 0x400); | 1685 | local_flush_icache_range(ebase, ebase + 0x400); |
| 1684 | flush_tlb_handlers(); | 1686 | flush_tlb_handlers(); |
| 1687 | |||
| 1688 | sort_extable(__start___dbe_table, __stop___dbe_table); | ||
| 1685 | } | 1689 | } |
diff --git a/arch/mips/mm/c-r3k.c b/arch/mips/mm/c-r3k.c index 27a5b466c85c..5500c20c79ae 100644 --- a/arch/mips/mm/c-r3k.c +++ b/arch/mips/mm/c-r3k.c | |||
| @@ -320,6 +320,7 @@ void __cpuinit r3k_cache_init(void) | |||
| 320 | flush_cache_range = r3k_flush_cache_range; | 320 | flush_cache_range = r3k_flush_cache_range; |
| 321 | flush_cache_page = r3k_flush_cache_page; | 321 | flush_cache_page = r3k_flush_cache_page; |
| 322 | flush_icache_range = r3k_flush_icache_range; | 322 | flush_icache_range = r3k_flush_icache_range; |
| 323 | local_flush_icache_range = r3k_flush_icache_range; | ||
| 323 | 324 | ||
| 324 | flush_cache_sigtramp = r3k_flush_cache_sigtramp; | 325 | flush_cache_sigtramp = r3k_flush_cache_sigtramp; |
| 325 | local_flush_data_cache_page = local_r3k_flush_data_cache_page; | 326 | local_flush_data_cache_page = local_r3k_flush_data_cache_page; |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 71df3390c07b..6e99665ae860 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
| @@ -543,12 +543,8 @@ struct flush_icache_range_args { | |||
| 543 | unsigned long end; | 543 | unsigned long end; |
| 544 | }; | 544 | }; |
| 545 | 545 | ||
| 546 | static inline void local_r4k_flush_icache_range(void *args) | 546 | static inline void local_r4k_flush_icache_range(unsigned long start, unsigned long end) |
| 547 | { | 547 | { |
| 548 | struct flush_icache_range_args *fir_args = args; | ||
| 549 | unsigned long start = fir_args->start; | ||
| 550 | unsigned long end = fir_args->end; | ||
| 551 | |||
| 552 | if (!cpu_has_ic_fills_f_dc) { | 548 | if (!cpu_has_ic_fills_f_dc) { |
| 553 | if (end - start >= dcache_size) { | 549 | if (end - start >= dcache_size) { |
| 554 | r4k_blast_dcache(); | 550 | r4k_blast_dcache(); |
| @@ -564,6 +560,15 @@ static inline void local_r4k_flush_icache_range(void *args) | |||
| 564 | protected_blast_icache_range(start, end); | 560 | protected_blast_icache_range(start, end); |
| 565 | } | 561 | } |
| 566 | 562 | ||
| 563 | static inline void local_r4k_flush_icache_range_ipi(void *args) | ||
| 564 | { | ||
| 565 | struct flush_icache_range_args *fir_args = args; | ||
| 566 | unsigned long start = fir_args->start; | ||
| 567 | unsigned long end = fir_args->end; | ||
| 568 | |||
| 569 | local_r4k_flush_icache_range(start, end); | ||
| 570 | } | ||
| 571 | |||
| 567 | static void r4k_flush_icache_range(unsigned long start, unsigned long end) | 572 | static void r4k_flush_icache_range(unsigned long start, unsigned long end) |
| 568 | { | 573 | { |
| 569 | struct flush_icache_range_args args; | 574 | struct flush_icache_range_args args; |
| @@ -571,7 +576,7 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end) | |||
| 571 | args.start = start; | 576 | args.start = start; |
| 572 | args.end = end; | 577 | args.end = end; |
| 573 | 578 | ||
| 574 | r4k_on_each_cpu(local_r4k_flush_icache_range, &args, 1); | 579 | r4k_on_each_cpu(local_r4k_flush_icache_range_ipi, &args, 1); |
| 575 | instruction_hazard(); | 580 | instruction_hazard(); |
| 576 | } | 581 | } |
| 577 | 582 | ||
| @@ -1375,6 +1380,7 @@ void __cpuinit r4k_cache_init(void) | |||
| 1375 | local_flush_data_cache_page = local_r4k_flush_data_cache_page; | 1380 | local_flush_data_cache_page = local_r4k_flush_data_cache_page; |
| 1376 | flush_data_cache_page = r4k_flush_data_cache_page; | 1381 | flush_data_cache_page = r4k_flush_data_cache_page; |
| 1377 | flush_icache_range = r4k_flush_icache_range; | 1382 | flush_icache_range = r4k_flush_icache_range; |
| 1383 | local_flush_icache_range = local_r4k_flush_icache_range; | ||
| 1378 | 1384 | ||
| 1379 | #if defined(CONFIG_DMA_NONCOHERENT) | 1385 | #if defined(CONFIG_DMA_NONCOHERENT) |
| 1380 | if (coherentio) { | 1386 | if (coherentio) { |
diff --git a/arch/mips/mm/c-tx39.c b/arch/mips/mm/c-tx39.c index a9f7f1f5e9b4..f7c8f9ce39c1 100644 --- a/arch/mips/mm/c-tx39.c +++ b/arch/mips/mm/c-tx39.c | |||
| @@ -362,6 +362,7 @@ void __cpuinit tx39_cache_init(void) | |||
| 362 | flush_cache_range = (void *) tx39h_flush_icache_all; | 362 | flush_cache_range = (void *) tx39h_flush_icache_all; |
| 363 | flush_cache_page = (void *) tx39h_flush_icache_all; | 363 | flush_cache_page = (void *) tx39h_flush_icache_all; |
| 364 | flush_icache_range = (void *) tx39h_flush_icache_all; | 364 | flush_icache_range = (void *) tx39h_flush_icache_all; |
| 365 | local_flush_icache_range = (void *) tx39h_flush_icache_all; | ||
| 365 | 366 | ||
| 366 | flush_cache_sigtramp = (void *) tx39h_flush_icache_all; | 367 | flush_cache_sigtramp = (void *) tx39h_flush_icache_all; |
| 367 | local_flush_data_cache_page = (void *) tx39h_flush_icache_all; | 368 | local_flush_data_cache_page = (void *) tx39h_flush_icache_all; |
| @@ -390,6 +391,7 @@ void __cpuinit tx39_cache_init(void) | |||
| 390 | flush_cache_range = tx39_flush_cache_range; | 391 | flush_cache_range = tx39_flush_cache_range; |
| 391 | flush_cache_page = tx39_flush_cache_page; | 392 | flush_cache_page = tx39_flush_cache_page; |
| 392 | flush_icache_range = tx39_flush_icache_range; | 393 | flush_icache_range = tx39_flush_icache_range; |
| 394 | local_flush_icache_range = tx39_flush_icache_range; | ||
| 393 | 395 | ||
| 394 | flush_cache_sigtramp = tx39_flush_cache_sigtramp; | 396 | flush_cache_sigtramp = tx39_flush_cache_sigtramp; |
| 395 | local_flush_data_cache_page = local_tx39_flush_data_cache_page; | 397 | local_flush_data_cache_page = local_tx39_flush_data_cache_page; |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 034e8506f6ea..1eb7c71e3d6a 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
| @@ -29,6 +29,7 @@ void (*flush_cache_range)(struct vm_area_struct *vma, unsigned long start, | |||
| 29 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, | 29 | void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, |
| 30 | unsigned long pfn); | 30 | unsigned long pfn); |
| 31 | void (*flush_icache_range)(unsigned long start, unsigned long end); | 31 | void (*flush_icache_range)(unsigned long start, unsigned long end); |
| 32 | void (*local_flush_icache_range)(unsigned long start, unsigned long end); | ||
| 32 | 33 | ||
| 33 | void (*__flush_cache_vmap)(void); | 34 | void (*__flush_cache_vmap)(void); |
| 34 | void (*__flush_cache_vunmap)(void); | 35 | void (*__flush_cache_vunmap)(void); |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 76da73a5ab3c..979cf9197282 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
| @@ -1273,10 +1273,10 @@ void __cpuinit build_tlb_refill_handler(void) | |||
| 1273 | 1273 | ||
| 1274 | void __cpuinit flush_tlb_handlers(void) | 1274 | void __cpuinit flush_tlb_handlers(void) |
| 1275 | { | 1275 | { |
| 1276 | flush_icache_range((unsigned long)handle_tlbl, | 1276 | local_flush_icache_range((unsigned long)handle_tlbl, |
| 1277 | (unsigned long)handle_tlbl + sizeof(handle_tlbl)); | 1277 | (unsigned long)handle_tlbl + sizeof(handle_tlbl)); |
| 1278 | flush_icache_range((unsigned long)handle_tlbs, | 1278 | local_flush_icache_range((unsigned long)handle_tlbs, |
| 1279 | (unsigned long)handle_tlbs + sizeof(handle_tlbs)); | 1279 | (unsigned long)handle_tlbs + sizeof(handle_tlbs)); |
| 1280 | flush_icache_range((unsigned long)handle_tlbm, | 1280 | local_flush_icache_range((unsigned long)handle_tlbm, |
| 1281 | (unsigned long)handle_tlbm + sizeof(handle_tlbm)); | 1281 | (unsigned long)handle_tlbm + sizeof(handle_tlbm)); |
| 1282 | } | 1282 | } |
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index 0afe94c48fb6..fe6bee09cece 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c | |||
| @@ -53,6 +53,7 @@ txx9_reg_res_init(unsigned int pcode, unsigned long base, unsigned long size) | |||
| 53 | txx9_ce_res[i].name = txx9_ce_res_name[i]; | 53 | txx9_ce_res[i].name = txx9_ce_res_name[i]; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | txx9_pcode = pcode; | ||
| 56 | sprintf(txx9_pcode_str, "TX%x", pcode); | 57 | sprintf(txx9_pcode_str, "TX%x", pcode); |
| 57 | if (base) { | 58 | if (base) { |
| 58 | txx9_reg_res.start = base & 0xfffffffffULL; | 59 | txx9_reg_res.start = base & 0xfffffffffULL; |
diff --git a/include/asm-mips/cacheflush.h b/include/asm-mips/cacheflush.h index d5c0f2fda51b..03b1d69b142f 100644 --- a/include/asm-mips/cacheflush.h +++ b/include/asm-mips/cacheflush.h | |||
| @@ -63,6 +63,7 @@ static inline void flush_icache_page(struct vm_area_struct *vma, | |||
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | extern void (*flush_icache_range)(unsigned long start, unsigned long end); | 65 | extern void (*flush_icache_range)(unsigned long start, unsigned long end); |
| 66 | extern void (*local_flush_icache_range)(unsigned long start, unsigned long end); | ||
| 66 | 67 | ||
| 67 | extern void (*__flush_cache_vmap)(void); | 68 | extern void (*__flush_cache_vmap)(void); |
| 68 | 69 | ||
