xref: /freebsd/sys/dev/atkbdc/atkbdc.c (revision 8d20be1e22095c27faf8fe8b2f0d089739cc742e)
1 /*-
2  * Copyright (c) 1996-1999
3  * Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote
15  *    products derived from this software without specific prior written
16  *    permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * from kbdio.c,v 1.13 1998/09/25 11:55:46 yokota Exp
31  */
32 
33 #include <sys/cdefs.h>
34 __FBSDID("$FreeBSD$");
35 
36 #include "opt_kbd.h"
37 
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/bus.h>
41 #include <sys/malloc.h>
42 #include <sys/syslog.h>
43 #include <machine/bus.h>
44 #include <machine/resource.h>
45 #include <sys/rman.h>
46 
47 #if defined(__amd64__)
48 #include <machine/clock.h>
49 #endif
50 
51 #include <dev/atkbdc/atkbdcreg.h>
52 
53 #ifdef __sparc64__
54 #include <dev/ofw/openfirm.h>
55 #include <machine/bus_private.h>
56 #include <machine/ofw_machdep.h>
57 #else
58 #include <isa/isareg.h>
59 #endif
60 
61 /* constants */
62 
63 #define MAXKBDC		1		/* XXX */
64 
65 /* macros */
66 
67 #ifndef MAX
68 #define MAX(x, y)	((x) > (y) ? (x) : (y))
69 #endif
70 
71 #define kbdcp(p)	((atkbdc_softc_t *)(p))
72 #define nextq(i)	(((i) + 1) % KBDQ_BUFSIZE)
73 #define availq(q)	((q)->head != (q)->tail)
74 #if KBDIO_DEBUG >= 2
75 #define emptyq(q)	((q)->tail = (q)->head = (q)->qcount = 0)
76 #else
77 #define emptyq(q)	((q)->tail = (q)->head = 0)
78 #endif
79 
80 #define read_data(k)	(bus_space_read_1((k)->iot, (k)->ioh0, 0))
81 #define read_status(k)	(bus_space_read_1((k)->iot, (k)->ioh1, 0))
82 #define write_data(k, d)	\
83 			(bus_space_write_1((k)->iot, (k)->ioh0, 0, (d)))
84 #define write_command(k, d)	\
85 			(bus_space_write_1((k)->iot, (k)->ioh1, 0, (d)))
86 
87 /* local variables */
88 
89 /*
90  * We always need at least one copy of the kbdc_softc struct for the
91  * low-level console.  As the low-level console accesses the keyboard
92  * controller before kbdc, and all other devices, is probed, we
93  * statically allocate one entry. XXX
94  */
95 static atkbdc_softc_t default_kbdc;
96 static atkbdc_softc_t *atkbdc_softc[MAXKBDC] = { &default_kbdc };
97 
98 static int verbose = KBDIO_DEBUG;
99 
100 #ifdef __sparc64__
101 static struct bus_space_tag atkbdc_bst_store[MAXKBDC];
102 #endif
103 
104 /* function prototypes */
105 
106 static int atkbdc_setup(atkbdc_softc_t *sc, bus_space_tag_t tag,
107 			bus_space_handle_t h0, bus_space_handle_t h1);
108 static int addq(kqueue *q, int c);
109 static int removeq(kqueue *q);
110 static int wait_while_controller_busy(atkbdc_softc_t *kbdc);
111 static int wait_for_data(atkbdc_softc_t *kbdc);
112 static int wait_for_kbd_data(atkbdc_softc_t *kbdc);
113 static int wait_for_kbd_ack(atkbdc_softc_t *kbdc);
114 static int wait_for_aux_data(atkbdc_softc_t *kbdc);
115 static int wait_for_aux_ack(atkbdc_softc_t *kbdc);
116 
117 atkbdc_softc_t
118 *atkbdc_get_softc(int unit)
119 {
120 	atkbdc_softc_t *sc;
121 
122 	if (unit >= sizeof(atkbdc_softc)/sizeof(atkbdc_softc[0]))
123 		return NULL;
124 	sc = atkbdc_softc[unit];
125 	if (sc == NULL) {
126 		sc = atkbdc_softc[unit]
127 		   = malloc(sizeof(*sc), M_DEVBUF, M_NOWAIT | M_ZERO);
128 		if (sc == NULL)
129 			return NULL;
130 	}
131 	return sc;
132 }
133 
134 int
135 atkbdc_probe_unit(int unit, struct resource *port0, struct resource *port1)
136 {
137 	if (rman_get_start(port0) <= 0)
138 		return ENXIO;
139 	if (rman_get_start(port1) <= 0)
140 		return ENXIO;
141 	return 0;
142 }
143 
144 int
145 atkbdc_attach_unit(int unit, atkbdc_softc_t *sc, struct resource *port0,
146 		   struct resource *port1)
147 {
148 	return atkbdc_setup(sc, rman_get_bustag(port0),
149 			    rman_get_bushandle(port0),
150 			    rman_get_bushandle(port1));
151 }
152 
153 /* the backdoor to the keyboard controller! XXX */
154 int
155 atkbdc_configure(void)
156 {
157 	bus_space_tag_t tag;
158 	bus_space_handle_t h0;
159 	bus_space_handle_t h1;
160 #if defined(__i386__) || defined(__amd64__)
161 	volatile int i;
162 	register_t flags;
163 #endif
164 #ifdef __sparc64__
165 	char name[32];
166 	phandle_t chosen, node;
167 	ihandle_t stdin;
168 	bus_addr_t port0;
169 	bus_addr_t port1;
170 	int space;
171 #else
172 	int port0;
173 	int port1;
174 #endif
175 
176 	/* XXX: tag should be passed from the caller */
177 #if defined(__amd64__) || defined(__i386__)
178 	tag = X86_BUS_SPACE_IO;
179 #elif defined(__ia64__)
180 	tag = IA64_BUS_SPACE_IO;
181 #elif defined(__sparc64__)
182 	tag = &atkbdc_bst_store[0];
183 #else
184 #error "define tag!"
185 #endif
186 
187 #ifdef __sparc64__
188 	if ((chosen = OF_finddevice("/chosen")) == -1)
189 		return 0;
190 	if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) == -1)
191 		return 0;
192 	if ((node = OF_instance_to_package(stdin)) == -1)
193 		return 0;
194 	if (OF_getprop(node, "name", name, sizeof(name)) == -1)
195 		return 0;
196 	name[sizeof(name) - 1] = '\0';
197 	if (strcmp(name, "kb_ps2") != 0)
198 		return 0;
199 	/*
200 	 * The stdin handle points to an instance of a PS/2 keyboard
201 	 * package but we want the 8042 controller, which is the parent
202 	 * of that keyboard node.
203 	 */
204 	if ((node = OF_parent(node)) == 0)
205 		return 0;
206 	if (OF_decode_addr(node, 0, &space, &port0) != 0)
207 		return 0;
208 	h0 = sparc64_fake_bustag(space, port0, tag);
209 	bus_space_subregion(tag, h0, KBD_DATA_PORT, 1, &h0);
210 	if (OF_decode_addr(node, 1, &space, &port1) != 0)
211 		return 0;
212 	h1 = sparc64_fake_bustag(space, port1, tag);
213 	bus_space_subregion(tag, h1, KBD_STATUS_PORT, 1, &h1);
214 #else
215 	port0 = IO_KBD;
216 	resource_int_value("atkbdc", 0, "port", &port0);
217 	port1 = IO_KBD + KBD_STATUS_PORT;
218 #ifdef notyet
219 	bus_space_map(tag, port0, IO_KBDSIZE, 0, &h0);
220 	bus_space_map(tag, port1, IO_KBDSIZE, 0, &h1);
221 #else
222 	h0 = (bus_space_handle_t)port0;
223 	h1 = (bus_space_handle_t)port1;
224 #endif
225 #endif
226 
227 #if defined(__i386__) || defined(__amd64__)
228 	/*
229 	 * Check if we really have AT keyboard controller. Poll status
230 	 * register until we get "all clear" indication. If no such
231 	 * indication comes, it probably means that there is no AT
232 	 * keyboard controller present. Give up in such case. Check relies
233 	 * on the fact that reading from non-existing in/out port returns
234 	 * 0xff on i386. May or may not be true on other platforms.
235 	 */
236 	flags = intr_disable();
237 	for (i = 0; i != 65535; i++) {
238 		if ((bus_space_read_1(tag, h1, 0) & 0x2) == 0)
239 			break;
240 	}
241 	intr_restore(flags);
242 	if (i == 65535)
243                 return ENXIO;
244 #endif
245 
246 	return atkbdc_setup(atkbdc_softc[0], tag, h0, h1);
247 }
248 
249 static int
250 atkbdc_setup(atkbdc_softc_t *sc, bus_space_tag_t tag, bus_space_handle_t h0,
251 	     bus_space_handle_t h1)
252 {
253 #if defined(__amd64__)
254 	u_int64_t tscval[3], read_delay;
255 	register_t flags;
256 #endif
257 
258 	if (sc->ioh0 == 0) {	/* XXX */
259 	    sc->command_byte = -1;
260 	    sc->command_mask = 0;
261 	    sc->lock = FALSE;
262 	    sc->kbd.head = sc->kbd.tail = 0;
263 	    sc->aux.head = sc->aux.tail = 0;
264 #if KBDIO_DEBUG >= 2
265 	    sc->kbd.call_count = 0;
266 	    sc->kbd.qcount = sc->kbd.max_qcount = 0;
267 	    sc->aux.call_count = 0;
268 	    sc->aux.qcount = sc->aux.max_qcount = 0;
269 #endif
270 	}
271 	sc->iot = tag;
272 	sc->ioh0 = h0;
273 	sc->ioh1 = h1;
274 
275 #if defined(__amd64__)
276 	/*
277 	 * On certain chipsets AT keyboard controller isn't present and is
278 	 * emulated by BIOS using SMI interrupt. On those chipsets reading
279 	 * from the status port may be thousand times slower than usually.
280 	 * Sometimes this emilation is not working properly resulting in
281 	 * commands timing our and since we assume that inb() operation
282 	 * takes very little time to complete we need to adjust number of
283 	 * retries to keep waiting time within a designed limits (100ms).
284 	 * Measure time it takes to make read_status() call and adjust
285 	 * number of retries accordingly.
286 	 */
287 	flags = intr_disable();
288 	tscval[0] = rdtsc();
289 	read_status(sc);
290 	tscval[1] = rdtsc();
291 	DELAY(1000);
292 	tscval[2] = rdtsc();
293 	intr_restore(flags);
294 	read_delay = tscval[1] - tscval[0];
295 	read_delay /= (tscval[2] - tscval[1]) / 1000;
296 	sc->retry = 100000 / ((KBDD_DELAYTIME * 2) + read_delay);
297 #else
298 	sc->retry = 5000;
299 #endif
300 
301 	return 0;
302 }
303 
304 /* open a keyboard controller */
305 KBDC
306 atkbdc_open(int unit)
307 {
308     if (unit <= 0)
309 	unit = 0;
310     if (unit >= MAXKBDC)
311 	return NULL;
312     if ((atkbdc_softc[unit]->port0 != NULL)
313 	|| (atkbdc_softc[unit]->ioh0 != 0))		/* XXX */
314 	return (KBDC)atkbdc_softc[unit];
315     return NULL;
316 }
317 
318 /*
319  * I/O access arbitration in `kbdio'
320  *
321  * The `kbdio' module uses a simplistic convention to arbitrate
322  * I/O access to the controller/keyboard/mouse. The convention requires
323  * close cooperation of the calling device driver.
324  *
325  * The device drivers which utilize the `kbdio' module are assumed to
326  * have the following set of routines.
327  *    a. An interrupt handler (the bottom half of the driver).
328  *    b. Timeout routines which may briefly poll the keyboard controller.
329  *    c. Routines outside interrupt context (the top half of the driver).
330  * They should follow the rules below:
331  *    1. The interrupt handler may assume that it always has full access
332  *       to the controller/keyboard/mouse.
333  *    2. The other routines must issue `spltty()' if they wish to
334  *       prevent the interrupt handler from accessing
335  *       the controller/keyboard/mouse.
336  *    3. The timeout routines and the top half routines of the device driver
337  *       arbitrate I/O access by observing the lock flag in `kbdio'.
338  *       The flag is manipulated via `kbdc_lock()'; when one wants to
339  *       perform I/O, call `kbdc_lock(kbdc, TRUE)' and proceed only if
340  *       the call returns with TRUE. Otherwise the caller must back off.
341  *       Call `kbdc_lock(kbdc, FALSE)' when necessary I/O operaion
342  *       is finished. This mechanism does not prevent the interrupt
343  *       handler from being invoked at any time and carrying out I/O.
344  *       Therefore, `spltty()' must be strategically placed in the device
345  *       driver code. Also note that the timeout routine may interrupt
346  *       `kbdc_lock()' called by the top half of the driver, but this
347  *       interruption is OK so long as the timeout routine observes
348  *       rule 4 below.
349  *    4. The interrupt and timeout routines should not extend I/O operation
350  *       across more than one interrupt or timeout; they must complete any
351  *       necessary I/O operation within one invocation of the routine.
352  *       This means that if the timeout routine acquires the lock flag,
353  *       it must reset the flag to FALSE before it returns.
354  */
355 
356 /* set/reset polling lock */
357 int
358 kbdc_lock(KBDC p, int lock)
359 {
360     int prevlock;
361 
362     prevlock = kbdcp(p)->lock;
363     kbdcp(p)->lock = lock;
364 
365     return (prevlock != lock);
366 }
367 
368 /* check if any data is waiting to be processed */
369 int
370 kbdc_data_ready(KBDC p)
371 {
372     return (availq(&kbdcp(p)->kbd) || availq(&kbdcp(p)->aux)
373 	|| (read_status(kbdcp(p)) & KBDS_ANY_BUFFER_FULL));
374 }
375 
376 /* queuing functions */
377 
378 static int
379 addq(kqueue *q, int c)
380 {
381     if (nextq(q->tail) != q->head) {
382 	q->q[q->tail] = c;
383 	q->tail = nextq(q->tail);
384 #if KBDIO_DEBUG >= 2
385         ++q->call_count;
386         ++q->qcount;
387 	if (q->qcount > q->max_qcount)
388             q->max_qcount = q->qcount;
389 #endif
390 	return TRUE;
391     }
392     return FALSE;
393 }
394 
395 static int
396 removeq(kqueue *q)
397 {
398     int c;
399 
400     if (q->tail != q->head) {
401 	c = q->q[q->head];
402 	q->head = nextq(q->head);
403 #if KBDIO_DEBUG >= 2
404         --q->qcount;
405 #endif
406 	return c;
407     }
408     return -1;
409 }
410 
411 /*
412  * device I/O routines
413  */
414 static int
415 wait_while_controller_busy(struct atkbdc_softc *kbdc)
416 {
417     int retry;
418     int f;
419 
420     /* CPU will stay inside the loop for 100msec at most */
421     retry = kbdc->retry;
422 
423     while ((f = read_status(kbdc)) & KBDS_INPUT_BUFFER_FULL) {
424 	if ((f & KBDS_BUFFER_FULL) == KBDS_KBD_BUFFER_FULL) {
425 	    DELAY(KBDD_DELAYTIME);
426 	    addq(&kbdc->kbd, read_data(kbdc));
427 	} else if ((f & KBDS_BUFFER_FULL) == KBDS_AUX_BUFFER_FULL) {
428 	    DELAY(KBDD_DELAYTIME);
429 	    addq(&kbdc->aux, read_data(kbdc));
430 	}
431         DELAY(KBDC_DELAYTIME);
432         if (--retry < 0)
433     	    return FALSE;
434     }
435     return TRUE;
436 }
437 
438 /*
439  * wait for any data; whether it's from the controller,
440  * the keyboard, or the aux device.
441  */
442 static int
443 wait_for_data(struct atkbdc_softc *kbdc)
444 {
445     int retry;
446     int f;
447 
448     /* CPU will stay inside the loop for 200msec at most */
449     retry = kbdc->retry * 2;
450 
451     while ((f = read_status(kbdc) & KBDS_ANY_BUFFER_FULL) == 0) {
452         DELAY(KBDC_DELAYTIME);
453         if (--retry < 0)
454     	    return 0;
455     }
456     DELAY(KBDD_DELAYTIME);
457     return f;
458 }
459 
460 /* wait for data from the keyboard */
461 static int
462 wait_for_kbd_data(struct atkbdc_softc *kbdc)
463 {
464     int retry;
465     int f;
466 
467     /* CPU will stay inside the loop for 200msec at most */
468     retry = kbdc->retry * 2;
469 
470     while ((f = read_status(kbdc) & KBDS_BUFFER_FULL)
471 	    != KBDS_KBD_BUFFER_FULL) {
472         if (f == KBDS_AUX_BUFFER_FULL) {
473 	    DELAY(KBDD_DELAYTIME);
474 	    addq(&kbdc->aux, read_data(kbdc));
475 	}
476         DELAY(KBDC_DELAYTIME);
477         if (--retry < 0)
478     	    return 0;
479     }
480     DELAY(KBDD_DELAYTIME);
481     return f;
482 }
483 
484 /*
485  * wait for an ACK(FAh), RESEND(FEh), or RESET_FAIL(FCh) from the keyboard.
486  * queue anything else.
487  */
488 static int
489 wait_for_kbd_ack(struct atkbdc_softc *kbdc)
490 {
491     int retry;
492     int f;
493     int b;
494 
495     /* CPU will stay inside the loop for 200msec at most */
496     retry = kbdc->retry * 2;
497 
498     while (retry-- > 0) {
499         if ((f = read_status(kbdc)) & KBDS_ANY_BUFFER_FULL) {
500 	    DELAY(KBDD_DELAYTIME);
501             b = read_data(kbdc);
502 	    if ((f & KBDS_BUFFER_FULL) == KBDS_KBD_BUFFER_FULL) {
503 		if ((b == KBD_ACK) || (b == KBD_RESEND)
504 		    || (b == KBD_RESET_FAIL))
505 		    return b;
506 		addq(&kbdc->kbd, b);
507 	    } else if ((f & KBDS_BUFFER_FULL) == KBDS_AUX_BUFFER_FULL) {
508 		addq(&kbdc->aux, b);
509 	    }
510 	}
511         DELAY(KBDC_DELAYTIME);
512     }
513     return -1;
514 }
515 
516 /* wait for data from the aux device */
517 static int
518 wait_for_aux_data(struct atkbdc_softc *kbdc)
519 {
520     int retry;
521     int f;
522 
523     /* CPU will stay inside the loop for 200msec at most */
524     retry = kbdc->retry * 2;
525 
526     while ((f = read_status(kbdc) & KBDS_BUFFER_FULL)
527 	    != KBDS_AUX_BUFFER_FULL) {
528         if (f == KBDS_KBD_BUFFER_FULL) {
529 	    DELAY(KBDD_DELAYTIME);
530 	    addq(&kbdc->kbd, read_data(kbdc));
531 	}
532         DELAY(KBDC_DELAYTIME);
533         if (--retry < 0)
534     	    return 0;
535     }
536     DELAY(KBDD_DELAYTIME);
537     return f;
538 }
539 
540 /*
541  * wait for an ACK(FAh), RESEND(FEh), or RESET_FAIL(FCh) from the aux device.
542  * queue anything else.
543  */
544 static int
545 wait_for_aux_ack(struct atkbdc_softc *kbdc)
546 {
547     int retry;
548     int f;
549     int b;
550 
551     /* CPU will stay inside the loop for 200msec at most */
552     retry = kbdc->retry * 2;
553 
554     while (retry-- > 0) {
555         if ((f = read_status(kbdc)) & KBDS_ANY_BUFFER_FULL) {
556 	    DELAY(KBDD_DELAYTIME);
557             b = read_data(kbdc);
558 	    if ((f & KBDS_BUFFER_FULL) == KBDS_AUX_BUFFER_FULL) {
559 		if ((b == PSM_ACK) || (b == PSM_RESEND)
560 		    || (b == PSM_RESET_FAIL))
561 		    return b;
562 		addq(&kbdc->aux, b);
563 	    } else if ((f & KBDS_BUFFER_FULL) == KBDS_KBD_BUFFER_FULL) {
564 		addq(&kbdc->kbd, b);
565 	    }
566 	}
567         DELAY(KBDC_DELAYTIME);
568     }
569     return -1;
570 }
571 
572 /* write a one byte command to the controller */
573 int
574 write_controller_command(KBDC p, int c)
575 {
576     if (!wait_while_controller_busy(kbdcp(p)))
577 	return FALSE;
578     write_command(kbdcp(p), c);
579     return TRUE;
580 }
581 
582 /* write a one byte data to the controller */
583 int
584 write_controller_data(KBDC p, int c)
585 {
586     if (!wait_while_controller_busy(kbdcp(p)))
587 	return FALSE;
588     write_data(kbdcp(p), c);
589     return TRUE;
590 }
591 
592 /* write a one byte keyboard command */
593 int
594 write_kbd_command(KBDC p, int c)
595 {
596     if (!wait_while_controller_busy(kbdcp(p)))
597 	return FALSE;
598     write_data(kbdcp(p), c);
599     return TRUE;
600 }
601 
602 /* write a one byte auxiliary device command */
603 int
604 write_aux_command(KBDC p, int c)
605 {
606     if (!write_controller_command(p, KBDC_WRITE_TO_AUX))
607 	return FALSE;
608     return write_controller_data(p, c);
609 }
610 
611 /* send a command to the keyboard and wait for ACK */
612 int
613 send_kbd_command(KBDC p, int c)
614 {
615     int retry = KBD_MAXRETRY;
616     int res = -1;
617 
618     while (retry-- > 0) {
619 	if (!write_kbd_command(p, c))
620 	    continue;
621         res = wait_for_kbd_ack(kbdcp(p));
622         if (res == KBD_ACK)
623     	    break;
624     }
625     return res;
626 }
627 
628 /* send a command to the auxiliary device and wait for ACK */
629 int
630 send_aux_command(KBDC p, int c)
631 {
632     int retry = KBD_MAXRETRY;
633     int res = -1;
634 
635     while (retry-- > 0) {
636 	if (!write_aux_command(p, c))
637 	    continue;
638 	/*
639 	 * FIXME: XXX
640 	 * The aux device may have already sent one or two bytes of
641 	 * status data, when a command is received. It will immediately
642 	 * stop data transmission, thus, leaving an incomplete data
643 	 * packet in our buffer. We have to discard any unprocessed
644 	 * data in order to remove such packets. Well, we may remove
645 	 * unprocessed, but necessary data byte as well...
646 	 */
647 	emptyq(&kbdcp(p)->aux);
648         res = wait_for_aux_ack(kbdcp(p));
649         if (res == PSM_ACK)
650     	    break;
651     }
652     return res;
653 }
654 
655 /* send a command and a data to the keyboard, wait for ACKs */
656 int
657 send_kbd_command_and_data(KBDC p, int c, int d)
658 {
659     int retry;
660     int res = -1;
661 
662     for (retry = KBD_MAXRETRY; retry > 0; --retry) {
663 	if (!write_kbd_command(p, c))
664 	    continue;
665         res = wait_for_kbd_ack(kbdcp(p));
666         if (res == KBD_ACK)
667     	    break;
668         else if (res != KBD_RESEND)
669     	    return res;
670     }
671     if (retry <= 0)
672 	return res;
673 
674     for (retry = KBD_MAXRETRY, res = -1; retry > 0; --retry) {
675 	if (!write_kbd_command(p, d))
676 	    continue;
677         res = wait_for_kbd_ack(kbdcp(p));
678         if (res != KBD_RESEND)
679     	    break;
680     }
681     return res;
682 }
683 
684 /* send a command and a data to the auxiliary device, wait for ACKs */
685 int
686 send_aux_command_and_data(KBDC p, int c, int d)
687 {
688     int retry;
689     int res = -1;
690 
691     for (retry = KBD_MAXRETRY; retry > 0; --retry) {
692 	if (!write_aux_command(p, c))
693 	    continue;
694 	emptyq(&kbdcp(p)->aux);
695         res = wait_for_aux_ack(kbdcp(p));
696         if (res == PSM_ACK)
697     	    break;
698         else if (res != PSM_RESEND)
699     	    return res;
700     }
701     if (retry <= 0)
702 	return res;
703 
704     for (retry = KBD_MAXRETRY, res = -1; retry > 0; --retry) {
705 	if (!write_aux_command(p, d))
706 	    continue;
707         res = wait_for_aux_ack(kbdcp(p));
708         if (res != PSM_RESEND)
709     	    break;
710     }
711     return res;
712 }
713 
714 /*
715  * read one byte from any source; whether from the controller,
716  * the keyboard, or the aux device
717  */
718 int
719 read_controller_data(KBDC p)
720 {
721     if (availq(&kbdcp(p)->kbd))
722         return removeq(&kbdcp(p)->kbd);
723     if (availq(&kbdcp(p)->aux))
724         return removeq(&kbdcp(p)->aux);
725     if (!wait_for_data(kbdcp(p)))
726         return -1;		/* timeout */
727     return read_data(kbdcp(p));
728 }
729 
730 #if KBDIO_DEBUG >= 2
731 static int call = 0;
732 #endif
733 
734 /* read one byte from the keyboard */
735 int
736 read_kbd_data(KBDC p)
737 {
738 #if KBDIO_DEBUG >= 2
739     if (++call > 2000) {
740 	call = 0;
741 	log(LOG_DEBUG, "kbdc: kbd q: %d calls, max %d chars, "
742 			     "aux q: %d calls, max %d chars\n",
743 		       kbdcp(p)->kbd.call_count, kbdcp(p)->kbd.max_qcount,
744 		       kbdcp(p)->aux.call_count, kbdcp(p)->aux.max_qcount);
745     }
746 #endif
747 
748     if (availq(&kbdcp(p)->kbd))
749         return removeq(&kbdcp(p)->kbd);
750     if (!wait_for_kbd_data(kbdcp(p)))
751         return -1;		/* timeout */
752     return read_data(kbdcp(p));
753 }
754 
755 /* read one byte from the keyboard, but return immediately if
756  * no data is waiting
757  */
758 int
759 read_kbd_data_no_wait(KBDC p)
760 {
761     int f;
762 
763 #if KBDIO_DEBUG >= 2
764     if (++call > 2000) {
765 	call = 0;
766 	log(LOG_DEBUG, "kbdc: kbd q: %d calls, max %d chars, "
767 			     "aux q: %d calls, max %d chars\n",
768 		       kbdcp(p)->kbd.call_count, kbdcp(p)->kbd.max_qcount,
769 		       kbdcp(p)->aux.call_count, kbdcp(p)->aux.max_qcount);
770     }
771 #endif
772 
773     if (availq(&kbdcp(p)->kbd))
774         return removeq(&kbdcp(p)->kbd);
775     f = read_status(kbdcp(p)) & KBDS_BUFFER_FULL;
776     if (f == KBDS_AUX_BUFFER_FULL) {
777         DELAY(KBDD_DELAYTIME);
778         addq(&kbdcp(p)->aux, read_data(kbdcp(p)));
779         f = read_status(kbdcp(p)) & KBDS_BUFFER_FULL;
780     }
781     if (f == KBDS_KBD_BUFFER_FULL) {
782         DELAY(KBDD_DELAYTIME);
783         return read_data(kbdcp(p));
784     }
785     return -1;		/* no data */
786 }
787 
788 /* read one byte from the aux device */
789 int
790 read_aux_data(KBDC p)
791 {
792     if (availq(&kbdcp(p)->aux))
793         return removeq(&kbdcp(p)->aux);
794     if (!wait_for_aux_data(kbdcp(p)))
795         return -1;		/* timeout */
796     return read_data(kbdcp(p));
797 }
798 
799 /* read one byte from the aux device, but return immediately if
800  * no data is waiting
801  */
802 int
803 read_aux_data_no_wait(KBDC p)
804 {
805     int f;
806 
807     if (availq(&kbdcp(p)->aux))
808         return removeq(&kbdcp(p)->aux);
809     f = read_status(kbdcp(p)) & KBDS_BUFFER_FULL;
810     if (f == KBDS_KBD_BUFFER_FULL) {
811         DELAY(KBDD_DELAYTIME);
812         addq(&kbdcp(p)->kbd, read_data(kbdcp(p)));
813         f = read_status(kbdcp(p)) & KBDS_BUFFER_FULL;
814     }
815     if (f == KBDS_AUX_BUFFER_FULL) {
816         DELAY(KBDD_DELAYTIME);
817         return read_data(kbdcp(p));
818     }
819     return -1;		/* no data */
820 }
821 
822 /* discard data from the keyboard */
823 void
824 empty_kbd_buffer(KBDC p, int wait)
825 {
826     int t;
827     int b;
828     int f;
829 #if KBDIO_DEBUG >= 2
830     int c1 = 0;
831     int c2 = 0;
832 #endif
833     int delta = 2;
834 
835     for (t = wait; t > 0; ) {
836         if ((f = read_status(kbdcp(p))) & KBDS_ANY_BUFFER_FULL) {
837 	    DELAY(KBDD_DELAYTIME);
838             b = read_data(kbdcp(p));
839 	    if ((f & KBDS_BUFFER_FULL) == KBDS_AUX_BUFFER_FULL) {
840 		addq(&kbdcp(p)->aux, b);
841 #if KBDIO_DEBUG >= 2
842 		++c2;
843             } else {
844 		++c1;
845 #endif
846 	    }
847 	    t = wait;
848 	} else {
849 	    t -= delta;
850 	}
851         DELAY(delta*1000);
852     }
853 #if KBDIO_DEBUG >= 2
854     if ((c1 > 0) || (c2 > 0))
855         log(LOG_DEBUG, "kbdc: %d:%d char read (empty_kbd_buffer)\n", c1, c2);
856 #endif
857 
858     emptyq(&kbdcp(p)->kbd);
859 }
860 
861 /* discard data from the aux device */
862 void
863 empty_aux_buffer(KBDC p, int wait)
864 {
865     int t;
866     int b;
867     int f;
868 #if KBDIO_DEBUG >= 2
869     int c1 = 0;
870     int c2 = 0;
871 #endif
872     int delta = 2;
873 
874     for (t = wait; t > 0; ) {
875         if ((f = read_status(kbdcp(p))) & KBDS_ANY_BUFFER_FULL) {
876 	    DELAY(KBDD_DELAYTIME);
877             b = read_data(kbdcp(p));
878 	    if ((f & KBDS_BUFFER_FULL) == KBDS_KBD_BUFFER_FULL) {
879 		addq(&kbdcp(p)->kbd, b);
880 #if KBDIO_DEBUG >= 2
881 		++c1;
882             } else {
883 		++c2;
884 #endif
885 	    }
886 	    t = wait;
887 	} else {
888 	    t -= delta;
889 	}
890 	DELAY(delta*1000);
891     }
892 #if KBDIO_DEBUG >= 2
893     if ((c1 > 0) || (c2 > 0))
894         log(LOG_DEBUG, "kbdc: %d:%d char read (empty_aux_buffer)\n", c1, c2);
895 #endif
896 
897     emptyq(&kbdcp(p)->aux);
898 }
899 
900 /* discard any data from the keyboard or the aux device */
901 void
902 empty_both_buffers(KBDC p, int wait)
903 {
904     int t;
905     int f;
906     int waited = 0;
907 #if KBDIO_DEBUG >= 2
908     int c1 = 0;
909     int c2 = 0;
910 #endif
911     int delta = 2;
912 
913     for (t = wait; t > 0; ) {
914         if ((f = read_status(kbdcp(p))) & KBDS_ANY_BUFFER_FULL) {
915 	    DELAY(KBDD_DELAYTIME);
916             (void)read_data(kbdcp(p));
917 #if KBDIO_DEBUG >= 2
918 	    if ((f & KBDS_BUFFER_FULL) == KBDS_KBD_BUFFER_FULL)
919 		++c1;
920             else
921 		++c2;
922 #endif
923 	    t = wait;
924 	} else {
925 	    t -= delta;
926 	}
927 
928 	/*
929 	 * Some systems (Intel/IBM blades) do not have keyboard devices and
930 	 * will thus hang in this procedure. Time out after delta seconds to
931 	 * avoid this hang -- the keyboard attach will fail later on.
932 	 */
933         waited += (delta * 1000);
934         if (waited == (delta * 1000000))
935 	    return;
936 
937 	DELAY(delta*1000);
938     }
939 #if KBDIO_DEBUG >= 2
940     if ((c1 > 0) || (c2 > 0))
941         log(LOG_DEBUG, "kbdc: %d:%d char read (empty_both_buffers)\n", c1, c2);
942 #endif
943 
944     emptyq(&kbdcp(p)->kbd);
945     emptyq(&kbdcp(p)->aux);
946 }
947 
948 /* keyboard and mouse device control */
949 
950 /* NOTE: enable the keyboard port but disable the keyboard
951  * interrupt before calling "reset_kbd()".
952  */
953 int
954 reset_kbd(KBDC p)
955 {
956     int retry = KBD_MAXRETRY;
957     int again = KBD_MAXWAIT;
958     int c = KBD_RESEND;		/* keep the compiler happy */
959 
960     while (retry-- > 0) {
961         empty_both_buffers(p, 10);
962         if (!write_kbd_command(p, KBDC_RESET_KBD))
963 	    continue;
964 	emptyq(&kbdcp(p)->kbd);
965         c = read_controller_data(p);
966 	if (verbose || bootverbose)
967             log(LOG_DEBUG, "kbdc: RESET_KBD return code:%04x\n", c);
968         if (c == KBD_ACK)	/* keyboard has agreed to reset itself... */
969     	    break;
970     }
971     if (retry < 0)
972         return FALSE;
973 
974     while (again-- > 0) {
975         /* wait awhile, well, in fact we must wait quite loooooooooooong */
976         DELAY(KBD_RESETDELAY*1000);
977         c = read_controller_data(p);	/* RESET_DONE/RESET_FAIL */
978         if (c != -1) 	/* wait again if the controller is not ready */
979     	    break;
980     }
981     if (verbose || bootverbose)
982         log(LOG_DEBUG, "kbdc: RESET_KBD status:%04x\n", c);
983     if (c != KBD_RESET_DONE)
984         return FALSE;
985     return TRUE;
986 }
987 
988 /* NOTE: enable the aux port but disable the aux interrupt
989  * before calling `reset_aux_dev()'.
990  */
991 int
992 reset_aux_dev(KBDC p)
993 {
994     int retry = KBD_MAXRETRY;
995     int again = KBD_MAXWAIT;
996     int c = PSM_RESEND;		/* keep the compiler happy */
997 
998     while (retry-- > 0) {
999         empty_both_buffers(p, 10);
1000         if (!write_aux_command(p, PSMC_RESET_DEV))
1001 	    continue;
1002 	emptyq(&kbdcp(p)->aux);
1003 	/* NOTE: Compaq Armada laptops require extra delay here. XXX */
1004 	for (again = KBD_MAXWAIT; again > 0; --again) {
1005             DELAY(KBD_RESETDELAY*1000);
1006             c = read_aux_data_no_wait(p);
1007 	    if (c != -1)
1008 		break;
1009 	}
1010         if (verbose || bootverbose)
1011             log(LOG_DEBUG, "kbdc: RESET_AUX return code:%04x\n", c);
1012         if (c == PSM_ACK)	/* aux dev is about to reset... */
1013     	    break;
1014     }
1015     if (retry < 0)
1016         return FALSE;
1017 
1018     for (again = KBD_MAXWAIT; again > 0; --again) {
1019         /* wait awhile, well, quite looooooooooooong */
1020         DELAY(KBD_RESETDELAY*1000);
1021         c = read_aux_data_no_wait(p);	/* RESET_DONE/RESET_FAIL */
1022         if (c != -1) 	/* wait again if the controller is not ready */
1023     	    break;
1024     }
1025     if (verbose || bootverbose)
1026         log(LOG_DEBUG, "kbdc: RESET_AUX status:%04x\n", c);
1027     if (c != PSM_RESET_DONE)	/* reset status */
1028         return FALSE;
1029 
1030     c = read_aux_data(p);	/* device ID */
1031     if (verbose || bootverbose)
1032         log(LOG_DEBUG, "kbdc: RESET_AUX ID:%04x\n", c);
1033     /* NOTE: we could check the device ID now, but leave it later... */
1034     return TRUE;
1035 }
1036 
1037 /* controller diagnostics and setup */
1038 
1039 int
1040 test_controller(KBDC p)
1041 {
1042     int retry = KBD_MAXRETRY;
1043     int again = KBD_MAXWAIT;
1044     int c = KBD_DIAG_FAIL;
1045 
1046     while (retry-- > 0) {
1047         empty_both_buffers(p, 10);
1048         if (write_controller_command(p, KBDC_DIAGNOSE))
1049     	    break;
1050     }
1051     if (retry < 0)
1052         return FALSE;
1053 
1054     emptyq(&kbdcp(p)->kbd);
1055     while (again-- > 0) {
1056         /* wait awhile */
1057         DELAY(KBD_RESETDELAY*1000);
1058         c = read_controller_data(p);	/* DIAG_DONE/DIAG_FAIL */
1059         if (c != -1) 	/* wait again if the controller is not ready */
1060     	    break;
1061     }
1062     if (verbose || bootverbose)
1063         log(LOG_DEBUG, "kbdc: DIAGNOSE status:%04x\n", c);
1064     return (c == KBD_DIAG_DONE);
1065 }
1066 
1067 int
1068 test_kbd_port(KBDC p)
1069 {
1070     int retry = KBD_MAXRETRY;
1071     int again = KBD_MAXWAIT;
1072     int c = -1;
1073 
1074     while (retry-- > 0) {
1075         empty_both_buffers(p, 10);
1076         if (write_controller_command(p, KBDC_TEST_KBD_PORT))
1077     	    break;
1078     }
1079     if (retry < 0)
1080         return FALSE;
1081 
1082     emptyq(&kbdcp(p)->kbd);
1083     while (again-- > 0) {
1084         c = read_controller_data(p);
1085         if (c != -1) 	/* try again if the controller is not ready */
1086     	    break;
1087     }
1088     if (verbose || bootverbose)
1089         log(LOG_DEBUG, "kbdc: TEST_KBD_PORT status:%04x\n", c);
1090     return c;
1091 }
1092 
1093 int
1094 test_aux_port(KBDC p)
1095 {
1096     int retry = KBD_MAXRETRY;
1097     int again = KBD_MAXWAIT;
1098     int c = -1;
1099 
1100     while (retry-- > 0) {
1101         empty_both_buffers(p, 10);
1102         if (write_controller_command(p, KBDC_TEST_AUX_PORT))
1103     	    break;
1104     }
1105     if (retry < 0)
1106         return FALSE;
1107 
1108     emptyq(&kbdcp(p)->kbd);
1109     while (again-- > 0) {
1110         c = read_controller_data(p);
1111         if (c != -1) 	/* try again if the controller is not ready */
1112     	    break;
1113     }
1114     if (verbose || bootverbose)
1115         log(LOG_DEBUG, "kbdc: TEST_AUX_PORT status:%04x\n", c);
1116     return c;
1117 }
1118 
1119 int
1120 kbdc_get_device_mask(KBDC p)
1121 {
1122     return kbdcp(p)->command_mask;
1123 }
1124 
1125 void
1126 kbdc_set_device_mask(KBDC p, int mask)
1127 {
1128     kbdcp(p)->command_mask =
1129 	mask & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS);
1130 }
1131 
1132 int
1133 get_controller_command_byte(KBDC p)
1134 {
1135     if (kbdcp(p)->command_byte != -1)
1136 	return kbdcp(p)->command_byte;
1137     if (!write_controller_command(p, KBDC_GET_COMMAND_BYTE))
1138 	return -1;
1139     emptyq(&kbdcp(p)->kbd);
1140     kbdcp(p)->command_byte = read_controller_data(p);
1141     return kbdcp(p)->command_byte;
1142 }
1143 
1144 int
1145 set_controller_command_byte(KBDC p, int mask, int command)
1146 {
1147     if (get_controller_command_byte(p) == -1)
1148 	return FALSE;
1149 
1150     command = (kbdcp(p)->command_byte & ~mask) | (command & mask);
1151     if (command & KBD_DISABLE_KBD_PORT) {
1152 	if (!write_controller_command(p, KBDC_DISABLE_KBD_PORT))
1153 	    return FALSE;
1154     }
1155     if (!write_controller_command(p, KBDC_SET_COMMAND_BYTE))
1156 	return FALSE;
1157     if (!write_controller_data(p, command))
1158 	return FALSE;
1159     kbdcp(p)->command_byte = command;
1160 
1161     if (verbose)
1162         log(LOG_DEBUG, "kbdc: new command byte:%04x (set_controller...)\n",
1163 	    command);
1164 
1165     return TRUE;
1166 }
1167