diff options
author | Mike Frysinger <vapier@gentoo.org> | 2011-05-29 16:05:03 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2011-07-23 01:10:42 -0400 |
commit | b648072d3ef5d68cc9fa392dae19f8adc82231b7 (patch) | |
tree | 6447f40520b2797a83de9b7d9b90d700b87dcb06 /arch | |
parent | 2f7d63f909900c555baf36a4c6a11e9bf8e1af18 (diff) |
Blackfin: SMP: optimize start up code a bit
This just imports all of the optimization work done in the
common startup code.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/blackfin/mach-bf561/secondary.S | 132 |
1 files changed, 54 insertions, 78 deletions
diff --git a/arch/blackfin/mach-bf561/secondary.S b/arch/blackfin/mach-bf561/secondary.S index 4c462838f4e1..348c9191d19f 100644 --- a/arch/blackfin/mach-bf561/secondary.S +++ b/arch/blackfin/mach-bf561/secondary.S | |||
@@ -23,74 +23,56 @@ | |||
23 | #define INITIAL_STACK (COREB_L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) | 23 | #define INITIAL_STACK (COREB_L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) |
24 | 24 | ||
25 | ENTRY(_coreb_trampoline_start) | 25 | ENTRY(_coreb_trampoline_start) |
26 | /* Set the SYSCFG register */ | 26 | /* Enable Cycle Counter and Nesting Of Interrupts */ |
27 | R0 = 0x36; | 27 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES |
28 | SYSCFG = R0; /*Enable Cycle Counter and Nesting Of Interrupts(3rd Bit)*/ | 28 | R0 = SYSCFG_SNEN; |
29 | R0 = 0; | 29 | #else |
30 | 30 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | |
31 | /*Clear Out All the data and pointer Registers*/ | 31 | #endif |
32 | R1 = R0; | 32 | SYSCFG = R0; |
33 | R2 = R0; | ||
34 | R3 = R0; | ||
35 | R4 = R0; | ||
36 | R5 = R0; | ||
37 | R6 = R0; | ||
38 | R7 = R0; | ||
39 | |||
40 | P0 = R0; | ||
41 | P1 = R0; | ||
42 | P2 = R0; | ||
43 | P3 = R0; | ||
44 | P4 = R0; | ||
45 | P5 = R0; | ||
46 | |||
47 | LC0 = r0; | ||
48 | LC1 = r0; | ||
49 | L0 = r0; | ||
50 | L1 = r0; | ||
51 | L2 = r0; | ||
52 | L3 = r0; | ||
53 | |||
54 | /* Clear Out All the DAG Registers*/ | ||
55 | B0 = r0; | ||
56 | B1 = r0; | ||
57 | B2 = r0; | ||
58 | B3 = r0; | ||
59 | |||
60 | I0 = r0; | ||
61 | I1 = r0; | ||
62 | I2 = r0; | ||
63 | I3 = r0; | ||
64 | |||
65 | M0 = r0; | ||
66 | M1 = r0; | ||
67 | M2 = r0; | ||
68 | M3 = r0; | ||
69 | 33 | ||
70 | trace_buffer_init(p0,r0); | 34 | /* Optimization register tricks: keep a base value in the |
35 | * reserved P registers so we use the load/store with an | ||
36 | * offset syntax. R0 = [P5 + <constant>]; | ||
37 | * P5 - core MMR base | ||
38 | * R6 - 0 | ||
39 | */ | ||
40 | r6 = 0; | ||
41 | p5.l = 0; | ||
42 | p5.h = hi(COREMMR_BASE); | ||
71 | 43 | ||
72 | /* Turn off the icache */ | 44 | /* Zero out registers required by Blackfin ABI */ |
73 | p0.l = LO(IMEM_CONTROL); | ||
74 | p0.h = HI(IMEM_CONTROL); | ||
75 | R1 = [p0]; | ||
76 | R0 = ~ENICPLB; | ||
77 | R0 = R0 & R1; | ||
78 | 45 | ||
79 | /* Disabling of CPLBs should be proceeded by a CSYNC */ | 46 | /* Disable circular buffers */ |
47 | L0 = r6; | ||
48 | L1 = r6; | ||
49 | L2 = r6; | ||
50 | L3 = r6; | ||
51 | |||
52 | /* Disable hardware loops in case we were started by 'go' */ | ||
53 | LC0 = r6; | ||
54 | LC1 = r6; | ||
55 | |||
56 | /* | ||
57 | * Clear ITEST_COMMAND and DTEST_COMMAND registers, | ||
58 | * Leaving these as non-zero can confuse the emulator | ||
59 | */ | ||
60 | [p5 + (DTEST_COMMAND - COREMMR_BASE)] = r6; | ||
61 | [p5 + (ITEST_COMMAND - COREMMR_BASE)] = r6; | ||
80 | CSYNC; | 62 | CSYNC; |
81 | [p0] = R0; | 63 | |
64 | trace_buffer_init(p0,r0); | ||
65 | |||
66 | /* Turn off the icache */ | ||
67 | r1 = [p5 + (IMEM_CONTROL - COREMMR_BASE)]; | ||
68 | BITCLR (r1, ENICPLB_P); | ||
69 | [p5 + (IMEM_CONTROL - COREMMR_BASE)] = r1; | ||
82 | SSYNC; | 70 | SSYNC; |
83 | 71 | ||
84 | /* Turn off the dcache */ | 72 | /* Turn off the dcache */ |
85 | p0.l = LO(DMEM_CONTROL); | 73 | r1 = [p5 + (DMEM_CONTROL - COREMMR_BASE)]; |
86 | p0.h = HI(DMEM_CONTROL); | 74 | BITCLR (r1, ENDCPLB_P); |
87 | R1 = [p0]; | 75 | [p5 + (DMEM_CONTROL - COREMMR_BASE)] = r1; |
88 | R0 = ~ENDCPLB; | ||
89 | R0 = R0 & R1; | ||
90 | |||
91 | /* Disabling of CPLBs should be proceeded by a CSYNC */ | ||
92 | CSYNC; | ||
93 | [p0] = R0; | ||
94 | SSYNC; | 76 | SSYNC; |
95 | 77 | ||
96 | /* in case of double faults, save a few things */ | 78 | /* in case of double faults, save a few things */ |
@@ -105,25 +87,25 @@ ENTRY(_coreb_trampoline_start) | |||
105 | * below | 87 | * below |
106 | */ | 88 | */ |
107 | GET_PDA(p0, r0); | 89 | GET_PDA(p0, r0); |
108 | r7 = [p0 + PDA_DF_RETX]; | 90 | r5 = [p0 + PDA_DF_RETX]; |
109 | p1.l = _init_saved_retx_coreb; | 91 | p1.l = _init_saved_retx_coreb; |
110 | p1.h = _init_saved_retx_coreb; | 92 | p1.h = _init_saved_retx_coreb; |
111 | [p1] = r7; | 93 | [p1] = r5; |
112 | 94 | ||
113 | r7 = [p0 + PDA_DF_DCPLB]; | 95 | r5 = [p0 + PDA_DF_DCPLB]; |
114 | p1.l = _init_saved_dcplb_fault_addr_coreb; | 96 | p1.l = _init_saved_dcplb_fault_addr_coreb; |
115 | p1.h = _init_saved_dcplb_fault_addr_coreb; | 97 | p1.h = _init_saved_dcplb_fault_addr_coreb; |
116 | [p1] = r7; | 98 | [p1] = r5; |
117 | 99 | ||
118 | r7 = [p0 + PDA_DF_ICPLB]; | 100 | r5 = [p0 + PDA_DF_ICPLB]; |
119 | p1.l = _init_saved_icplb_fault_addr_coreb; | 101 | p1.l = _init_saved_icplb_fault_addr_coreb; |
120 | p1.h = _init_saved_icplb_fault_addr_coreb; | 102 | p1.h = _init_saved_icplb_fault_addr_coreb; |
121 | [p1] = r7; | 103 | [p1] = r5; |
122 | 104 | ||
123 | r7 = [p0 + PDA_DF_SEQSTAT]; | 105 | r5 = [p0 + PDA_DF_SEQSTAT]; |
124 | p1.l = _init_saved_seqstat_coreb; | 106 | p1.l = _init_saved_seqstat_coreb; |
125 | p1.h = _init_saved_seqstat_coreb; | 107 | p1.h = _init_saved_seqstat_coreb; |
126 | [p1] = r7; | 108 | [p1] = r5; |
127 | #endif | 109 | #endif |
128 | 110 | ||
129 | /* Initialize stack pointer */ | 111 | /* Initialize stack pointer */ |
@@ -138,19 +120,13 @@ ENTRY(_coreb_trampoline_start) | |||
138 | 120 | ||
139 | /* EVT15 = _real_start */ | 121 | /* EVT15 = _real_start */ |
140 | 122 | ||
141 | p0.l = lo(EVT15); | ||
142 | p0.h = hi(EVT15); | ||
143 | p1.l = _coreb_start; | 123 | p1.l = _coreb_start; |
144 | p1.h = _coreb_start; | 124 | p1.h = _coreb_start; |
145 | [p0] = p1; | 125 | [p5 + (EVT15 - COREMMR_BASE)] = p1; |
146 | csync; | 126 | csync; |
147 | 127 | ||
148 | p0.l = lo(IMASK); | 128 | r0 = EVT_IVG15 (z); |
149 | p0.h = hi(IMASK); | 129 | sti r0; |
150 | p1.l = IMASK_IVG15; | ||
151 | p1.h = 0x0; | ||
152 | [p0] = p1; | ||
153 | csync; | ||
154 | 130 | ||
155 | raise 15; | 131 | raise 15; |
156 | p0.l = .LWAIT_HERE; | 132 | p0.l = .LWAIT_HERE; |