Rev 2131 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2131 | Rev 2456 | ||
|---|---|---|---|
| Line 47... | Line 47... | ||
| 47 | #include <console/chardev.h> |
47 | #include <console/chardev.h> |
| 48 | #include <console/console.h> |
48 | #include <console/console.h> |
| 49 | #include <interrupt.h> |
49 | #include <interrupt.h> |
| 50 | #include <sysinfo/sysinfo.h> |
50 | #include <sysinfo/sysinfo.h> |
| 51 | #include <ipc/irq.h> |
51 | #include <ipc/irq.h> |
| - | 52 | #include <generic/synch/rcu.h> |
|
| 52 | 53 | ||
| 53 | /* Keyboard commands. */ |
54 | /* Keyboard commands. */ |
| 54 | #define KBD_ENABLE 0xf4 |
55 | #define KBD_ENABLE 0xf4 |
| 55 | #define KBD_DISABLE 0xf5 |
56 | #define KBD_DISABLE 0xf5 |
| 56 | #define KBD_ACK 0xfa |
57 | #define KBD_ACK 0xfa |
| Line 105... | Line 106... | ||
| 105 | i8042_command_write(i8042_SET_COMMAND); |
106 | i8042_command_write(i8042_SET_COMMAND); |
| 106 | i8042_wait(); |
107 | i8042_wait(); |
| 107 | i8042_data_write(i8042_COMMAND); |
108 | i8042_data_write(i8042_COMMAND); |
| 108 | i8042_wait(); |
109 | i8042_wait(); |
| 109 | 110 | ||
| 110 | spinlock_lock(&i8042_kbd_irq.lock); |
111 | //rcu_read_lock() is not needed, ints are disabled |
| 111 | i8042_kbd_irq.notif_cfg.notify = false; |
112 | //rcu: atomic update doesn't need reallocation |
| 112 | spinlock_unlock(&i8042_kbd_irq.lock); |
113 | rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).notify = false; |
| 113 | 114 | ||
| 114 | spinlock_lock(&i8042_mouse_irq.lock); |
- | |
| 115 | i8042_mouse_irq.notif_cfg.notify = false; |
115 | rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).notify = false; |
| 116 | spinlock_unlock(&i8042_mouse_irq.lock); |
- | |
| 117 | 116 | ||
| 118 | interrupts_restore(ipl); |
117 | interrupts_restore(ipl); |
| 119 | } |
118 | } |
| 120 | 119 | ||
| 121 | void i8042_release(void) |
120 | void i8042_release(void) |
| 122 | { |
121 | { |
| 123 | ipl_t ipl = interrupts_disable(); |
122 | ipl_t ipl = interrupts_disable(); |
| 124 | - | ||
| - | 123 | //rcu: atomic update doesn't need reallocation |
|
| 125 | spinlock_lock(&i8042_kbd_irq.lock); |
124 | spinlock_lock(&i8042_kbd_irq.lock); |
| 126 | if (i8042_kbd_irq.notif_cfg.answerbox) |
125 | if (rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).answerbox) |
| 127 | i8042_kbd_irq.notif_cfg.notify = true; |
126 | rcu_dereference_pointer(i8042_kbd_irq.notif_cfg).notify = true; |
| 128 | spinlock_unlock(&i8042_kbd_irq.lock); |
127 | spinlock_unlock(&i8042_kbd_irq.lock); |
| 129 | 128 | ||
| 130 | spinlock_lock(&i8042_mouse_irq.lock); |
129 | spinlock_lock(&i8042_mouse_irq.lock); |
| 131 | if (i8042_mouse_irq.notif_cfg.answerbox) |
130 | if (rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).answerbox) |
| 132 | i8042_mouse_irq.notif_cfg.notify = true; |
131 | rcu_dereference_pointer(i8042_mouse_irq.notif_cfg).notify = true; |
| 133 | spinlock_unlock(&i8042_mouse_irq.lock); |
132 | spinlock_unlock(&i8042_mouse_irq.lock); |
| 134 | 133 | ||
| 135 | interrupts_restore(ipl); |
134 | interrupts_restore(ipl); |
| 136 | } |
135 | } |
| 137 | 136 | ||
| Line 140... | Line 139... | ||
| 140 | return IRQ_ACCEPT; |
139 | return IRQ_ACCEPT; |
| 141 | } |
140 | } |
| 142 | 141 | ||
| 143 | static void i8042_kbd_irq_handler(irq_t *irq, void *arg, ...) |
142 | static void i8042_kbd_irq_handler(irq_t *irq, void *arg, ...) |
| 144 | { |
143 | { |
| 145 | if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
144 | if (rcu_dereference_pointer(irq->notif_cfg).notify && rcu_dereference_pointer(irq->notif_cfg).answerbox) |
| 146 | ipc_irq_send_notif(irq); |
145 | ipc_irq_send_notif(irq); |
| 147 | else { |
146 | else { |
| 148 | uint8_t x; |
147 | uint8_t x; |
| 149 | uint8_t status; |
148 | uint8_t status; |
| 150 | 149 | ||
| Line 162... | Line 161... | ||
| 162 | } |
161 | } |
| 163 | } |
162 | } |
| 164 | 163 | ||
| 165 | static void i8042_mouse_irq_handler(irq_t *irq, void *arg, ...) |
164 | static void i8042_mouse_irq_handler(irq_t *irq, void *arg, ...) |
| 166 | { |
165 | { |
| 167 | if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
166 | if (rcu_dereference_pointer(irq->notif_cfg).notify && rcu_dereference_pointer(irq->notif_cfg).answerbox) |
| 168 | ipc_irq_send_notif(irq); |
167 | ipc_irq_send_notif(irq); |
| 169 | } |
168 | } |
| 170 | 169 | ||
| 171 | /** Initialize i8042. */ |
170 | /** Initialize i8042. */ |
| 172 | void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr) |
171 | void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr) |