On 23/05/13(Thu) 17:00, Miod Vallat wrote:
> > Were you thinking of something like that? It works for me (c) tm, with
> > my PowerBooks (disk@0/wd0), I haven't tried NFS boot yet.
> 
> Not exactly, but your version is probably better than what I was
> thinking of. However, it will not allow for root on the second wd disk
> of a controller, or on any secondary pciide controller.
> 
> Borrowing the sparc64 logic is a larger work but less error-prone.

Indeed it is, but until someone does it, here's a slightly improved
version that adds a check for the drive number.

Jan does is still work for you?

Index: macppc//autoconf.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/macppc/autoconf.c,v
retrieving revision 1.39
diff -u -p -r1.39 autoconf.c
--- macppc//autoconf.c  11 Nov 2010 17:58:21 -0000      1.39
+++ macppc//autoconf.c  29 May 2013 23:17:42 -0000
@@ -62,13 +62,12 @@
 
 #include <sys/disk.h>
 #include <scsi/scsi_all.h>
-#include <scsi/scsi_disk.h>
 #include <scsi/scsiconf.h>
-#include <scsi/sdvar.h>
+#include <dev/ata/atavar.h>
 
 void   dumpconf(void);
 static struct devmap *findtype(char **);
-void   makebootdev(char *cp);
+void   parseofwbp(char *);
 int    getpno(char **);
 
 /*
@@ -79,6 +78,9 @@ int   getpno(char **);
 int    cold = 1;       /* if 1, still working on cold-start */
 char   bootdev[16];    /* to hold boot dev name */
 struct device *bootdv = NULL;
+enum devclass bootdev_class = DV_DULL;
+int    bootdev_type = 0;
+int    bootdev_unit = 0;
 
 struct dumpmem dumpmem[VM_PHYSSEG_MAX];
 u_int ndumpmem;
@@ -165,9 +167,9 @@ findtype(char **s)
  *                      '/ht@0,f2000000/pci@2/bcom5704@4/bsd'
  */
 void
-makebootdev(char *bp)
+parseofwbp(char *bp)
 {
-       int     unit, ptype;
+       int     ptype;
        char   *dev, *cp;
        struct devmap *dp;
 
@@ -184,6 +186,8 @@ makebootdev(char *bp)
        } while((dp->type & T_IFACE) == 0);
 
        if (dp->att && dp->type == T_IFACE) {
+               bootdev_class = DV_IFNET;
+               bootdev_type = dp->type;
                strlcpy(bootdev, dp->dev, sizeof bootdev);
                return;
        }
@@ -193,24 +197,9 @@ makebootdev(char *bp)
        ptype = dp->type;
        dp = findtype(&cp);
        if (dp->att && dp->type == T_DISK) {
-               unit = getpno(&cp);
-               if (ptype == T_SCSI) {
-                       struct device *dv;
-                       struct sd_softc *sd;
-
-                       TAILQ_FOREACH(dv, &alldevs, dv_list) {
-                               if (dv->dv_class != DV_DISK ||
-                                   strcmp(dv->dv_cfdata->cf_driver->cd_name, 
"sd"))
-                                       continue;
-                               sd = (struct sd_softc *)dv;
-                               if (sd->sc_link->target != unit)
-                                       continue;
-                               snprintf(bootdev, sizeof bootdev,
-                                   "%s%c", dv->dv_xname, 'a');
-                               return;
-                       }
-               }
-               snprintf(bootdev, sizeof bootdev, "%s%d%c", dev, unit, 'a');
+               bootdev_class = DV_DISK;
+               bootdev_type = ptype;
+               bootdev_unit = getpno(&cp);
                return;
        }
        printf("Warning: boot device unrecognized: %s\n", bp);
@@ -239,25 +228,43 @@ getpno(char **cp)
 void
 device_register(struct device *dev, void *aux)
 {
+       const char *drvrname = dev->dv_cfdata->cf_driver->cd_name;
+       const char *name = dev->dv_xname;
+
+       if (bootdv != NULL || dev->dv_class != bootdev_class)
+               return;
+
+       switch (bootdev_type) {
+       case T_SCSI:
+               if (strcmp(drvrname, "sd") == 0) {
+                       struct scsi_attach_args *sa = aux;
+
+                       if (sa->sa_sc_link->target == bootdev_unit)
+                               bootdv = dev;
+               }
+       case T_IDE:
+               if (strcmp(drvrname, "wd") == 0) {
+                       struct ata_atapi_attach *aa = aux;
+
+                       if (aa->aa_drv_data->drive == bootdev_unit)
+                               bootdv = dev;
+               }
+               break;
+       case T_IFACE:
+               if (strcmp(name, bootdev) == 0)
+                       bootdv = dev;
+               break;
+       default:
+               break;
+       }
 }
 
-/*
- * Now that we are fully operational, we can checksum the
- * disks, and using some heuristics, hopefully are able to
- * always determine the correct root disk.
- */
 void
 diskconf(void)
 {
-       dev_t temp;
-       int part = 0;
-
        printf("bootpath: %s\n", bootpath);
-       makebootdev(bootpath);
 
-       /* Lookup boot device from boot if not set by configuration */
-       bootdv = parsedisk(bootdev, strlen(bootdev), 0, &temp);
-       setroot(bootdv, part, RB_USERREQ);
+       setroot(bootdv, 0, RB_USERREQ);
        dumpconf();
 }
 
Index: macppc//machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/macppc/machdep.c,v
retrieving revision 1.135
diff -u -p -r1.135 machdep.c
--- macppc//machdep.c   6 Dec 2012 12:35:22 -0000       1.135
+++ macppc//machdep.c   22 May 2013 18:24:25 -0000
@@ -114,6 +114,9 @@ char ofw_eth_addr[6];               /* Save address o
 char *bootpath;
 char bootpathbuf[512];
 
+/* from autoconf.c */
+extern void parseofwbp(char *);
+
 struct firmware *fw = NULL;
 
 #ifdef DDB
@@ -367,7 +370,8 @@ initppc(startkernel, endkernel, args)
                        }
                }
        }
-       bootpath= &bootpathbuf[0];
+       bootpath = &bootpathbuf[0];
+       parseofwbp(bootpath);
 
 #ifdef DDB
        ddb_init();

Reply via email to