diff options
author | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 01:31:40 -0400 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2006-09-27 01:31:40 -0400 |
commit | 5b19c9081fbd0882c936ec087bf9055a20251dec (patch) | |
tree | 3bfb5779699b485fcf524ea34dd227e42f74ae78 | |
parent | 555ef1963029d19d2367acd09f6b9a6a0056f217 (diff) |
sh: Support for SH7770/SH7780 CPU subtypes.
Merge support for SH7770 and SH7780 SH-4A subtypes.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
-rw-r--r-- | arch/sh/kernel/cpu/sh4/ex.S | 164 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/probe.c | 15 | ||||
-rw-r--r-- | arch/sh/kernel/cpu/sh4/sq.c | 2 | ||||
-rw-r--r-- | arch/sh/mm/tlb-sh4.c | 4 | ||||
-rw-r--r-- | include/asm-sh/bugs.h | 4 | ||||
-rw-r--r-- | include/asm-sh/cpu-sh4/cache.h | 2 |
6 files changed, 191 insertions, 0 deletions
diff --git a/arch/sh/kernel/cpu/sh4/ex.S b/arch/sh/kernel/cpu/sh4/ex.S index 26a27df06505..af5ecbddea55 100644 --- a/arch/sh/kernel/cpu/sh4/ex.S +++ b/arch/sh/kernel/cpu/sh4/ex.S | |||
@@ -72,6 +72,7 @@ ENTRY(interrupt_table) | |||
72 | .long do_IRQ ! 1110 | 72 | .long do_IRQ ! 1110 |
73 | .long exception_error | 73 | .long exception_error |
74 | ! Internal hardware | 74 | ! Internal hardware |
75 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | ||
75 | .long do_IRQ ! TMU0 tuni0 /* 400 */ | 76 | .long do_IRQ ! TMU0 tuni0 /* 400 */ |
76 | .long do_IRQ ! TMU1 tuni1 | 77 | .long do_IRQ ! TMU1 tuni1 |
77 | .long do_IRQ ! TMU2 tuni2 | 78 | .long do_IRQ ! TMU2 tuni2 |
@@ -379,5 +380,168 @@ ENTRY(interrupt_table) | |||
379 | .long exception_error ! 141 0x13a0 | 380 | .long exception_error ! 141 0x13a0 |
380 | .long exception_error ! 142 0x13c0 | 381 | .long exception_error ! 142 0x13c0 |
381 | .long exception_error ! 143 0x13e0 | 382 | .long exception_error ! 143 0x13e0 |
383 | #elif defined(CONFIG_CPU_SUBTYPE_SH7770) | ||
384 | .long do_IRQ ! 50 0x840 | ||
385 | .long do_IRQ ! 51 0x860 | ||
386 | .long do_IRQ ! 52 0x880 | ||
387 | .long do_IRQ ! 53 0x8a0 | ||
388 | .long do_IRQ ! 54 0x8c0 | ||
389 | .long do_IRQ ! 55 0x8e0 | ||
390 | .long do_IRQ ! 56 0x900 | ||
391 | .long do_IRQ ! 57 0x920 | ||
392 | .long do_IRQ ! 58 0x940 | ||
393 | .long do_IRQ ! 59 0x960 | ||
394 | .long do_IRQ ! 60 0x980 | ||
395 | .long do_IRQ ! 61 0x9a0 | ||
396 | .long do_IRQ ! 62 0x9c0 | ||
397 | .long do_IRQ ! 63 0x9e0 | ||
398 | .long do_IRQ ! 64 0xa00 | ||
399 | .long do_IRQ ! 65 0xa20 | ||
400 | .long do_IRQ ! 66 0xa4d | ||
401 | .long do_IRQ ! 67 0xa60 | ||
402 | .long do_IRQ ! 68 0xa80 | ||
403 | .long do_IRQ ! 69 0xaa0 | ||
404 | .long do_IRQ ! 70 0xac0 | ||
405 | .long do_IRQ ! 71 0xae0 | ||
406 | .long do_IRQ ! 72 0xb00 | ||
407 | .long do_IRQ ! 73 0xb20 | ||
408 | .long do_IRQ ! 74 0xb40 | ||
409 | .long do_IRQ ! 75 0xb60 | ||
410 | .long do_IRQ ! 76 0xb80 | ||
411 | .long do_IRQ ! 77 0xba0 | ||
412 | .long do_IRQ ! 78 0xbc0 | ||
413 | .long do_IRQ ! 79 0xbe0 | ||
414 | .long do_IRQ ! 80 0xc00 | ||
415 | .long do_IRQ ! 81 0xc20 | ||
416 | .long do_IRQ ! 82 0xc40 | ||
417 | .long do_IRQ ! 83 0xc60 | ||
418 | .long do_IRQ ! 84 0xc80 | ||
419 | .long do_IRQ ! 85 0xca0 | ||
420 | .long do_IRQ ! 86 0xcc0 | ||
421 | .long do_IRQ ! 87 0xce0 | ||
422 | .long do_IRQ ! 88 0xd00 | ||
423 | .long do_IRQ ! 89 0xd20 | ||
424 | .long do_IRQ ! 90 0xd40 | ||
425 | .long do_IRQ ! 91 0xd60 | ||
426 | .long do_IRQ ! 92 0xd80 | ||
427 | .long do_IRQ ! 93 0xda0 | ||
428 | .long do_IRQ ! 94 0xdc0 | ||
429 | .long do_IRQ ! 95 0xde0 | ||
430 | .long do_IRQ ! 96 0xe00 | ||
431 | .long do_IRQ ! 97 0xe20 | ||
432 | .long do_IRQ ! 98 0xe40 | ||
433 | .long do_IRQ ! 99 0xe60 | ||
434 | .long do_IRQ ! 100 0xe80 | ||
435 | .long do_IRQ ! 101 0xea0 | ||
436 | .long do_IRQ ! 102 0xec0 | ||
437 | .long do_IRQ ! 103 0xee0 | ||
438 | .long do_IRQ ! 104 0xf00 | ||
439 | .long do_IRQ ! 105 0xf20 | ||
440 | .long do_IRQ ! 106 0xf40 | ||
441 | .long do_IRQ ! 107 0xf60 | ||
442 | .long do_IRQ ! 108 0xf80 | ||
443 | #endif | ||
444 | #else | ||
445 | .long exception_error /* 400 */ | ||
446 | .long exception_error | ||
447 | .long exception_error | ||
448 | .long exception_error | ||
449 | .long do_IRQ ! RTC ati | ||
450 | .long do_IRQ ! pri | ||
451 | .long do_IRQ ! cui | ||
452 | .long exception_error | ||
453 | .long exception_error /* 500 */ | ||
454 | .long exception_error | ||
455 | .long exception_error | ||
456 | .long do_IRQ ! WDT iti /* 560 */ | ||
457 | .long do_IRQ ! TMU-ch0 | ||
458 | .long do_IRQ ! TMU-ch1 | ||
459 | .long do_IRQ ! TMU-ch2 | ||
460 | .long do_IRQ ! ticpi2 /* 5E0 */ | ||
461 | .long do_IRQ ! 32 Hitachi UDI /* 600 */ | ||
462 | .long exception_error | ||
463 | .long do_IRQ ! 34 DMAC dmte0 | ||
464 | .long do_IRQ ! 35 dmte1 | ||
465 | .long do_IRQ ! 36 dmte2 | ||
466 | .long do_IRQ ! 37 dmte3 | ||
467 | .long do_IRQ ! 38 dmae | ||
468 | .long exception_error ! 39 /* 6E0 */ | ||
469 | .long do_IRQ ! 40 SCIF-ch0 eri /* 700 */ | ||
470 | .long do_IRQ ! 41 rxi | ||
471 | .long do_IRQ ! 42 bri | ||
472 | .long do_IRQ ! 43 txi | ||
473 | .long do_IRQ ! 44 DMAC dmte4 /* 780 */ | ||
474 | .long do_IRQ ! 45 dmte5 | ||
475 | .long do_IRQ ! 46 dmte6 | ||
476 | .long do_IRQ ! 47 dmte7 /* 7E0 */ | ||
477 | #if defined(CONFIG_SH_FPU) | ||
478 | .long do_fpu_state_restore ! 48 /* 800 */ | ||
479 | .long do_fpu_state_restore ! 49 /* 820 */ | ||
480 | #else | ||
481 | .long exception_error | ||
482 | .long exception_error | ||
483 | #endif | ||
484 | .long exception_error /* 840 */ | ||
485 | .long exception_error | ||
486 | .long exception_error | ||
487 | .long exception_error | ||
488 | .long exception_error | ||
489 | .long exception_error | ||
490 | .long do_IRQ ! 56 CMT /* 900 */ | ||
491 | .long exception_error | ||
492 | .long exception_error | ||
493 | .long exception_error | ||
494 | .long do_IRQ ! 60 HAC | ||
495 | .long exception_error | ||
496 | .long exception_error | ||
497 | .long exception_error | ||
498 | .long do_IRQ ! PCI serr /* A00 */ | ||
499 | .long do_IRQ ! INTA | ||
500 | .long do_IRQ ! INTB | ||
501 | .long do_IRQ ! INTC | ||
502 | .long do_IRQ ! INTD | ||
503 | .long do_IRQ ! err | ||
504 | .long do_IRQ ! pwd3 | ||
505 | .long do_IRQ ! pwd2 | ||
506 | .long do_IRQ ! pwd1 /* B00 */ | ||
507 | .long do_IRQ ! pwd0 | ||
508 | .long exception_error | ||
509 | .long exception_error | ||
510 | .long do_IRQ ! SCIF-ch1 eri /* B80 */ | ||
511 | .long do_IRQ ! rxi | ||
512 | .long do_IRQ ! bri | ||
513 | .long do_IRQ ! txi | ||
514 | .long do_IRQ ! SIOF /* C00 */ | ||
515 | .long exception_error | ||
516 | .long exception_error | ||
517 | .long exception_error | ||
518 | .long do_IRQ ! HSPI /* C80 */ | ||
519 | .long exception_error | ||
520 | .long exception_error | ||
521 | .long exception_error | ||
522 | .long do_IRQ ! MMCIF fatat /* D00 */ | ||
523 | .long do_IRQ ! tran | ||
524 | .long do_IRQ ! err | ||
525 | .long do_IRQ ! frdy | ||
526 | .long do_IRQ ! DMAC dmint8 /* D80 */ | ||
527 | .long do_IRQ ! dmint9 | ||
528 | .long do_IRQ ! dmint10 | ||
529 | .long do_IRQ ! dmint11 | ||
530 | .long do_IRQ ! TMU-ch3 /* E00 */ | ||
531 | .long do_IRQ ! TMU-ch4 | ||
532 | .long do_IRQ ! TMU-ch5 | ||
533 | .long exception_error | ||
534 | .long do_IRQ ! SSI | ||
535 | .long exception_error | ||
536 | .long exception_error | ||
537 | .long exception_error | ||
538 | .long do_IRQ ! FLCTL flste /* F00 */ | ||
539 | .long do_IRQ ! fltend | ||
540 | .long do_IRQ ! fltrq0 | ||
541 | .long do_IRQ ! fltrq1 | ||
542 | .long do_IRQ ! GPIO gpioi0 /* F80 */ | ||
543 | .long do_IRQ ! gpioi1 | ||
544 | .long do_IRQ ! gpioi2 | ||
545 | .long do_IRQ ! gpioi3 | ||
382 | #endif | 546 | #endif |
383 | 547 | ||
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index 89986e70d041..85ff48c1533a 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -78,6 +78,21 @@ int __init detect_cpu_and_cache_system(void) | |||
78 | cpu_data->dcache.ways = 4; | 78 | cpu_data->dcache.ways = 4; |
79 | cpu_data->flags &= ~CPU_HAS_FPU; | 79 | cpu_data->flags &= ~CPU_HAS_FPU; |
80 | break; | 80 | break; |
81 | case 0x2001: | ||
82 | case 0x2004: | ||
83 | cpu_data->type = CPU_SH7770; | ||
84 | cpu_data->icache.ways = 4; | ||
85 | cpu_data->dcache.ways = 4; | ||
86 | break; | ||
87 | case 0x2006: | ||
88 | case 0x200A: | ||
89 | if (prr == 0x61) | ||
90 | cpu_data->type = CPU_SH7781; | ||
91 | else | ||
92 | cpu_data->type = CPU_SH7780; | ||
93 | cpu_data->icache.ways = 4; | ||
94 | cpu_data->dcache.ways = 4; | ||
95 | break; | ||
81 | case 0x8000: | 96 | case 0x8000: |
82 | cpu_data->type = CPU_ST40RA; | 97 | cpu_data->type = CPU_ST40RA; |
83 | break; | 98 | break; |
diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index 00f6a3c8c43b..32c93b781b51 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c | |||
@@ -166,7 +166,9 @@ static struct sq_mapping *__sq_remap(struct sq_mapping *map) | |||
166 | ctrl_outl((pteh & MMU_VPN_MASK) | get_asid(), MMU_PTEH); | 166 | ctrl_outl((pteh & MMU_VPN_MASK) | get_asid(), MMU_PTEH); |
167 | 167 | ||
168 | ptel = map->addr & PAGE_MASK; | 168 | ptel = map->addr & PAGE_MASK; |
169 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | ||
169 | ctrl_outl(((ptel >> 28) & 0xe) | (ptel & 0x1), MMU_PTEA); | 170 | ctrl_outl(((ptel >> 28) & 0xe) | (ptel & 0x1), MMU_PTEA); |
171 | #endif | ||
170 | 172 | ||
171 | pgprot = pgprot_noncached(PAGE_KERNEL); | 173 | pgprot = pgprot_noncached(PAGE_KERNEL); |
172 | 174 | ||
diff --git a/arch/sh/mm/tlb-sh4.c b/arch/sh/mm/tlb-sh4.c index 115b1b6be40b..96e5fb0ac4fa 100644 --- a/arch/sh/mm/tlb-sh4.c +++ b/arch/sh/mm/tlb-sh4.c | |||
@@ -36,7 +36,9 @@ void update_mmu_cache(struct vm_area_struct * vma, | |||
36 | unsigned long vpn; | 36 | unsigned long vpn; |
37 | struct page *page; | 37 | struct page *page; |
38 | unsigned long pfn; | 38 | unsigned long pfn; |
39 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | ||
39 | unsigned long ptea; | 40 | unsigned long ptea; |
41 | #endif | ||
40 | 42 | ||
41 | /* Ptrace may call this routine. */ | 43 | /* Ptrace may call this routine. */ |
42 | if (vma && current->active_mm != vma->vm_mm) | 44 | if (vma && current->active_mm != vma->vm_mm) |
@@ -59,10 +61,12 @@ void update_mmu_cache(struct vm_area_struct * vma, | |||
59 | ctrl_outl(vpn, MMU_PTEH); | 61 | ctrl_outl(vpn, MMU_PTEH); |
60 | 62 | ||
61 | pteval = pte_val(pte); | 63 | pteval = pte_val(pte); |
64 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | ||
62 | /* Set PTEA register */ | 65 | /* Set PTEA register */ |
63 | /* TODO: make this look less hacky */ | 66 | /* TODO: make this look less hacky */ |
64 | ptea = ((pteval >> 28) & 0xe) | (pteval & 0x1); | 67 | ptea = ((pteval >> 28) & 0xe) | (pteval & 0x1); |
65 | ctrl_outl(ptea, MMU_PTEA); | 68 | ctrl_outl(ptea, MMU_PTEA); |
69 | #endif | ||
66 | 70 | ||
67 | /* Set PTEL register */ | 71 | /* Set PTEL register */ |
68 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ | 72 | pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */ |
diff --git a/include/asm-sh/bugs.h b/include/asm-sh/bugs.h index a6de3d06a3d9..b4000c8bf31b 100644 --- a/include/asm-sh/bugs.h +++ b/include/asm-sh/bugs.h | |||
@@ -32,6 +32,10 @@ static void __init check_bugs(void) | |||
32 | case CPU_SH7750 ... CPU_SH4_501: | 32 | case CPU_SH7750 ... CPU_SH4_501: |
33 | *p++ = '4'; | 33 | *p++ = '4'; |
34 | break; | 34 | break; |
35 | case CPU_SH7770 ... CPU_SH7781: | ||
36 | *p++ = '4'; | ||
37 | *p++ = 'a'; | ||
38 | break; | ||
35 | default: | 39 | default: |
36 | *p++ = '?'; | 40 | *p++ = '?'; |
37 | *p++ = '!'; | 41 | *p++ = '!'; |
diff --git a/include/asm-sh/cpu-sh4/cache.h b/include/asm-sh/cpu-sh4/cache.h index 1fe20359312c..6e9c7e6ee8e4 100644 --- a/include/asm-sh/cpu-sh4/cache.h +++ b/include/asm-sh/cpu-sh4/cache.h | |||
@@ -22,7 +22,9 @@ | |||
22 | #define CCR_CACHE_ICE 0x0100 /* Instruction Cache Enable */ | 22 | #define CCR_CACHE_ICE 0x0100 /* Instruction Cache Enable */ |
23 | #define CCR_CACHE_ICI 0x0800 /* IC Invalidate */ | 23 | #define CCR_CACHE_ICI 0x0800 /* IC Invalidate */ |
24 | #define CCR_CACHE_IIX 0x8000 /* IC Index Enable */ | 24 | #define CCR_CACHE_IIX 0x8000 /* IC Index Enable */ |
25 | #ifndef CONFIG_CPU_SUBTYPE_SH7780 | ||
25 | #define CCR_CACHE_EMODE 0x80000000 /* EMODE Enable */ | 26 | #define CCR_CACHE_EMODE 0x80000000 /* EMODE Enable */ |
27 | #endif | ||
26 | 28 | ||
27 | /* Default CCR setup: 8k+16k-byte cache,P1-wb,enable */ | 29 | /* Default CCR setup: 8k+16k-byte cache,P1-wb,enable */ |
28 | #define CCR_CACHE_ENABLE (CCR_CACHE_OCE|CCR_CACHE_ICE) | 30 | #define CCR_CACHE_ENABLE (CCR_CACHE_OCE|CCR_CACHE_ICE) |