On May 23 08:41:50, [email protected] 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
[email protected]:/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();