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