diff options
author | Paul Mackerras <paulus@samba.org> | 2005-10-30 21:37:12 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2005-10-30 21:37:12 -0500 |
commit | 23fd07750a789a66fe88cf173d52a18f1a387da4 (patch) | |
tree | 06fdd6df35fdb835abdaa9b754d62f6b84b97250 /arch/mips/sibyte/sb1250 | |
parent | bd787d438a59266af3c9f6351644c85ef1dd21fe (diff) | |
parent | ed28f96ac1960f30f818374d65be71d2fdf811b0 (diff) |
Merge ../linux-2.6 by hand
Diffstat (limited to 'arch/mips/sibyte/sb1250')
-rw-r--r-- | arch/mips/sibyte/sb1250/bcm1250_tbprof.c | 154 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/bus_watcher.c | 2 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/irq.c | 121 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/setup.c | 4 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/smp.c | 18 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/time.c | 44 |
6 files changed, 177 insertions, 166 deletions
diff --git a/arch/mips/sibyte/sb1250/bcm1250_tbprof.c b/arch/mips/sibyte/sb1250/bcm1250_tbprof.c index 7f813ae9eaff..992e0d8dbb67 100644 --- a/arch/mips/sibyte/sb1250/bcm1250_tbprof.c +++ b/arch/mips/sibyte/sb1250/bcm1250_tbprof.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/fs.h> | 28 | #include <linux/fs.h> |
29 | #include <linux/errno.h> | 29 | #include <linux/errno.h> |
30 | #include <linux/reboot.h> | 30 | #include <linux/reboot.h> |
31 | #include <linux/smp_lock.h> | ||
32 | #include <linux/wait.h> | ||
31 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
32 | #include <asm/io.h> | 34 | #include <asm/io.h> |
33 | #include <asm/sibyte/sb1250.h> | 35 | #include <asm/sibyte/sb1250.h> |
@@ -64,24 +66,25 @@ static void arm_tb(void) | |||
64 | u_int64_t tb_options = M_SCD_TRACE_CFG_FREEZE_FULL; | 66 | u_int64_t tb_options = M_SCD_TRACE_CFG_FREEZE_FULL; |
65 | /* Generate an SCD_PERFCNT interrupt in TB_PERIOD Zclks to | 67 | /* Generate an SCD_PERFCNT interrupt in TB_PERIOD Zclks to |
66 | trigger start of trace. XXX vary sampling period */ | 68 | trigger start of trace. XXX vary sampling period */ |
67 | bus_writeq(0, IOADDR(A_SCD_PERF_CNT_1)); | 69 | __raw_writeq(0, IOADDR(A_SCD_PERF_CNT_1)); |
68 | scdperfcnt = bus_readq(IOADDR(A_SCD_PERF_CNT_CFG)); | 70 | scdperfcnt = __raw_readq(IOADDR(A_SCD_PERF_CNT_CFG)); |
69 | /* Unfortunately, in Pass 2 we must clear all counters to knock down | 71 | /* Unfortunately, in Pass 2 we must clear all counters to knock down |
70 | a previous interrupt request. This means that bus profiling | 72 | a previous interrupt request. This means that bus profiling |
71 | requires ALL of the SCD perf counters. */ | 73 | requires ALL of the SCD perf counters. */ |
72 | bus_writeq((scdperfcnt & ~M_SPC_CFG_SRC1) | // keep counters 0,2,3 as is | 74 | __raw_writeq((scdperfcnt & ~M_SPC_CFG_SRC1) | |
73 | M_SPC_CFG_ENABLE | // enable counting | 75 | // keep counters 0,2,3 as is |
74 | M_SPC_CFG_CLEAR | // clear all counters | 76 | M_SPC_CFG_ENABLE | // enable counting |
75 | V_SPC_CFG_SRC1(1), // counter 1 counts cycles | 77 | M_SPC_CFG_CLEAR | // clear all counters |
76 | IOADDR(A_SCD_PERF_CNT_CFG)); | 78 | V_SPC_CFG_SRC1(1), // counter 1 counts cycles |
77 | bus_writeq(next, IOADDR(A_SCD_PERF_CNT_1)); | 79 | IOADDR(A_SCD_PERF_CNT_CFG)); |
80 | __raw_writeq(next, IOADDR(A_SCD_PERF_CNT_1)); | ||
78 | /* Reset the trace buffer */ | 81 | /* Reset the trace buffer */ |
79 | bus_writeq(M_SCD_TRACE_CFG_RESET, IOADDR(A_SCD_TRACE_CFG)); | 82 | __raw_writeq(M_SCD_TRACE_CFG_RESET, IOADDR(A_SCD_TRACE_CFG)); |
80 | #if 0 && defined(M_SCD_TRACE_CFG_FORCECNT) | 83 | #if 0 && defined(M_SCD_TRACE_CFG_FORCECNT) |
81 | /* XXXKW may want to expose control to the data-collector */ | 84 | /* XXXKW may want to expose control to the data-collector */ |
82 | tb_options |= M_SCD_TRACE_CFG_FORCECNT; | 85 | tb_options |= M_SCD_TRACE_CFG_FORCECNT; |
83 | #endif | 86 | #endif |
84 | bus_writeq(tb_options, IOADDR(A_SCD_TRACE_CFG)); | 87 | __raw_writeq(tb_options, IOADDR(A_SCD_TRACE_CFG)); |
85 | sbp.tb_armed = 1; | 88 | sbp.tb_armed = 1; |
86 | } | 89 | } |
87 | 90 | ||
@@ -93,23 +96,30 @@ static irqreturn_t sbprof_tb_intr(int irq, void *dev_id, struct pt_regs *regs) | |||
93 | /* XXX should use XKPHYS to make writes bypass L2 */ | 96 | /* XXX should use XKPHYS to make writes bypass L2 */ |
94 | u_int64_t *p = sbp.sbprof_tbbuf[sbp.next_tb_sample++]; | 97 | u_int64_t *p = sbp.sbprof_tbbuf[sbp.next_tb_sample++]; |
95 | /* Read out trace */ | 98 | /* Read out trace */ |
96 | bus_writeq(M_SCD_TRACE_CFG_START_READ, IOADDR(A_SCD_TRACE_CFG)); | 99 | __raw_writeq(M_SCD_TRACE_CFG_START_READ, |
100 | IOADDR(A_SCD_TRACE_CFG)); | ||
97 | __asm__ __volatile__ ("sync" : : : "memory"); | 101 | __asm__ __volatile__ ("sync" : : : "memory"); |
98 | /* Loop runs backwards because bundles are read out in reverse order */ | 102 | /* Loop runs backwards because bundles are read out in reverse order */ |
99 | for (i = 256 * 6; i > 0; i -= 6) { | 103 | for (i = 256 * 6; i > 0; i -= 6) { |
100 | // Subscripts decrease to put bundle in the order | 104 | // Subscripts decrease to put bundle in the order |
101 | // t0 lo, t0 hi, t1 lo, t1 hi, t2 lo, t2 hi | 105 | // t0 lo, t0 hi, t1 lo, t1 hi, t2 lo, t2 hi |
102 | p[i-1] = bus_readq(IOADDR(A_SCD_TRACE_READ)); // read t2 hi | 106 | p[i - 1] = __raw_readq(IOADDR(A_SCD_TRACE_READ)); |
103 | p[i-2] = bus_readq(IOADDR(A_SCD_TRACE_READ)); // read t2 lo | 107 | // read t2 hi |
104 | p[i-3] = bus_readq(IOADDR(A_SCD_TRACE_READ)); // read t1 hi | 108 | p[i - 2] = __raw_readq(IOADDR(A_SCD_TRACE_READ)); |
105 | p[i-4] = bus_readq(IOADDR(A_SCD_TRACE_READ)); // read t1 lo | 109 | // read t2 lo |
106 | p[i-5] = bus_readq(IOADDR(A_SCD_TRACE_READ)); // read t0 hi | 110 | p[i - 3] = __raw_readq(IOADDR(A_SCD_TRACE_READ)); |
107 | p[i-6] = bus_readq(IOADDR(A_SCD_TRACE_READ)); // read t0 lo | 111 | // read t1 hi |
112 | p[i - 4] = __raw_readq(IOADDR(A_SCD_TRACE_READ)); | ||
113 | // read t1 lo | ||
114 | p[i - 5] = __raw_readq(IOADDR(A_SCD_TRACE_READ)); | ||
115 | // read t0 hi | ||
116 | p[i - 6] = __raw_readq(IOADDR(A_SCD_TRACE_READ)); | ||
117 | // read t0 lo | ||
108 | } | 118 | } |
109 | if (!sbp.tb_enable) { | 119 | if (!sbp.tb_enable) { |
110 | DBG(printk(DEVNAME ": tb_intr shutdown\n")); | 120 | DBG(printk(DEVNAME ": tb_intr shutdown\n")); |
111 | bus_writeq(M_SCD_TRACE_CFG_RESET, | 121 | __raw_writeq(M_SCD_TRACE_CFG_RESET, |
112 | IOADDR(A_SCD_TRACE_CFG)); | 122 | IOADDR(A_SCD_TRACE_CFG)); |
113 | sbp.tb_armed = 0; | 123 | sbp.tb_armed = 0; |
114 | wake_up(&sbp.tb_sync); | 124 | wake_up(&sbp.tb_sync); |
115 | } else { | 125 | } else { |
@@ -118,7 +128,7 @@ static irqreturn_t sbprof_tb_intr(int irq, void *dev_id, struct pt_regs *regs) | |||
118 | } else { | 128 | } else { |
119 | /* No more trace buffer samples */ | 129 | /* No more trace buffer samples */ |
120 | DBG(printk(DEVNAME ": tb_intr full\n")); | 130 | DBG(printk(DEVNAME ": tb_intr full\n")); |
121 | bus_writeq(M_SCD_TRACE_CFG_RESET, IOADDR(A_SCD_TRACE_CFG)); | 131 | __raw_writeq(M_SCD_TRACE_CFG_RESET, IOADDR(A_SCD_TRACE_CFG)); |
122 | sbp.tb_armed = 0; | 132 | sbp.tb_armed = 0; |
123 | if (!sbp.tb_enable) { | 133 | if (!sbp.tb_enable) { |
124 | wake_up(&sbp.tb_sync); | 134 | wake_up(&sbp.tb_sync); |
@@ -152,13 +162,11 @@ int sbprof_zbprof_start(struct file *filp) | |||
152 | return -EBUSY; | 162 | return -EBUSY; |
153 | } | 163 | } |
154 | /* Make sure there isn't a perf-cnt interrupt waiting */ | 164 | /* Make sure there isn't a perf-cnt interrupt waiting */ |
155 | scdperfcnt = bus_readq(IOADDR(A_SCD_PERF_CNT_CFG)); | 165 | scdperfcnt = __raw_readq(IOADDR(A_SCD_PERF_CNT_CFG)); |
156 | /* Disable and clear counters, override SRC_1 */ | 166 | /* Disable and clear counters, override SRC_1 */ |
157 | bus_writeq((scdperfcnt & ~(M_SPC_CFG_SRC1 | M_SPC_CFG_ENABLE)) | | 167 | __raw_writeq((scdperfcnt & ~(M_SPC_CFG_SRC1 | M_SPC_CFG_ENABLE)) | |
158 | M_SPC_CFG_ENABLE | | 168 | M_SPC_CFG_ENABLE | M_SPC_CFG_CLEAR | V_SPC_CFG_SRC1(1), |
159 | M_SPC_CFG_CLEAR | | 169 | IOADDR(A_SCD_PERF_CNT_CFG)); |
160 | V_SPC_CFG_SRC1(1), | ||
161 | IOADDR(A_SCD_PERF_CNT_CFG)); | ||
162 | 170 | ||
163 | /* We grab this interrupt to prevent others from trying to use | 171 | /* We grab this interrupt to prevent others from trying to use |
164 | it, even though we don't want to service the interrupts | 172 | it, even though we don't want to service the interrupts |
@@ -172,55 +180,55 @@ int sbprof_zbprof_start(struct file *filp) | |||
172 | /* I need the core to mask these, but the interrupt mapper to | 180 | /* I need the core to mask these, but the interrupt mapper to |
173 | pass them through. I am exploiting my knowledge that | 181 | pass them through. I am exploiting my knowledge that |
174 | cp0_status masks out IP[5]. krw */ | 182 | cp0_status masks out IP[5]. krw */ |
175 | bus_writeq(K_INT_MAP_I3, | 183 | __raw_writeq(K_INT_MAP_I3, |
176 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MAP_BASE) + | 184 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MAP_BASE) + |
177 | (K_INT_PERF_CNT << 3))); | 185 | (K_INT_PERF_CNT << 3))); |
178 | 186 | ||
179 | /* Initialize address traps */ | 187 | /* Initialize address traps */ |
180 | bus_writeq(0, IOADDR(A_ADDR_TRAP_UP_0)); | 188 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_UP_0)); |
181 | bus_writeq(0, IOADDR(A_ADDR_TRAP_UP_1)); | 189 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_UP_1)); |
182 | bus_writeq(0, IOADDR(A_ADDR_TRAP_UP_2)); | 190 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_UP_2)); |
183 | bus_writeq(0, IOADDR(A_ADDR_TRAP_UP_3)); | 191 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_UP_3)); |
184 | 192 | ||
185 | bus_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_0)); | 193 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_0)); |
186 | bus_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_1)); | 194 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_1)); |
187 | bus_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_2)); | 195 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_2)); |
188 | bus_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_3)); | 196 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_DOWN_3)); |
189 | 197 | ||
190 | bus_writeq(0, IOADDR(A_ADDR_TRAP_CFG_0)); | 198 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_CFG_0)); |
191 | bus_writeq(0, IOADDR(A_ADDR_TRAP_CFG_1)); | 199 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_CFG_1)); |
192 | bus_writeq(0, IOADDR(A_ADDR_TRAP_CFG_2)); | 200 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_CFG_2)); |
193 | bus_writeq(0, IOADDR(A_ADDR_TRAP_CFG_3)); | 201 | __raw_writeq(0, IOADDR(A_ADDR_TRAP_CFG_3)); |
194 | 202 | ||
195 | /* Initialize Trace Event 0-7 */ | 203 | /* Initialize Trace Event 0-7 */ |
196 | // when interrupt | 204 | // when interrupt |
197 | bus_writeq(M_SCD_TREVT_INTERRUPT, IOADDR(A_SCD_TRACE_EVENT_0)); | 205 | __raw_writeq(M_SCD_TREVT_INTERRUPT, IOADDR(A_SCD_TRACE_EVENT_0)); |
198 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_1)); | 206 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_1)); |
199 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_2)); | 207 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_2)); |
200 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_3)); | 208 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_3)); |
201 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_4)); | 209 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_4)); |
202 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_5)); | 210 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_5)); |
203 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_6)); | 211 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_6)); |
204 | bus_writeq(0, IOADDR(A_SCD_TRACE_EVENT_7)); | 212 | __raw_writeq(0, IOADDR(A_SCD_TRACE_EVENT_7)); |
205 | 213 | ||
206 | /* Initialize Trace Sequence 0-7 */ | 214 | /* Initialize Trace Sequence 0-7 */ |
207 | // Start on event 0 (interrupt) | 215 | // Start on event 0 (interrupt) |
208 | bus_writeq(V_SCD_TRSEQ_FUNC_START | 0x0fff, | 216 | __raw_writeq(V_SCD_TRSEQ_FUNC_START | 0x0fff, |
209 | IOADDR(A_SCD_TRACE_SEQUENCE_0)); | 217 | IOADDR(A_SCD_TRACE_SEQUENCE_0)); |
210 | // dsamp when d used | asamp when a used | 218 | // dsamp when d used | asamp when a used |
211 | bus_writeq(M_SCD_TRSEQ_ASAMPLE | M_SCD_TRSEQ_DSAMPLE | | 219 | __raw_writeq(M_SCD_TRSEQ_ASAMPLE | M_SCD_TRSEQ_DSAMPLE | |
212 | K_SCD_TRSEQ_TRIGGER_ALL, | 220 | K_SCD_TRSEQ_TRIGGER_ALL, |
213 | IOADDR(A_SCD_TRACE_SEQUENCE_1)); | 221 | IOADDR(A_SCD_TRACE_SEQUENCE_1)); |
214 | bus_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_2)); | 222 | __raw_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_2)); |
215 | bus_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_3)); | 223 | __raw_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_3)); |
216 | bus_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_4)); | 224 | __raw_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_4)); |
217 | bus_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_5)); | 225 | __raw_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_5)); |
218 | bus_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_6)); | 226 | __raw_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_6)); |
219 | bus_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_7)); | 227 | __raw_writeq(0, IOADDR(A_SCD_TRACE_SEQUENCE_7)); |
220 | 228 | ||
221 | /* Now indicate the PERF_CNT interrupt as a trace-relevant interrupt */ | 229 | /* Now indicate the PERF_CNT interrupt as a trace-relevant interrupt */ |
222 | bus_writeq((1ULL << K_INT_PERF_CNT), | 230 | __raw_writeq(1ULL << K_INT_PERF_CNT, |
223 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_TRACE))); | 231 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_TRACE))); |
224 | 232 | ||
225 | arm_tb(); | 233 | arm_tb(); |
226 | 234 | ||
@@ -231,6 +239,7 @@ int sbprof_zbprof_start(struct file *filp) | |||
231 | 239 | ||
232 | int sbprof_zbprof_stop(void) | 240 | int sbprof_zbprof_stop(void) |
233 | { | 241 | { |
242 | DEFINE_WAIT(wait); | ||
234 | DBG(printk(DEVNAME ": stopping\n")); | 243 | DBG(printk(DEVNAME ": stopping\n")); |
235 | 244 | ||
236 | if (sbp.tb_enable) { | 245 | if (sbp.tb_enable) { |
@@ -240,7 +249,9 @@ int sbprof_zbprof_stop(void) | |||
240 | this sleep happens. */ | 249 | this sleep happens. */ |
241 | if (sbp.tb_armed) { | 250 | if (sbp.tb_armed) { |
242 | DBG(printk(DEVNAME ": wait for disarm\n")); | 251 | DBG(printk(DEVNAME ": wait for disarm\n")); |
243 | interruptible_sleep_on(&sbp.tb_sync); | 252 | prepare_to_wait(&sbp.tb_sync, &wait, TASK_INTERRUPTIBLE); |
253 | schedule(); | ||
254 | finish_wait(&sbp.tb_sync, &wait); | ||
244 | DBG(printk(DEVNAME ": disarm complete\n")); | 255 | DBG(printk(DEVNAME ": disarm complete\n")); |
245 | } | 256 | } |
246 | free_irq(K_INT_TRACE_FREEZE, &sbp); | 257 | free_irq(K_INT_TRACE_FREEZE, &sbp); |
@@ -333,13 +344,13 @@ static ssize_t sbprof_tb_read(struct file *filp, char *buf, | |||
333 | return count; | 344 | return count; |
334 | } | 345 | } |
335 | 346 | ||
336 | static int sbprof_tb_ioctl(struct inode *inode, | 347 | static long sbprof_tb_ioctl(struct file *filp, |
337 | struct file *filp, | 348 | unsigned int command, |
338 | unsigned int command, | 349 | unsigned long arg) |
339 | unsigned long arg) | ||
340 | { | 350 | { |
341 | int error = 0; | 351 | int error = 0; |
342 | 352 | ||
353 | lock_kernel(); | ||
343 | switch (command) { | 354 | switch (command) { |
344 | case SBPROF_ZBSTART: | 355 | case SBPROF_ZBSTART: |
345 | error = sbprof_zbprof_start(filp); | 356 | error = sbprof_zbprof_start(filp); |
@@ -348,13 +359,17 @@ static int sbprof_tb_ioctl(struct inode *inode, | |||
348 | error = sbprof_zbprof_stop(); | 359 | error = sbprof_zbprof_stop(); |
349 | break; | 360 | break; |
350 | case SBPROF_ZBWAITFULL: | 361 | case SBPROF_ZBWAITFULL: |
351 | interruptible_sleep_on(&sbp.tb_read); | 362 | DEFINE_WAIT(wait); |
363 | prepare_to_wait(&sbp.tb_read, &wait, TASK_INTERRUPTIBLE); | ||
364 | schedule(); | ||
365 | finish_wait(&sbp.tb_read, &wait); | ||
352 | /* XXXKW check if interrupted? */ | 366 | /* XXXKW check if interrupted? */ |
353 | return put_user(TB_FULL, (int *) arg); | 367 | return put_user(TB_FULL, (int *) arg); |
354 | default: | 368 | default: |
355 | error = -EINVAL; | 369 | error = -EINVAL; |
356 | break; | 370 | break; |
357 | } | 371 | } |
372 | unlock_kernel(); | ||
358 | 373 | ||
359 | return error; | 374 | return error; |
360 | } | 375 | } |
@@ -364,7 +379,8 @@ static struct file_operations sbprof_tb_fops = { | |||
364 | .open = sbprof_tb_open, | 379 | .open = sbprof_tb_open, |
365 | .release = sbprof_tb_release, | 380 | .release = sbprof_tb_release, |
366 | .read = sbprof_tb_read, | 381 | .read = sbprof_tb_read, |
367 | .ioctl = sbprof_tb_ioctl, | 382 | .unlocked_ioctl = sbprof_tb_ioctl, |
383 | .compat_ioctl = sbprof_tb_ioctl, | ||
368 | .mmap = NULL, | 384 | .mmap = NULL, |
369 | }; | 385 | }; |
370 | 386 | ||
diff --git a/arch/mips/sibyte/sb1250/bus_watcher.c b/arch/mips/sibyte/sb1250/bus_watcher.c index 1a97e3127aeb..482dee054e68 100644 --- a/arch/mips/sibyte/sb1250/bus_watcher.c +++ b/arch/mips/sibyte/sb1250/bus_watcher.c | |||
@@ -189,7 +189,7 @@ static irqreturn_t sibyte_bw_int(int irq, void *data, struct pt_regs *regs) | |||
189 | 189 | ||
190 | for (i=0; i<256*6; i++) | 190 | for (i=0; i<256*6; i++) |
191 | printk("%016llx\n", | 191 | printk("%016llx\n", |
192 | (unsigned long long)bus_readq(IOADDR(A_SCD_TRACE_READ))); | 192 | (long long)__raw_readq(IOADDR(A_SCD_TRACE_READ))); |
193 | 193 | ||
194 | csr_out32(M_SCD_TRACE_CFG_RESET, IOADDR(A_SCD_TRACE_CFG)); | 194 | csr_out32(M_SCD_TRACE_CFG_RESET, IOADDR(A_SCD_TRACE_CFG)); |
195 | csr_out32(M_SCD_TRACE_CFG_START, IOADDR(A_SCD_TRACE_CFG)); | 195 | csr_out32(M_SCD_TRACE_CFG_START, IOADDR(A_SCD_TRACE_CFG)); |
diff --git a/arch/mips/sibyte/sb1250/irq.c b/arch/mips/sibyte/sb1250/irq.c index 2725b263cced..589537bfcc3d 100644 --- a/arch/mips/sibyte/sb1250/irq.c +++ b/arch/mips/sibyte/sb1250/irq.c | |||
@@ -53,7 +53,7 @@ static void disable_sb1250_irq(unsigned int irq); | |||
53 | static unsigned int startup_sb1250_irq(unsigned int irq); | 53 | static unsigned int startup_sb1250_irq(unsigned int irq); |
54 | static void ack_sb1250_irq(unsigned int irq); | 54 | static void ack_sb1250_irq(unsigned int irq); |
55 | #ifdef CONFIG_SMP | 55 | #ifdef CONFIG_SMP |
56 | static void sb1250_set_affinity(unsigned int irq, unsigned long mask); | 56 | static void sb1250_set_affinity(unsigned int irq, cpumask_t mask); |
57 | #endif | 57 | #endif |
58 | 58 | ||
59 | #ifdef CONFIG_SIBYTE_HAS_LDT | 59 | #ifdef CONFIG_SIBYTE_HAS_LDT |
@@ -71,17 +71,15 @@ extern char sb1250_duart_present[]; | |||
71 | #endif | 71 | #endif |
72 | 72 | ||
73 | static struct hw_interrupt_type sb1250_irq_type = { | 73 | static struct hw_interrupt_type sb1250_irq_type = { |
74 | "SB1250-IMR", | 74 | .typename = "SB1250-IMR", |
75 | startup_sb1250_irq, | 75 | .startup = startup_sb1250_irq, |
76 | shutdown_sb1250_irq, | 76 | .shutdown = shutdown_sb1250_irq, |
77 | enable_sb1250_irq, | 77 | .enable = enable_sb1250_irq, |
78 | disable_sb1250_irq, | 78 | .disable = disable_sb1250_irq, |
79 | ack_sb1250_irq, | 79 | .ack = ack_sb1250_irq, |
80 | end_sb1250_irq, | 80 | .end = end_sb1250_irq, |
81 | #ifdef CONFIG_SMP | 81 | #ifdef CONFIG_SMP |
82 | sb1250_set_affinity | 82 | .set_affinity = sb1250_set_affinity |
83 | #else | ||
84 | NULL | ||
85 | #endif | 83 | #endif |
86 | }; | 84 | }; |
87 | 85 | ||
@@ -96,11 +94,11 @@ void sb1250_mask_irq(int cpu, int irq) | |||
96 | u64 cur_ints; | 94 | u64 cur_ints; |
97 | 95 | ||
98 | spin_lock_irqsave(&sb1250_imr_lock, flags); | 96 | spin_lock_irqsave(&sb1250_imr_lock, flags); |
99 | cur_ints = __bus_readq(IOADDR(A_IMR_MAPPER(cpu) + | 97 | cur_ints = ____raw_readq(IOADDR(A_IMR_MAPPER(cpu) + |
100 | R_IMR_INTERRUPT_MASK)); | 98 | R_IMR_INTERRUPT_MASK)); |
101 | cur_ints |= (((u64) 1) << irq); | 99 | cur_ints |= (((u64) 1) << irq); |
102 | __bus_writeq(cur_ints, IOADDR(A_IMR_MAPPER(cpu) + | 100 | ____raw_writeq(cur_ints, IOADDR(A_IMR_MAPPER(cpu) + |
103 | R_IMR_INTERRUPT_MASK)); | 101 | R_IMR_INTERRUPT_MASK)); |
104 | spin_unlock_irqrestore(&sb1250_imr_lock, flags); | 102 | spin_unlock_irqrestore(&sb1250_imr_lock, flags); |
105 | } | 103 | } |
106 | 104 | ||
@@ -110,32 +108,25 @@ void sb1250_unmask_irq(int cpu, int irq) | |||
110 | u64 cur_ints; | 108 | u64 cur_ints; |
111 | 109 | ||
112 | spin_lock_irqsave(&sb1250_imr_lock, flags); | 110 | spin_lock_irqsave(&sb1250_imr_lock, flags); |
113 | cur_ints = __bus_readq(IOADDR(A_IMR_MAPPER(cpu) + | 111 | cur_ints = ____raw_readq(IOADDR(A_IMR_MAPPER(cpu) + |
114 | R_IMR_INTERRUPT_MASK)); | 112 | R_IMR_INTERRUPT_MASK)); |
115 | cur_ints &= ~(((u64) 1) << irq); | 113 | cur_ints &= ~(((u64) 1) << irq); |
116 | __bus_writeq(cur_ints, IOADDR(A_IMR_MAPPER(cpu) + | 114 | ____raw_writeq(cur_ints, IOADDR(A_IMR_MAPPER(cpu) + |
117 | R_IMR_INTERRUPT_MASK)); | 115 | R_IMR_INTERRUPT_MASK)); |
118 | spin_unlock_irqrestore(&sb1250_imr_lock, flags); | 116 | spin_unlock_irqrestore(&sb1250_imr_lock, flags); |
119 | } | 117 | } |
120 | 118 | ||
121 | #ifdef CONFIG_SMP | 119 | #ifdef CONFIG_SMP |
122 | static void sb1250_set_affinity(unsigned int irq, unsigned long mask) | 120 | static void sb1250_set_affinity(unsigned int irq, cpumask_t mask) |
123 | { | 121 | { |
124 | int i = 0, old_cpu, cpu, int_on; | 122 | int i = 0, old_cpu, cpu, int_on; |
125 | u64 cur_ints; | 123 | u64 cur_ints; |
126 | irq_desc_t *desc = irq_desc + irq; | 124 | irq_desc_t *desc = irq_desc + irq; |
127 | unsigned long flags; | 125 | unsigned long flags; |
128 | 126 | ||
129 | while (mask) { | 127 | i = first_cpu(mask); |
130 | if (mask & 1) { | ||
131 | mask >>= 1; | ||
132 | break; | ||
133 | } | ||
134 | mask >>= 1; | ||
135 | i++; | ||
136 | } | ||
137 | 128 | ||
138 | if (mask) { | 129 | if (cpus_weight(mask) > 1) { |
139 | printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq); | 130 | printk("attempted to set irq affinity for irq %d to multiple CPUs\n", irq); |
140 | return; | 131 | return; |
141 | } | 132 | } |
@@ -149,23 +140,23 @@ static void sb1250_set_affinity(unsigned int irq, unsigned long mask) | |||
149 | 140 | ||
150 | /* Swizzle each CPU's IMR (but leave the IP selection alone) */ | 141 | /* Swizzle each CPU's IMR (but leave the IP selection alone) */ |
151 | old_cpu = sb1250_irq_owner[irq]; | 142 | old_cpu = sb1250_irq_owner[irq]; |
152 | cur_ints = __bus_readq(IOADDR(A_IMR_MAPPER(old_cpu) + | 143 | cur_ints = ____raw_readq(IOADDR(A_IMR_MAPPER(old_cpu) + |
153 | R_IMR_INTERRUPT_MASK)); | 144 | R_IMR_INTERRUPT_MASK)); |
154 | int_on = !(cur_ints & (((u64) 1) << irq)); | 145 | int_on = !(cur_ints & (((u64) 1) << irq)); |
155 | if (int_on) { | 146 | if (int_on) { |
156 | /* If it was on, mask it */ | 147 | /* If it was on, mask it */ |
157 | cur_ints |= (((u64) 1) << irq); | 148 | cur_ints |= (((u64) 1) << irq); |
158 | __bus_writeq(cur_ints, IOADDR(A_IMR_MAPPER(old_cpu) + | 149 | ____raw_writeq(cur_ints, IOADDR(A_IMR_MAPPER(old_cpu) + |
159 | R_IMR_INTERRUPT_MASK)); | 150 | R_IMR_INTERRUPT_MASK)); |
160 | } | 151 | } |
161 | sb1250_irq_owner[irq] = cpu; | 152 | sb1250_irq_owner[irq] = cpu; |
162 | if (int_on) { | 153 | if (int_on) { |
163 | /* unmask for the new CPU */ | 154 | /* unmask for the new CPU */ |
164 | cur_ints = __bus_readq(IOADDR(A_IMR_MAPPER(cpu) + | 155 | cur_ints = ____raw_readq(IOADDR(A_IMR_MAPPER(cpu) + |
165 | R_IMR_INTERRUPT_MASK)); | 156 | R_IMR_INTERRUPT_MASK)); |
166 | cur_ints &= ~(((u64) 1) << irq); | 157 | cur_ints &= ~(((u64) 1) << irq); |
167 | __bus_writeq(cur_ints, IOADDR(A_IMR_MAPPER(cpu) + | 158 | ____raw_writeq(cur_ints, IOADDR(A_IMR_MAPPER(cpu) + |
168 | R_IMR_INTERRUPT_MASK)); | 159 | R_IMR_INTERRUPT_MASK)); |
169 | } | 160 | } |
170 | spin_unlock(&sb1250_imr_lock); | 161 | spin_unlock(&sb1250_imr_lock); |
171 | spin_unlock_irqrestore(&desc->lock, flags); | 162 | spin_unlock_irqrestore(&desc->lock, flags); |
@@ -208,8 +199,8 @@ static void ack_sb1250_irq(unsigned int irq) | |||
208 | * deliver the interrupts to all CPUs (which makes affinity | 199 | * deliver the interrupts to all CPUs (which makes affinity |
209 | * changing easier for us) | 200 | * changing easier for us) |
210 | */ | 201 | */ |
211 | pending = bus_readq(IOADDR(A_IMR_REGISTER(sb1250_irq_owner[irq], | 202 | pending = __raw_readq(IOADDR(A_IMR_REGISTER(sb1250_irq_owner[irq], |
212 | R_IMR_LDT_INTERRUPT))); | 203 | R_IMR_LDT_INTERRUPT))); |
213 | pending &= ((u64)1 << (irq)); | 204 | pending &= ((u64)1 << (irq)); |
214 | if (pending) { | 205 | if (pending) { |
215 | int i; | 206 | int i; |
@@ -224,8 +215,8 @@ static void ack_sb1250_irq(unsigned int irq) | |||
224 | * Clear for all CPUs so an affinity switch | 215 | * Clear for all CPUs so an affinity switch |
225 | * doesn't find an old status | 216 | * doesn't find an old status |
226 | */ | 217 | */ |
227 | bus_writeq(pending, | 218 | __raw_writeq(pending, |
228 | IOADDR(A_IMR_REGISTER(cpu, | 219 | IOADDR(A_IMR_REGISTER(cpu, |
229 | R_IMR_LDT_INTERRUPT_CLR))); | 220 | R_IMR_LDT_INTERRUPT_CLR))); |
230 | } | 221 | } |
231 | 222 | ||
@@ -340,12 +331,14 @@ void __init arch_init_irq(void) | |||
340 | 331 | ||
341 | /* Default everything to IP2 */ | 332 | /* Default everything to IP2 */ |
342 | for (i = 0; i < SB1250_NR_IRQS; i++) { /* was I0 */ | 333 | for (i = 0; i < SB1250_NR_IRQS; i++) { /* was I0 */ |
343 | bus_writeq(IMR_IP2_VAL, | 334 | __raw_writeq(IMR_IP2_VAL, |
344 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MAP_BASE) + | 335 | IOADDR(A_IMR_REGISTER(0, |
345 | (i << 3))); | 336 | R_IMR_INTERRUPT_MAP_BASE) + |
346 | bus_writeq(IMR_IP2_VAL, | 337 | (i << 3))); |
347 | IOADDR(A_IMR_REGISTER(1, R_IMR_INTERRUPT_MAP_BASE) + | 338 | __raw_writeq(IMR_IP2_VAL, |
348 | (i << 3))); | 339 | IOADDR(A_IMR_REGISTER(1, |
340 | R_IMR_INTERRUPT_MAP_BASE) + | ||
341 | (i << 3))); | ||
349 | } | 342 | } |
350 | 343 | ||
351 | init_sb1250_irqs(); | 344 | init_sb1250_irqs(); |
@@ -355,23 +348,23 @@ void __init arch_init_irq(void) | |||
355 | * inter-cpu messages | 348 | * inter-cpu messages |
356 | */ | 349 | */ |
357 | /* Was I1 */ | 350 | /* Was I1 */ |
358 | bus_writeq(IMR_IP3_VAL, | 351 | __raw_writeq(IMR_IP3_VAL, |
359 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MAP_BASE) + | 352 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MAP_BASE) + |
360 | (K_INT_MBOX_0 << 3))); | 353 | (K_INT_MBOX_0 << 3))); |
361 | bus_writeq(IMR_IP3_VAL, | 354 | __raw_writeq(IMR_IP3_VAL, |
362 | IOADDR(A_IMR_REGISTER(1, R_IMR_INTERRUPT_MAP_BASE) + | 355 | IOADDR(A_IMR_REGISTER(1, R_IMR_INTERRUPT_MAP_BASE) + |
363 | (K_INT_MBOX_0 << 3))); | 356 | (K_INT_MBOX_0 << 3))); |
364 | 357 | ||
365 | /* Clear the mailboxes. The firmware may leave them dirty */ | 358 | /* Clear the mailboxes. The firmware may leave them dirty */ |
366 | bus_writeq(0xffffffffffffffffULL, | 359 | __raw_writeq(0xffffffffffffffffULL, |
367 | IOADDR(A_IMR_REGISTER(0, R_IMR_MAILBOX_CLR_CPU))); | 360 | IOADDR(A_IMR_REGISTER(0, R_IMR_MAILBOX_CLR_CPU))); |
368 | bus_writeq(0xffffffffffffffffULL, | 361 | __raw_writeq(0xffffffffffffffffULL, |
369 | IOADDR(A_IMR_REGISTER(1, R_IMR_MAILBOX_CLR_CPU))); | 362 | IOADDR(A_IMR_REGISTER(1, R_IMR_MAILBOX_CLR_CPU))); |
370 | 363 | ||
371 | /* Mask everything except the mailbox registers for both cpus */ | 364 | /* Mask everything except the mailbox registers for both cpus */ |
372 | tmp = ~((u64) 0) ^ (((u64) 1) << K_INT_MBOX_0); | 365 | tmp = ~((u64) 0) ^ (((u64) 1) << K_INT_MBOX_0); |
373 | bus_writeq(tmp, IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MASK))); | 366 | __raw_writeq(tmp, IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MASK))); |
374 | bus_writeq(tmp, IOADDR(A_IMR_REGISTER(1, R_IMR_INTERRUPT_MASK))); | 367 | __raw_writeq(tmp, IOADDR(A_IMR_REGISTER(1, R_IMR_INTERRUPT_MASK))); |
375 | 368 | ||
376 | sb1250_steal_irq(K_INT_MBOX_0); | 369 | sb1250_steal_irq(K_INT_MBOX_0); |
377 | 370 | ||
@@ -396,12 +389,14 @@ void __init arch_init_irq(void) | |||
396 | sb1250_duart_present[kgdb_port] = 0; | 389 | sb1250_duart_present[kgdb_port] = 0; |
397 | #endif | 390 | #endif |
398 | /* Setup uart 1 settings, mapper */ | 391 | /* Setup uart 1 settings, mapper */ |
399 | bus_writeq(M_DUART_IMR_BRK, IOADDR(A_DUART_IMRREG(kgdb_port))); | 392 | __raw_writeq(M_DUART_IMR_BRK, |
393 | IOADDR(A_DUART_IMRREG(kgdb_port))); | ||
400 | 394 | ||
401 | sb1250_steal_irq(kgdb_irq); | 395 | sb1250_steal_irq(kgdb_irq); |
402 | bus_writeq(IMR_IP6_VAL, | 396 | __raw_writeq(IMR_IP6_VAL, |
403 | IOADDR(A_IMR_REGISTER(0, R_IMR_INTERRUPT_MAP_BASE) + | 397 | IOADDR(A_IMR_REGISTER(0, |
404 | (kgdb_irq<<3))); | 398 | R_IMR_INTERRUPT_MAP_BASE) + |
399 | (kgdb_irq << 3))); | ||
405 | sb1250_unmask_irq(0, kgdb_irq); | 400 | sb1250_unmask_irq(0, kgdb_irq); |
406 | } | 401 | } |
407 | #endif | 402 | #endif |
diff --git a/arch/mips/sibyte/sb1250/setup.c b/arch/mips/sibyte/sb1250/setup.c index f8c605be96c7..df2e266c700c 100644 --- a/arch/mips/sibyte/sb1250/setup.c +++ b/arch/mips/sibyte/sb1250/setup.c | |||
@@ -153,7 +153,7 @@ void sb1250_setup(void) | |||
153 | int bad_config = 0; | 153 | int bad_config = 0; |
154 | 154 | ||
155 | sb1_pass = read_c0_prid() & 0xff; | 155 | sb1_pass = read_c0_prid() & 0xff; |
156 | sys_rev = bus_readq(IOADDR(A_SCD_SYSTEM_REVISION)); | 156 | sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION)); |
157 | soc_type = SYS_SOC_TYPE(sys_rev); | 157 | soc_type = SYS_SOC_TYPE(sys_rev); |
158 | soc_pass = G_SYS_REVISION(sys_rev); | 158 | soc_pass = G_SYS_REVISION(sys_rev); |
159 | 159 | ||
@@ -162,7 +162,7 @@ void sb1250_setup(void) | |||
162 | machine_restart(NULL); | 162 | machine_restart(NULL); |
163 | } | 163 | } |
164 | 164 | ||
165 | plldiv = G_SYS_PLL_DIV(bus_readq(IOADDR(A_SCD_SYSTEM_CFG))); | 165 | plldiv = G_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG))); |
166 | zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25); | 166 | zbbus_mhz = ((plldiv >> 1) * 50) + ((plldiv & 1) * 25); |
167 | 167 | ||
168 | prom_printf("Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)\n", | 168 | prom_printf("Broadcom SiByte %s %s @ %d MHz (SB1 rev %d)\n", |
diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c index be91b3990952..f859db02d3c9 100644 --- a/arch/mips/sibyte/sb1250/smp.c +++ b/arch/mips/sibyte/sb1250/smp.c | |||
@@ -29,18 +29,18 @@ | |||
29 | #include <asm/sibyte/sb1250_int.h> | 29 | #include <asm/sibyte/sb1250_int.h> |
30 | 30 | ||
31 | static void *mailbox_set_regs[] = { | 31 | static void *mailbox_set_regs[] = { |
32 | (void *)IOADDR(A_IMR_CPU0_BASE + R_IMR_MAILBOX_SET_CPU), | 32 | IOADDR(A_IMR_CPU0_BASE + R_IMR_MAILBOX_SET_CPU), |
33 | (void *)IOADDR(A_IMR_CPU1_BASE + R_IMR_MAILBOX_SET_CPU) | 33 | IOADDR(A_IMR_CPU1_BASE + R_IMR_MAILBOX_SET_CPU) |
34 | }; | 34 | }; |
35 | 35 | ||
36 | static void *mailbox_clear_regs[] = { | 36 | static void *mailbox_clear_regs[] = { |
37 | (void *)IOADDR(A_IMR_CPU0_BASE + R_IMR_MAILBOX_CLR_CPU), | 37 | IOADDR(A_IMR_CPU0_BASE + R_IMR_MAILBOX_CLR_CPU), |
38 | (void *)IOADDR(A_IMR_CPU1_BASE + R_IMR_MAILBOX_CLR_CPU) | 38 | IOADDR(A_IMR_CPU1_BASE + R_IMR_MAILBOX_CLR_CPU) |
39 | }; | 39 | }; |
40 | 40 | ||
41 | static void *mailbox_regs[] = { | 41 | static void *mailbox_regs[] = { |
42 | (void *)IOADDR(A_IMR_CPU0_BASE + R_IMR_MAILBOX_CPU), | 42 | IOADDR(A_IMR_CPU0_BASE + R_IMR_MAILBOX_CPU), |
43 | (void *)IOADDR(A_IMR_CPU1_BASE + R_IMR_MAILBOX_CPU) | 43 | IOADDR(A_IMR_CPU1_BASE + R_IMR_MAILBOX_CPU) |
44 | }; | 44 | }; |
45 | 45 | ||
46 | /* | 46 | /* |
@@ -73,7 +73,7 @@ void sb1250_smp_finish(void) | |||
73 | */ | 73 | */ |
74 | void core_send_ipi(int cpu, unsigned int action) | 74 | void core_send_ipi(int cpu, unsigned int action) |
75 | { | 75 | { |
76 | bus_writeq((((u64)action) << 48), mailbox_set_regs[cpu]); | 76 | __raw_writeq((((u64)action) << 48), mailbox_set_regs[cpu]); |
77 | } | 77 | } |
78 | 78 | ||
79 | void sb1250_mailbox_interrupt(struct pt_regs *regs) | 79 | void sb1250_mailbox_interrupt(struct pt_regs *regs) |
@@ -83,10 +83,10 @@ void sb1250_mailbox_interrupt(struct pt_regs *regs) | |||
83 | 83 | ||
84 | kstat_this_cpu.irqs[K_INT_MBOX_0]++; | 84 | kstat_this_cpu.irqs[K_INT_MBOX_0]++; |
85 | /* Load the mailbox register to figure out what we're supposed to do */ | 85 | /* Load the mailbox register to figure out what we're supposed to do */ |
86 | action = (__bus_readq(mailbox_regs[cpu]) >> 48) & 0xffff; | 86 | action = (____raw_readq(mailbox_regs[cpu]) >> 48) & 0xffff; |
87 | 87 | ||
88 | /* Clear the mailbox to clear the interrupt */ | 88 | /* Clear the mailbox to clear the interrupt */ |
89 | __bus_writeq(((u64)action) << 48, mailbox_clear_regs[cpu]); | 89 | ____raw_writeq(((u64)action) << 48, mailbox_clear_regs[cpu]); |
90 | 90 | ||
91 | /* | 91 | /* |
92 | * Nothing to do for SMP_RESCHEDULE_YOURSELF; returning from the | 92 | * Nothing to do for SMP_RESCHEDULE_YOURSELF; returning from the |
diff --git a/arch/mips/sibyte/sb1250/time.c b/arch/mips/sibyte/sb1250/time.c index 8b4c848c907b..511c89d65f38 100644 --- a/arch/mips/sibyte/sb1250/time.c +++ b/arch/mips/sibyte/sb1250/time.c | |||
@@ -67,24 +67,24 @@ void sb1250_time_init(void) | |||
67 | sb1250_mask_irq(cpu, irq); | 67 | sb1250_mask_irq(cpu, irq); |
68 | 68 | ||
69 | /* Map the timer interrupt to ip[4] of this cpu */ | 69 | /* Map the timer interrupt to ip[4] of this cpu */ |
70 | bus_writeq(IMR_IP4_VAL, | 70 | __raw_writeq(IMR_IP4_VAL, |
71 | IOADDR(A_IMR_REGISTER(cpu, R_IMR_INTERRUPT_MAP_BASE) + | 71 | IOADDR(A_IMR_REGISTER(cpu, R_IMR_INTERRUPT_MAP_BASE) + |
72 | (irq << 3))); | 72 | (irq << 3))); |
73 | 73 | ||
74 | /* the general purpose timer ticks at 1 Mhz independent if the rest of the system */ | 74 | /* the general purpose timer ticks at 1 Mhz independent if the rest of the system */ |
75 | /* Disable the timer and set up the count */ | 75 | /* Disable the timer and set up the count */ |
76 | bus_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | 76 | __raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); |
77 | #ifdef CONFIG_SIMULATION | 77 | #ifdef CONFIG_SIMULATION |
78 | bus_writeq(50000 / HZ, | 78 | __raw_writeq(50000 / HZ, |
79 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); | 79 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); |
80 | #else | 80 | #else |
81 | bus_writeq(1000000/HZ, | 81 | __raw_writeq(1000000 / HZ, |
82 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); | 82 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT))); |
83 | #endif | 83 | #endif |
84 | 84 | ||
85 | /* Set the timer running */ | 85 | /* Set the timer running */ |
86 | bus_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | 86 | __raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, |
87 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | 87 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); |
88 | 88 | ||
89 | sb1250_unmask_irq(cpu, irq); | 89 | sb1250_unmask_irq(cpu, irq); |
90 | sb1250_steal_irq(irq); | 90 | sb1250_steal_irq(irq); |
@@ -100,25 +100,25 @@ void sb1250_time_init(void) | |||
100 | 100 | ||
101 | void sb1250_timer_interrupt(struct pt_regs *regs) | 101 | void sb1250_timer_interrupt(struct pt_regs *regs) |
102 | { | 102 | { |
103 | extern asmlinkage void ll_local_timer_interrupt(int irq, struct pt_regs *regs); | ||
104 | int cpu = smp_processor_id(); | 103 | int cpu = smp_processor_id(); |
105 | int irq = K_INT_TIMER_0 + cpu; | 104 | int irq = K_INT_TIMER_0 + cpu; |
106 | 105 | ||
107 | /* Reset the timer */ | 106 | /* Reset the timer */ |
108 | __bus_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | 107 | ____raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, |
109 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | 108 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); |
110 | 109 | ||
111 | /* | ||
112 | * CPU 0 handles the global timer interrupt job | ||
113 | */ | ||
114 | if (cpu == 0) { | 110 | if (cpu == 0) { |
111 | /* | ||
112 | * CPU 0 handles the global timer interrupt job | ||
113 | */ | ||
115 | ll_timer_interrupt(irq, regs); | 114 | ll_timer_interrupt(irq, regs); |
116 | } | 115 | } |
117 | 116 | else { | |
118 | /* | 117 | /* |
119 | * every CPU should do profiling and process accouting | 118 | * other CPUs should just do profiling and process accounting |
120 | */ | 119 | */ |
121 | ll_local_timer_interrupt(irq, regs); | 120 | ll_local_timer_interrupt(irq, regs); |
121 | } | ||
122 | } | 122 | } |
123 | 123 | ||
124 | /* | 124 | /* |
@@ -130,7 +130,7 @@ void sb1250_timer_interrupt(struct pt_regs *regs) | |||
130 | unsigned long sb1250_gettimeoffset(void) | 130 | unsigned long sb1250_gettimeoffset(void) |
131 | { | 131 | { |
132 | unsigned long count = | 132 | unsigned long count = |
133 | bus_readq(IOADDR(A_SCD_TIMER_REGISTER(0, R_SCD_TIMER_CNT))); | 133 | __raw_readq(IOADDR(A_SCD_TIMER_REGISTER(0, R_SCD_TIMER_CNT))); |
134 | 134 | ||
135 | return 1000000/HZ - count; | 135 | return 1000000/HZ - count; |
136 | } | 136 | } |