1 | #include <libcpu/cpuIdent.h> |
---|
2 | #include <libcpu/raw_exception.h> |
---|
3 | |
---|
4 | #define MTIVPR(prefix) asm volatile("mtivpr %0"::"r"(prefix)); |
---|
5 | #define MTIVOR(x, vec) asm volatile("mtivor"#x" %0"::"r"(vec)); |
---|
6 | |
---|
7 | /* Use during early init for initializing the e500 IVOR/IVPR registers */ |
---|
8 | void |
---|
9 | e500_setup_raw_exceptions(void) |
---|
10 | { |
---|
11 | unsigned c; |
---|
12 | if ( ! (c = ppc_cpu_is_bookE()) || PPC_BOOKE_405 == c ) |
---|
13 | return; |
---|
14 | |
---|
15 | /* Set interupt vector prefix register */ |
---|
16 | MTIVPR( ppc_exc_vector_base); |
---|
17 | |
---|
18 | /* setup vectors to be compatible with classic PPC */ |
---|
19 | MTIVOR(0, ppc_get_vector_addr(ASM_BOOKE_CRIT_VECTOR)); /* Critical input not (yet) supported; use reset vector */ |
---|
20 | MTIVOR(1, ppc_get_vector_addr(ASM_MACH_VECTOR)); |
---|
21 | MTIVOR(2, ppc_get_vector_addr(ASM_PROT_VECTOR)); |
---|
22 | MTIVOR(3, ppc_get_vector_addr(ASM_ISI_VECTOR)); |
---|
23 | MTIVOR(4, ppc_get_vector_addr(ASM_EXT_VECTOR)); |
---|
24 | MTIVOR(5, ppc_get_vector_addr(ASM_ALIGN_VECTOR)); |
---|
25 | MTIVOR(6, ppc_get_vector_addr(ASM_PROG_VECTOR)); |
---|
26 | MTIVOR(7, ppc_get_vector_addr(ASM_FLOAT_VECTOR)); |
---|
27 | MTIVOR(8, ppc_get_vector_addr(ASM_SYS_VECTOR)); |
---|
28 | MTIVOR(9, ppc_get_vector_addr(0x0b)); |
---|
29 | MTIVOR(10, ppc_get_vector_addr(ASM_BOOKE_DEC_VECTOR)); |
---|
30 | MTIVOR(11, ppc_get_vector_addr(ASM_BOOKE_FIT_VECTOR)); |
---|
31 | MTIVOR(12, ppc_get_vector_addr(ASM_BOOKE_WDOG_VECTOR)); |
---|
32 | MTIVOR(13, ppc_get_vector_addr(ASM_60X_DSMISS_VECTOR)); |
---|
33 | MTIVOR(14, ppc_get_vector_addr(ASM_60X_DLMISS_VECTOR)); |
---|
34 | MTIVOR(15, ppc_get_vector_addr(ASM_TRACE_VECTOR)); |
---|
35 | MTIVOR(32, ppc_get_vector_addr(ASM_60X_VEC_VECTOR)); |
---|
36 | MTIVOR(33, ppc_get_vector_addr(0x16)); |
---|
37 | MTIVOR(34, ppc_get_vector_addr(0x15)); |
---|
38 | MTIVOR(35, ppc_get_vector_addr(ASM_60X_PERFMON_VECTOR)); |
---|
39 | } |
---|
40 | |
---|
41 | void e200_setup_raw_exceptions() |
---|
42 | { |
---|
43 | if (current_ppc_cpu != PPC_e200z6) { |
---|
44 | return; |
---|
45 | } |
---|
46 | |
---|
47 | /* Interupt vector prefix register */ |
---|
48 | MTIVPR( ppc_exc_vector_base); |
---|
49 | |
---|
50 | /* Interupt vector offset register */ |
---|
51 | MTIVOR( 0, 0); /* Critical input */ |
---|
52 | MTIVOR( 1, ppc_get_vector_addr( ASM_MACH_VECTOR)); |
---|
53 | MTIVOR( 2, ppc_get_vector_addr( ASM_PROT_VECTOR)); |
---|
54 | MTIVOR( 3, ppc_get_vector_addr( ASM_ISI_VECTOR)); |
---|
55 | MTIVOR( 4, ppc_get_vector_addr( ASM_EXT_VECTOR)); |
---|
56 | MTIVOR( 5, ppc_get_vector_addr( ASM_ALIGN_VECTOR)); |
---|
57 | MTIVOR( 6, ppc_get_vector_addr( ASM_PROG_VECTOR)); |
---|
58 | MTIVOR( 7, ppc_get_vector_addr( ASM_FLOAT_VECTOR)); |
---|
59 | MTIVOR( 8, ppc_get_vector_addr( ASM_SYS_VECTOR)); |
---|
60 | MTIVOR( 9, 0); /* APU unavailable */ |
---|
61 | MTIVOR( 10, ppc_get_vector_addr( ASM_BOOKE_DEC_VECTOR)); |
---|
62 | MTIVOR( 11, ppc_get_vector_addr( ASM_BOOKE_FIT_VECTOR)); |
---|
63 | MTIVOR( 12, ppc_get_vector_addr( ASM_BOOKE_WDOG_VECTOR)); |
---|
64 | MTIVOR( 13, ppc_get_vector_addr( ASM_BOOKE_ITLBMISS_VECTOR)); |
---|
65 | MTIVOR( 14, ppc_get_vector_addr( ASM_BOOKE_DTLBMISS_VECTOR)); |
---|
66 | MTIVOR( 15, ppc_get_vector_addr( ASM_TRACE_VECTOR)); |
---|
67 | MTIVOR( 32, ppc_get_vector_addr( ASM_E200_SPE_UNAVAILABLE_VECTOR)); |
---|
68 | MTIVOR( 33, ppc_get_vector_addr( ASM_E200_SPE_DATA_VECTOR)); |
---|
69 | MTIVOR( 34, ppc_get_vector_addr( ASM_E200_SPE_ROUND_VECTOR)); |
---|
70 | } |
---|