Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/sparc/sparc Use a table to detect device aliases an...



details:   https://anonhg.NetBSD.org/src/rev/9cd3e1118d82
branches:  trunk
changeset: 480411:9cd3e1118d82
user:      pk <pk%NetBSD.org@localhost>
date:      Tue Jan 11 20:53:24 2000 +0000

description:
Use a table to detect device aliases and add various `isp' and floppy
controllers to it.  Also use a table lookup when matching busses/controllers.

diffstat:

 sys/arch/sparc/sparc/autoconf.c |  118 +++++++++++++++++++++++++++------------
 1 files changed, 80 insertions(+), 38 deletions(-)

diffs (202 lines):

diff -r 48a6421c4094 -r 9cd3e1118d82 sys/arch/sparc/sparc/autoconf.c
--- a/sys/arch/sparc/sparc/autoconf.c   Tue Jan 11 20:36:17 2000 +0000
+++ b/sys/arch/sparc/sparc/autoconf.c   Tue Jan 11 20:53:24 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: autoconf.c,v 1.128 2000/01/11 13:01:53 pk Exp $ */
+/*     $NetBSD: autoconf.c,v 1.129 2000/01/11 20:53:24 pk Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -1495,14 +1495,18 @@
 #include <dev/scsipi/scsiconf.h>
 #include <sparc/sparc/iommuvar.h>
 
-#define BUSCLASS_GENERIC       0
+#define BUSCLASS_NONE          0
 #define BUSCLASS_MAINBUS       1
 #define BUSCLASS_IOMMU         2
 #define BUSCLASS_OBIO          3
 #define BUSCLASS_SBUS          4
 #define BUSCLASS_VME           5
+#define BUSCLASS_XDC           6
+#define BUSCLASS_XYC           7
+#define BUSCLASS_FDC           8
 
 static int bus_class __P((struct device *));
+static char *bus_compatible __P((char *));
 static int instance_match __P((struct device *, void *, struct bootpath *));
 static void nail_bootdev __P((struct device *, struct bootpath *));
 
@@ -1521,18 +1525,53 @@
        { "isp",        BUSCLASS_SBUS },
        { "ledma",      BUSCLASS_SBUS },
        { "lebuffer",   BUSCLASS_SBUS },
-       { "vme",        BUSCLASS_VME }
+       { "vme",        BUSCLASS_VME },
+       { "xdc",        BUSCLASS_XDC },
+       { "xyc",        BUSCLASS_XYC },
+       { "fdc",        BUSCLASS_FDC },
 };
 
+/*
+ * A list of PROM device names that differ from our NetBSD
+ * device names.
+ */
+static struct {
+       char    *bpname;
+       char    *cfname;
+} dev_compat_tab[] = {
+       { "espdma",     "dma" },
+       { "QLGC,isp",   "isp" },
+       { "PTI,isp",    "isp" },
+       { "ptisp",      "isp" },
+       { "SUNW,fdtwo", "fdc" },
+};
+
+static char *
+bus_compatible(bpname)
+       char *bpname;
+{
+       int i;
+
+       for (i = sizeof(dev_compat_tab)/sizeof(dev_compat_tab[0]); i-- > 0;) {
+               if (strcmp(bpname, dev_compat_tab[i].bpname) == 0)
+                       return (dev_compat_tab[i].cfname);
+       }
+
+       return (bpname);
+}
+
 static int
 bus_class(dev)
        struct device *dev;
 {
-       struct device *parent = dev->dv_parent;
-       char *name = parent->dv_cfdata->cf_driver->cd_name;
+       char *name;
        int i, class;
 
-       class = BUSCLASS_GENERIC;
+       class = BUSCLASS_NONE;
+       if (dev == NULL)
+               return (class);
+
+       name = dev->dv_cfdata->cf_driver->cd_name;
        for (i = sizeof(bus_class_tab)/sizeof(bus_class_tab[0]); i-- > 0;) {
                if (strcmp(name, bus_class_tab[i].name) == 0) {
                        class = bus_class_tab[i].class;
@@ -1558,16 +1597,19 @@
        struct iommu_attach_args *iom;
 
        /*
-        * Several Sbus devices are represented on bootpaths in one of
-        * two formats:
+        * Several devices are represented on bootpaths in one of
+        * two formats, e.g.:
         *      (1) ../sbus@.../esp@<offset>,<slot>/sd@..  (PROM v3 style)
         *      (2) /sbus0/esp0/sd@..                      (PROM v2 style)
         *
-        * hence we fall back on a `unit number' check if the Sbus-specific
+        * hence we fall back on a `unit number' check if the bus-specific
         * instance parameter check does not produce a match.
         */
 
-       switch (bus_class(dev)) {
+       /*
+        * Rank parent bus so we know which locators to check.
+        */
+       switch (bus_class(dev->dv_parent)) {
        case BUSCLASS_MAINBUS:
                ma = aux;
                if (bp->val[0] == ma->ma_iospace && bp->val[1] == ma->ma_paddr)
@@ -1584,6 +1626,19 @@
                    bp->val[1] == iom->iom_reg[0].ior_pa)
                        return (1);
                break;
+       case BUSCLASS_XDC:
+       case BUSCLASS_XYC:
+               {
+               /*
+                * XXX - x[dy]c attach args are not exported right now..
+                * XXX   we happen to know they look like this:
+                */
+               struct xxxx_attach_args { int driveno; } *aap = aux;
+
+               if (aap->driveno == bp->val[0])
+                       return (1);
+
+               }
        default:
                break;
        }
@@ -1624,7 +1679,7 @@
        void *aux;
 {
        struct bootpath *bp = bootpath_store(0, NULL);
-       char *dvname = dev->dv_cfdata->cf_driver->cd_name;
+       char *dvname, *bpname;
 
        /*
         * If device name does not match current bootpath component
@@ -1633,27 +1688,18 @@
        if (bp == NULL)
                return;
 
-       if (strcmp(bp->name, "espdma") == 0) {
-               /* espdma special case */
-               if (strcmp(dvname, "dma") != 0)
-                       return;
-       } else if (strcmp(dvname, bp->name) != 0)
+       /*
+        * Translate PROM name in case our drivers are named differently
+        */
+       bpname = bus_compatible(bp->name);
+
+       /* First, match by name */
+       dvname = dev->dv_cfdata->cf_driver->cd_name;
+       if (strcmp(dvname, bpname) != 0)
                return;
 
-       if (strcmp(dvname, "obio") == 0 ||
-           strcmp(dvname, "vme") == 0 ||
-           strcmp(dvname, "iommu") == 0 ||
-           strcmp(dvname, "sbus") == 0 ||
-           strcmp(dvname, "xbox") == 0 ||
-           strcmp(dvname, "dma") == 0 ||
-           strcmp(dvname, "ledma") == 0 ||
-           strcmp(dvname, "lebuffer") == 0 ||
-           strcmp(dvname, "espdma") == 0 ||
-           strcmp(dvname, "esp") == 0 ||
-           strcmp(dvname, "isp") == 0 ||
-           strcmp(dvname, "fdc") == 0 ||
-           strcmp(dvname, "xdc") == 0 ||
-           strcmp(dvname, "xyc") == 0 ) {
+
+       if (bus_class(dev) != BUSCLASS_NONE) {
                /*
                 * A bus or controller device of sorts. Check instance
                 * parameters and advance boot path on match.
@@ -1724,19 +1770,15 @@
                        nail_bootdev(dev, bp);
                        return;
                }
+
        } else if (strcmp("xd", dvname) == 0 || strcmp("xy", dvname) == 0) {
 
-               /*
-                * XXX - x[dy]c attach args are not exported right now..
-                * XXX   we happen to know they look like this:
-                */
-               struct xxxx_attach_args { int driveno; } *aap = aux;
-
-               if (aap->driveno == bp->val[0]) {
-                       /* We've found the boot device */
+               /* A Xylogic disk */
+               if (instance_match(dev, aux, bp) != 0) {
                        nail_bootdev(dev, bp);
                        return;
                }
+
        } else if (strcmp("fd", dvname) == 0) {
                /*
                 * Sun PROMs don't really seem to support multiple



Home | Main Index | Thread Index | Old Index