On May 23 08:41:50, mpieuc...@nolizard.org wrote:
> On 26/12/12(Wed) 20:54, Miod Vallat wrote:
> > > Just upgraded to a current again, with the same problem,
> > > and the same solution:
> > 
> > [...]
> > > wdc1 at kauaiata0 irq 39: DMA
> > > atapiscsi0 at wdc1 channel 0 drive 0
> > > scsibus0 at atapiscsi0: 2 targets
> > > cd0 at scsibus0 targ 0 lun 0: <MATSHITA, DVD-R UJ-825, DAND> ATAPI 
> > > 5/cdrom removable
> > > wd0 at wdc1 channel 0 drive 1: <ST9808211A>
> > > wd0: 16-sector PIO, LBA, 76319MB, 156301488 sectors
> > [...]
> > > bootpath: /pci@f4000000/ata-6@d/disk@1:/bsd
> > 
> > I think I understand what goes wrong. The code responsible for matching
> > the boot device to the actual kernel device on macppc is quite crude,
> > especially for non-SCSI disks.
> > 
> > Your bootpath specifies `disk@1' because the disk drive is the second
> > device (slave) on the ATA channel, the cdrom drive being master.
> > However, the kernel wants to match this information against a `wd1'
> > device (as if there were two hard disks on the ATA channel).
> > 
> > The kernel code needs to be fixed to use device_register() to match the
> > boot path against actual attachment information, instead of walking the
> > device tree at the end of autoconf. If nobody beats me to do this, I'll
> > try to cook a diff in a few days.
> 
> 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.
> 
> Jan, does it improve something for you?

Yes it does: with this patch, I don't need to hardcode

        config         bsd root on wd0a

into my kernel, it figures the bootpath itself.
Thank you!

        Jan


[ using 500872 bytes of bsd ELF symbol table ]
console out [ATY,RockHopper2_A]console in [keyboard] , using USB
using parent ATY,RockHopper2Paren:: memaddr 98000000 size 8000000, : consaddr 
9c008000, : ioaddr 90020000, size 20000: memtag 8000, iotag 8000: width 1280 
linebytes 1280 height 1024 depth 8
Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California.  All rights reserved.
Copyright (c) 1995-2013 OpenBSD. All rights reserved.  http://www.OpenBSD.org

OpenBSD 5.3-current (GENERIC.MP) #5: Thu May 23 09:02:44 CEST 2013
    r...@www.stare.cz:/usr/src/sys/arch/macppc/compile/GENERIC.MP
real mem = 1073741824 (1024MB)
avail mem = 1032151040 (984MB)
mainbus0 at root: model PowerMac10,2
cpu0 at mainbus0: 7447A (Revision 0x102): 1499 MHz: 512KB L2 cache
mem0 at mainbus0
spdmem0 at mem0: 1GB DDR SDRAM non-parity PC3200CL3.0
memc0 at mainbus0: uni-n rev 0xd2
"hw-clock" at memc0 not configured
kiic0 at memc0 offset 0xf8001000
iic0 at kiic0
mpcpcibr0 at mainbus0 pci: uni-north
pci0 at mpcpcibr0 bus 0
pchb0 at pci0 dev 11 function 0 "Apple UniNorth AGP" rev 0x00
appleagp0 at pchb0
agp0 at appleagp0: aperture at 0x0, size 0x10000000
vgafb0 at pci0 dev 16 function 0 "ATI Radeon 9200" rev 0x01, mmio
wsdisplay0 at vgafb0 mux 1: console (std, vt100 emulation)
mpcpcibr1 at mainbus0 pci: uni-north
pci1 at mpcpcibr1 bus 0
pchb1 at pci1 dev 11 function 0 "Apple UniNorth PCI" rev 0x00
bwi0 at pci1 dev 18 function 0 "Broadcom BCM4318" rev 0x02: irq 52, address 
00:11:24:bf:cb:2a
macobio0 at pci1 dev 23 function 0 "Apple Intrepid" rev 0x00
openpic0 at macobio0 offset 0x40000: version 0x4614 feature 3f0302 LE
macgpio0 at macobio0 offset 0x50
"modem-reset" at macgpio0 offset 0x1d not configured
"modem-power" at macgpio0 offset 0x1c not configured
macgpio1 at macgpio0 offset 0x9 irq 47
"programmer-switch" at macgpio0 offset 0x11 not configured
"gpio5" at macgpio0 offset 0x6f not configured
"gpio6" at macgpio0 offset 0x70 not configured
"extint-gpio15" at macgpio0 offset 0x67 not configured
"escc-legacy" at macobio0 offset 0x12000 not configured
zsc0 at macobio0 offset 0x13000: irq 22,23
zstty0 at zsc0 channel 0
zstty1 at zsc0 channel 1
aoa0 at macobio0 offset 0x10000: irq 30,1,2
audio0 at aoa0
"timer" at macobio0 offset 0x15000 not configured
adb0 at macobio0 offset 0x16000apm0 at adb0: battery flags 0x0, 0% charged
piic0 at adb0
iic1 at piic0
maxtmp0 at iic1 addr 0xc8: max6642
kiic1 at macobio0 offset 0x18000
iic2 at kiic1
wdc0 at macobio0 offset 0x20000 irq 24: DMA
ohci0 at pci1 dev 24 function 0 "Apple Intrepid USB" rev 0x00: couldn't map 
interrupt
ohci1 at pci1 dev 25 function 0 "Apple Intrepid USB" rev 0x00: couldn't map 
interrupt
ohci2 at pci1 dev 26 function 0 "Apple Intrepid USB" rev 0x00: irq 29, version 
1.0, legacy support
ohci3 at pci1 dev 27 function 0 "NEC USB" rev 0x43: irq 63, version 1.0
ohci4 at pci1 dev 27 function 1 "NEC USB" rev 0x43: irq 63, version 1.0
ehci0 at pci1 dev 27 function 2 "NEC USB" rev 0x04: irq 63
usb0 at ehci0: USB revision 2.0
uhub0 at usb0 "NEC EHCI root hub" rev 2.00/1.00 addr 1
usb1 at ohci2: USB revision 1.0
uhub1 at usb1 "Apple OHCI root hub" rev 1.00/1.00 addr 1
usb2 at ohci3: USB revision 1.0
uhub2 at usb2 "NEC OHCI root hub" rev 1.00/1.00 addr 1
usb3 at ohci4: USB revision 1.0
uhub3 at usb3 "NEC OHCI root hub" rev 1.00/1.00 addr 1
mpcpcibr2 at mainbus0 pci: uni-north
pci2 at mpcpcibr2 bus 0
pchb2 at pci2 dev 11 function 0 "Apple UniNorth PCI" rev 0x00
kauaiata0 at pci2 dev 13 function 0 "Apple Intrepid ATA" rev 0x00
wdc1 at kauaiata0 irq 39: DMA
atapiscsi0 at wdc1 channel 0 drive 0
scsibus0 at atapiscsi0: 2 targets
cd0 at scsibus0 targ 0 lun 0: <MATSHITA, DVD-R UJ-825, DAND> ATAPI 5/cdrom 
removable
wd0 at wdc1 channel 0 drive 1: <ST9808211A>
wd0: 16-sector PIO, LBA, 76319MB, 156301488 sectors
cd0(wdc1:0:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 4
wd0(wdc1:0:1): using PIO mode 4, DMA mode 2, Ultra-DMA mode 4
"Apple UniNorth Firewire" rev 0x81 at pci2 dev 14 function 0 not configured
gem0 at pci2 dev 15 function 0 "Apple Uni-N2 GMAC" rev 0x80: irq 41, address 
00:14:51:17:42:34
bmtphy0 at gem0 phy 0: BCM5221 100baseTX PHY, rev. 4
umass0 at uhub0 port 1 configuration 1 interface 0 "Prolific Technology Inc. 
Mass Storage Device" rev 2.00/1.00 addr 2
umass0: using SCSI over Bulk-Only
scsibus1 at umass0: 2 targets, initiator 0
sd0 at scsibus1 targ 1 lun 0: <ST980815, A, 3.AL> SCSI0 0/direct fixed 
serial.067b2506000000000000
sd0: 76319MB, 512 bytes/sector, 156301488 sectors
uhidev0 at uhub1 port 1 configuration 1 interface 0 "Apple Computer HID-proxy" 
rev 2.00/19.65 addr 2
uhidev0: iclass 3/1
ukbd0 at uhidev0: 8 variable keys, 6 key codes
wskbd0 at ukbd0: console keyboard, using wsdisplay0
uhidev1 at uhub1 port 1 configuration 1 interface 1 "Apple Computer HID-proxy" 
rev 2.00/19.65 addr 2
uhidev1: iclass 3/1
ums0 at uhidev1: 5 buttons
wsmouse0 at ums0 mux 0
uhidev2 at uhub3 port 1 configuration 1 interface 0 "Chicony USB Keyboard" rev 
1.10/1.02 addr 2
uhidev2: iclass 3/1
ukbd1 at uhidev2: 8 variable keys, 6 key codes
wskbd1 at ukbd1 mux 1
wskbd1: connecting to wsdisplay0
uhidev3 at uhub3 port 1 configuration 1 interface 1 "Chicony USB Keyboard" rev 
1.10/1.02 addr 2
uhidev3: iclass 3/0, 3 report ids
uhid0 at uhidev3 reportid 1: input=1, output=0, feature=0
uhid1 at uhidev3 reportid 2: input=1, output=0, feature=2
uhid2 at uhidev3 reportid 3: input=3, output=0, feature=0
vscsi0 at root
scsibus2 at vscsi0: 256 targets
softraid0 at root
scsibus3 at softraid0: 256 targets
bootpath: /pci@f4000000/ata-6@d/disk@1:/bsd
root on wd0a (5d2ade1fc5a8d569.a) swap on wd0b dump on wd0b

> Index: autoconf.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/macppc/autoconf.c,v
> retrieving revision 1.39
> diff -u -p -r1.39 autoconf.c
> --- autoconf.c        11 Nov 2010 17:58:21 -0000      1.39
> +++ autoconf.c        22 May 2013 19:00:45 -0000
> @@ -68,7 +68,7 @@
>  
>  void dumpconf(void);
>  static       struct devmap *findtype(char **);
> -void makebootdev(char *cp);
> +void parseofwbp(char *);
>  int  getpno(char **);
>  
>  /*
> @@ -79,6 +79,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 +168,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 +187,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 +198,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 +229,44 @@ 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 sd_softc *sd = (struct sd_softc *)dev;
> +
> +                     if (sd->sc_link->target == bootdev_unit)
> +                             bootdv = dev;
> +             }
> +     case T_IDE:
> +             /*
> +              * Do not require the bootpath unit number to match
> +              * against the driver's one, a slave disk on the ATA
> +              * channel `disk@1' can attach as `wd0'.
> +              */
> +             if (strcmp(drvrname, "wd") == 0)
> +                     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: machdep.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/macppc/machdep.c,v
> retrieving revision 1.135
> diff -u -p -r1.135 machdep.c
> --- machdep.c 6 Dec 2012 12:35:22 -0000       1.135
> +++ 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