Rev 2307 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2307 | Rev 2456 | ||
---|---|---|---|
Line 39... | Line 39... | ||
39 | #include <console/chardev.h> |
39 | #include <console/chardev.h> |
40 | #include <arch/drivers/pic.h> |
40 | #include <arch/drivers/pic.h> |
41 | #include <sysinfo/sysinfo.h> |
41 | #include <sysinfo/sysinfo.h> |
42 | #include <interrupt.h> |
42 | #include <interrupt.h> |
43 | #include <stdarg.h> |
43 | #include <stdarg.h> |
- | 44 | #include <synch/rcu.h> |
|
44 | 45 | ||
45 | #define CUDA_IRQ 10 |
46 | #define CUDA_IRQ 10 |
46 | #define SPECIAL '?' |
47 | #define SPECIAL '?' |
47 | 48 | ||
48 | #define PACKET_ADB 0x00 |
49 | #define PACKET_ADB 0x00 |
Line 247... | Line 248... | ||
247 | return -1; |
248 | return -1; |
248 | } |
249 | } |
249 | 250 | ||
250 | static void cuda_irq_handler(irq_t *irq, void *arg, ...) |
251 | static void cuda_irq_handler(irq_t *irq, void *arg, ...) |
251 | { |
252 | { |
252 | if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) |
253 | if ((rcu_dereference_pointer(irq->notif_cfg).notify) && (rcu_dereference_pointer(irq->notif_cfg).answerbox)) |
253 | ipc_irq_send_notif(irq); |
254 | ipc_irq_send_notif(irq); |
254 | else { |
255 | else { |
255 | int scan_code = cuda_get_scancode(); |
256 | int scan_code = cuda_get_scancode(); |
256 | 257 | ||
257 | if (scan_code != -1) { |
258 | if (scan_code != -1) { |
Line 270... | Line 271... | ||
270 | 271 | ||
271 | /** Initialize keyboard and service interrupts using kernel routine */ |
272 | /** Initialize keyboard and service interrupts using kernel routine */ |
272 | void cuda_grab(void) |
273 | void cuda_grab(void) |
273 | { |
274 | { |
274 | ipl_t ipl = interrupts_disable(); |
275 | ipl_t ipl = interrupts_disable(); |
275 | spinlock_lock(&cuda_irq.lock); |
276 | //rcu_read_lock() is not needed, ints are disabled |
276 | cuda_irq.notif_cfg.notify = false; |
277 | //rcu: atomic update doesn't need reallocation |
277 | spinlock_unlock(&cuda_irq.lock); |
278 | rcu_dereference_pointer(cuda_irq.notif_cfg).notify = false; |
278 | interrupts_restore(ipl); |
279 | interrupts_restore(ipl); |
279 | } |
280 | } |
280 | 281 | ||
281 | 282 | ||
282 | /** Resume the former interrupt vector */ |
283 | /** Resume the former interrupt vector */ |
283 | void cuda_release(void) |
284 | void cuda_release(void) |
284 | { |
285 | { |
285 | ipl_t ipl = interrupts_disable(); |
286 | ipl_t ipl = interrupts_disable(); |
- | 287 | //rcu: atomic update doesn't need reallocation |
|
286 | spinlock_lock(&cuda_irq.lock); |
288 | spinlock_lock(&cuda_irq.lock); |
287 | if (cuda_irq.notif_cfg.answerbox) |
289 | if (rcu_dereference_pointer(cuda_irq.notif_cfg).answerbox) |
288 | cuda_irq.notif_cfg.notify = true; |
290 | rcu_dereference_pointer(cuda_irq.notif_cfg).notify = true; |
289 | spinlock_unlock(&cuda_irq.unlock); |
291 | spinlock_unlock(&cuda_irq.unlock); |
290 | interrupts_restore(ipl); |
292 | interrupts_restore(ipl); |
291 | } |
293 | } |
292 | 294 | ||
293 | 295 |