PERFORCE change 37001 for review
Marcel Moolenaar
marcel at FreeBSD.org
Tue Aug 26 18:27:16 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=37001
Change 37001 by marcel at marcel_nfs on 2003/08/26 18:27:02
Teach the uart core code about keyboards. We already had
some suggesting code, but this takes it slightly further.
This commit exposes a fundamental problem:
Low-level access to the hardware prior to initialization
of the bus framework and thus prior to bus enumeration
is currently not scalable. We need to create static
structures for each of the different kinds of accesses
(ie console, debug port and keyboard). This means that if
there's a fourth "consumer" we need to teach the uart
driver about yet another "exception". What if there are
different kinds of keyboards? What if we want 2 serial
consoles?
It makes sense to approach it slightly differently:
o assume an uart can only be used for one kind of
special usage at the same time (ie a console is
never a debug port nor a keyboard). That way we
only need to have a single enumeration. Enumerations
are more scalable than bit fields.
o struct uart_devinfo should have a field for the
kind of consumer and pointers to link them together
so that we can have an arbitrary number of devinfos
with possibly multiple of the same kind.
o If we also put function pointers to helpers for
attach and detach in struct uart_devinfo, we don't
really need to know anything special and we should
have something that's generic enough.
Something to work on I guess..
Submitted by: jake
Affected files ...
.. //depot/projects/uart/dev/uart/uart_bus.h#18 edit
.. //depot/projects/uart/dev/uart/uart_core.c#24 edit
.. //depot/projects/uart/dev/uart/uart_cpu.h#4 edit
.. //depot/projects/uart/dev/uart/uart_cpu_sparc64.c#5 edit
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#20 edit
.. //depot/projects/uart/dev/uart/uart_dev_sab82532.c#16 edit
Differences ...
==== //depot/projects/uart/dev/uart/uart_bus.h#18 (text+ko) ====
@@ -109,8 +109,8 @@
int sc_dbgport:1; /* This UART is a debug port. */
int sc_fastintr:1; /* This UART uses fast interrupts. */
int sc_hasfifo:1; /* This UART has FIFOs. */
+ int sc_keyboard:1; /* This UART is a keyboard. */
int sc_leaving:1; /* This UART is going away. */
- int sc_keyboard:1; /* This UART is a keyboard device. */
int sc_opened:1; /* This UART is open for business. */
int sc_polled:1; /* This UART has no interrupts. */
int sc_txbusy:1; /* This UART is transmitting. */
==== //depot/projects/uart/dev/uart/uart_core.c#24 (text+ko) ====
@@ -258,6 +258,10 @@
sc->sc_dbgport = 1;
/* XXX check if ops matches class. */
}
+ if (uart_cpu_eqres(&sc->sc_bas, &uart_keyboard.bas)) {
+ sc->sc_keyboard = 1;
+ /* XXX check if ops matches class. */
+ }
#endif
error = UART_PROBE(sc);
@@ -338,7 +342,7 @@
if (error)
goto fail;
- if (sc->sc_console || sc->sc_dbgport) {
+ if (sc->sc_console || sc->sc_dbgport || sc->sc_keyboard) {
sep = "";
device_print_prettyname(dev);
if (sc->sc_console) {
@@ -349,6 +353,10 @@
printf("%sdebug port", sep);
sep = ", ";
}
+ if (sc->sc_keyboard) {
+ printf("%skeyboard", sep);
+ sep = ", ";
+ }
printf("\n");
}
==== //depot/projects/uart/dev/uart/uart_cpu.h#4 (text+ko) ====
@@ -59,9 +59,11 @@
extern struct uart_devinfo uart_console;
extern struct uart_devinfo uart_dbgport;
+extern struct uart_devinfo uart_keyboard;
#define UART_DEV_CONSOLE 0
#define UART_DEV_DBGPORT 1
+#define UART_DEV_KEYBOARD 2
int uart_cpu_getdev(int devtype, struct uart_devinfo *di);
int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2);
==== //depot/projects/uart/dev/uart/uart_cpu_sparc64.c#5 (text+ko) ====
@@ -40,7 +40,7 @@
int OF_decode_addr(phandle_t node, int *space, bus_addr_t *addr);
-static struct bus_space_tag bst_store[2];
+static struct bus_space_tag bst_store[3];
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
@@ -68,14 +68,20 @@
return (ENXIO);
if ((consout = OF_instance_to_package(stdout)) == -1)
return (ENXIO);
- if (consin != consout)
- return (ENXIO);
- if (OF_getprop(consout, "device_type", buffer, sizeof(buffer)) == -1)
+ if (devtype == UART_DEV_CONSOLE) {
+ if (consin != consout)
+ return (ENXIO);
+ } else if (devtype == UART_DEV_KEYBOARD) {
+ if (OF_getprop(consin, "keyboard", buffer,
+ sizeof(buffer)) == -1)
+ return (ENXIO);
+ }
+ if (OF_getprop(consin, "device_type", buffer, sizeof(buffer)) == -1)
return (ENXIO);
if (strcmp(buffer, "serial"))
return (ENXIO);
- error = OF_decode_addr(consout, &space, &addr);
+ error = OF_decode_addr(consin, &space, &addr);
if (error)
return (error);
@@ -86,7 +92,7 @@
di->bas.rclk = 0;
/* Get the device class. */
- if (OF_getprop(consout, "name", buffer, sizeof(buffer)) == -1)
+ if (OF_getprop(consin, "name", buffer, sizeof(buffer)) == -1)
return (ENXIO);
if (!strcmp(buffer, "se"))
di->ops = uart_sab82532_ops;
==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#20 (text+ko) ====
@@ -507,7 +507,7 @@
return (error);
mcr = MCR_IENABLE;
- if (!sc->sc_console && !sc->sc_dbgport) {
+ if (!sc->sc_console && !sc->sc_dbgport && !sc->sc_keyboard) {
/* By using ns8250_init() we also set DTR and RTS. */
ns8250_init(bas, 9600, 8, 1, UART_PARITY_NONE);
} else
==== //depot/projects/uart/dev/uart/uart_dev_sab82532.c#16 (text+ko) ====
@@ -383,7 +383,7 @@
uint8_t imr0, imr1;
bas = &sc->sc_bas;
- if (!sc->sc_console && !sc->sc_dbgport)
+ if (!sc->sc_console && !sc->sc_dbgport && !sc->sc_keyboard)
sab82532_init(bas, 9600, 8, 1, UART_PARITY_NONE);
sc->sc_rxfifosz = 32;
More information about the p4-projects
mailing list