Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-1-4]: src/sys/arch/macppc/macppc pullup 1.44->1.45 (tsubai)



details:   https://anonhg.NetBSD.org/src/rev/3feb39cb1664
branches:  netbsd-1-4
changeset: 468967:3feb39cb1664
user:      perry <perry%NetBSD.org@localhost>
date:      Thu Jun 24 16:35:14 1999 +0000

description:
pullup 1.44->1.45 (tsubai)

diffstat:

 sys/arch/macppc/macppc/machdep.c |  227 ++++++++++++--------------------------
 1 files changed, 70 insertions(+), 157 deletions(-)

diffs (276 lines):

diff -r 3ae826c67a79 -r 3feb39cb1664 sys/arch/macppc/macppc/machdep.c
--- a/sys/arch/macppc/macppc/machdep.c  Thu Jun 24 16:23:58 1999 +0000
+++ b/sys/arch/macppc/macppc/machdep.c  Thu Jun 24 16:35:14 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: machdep.c,v 1.38.2.3 1999/05/07 22:39:05 perry Exp $   */
+/*     $NetBSD: machdep.c,v 1.38.2.4 1999/06/24 16:35:14 perry Exp $   */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -88,25 +88,15 @@
 #include <machine/powerpc.h>
 #include <machine/trap.h>
 
-#include <dev/cons.h>
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
-
 #include <machine/bus.h>
 
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pcivar.h>
+#include <dev/cons.h>
+#include <dev/ofw/openfirm.h>
 
-#include <dev/usb/usb.h>
-#include <dev/usb/usbdi.h>
-#include <dev/usb/usbdivar.h>
-#include <dev/usb/usb_mem.h>
+#include <dev/wscons/wsksymvar.h>
+#include <dev/wscons/wscons_callbacks.h>
 
-#include <dev/usb/uhcireg.h>
-#include <dev/usb/uhcivar.h>
-
-#include <dev/usb/ohcireg.h>
-#include <dev/usb/ohcivar.h>
+#include <dev/usb/ukbdvar.h>
 
 vm_map_t exec_map = NULL;
 vm_map_t mb_map = NULL;
@@ -129,6 +119,10 @@
 static int chosen;
 struct pmap ofw_pmap;
 
+int    ofkbd_ihandle;
+int    ofkbd_cngetc __P((dev_t));
+void   ofkbd_cnpollc __P((dev_t, int));
+
 int msgbufmapped = 0;
 
 /*
@@ -1119,10 +1113,7 @@
 
 #if NOFB > 0
        if (strcmp(type, "display") == 0) {
-               u_int32_t pciclass, reg, bus, device, function;
-               const char *usbstr;
-               int stdin, i;
-               pcitag_t tag;
+               int stdin;
 
                /*
                 * Attach the console output now (so we can see
@@ -1173,149 +1164,45 @@
                }
 
                /*
-                * Initialize the PCI chipsets; can't map configuration
-                * space registers yet!
-                */
-               pci_init(0);
-
-               /*
-                * We're not an ADB keyboard; must be USB.  The parent
-                * node is pointing at the root hub.  We need to traverse
-                * back until we find the USB controller.
-                */
-               while (strcmp(type, "usb") != 0) {
-                       node = OF_parent(node);
-                       if (node == 0) {
-                               printf("WARNING: unable to find USB "
-                                   "controller\n");
-                               return;
-                       }
-                       bzero(type, sizeof(type));
-                       l = OF_getprop(node, "name", type, sizeof(type));
-                       if (l == -1 || l >= sizeof(type) - 1) {
-                               printf("WARNING: bad `name' property "
-                                   "searching for USB controller\n");
-                               return;
-                       }
-               }
-
-               /*
-                * `node' is now pointing at the USB controller.
-                * We must determine the type and location of this
-                * controller.
-                */
-               if (OF_getprop(node, "class-code", &pciclass, sizeof(pciclass))
-                   != sizeof(pciclass)) {
-                       printf("WARNING: unable to get PCI class code of "
-                           "USB controller\n");
-                       return;
-               }
-
-               /*
-                * The first address cell of the `reg' property will contain
-                * bus/device/function information.
+                * We're not an ADB keyboard; must be USB.  Unfortunately,
+                * we have a few problems:
+                *
+                *      (1) The stupid Macintosh firmware uses a
+                *          `psuedo-hid' (yes, they even spell it
+                *          incorrectly!) which apparently merges
+                *          all USB keyboard input into a single
+                *          input stream.  Because of this, we can't
+                *          actually determine which USB controller
+                *          or keyboard is really the console keyboard!
+                *
+                *      (2) Even if we could, USB requires a lot of
+                *          the kernel to be running in order for it
+                *          to work.
+                *
+                * So, what we do is this:
+                *
+                *      (1) Tell the ukbd driver that it is the console.
+                *          At autoconfiguration time, it will attach the
+                *          first USB keyboard instance as the console
+                *          keyboard.
+                *
+                *      (2) Until then, so that we have _something_, we
+                *          use the OpenFirmware I/O facilities to read
+                *          the keyboard.
                 */
-               if (OF_getprop(node, "reg", &reg, sizeof(reg)) <= 0) {
-                       printf("WARNING: unable to get PCI location of "
-                           "USB controller\n");
-                       return;
-               }
-
-               if (PCI_CLASS(pciclass) != PCI_CLASS_SERIALBUS) {
-                       printf("WARNING: USB controller is not `serial bus' "
-                           "class\n");
-                       return;
-               }
-
-               if (PCI_SUBCLASS(pciclass) != PCI_SUBCLASS_SERIALBUS_USB) {
-                       printf("WARNING: USB controller is not `usb' "
-                           "subclass\n");
-                       return;
-               }
-
-               switch (PCI_INTERFACE(pciclass)) {
-               case PCI_INTERFACE_UHCI:
-                       usbstr = "UHCI";
-                       break;
-
-               case PCI_INTERFACE_OHCI:
-                       usbstr = "OHCI";
-                       break;
-
-               default:
-                       printf("WARNING: unknown USB controller interface\n");
-                       return;
-               }
-
-               bus = (reg & OFW_PCI_PHYS_HI_BUSMASK) >>
-                   OFW_PCI_PHYS_HI_BUSSHIFT;
-               device = (reg & OFW_PCI_PHYS_HI_DEVICEMASK) >>
-                   OFW_PCI_PHYS_HI_DEVICESHIFT;
-               function = (reg & OFW_PCI_PHYS_HI_FUNCTIONMASK) >>
-                   OFW_PCI_PHYS_HI_FUNCTIONSHIFT;
-
-               printf("console keyboard type: USB on %s at %d,%d,%d\n",
-                   usbstr, bus, device, function);
-
-               /*
-                * Locate the PCI bridge we're on, and create the tag
-                * for the USB driver.
-                */
-               for (i = 0; i < sizeof(pci_bridges) / sizeof(pci_bridges[0]);
-                    i++) {
-                       if (pci_bridges[i].present &&
-                           pci_bridges[i].bus == bus)
-                               break;
-               }
-               if (i == sizeof(pci_bridges) / sizeof(pci_bridges[0])) {
-                       printf("WARNING: can't locate USB controller's "
-                           "PCI bridge\n");
-                       return;
-               }
-
-               tag = pci_make_tag(pci_bridges[i].pc, bus, device, function);
-
 #if NUKBD > 0
-               /*
-                * XXX We can't attach the USB keyboard just yet.  We
-                * XXX must defer it until autoconfiguration, because
-                * XXX the USB code must be able to use memory allocation,
-                * XXX DMA, etc.
-                * XXX
-                * XXX THIS SHOULD BE FIXED SOME DAY!
-                */
+               printf("console keyboard type: USB\n");
+               ukbd_cnattach();
 #else
                panic("ukbd support not in kernel");
 #endif
 
-               switch (PCI_INTERFACE(pciclass)) {
-               case PCI_INTERFACE_UHCI:
-#if NUHCI > 0
-                   {
-                       extern void uhci_pci_has_console __P((pcitag_t));
-
-                       uhci_pci_has_console(tag);
-                   }
-#else
-                       panic("uhci support not in kernel");
-#endif
-                       break;
-
-               case PCI_INTERFACE_OHCI:
-#if NOHCI > 0
-                   {
-                       extern void ohci_pci_has_console __P((pcitag_t));
-
-                       ohci_pci_has_console(tag);
-                   }
-#else
-                       panic("ohci support not in kernel");
-#endif
-                       break;
-
-               default:
-                       panic("cninit: impossible");
-               }
+               /*
+                * XXX This is a little gross, but we don't get to
+                * XXX call wskbd_cnattach() twice.
+                */
+               ofkbd_ihandle = stdin;
+               wsdisplay_set_cons_kbd(ofkbd_cngetc, ofkbd_cnpollc);
        }
 #endif /* NOFB > 0 */
 
@@ -1348,3 +1235,29 @@
 nocons:
        return;
 }
+
+/*
+ * Bootstrap console keyboard routines, using OpenFirmware I/O.
+ */
+int
+ofkbd_cngetc(dev)
+       dev_t dev;
+{
+       u_char c = '\0';
+       int l;
+
+       do {
+               l = OF_read(ofkbd_ihandle, &c, 1);
+       } while (l != 1);
+
+       return (c);
+}
+
+void
+ofkbd_cnpollc(dev, on)
+       dev_t dev;
+       int on;
+{
+
+       /* Nothing to do; always polled. */
+}



Home | Main Index | Thread Index | Old Index