Subject: Re: E250 support?
To: matthew green <mrg@eterna.com.au>
From: Mark Blackman <mark.blackman@netscalibur.co.uk>
List: port-sparc64
Date: 02/12/2001 09:24:24
two thumbs up! Now I just have to set up the NFS partition.

I've got full-on debugging enabled and here's the output.
********
{1} ok boot net netbsd -d
Resetting ...


Sun (TM) Enterprise 250 (2 X UltraSPARC-II 400MHz), Keyboard Present
OpenBoot 3.16, 1024 MB memory installed, Serial #15128240.
Ethernet address 8:0:20:e6:d6:b0, Host ID: 80e6d6b0.



Rebooting with command: boot net netbsd -d
Boot device: /pci@1f,4000/network@1,1  File and args: netbsd -d
43800 >> NetBSD/sparc64 OpenFirmware Boot, Revision
>> (eeh@nonplus.netbsd.org, Sat Jan 13 09:12:31 PST 2001)
Using BOOTPARAMS protocol: ip address: 192.168.1.235, hostname: sunbox.ch.foobar.net
root addr=192.168.1.150 path=/tmp/export/sunbox/root
main: Calling loadfile(fd, /pci@1f,4000/network@1,1/netbsd -d)
loadfile: reading header
elf64_exec: Booting /pci@1f,4000/network@1,1/netbsd
3301574@0x1000000+140336@0x1400000+538360@0x1422430
symbols @ 0xfefa2300 74+248592+127951 start=0x1000000
chain: calling OF_chain(800000, ee48, 1000000, fff89a80, 18)
OF_chain: prom returned!
Calling entry(0, 0xfff89a80, 18, f007601c, f007601c)
[ using 377392 bytes of netbsd ELF symbol table ]
prom_get_msgbuf: Cannot recover msgbuf on E250
prom_get_msgbuf: allocated new buf at 00000000
prom_get_msgbuf: claiming new buf at 00000000
pmap_bootstrap: could not claim physical dseg extention at 3fca6000 size 35a000
Setting DTLB entry 00000000 01000000 data e0000000 3f800076
Setting DTLB entry 00000000 01400000 data e0000000 3f400076
Setting ITLB entry 00000000 01000000 data e0000000 3f400076
Setting TSB pointer 00000000 014b8000
consinit()
setting up stdin
stdin instance = fff69760
setting up stdout
stdout instance = fff69d00
stdout package = f006eca8
console is unknown
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 1.5R (GENERIC) #24: Mon Feb 12 05:31:02 EST 2001
    mrg@everglades.eterna.com.au:/orb/j/src/sys/arch/sparc64/compile/GENERIC
total memory = 1024 MB
avail memory = 942 MB
using 6566 buffers containing 52528 KB of memory
bootpath: /pci@1f,4000/network@1,1
kdb breakpoint at 1266090
1 tt=1ff tstate=0 tpc=0x0 tnpc=0x0
Stopped in pid 0 (swapper) at   cpu_Debugger+0x4:       nop
db> x/x sparc_pci_debug
sparc_pci_debug:        0
db> w/l sparc_pci_debug=0x000000ff
Nothing written.
db> w/l sparc_pci_debug 0x000000ff
sparc_pci_debug                  0 =       0xff
db> w/l psycho_debug 0x000000ff
psycho_debug                     0 =       0xff
db> continue
mainbus0 (root): SUNW,Ultra-250
cpu0 at mainbus0: SUNW,UltraSPARC-II @ 400 MHz, version 0 FPU
cpu0: physical 4K instruction (32 b/l), 4K data (32 b/l), 2048K external (64 b/l)
psycho0 at mainbus0 addr 0xfffbc000
psycho: impl 0, version 4: psycho debug: got `ranges' for node f006bf9c: 4 entries
psycho debug: got `bus-range' for node f006bf9c: 0 - 0
bus range 0 to 0; PCI bus 0psycho debug: got `interupt-map' for node f006bf9c
psycho debug: got `interrupt-map-mask' for node f006bf9c

DVMA map: fe002000 to ffffe000
pci0 at psycho0
pci_attach_hook:
        node f006e48c name `ebus' devtype `':pci_conf_write: tag 0; reg 4; data 7; asi = 1d; readaddr = 1fe
01000004 (offset = 4)

        node f0084cf4 name `network' devtype `network': got interrupts got assigned-addresses got reg; bus
0 dev 1 fn 1pci_conf_read: tag 900; reg 3c; asi = 1d; readaddr = 1fe0100093c (offset = 93c) ... returning 0
50a0000
            ; read 50a0000 from intreg
            ; gonna write 50a0021 to intreg
pci_conf_write: tag 900; reg 3c; data 50a0021; asi = 1d; readaddr = 1fe0100093c (offset = 93c)
            ; reread 50a0021 from intreg
pci_conf_write: tag 900; reg 4; data 7; asi = 1d; readaddr = 1fe01000904 (offset = 904)

        node f008cd00 name `scsi' devtype `scsi-2': got interrupts got assigned-addresses got reg; bus 0 de
v 3 fn 0pci_conf_read: tag 1800; reg 3c; asi = 1d; readaddr = 1fe0100183c (offset = 183c) ... returning 401
10100
            ; read 40110100 from intreg
            ; gonna write 40110120 to intreg
pci_conf_write: tag 1800; reg 3c; data 40110120; asi = 1d; readaddr = 1fe0100183c (offset = 183c)
            ; reread 40110120 from intreg
pci_conf_write: tag 1800; reg 4; data 7; asi = 1d; readaddr = 1fe01001804 (offset = 1804)

        node f0093f1c name `scsi' devtype `scsi-2': got interrupts got assigned-addresses got reg; bus 0 de
v 3 fn 1pci_conf_read: tag 1900; reg 3c; asi = 1d; readaddr = 1fe0100193c (offset = 193c) ... returning 401
10200
            ; read 40110200 from intreg
            ; gonna write 40110226 to intreg
pci_conf_write: tag 1900; reg 3c; data 40110226; asi = 1d; readaddr = 1fe0100193c (offset = 193c)
            ; reread 40110226 from intreg
pci_conf_write: tag 1900; reg 4; data 7; asi = 1d; readaddr = 1fe01001904 (offset = 1904)


pci0: i/o space, memory space enabled
pci_conf_read: tag 800; reg 0; asi = 1d; readaddr = 1fe01000800 (offset = 800) ... returning 1000108e
pci_conf_read: tag 800; reg 4; asi = 1d; readaddr = 1fe01000804 (offset = 804) ... returning 02800146
pci_conf_read: tag 800; reg 8; asi = 1d; readaddr = 1fe01000808 (offset = 808) ... returning 06800001
pci_conf_read: tag 800; reg 3c; asi = 1d; readaddr = 1fe0100083c (offset = 83c) ... returning 190a0000
ebus0 at pci0 dev 1 function 0
ebus0: Sun Microsystems PCIO Ebus2, revision 0x01
auxio0 at ebus0 addr 726000-726003 addr 728000-728003 addr 72a000-72a003 addr 72c000-72c003 addr 72f000-72f
003
power at ebus0 addr 724000-724003 not configured
SUNW,pll at ebus0 addr 504000-504002 not configured
sc at ebus0 addr 500000-500007 not configured
se at ebus0 addr 400000-40007f ipl 43 not configured
se at ebus0 addr 200000-20007f ipl 35 not configured
com0 at ebus0 addr 3083f8-3083ff ipl 41_psycho_bus_map: type 4 off 713083f8 sz 8 flags 2 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 713083f8 paddr 1fff13083f8

psycho_intr_establish: ihandle 29 ino 29
psycho: intr 29: 0x0
Hunting for IRQ...
- turning on OBIO intr 9; read intrmap = 00000000000007e9; addr of intrmapptr = 0xfffad048; writing intrmap
 = 00000000800007e9
; reread intrmap = 00000000800007e9; installing handler 0x102bed4 arg 0x2729a00 with ino 41 pil 12
: ns16550a, working fifo
kbd0 at com0
com1 at ebus0 addr 3062f8-3062ff ipl 42_psycho_bus_map: type 4 off 713062f8 sz 8 flags 2 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 713062f8 paddr 1fff13062f8

psycho_intr_establish: ihandle 2a ino 2a
psycho: intr 2a: 0x0
Hunting for IRQ...
- turning on OBIO intr 10; read intrmap = 00000000000007ea; addr of intrmapptr = 0xfffad050; writing intrma
p = 00000000800007ea
; reread intrmap = 00000000800007ea; installing handler 0x102bed4 arg 0x2729800 with ino 42 pil 12
: ns16550a, working fifo
ms0 at com1
lpt0 at ebus0 addr 3043bc-3043cb addr 300398-300399 addr 700000-70000f ipl 34_psycho_bus_map: type 4 off 71
3043bc sz 10 flags 2 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 713043bc paddr 1fff13043bc

psycho_intr_establish: ihandle 22 ino 22
psycho: intr 22: 0x0
Hunting for IRQ...
- turning on OBIO intr 2; read intrmap = 00000000000007e2; addr of intrmapptr = 0xfffad010; writing intrmap
 = 00000000800007e2
; reread intrmap = 00000000800007e2; installing handler 0x1236da8 arg 0x26e5900 with ino 34 pil 12

clock0 at ebus0 addr 0-1fff_psycho_bus_map: type 4 off 71000000 sz 2000 flags 2 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 71000000 paddr 1fff1000000
: mk48t59: hostid 80e6d6b0
flashprom at ebus0 addr 0-fffff addr 0-fffff not configured
SUNW,envctrltwo at ebus0 addr 600000-600003 ipl 40 ipl 37 not configured
pci_conf_read: tag 900; reg 0; asi = 1d; readaddr = 1fe01000900 (offset = 900) ... returning 1001108e
pci_conf_read: tag 900; reg 4; asi = 1d; readaddr = 1fe01000904 (offset = 904) ... returning 02800006
pci_conf_read: tag 900; reg 8; asi = 1d; readaddr = 1fe01000908 (offset = 908) ... returning 02000001
pci_conf_read: tag 900; reg 3c; asi = 1d; readaddr = 1fe0100093c (offset = 93c) ... returning 050a0021
hme1 at pci0 dev 1 function 1pci_conf_read: tag 900; reg 4; asi = 1d; readaddr = 1fe01000904 (offset = 904)
 ... returning 02800006
pci_conf_write: tag 900; reg 4; data 2800006; asi = 1d; readaddr = 1fe01000904 (offset = 904)
pci_conf_read: tag 900; reg 10; asi = 1d; readaddr = 1fe01000910 (offset = 910) ... returning 00008000
pci_conf_write: tag 900; reg 10; data ffffffff; asi = 1d; readaddr = 1fe01000910 (offset = 910)
pci_conf_read: tag 900; reg 10; asi = 1d; readaddr = 1fe01000910 (offset = 910) ... returning ffff8000
pci_conf_write: tag 900; reg 10; data 8000; asi = 1d; readaddr = 1fe01000910 (offset = 910)
_psycho_bus_map: type 4 off 8000 sz 8000 flags 0 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 8000 paddr 1ff80008000
: address 08:00:20:e6:d6:b0
nsphy0 at hme1 phy 1: DP83840 10/100 media interface, rev. 1
nsphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
pci_intr_map: tag 900; pin 0; line 33; handle = 33; returning 0
pci_intr_string: ih 33; returning vector 33
pci_intr_establish: ih 33; level 6
psycho_intr_establish: ihandle 21 ino 21
psycho: intr 21: 0x0
Hunting for IRQ...
- turning on OBIO intr 1; read intrmap = 00000000000007e1; addr of intrmapptr = 0xfffad008; writing intrmap
 = 00000000800007e1
; reread intrmap = 00000000800007e1; installing handler 0x1022b58 arg 0x272f800 with ino 33 pil 6
; returning handle 0x2727b00
hme1: using vector 33 for interrupt
pci_conf_read: tag 1800; reg 0; asi = 1d; readaddr = 1fe01001800 (offset = 1800) ... returning 000f1000
pci_conf_read: tag 1800; reg 4; asi = 1d; readaddr = 1fe01001804 (offset = 1804) ... returning 02000007
pci_conf_read: tag 1800; reg 8; asi = 1d; readaddr = 1fe01001808 (offset = 1808) ... returning 01000014
pci_conf_read: tag 1800; reg 3c; asi = 1d; readaddr = 1fe0100183c (offset = 183c) ... returning 40110120
siop0 at pci0 dev 3 function 0: Symbios Logic 53c875 (ultra-wide scsi)
pci_conf_read: tag 1800; reg 14; asi = 1d; readaddr = 1fe01001814 (offset = 1814) ... returning 00010000
pci_conf_read: tag 1800; reg 14; asi = 1d; readaddr = 1fe01001814 (offset = 1814) ... returning 00010000
pci_conf_write: tag 1800; reg 14; data ffffffff; asi = 1d; readaddr = 1fe01001814 (offset = 1814)
pci_conf_read: tag 1800; reg 14; asi = 1d; readaddr = 1fe01001814 (offset = 1814) ... returning ffffff00
pci_conf_write: tag 1800; reg 14; data 10000; asi = 1d; readaddr = 1fe01001814 (offset = 1814)
_psycho_bus_map: type 4 off 10000 sz 100 flags 0 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 10000 paddr 1ff80010000
pci_conf_read: tag 1800; reg 10; asi = 1d; readaddr = 1fe01001810 (offset = 1810) ... returning 00000401
pci_conf_write: tag 1800; reg 10; data ffffffff; asi = 1d; readaddr = 1fe01001810 (offset = 1810)
pci_conf_read: tag 1800; reg 10; asi = 1d; readaddr = 1fe01001810 (offset = 1810) ... returning ffffff01
pci_conf_write: tag 1800; reg 10; data 401; asi = 1d; readaddr = 1fe01001810 (offset = 1810)
_psycho_bus_map: type 3 off 400 sz 100 flags 0 va 0x0 cspace 1
_psycho_bus_map: mapping paddr space 1 offset 400 paddr 1fe02010400
pci_conf_read: tag 1800; reg 18; asi = 1d; readaddr = 1fe01001818 (offset = 1818) ... returning 00012000
pci_conf_write: tag 1800; reg 18; data ffffffff; asi = 1d; readaddr = 1fe01001818 (offset = 1818)
pci_conf_read: tag 1800; reg 18; asi = 1d; readaddr = 1fe01001818 (offset = 1818) ... returning fffff000
pci_conf_write: tag 1800; reg 18; data 12000; asi = 1d; readaddr = 1fe01001818 (offset = 1818)
_psycho_bus_map: type 4 off 12000 sz 1000 flags 0 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 12000 paddr 1ff80012000
siop0: using on-board RAM
pci_intr_map: tag 1800; pin 1; line 32; handle = 32; returning 0
pci_intr_string: ih 32; returning vector 32
pci_intr_establish: ih 32; level 5
psycho_intr_establish: ihandle 20 ino 20
psycho: intr 20: 0x0
Hunting for IRQ...
- turning on OBIO intr 0; read intrmap = 00000000000007e0; addr of intrmapptr = 0xfffad000; writing intrmap
 = 00000000800007e0
; reread intrmap = 00000000800007e0; installing handler 0x101a89c arg 0x272f400 with ino 32 pil 5
; returning handle 0x2727ac0
siop0: interrupting at vector 32
scsibus0 at siop0: 16 targets, 8 luns per target
pci_conf_read: tag 1900; reg 0; asi = 1d; readaddr = 1fe01001900 (offset = 1900) ... returning 000f1000
pci_conf_read: tag 1900; reg 4; asi = 1d; readaddr = 1fe01001904 (offset = 1904) ... returning 02000007
pci_conf_read: tag 1900; reg 8; asi = 1d; readaddr = 1fe01001908 (offset = 1908) ... returning 01000014
pci_conf_read: tag 1900; reg 3c; asi = 1d; readaddr = 1fe0100193c (offset = 193c) ... returning 40110226
siop1 at pci0 dev 3 function 1: Symbios Logic 53c875 (ultra-wide scsi)
pci_conf_read: tag 1900; reg 14; asi = 1d; readaddr = 1fe01001914 (offset = 1914) ... returning 00014000
pci_conf_read: tag 1900; reg 14; asi = 1d; readaddr = 1fe01001914 (offset = 1914) ... returning 00014000
pci_conf_write: tag 1900; reg 14; data ffffffff; asi = 1d; readaddr = 1fe01001914 (offset = 1914)
pci_conf_read: tag 1900; reg 14; asi = 1d; readaddr = 1fe01001914 (offset = 1914) ... returning ffffff00
pci_conf_write: tag 1900; reg 14; data 14000; asi = 1d; readaddr = 1fe01001914 (offset = 1914)
_psycho_bus_map: type 4 off 14000 sz 100 flags 0 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 14000 paddr 1ff80014000
pci_conf_read: tag 1900; reg 10; asi = 1d; readaddr = 1fe01001910 (offset = 1910) ... returning 00000801
pci_conf_write: tag 1900; reg 10; data ffffffff; asi = 1d; readaddr = 1fe01001910 (offset = 1910)
pci_conf_read: tag 1900; reg 10; asi = 1d; readaddr = 1fe01001910 (offset = 1910) ... returning ffffff01
pci_conf_write: tag 1900; reg 10; data 801; asi = 1d; readaddr = 1fe01001910 (offset = 1910)
_psycho_bus_map: type 3 off 800 sz 100 flags 0 va 0x0 cspace 1
_psycho_bus_map: mapping paddr space 1 offset 800 paddr 1fe02010800
pci_conf_read: tag 1900; reg 18; asi = 1d; readaddr = 1fe01001918 (offset = 1918) ... returning 00016000
pci_conf_write: tag 1900; reg 18; data ffffffff; asi = 1d; readaddr = 1fe01001918 (offset = 1918)
pci_conf_read: tag 1900; reg 18; asi = 1d; readaddr = 1fe01001918 (offset = 1918) ... returning fffff000
pci_conf_write: tag 1900; reg 18; data 16000; asi = 1d; readaddr = 1fe01001918 (offset = 1918)
_psycho_bus_map: type 4 off 16000 sz 1000 flags 0 va 0x0 cspace 2
_psycho_bus_map: mapping paddr space 2 offset 16000 paddr 1ff80016000
siop1: using on-board RAM
pci_intr_map: tag 1900; pin 2; line 38; handle = 38; returning 0
pci_intr_string: ih 38; returning vector 38
pci_intr_establish: ih 38; level 5
psycho_intr_establish: ihandle 26 ino 26
psycho: intr 26: 0x0
Hunting for IRQ...
- turning on OBIO intr 6; read intrmap = 00000000000007e6; addr of intrmapptr = 0xfffad030; writing intrmap
 = 00000000800007e6
; reread intrmap = 00000000800007e6; installing handler 0x101a89c arg 0x272f000 with ino 38 pil 5
; returning handle 0x2727680
siop1: interrupting at vector 38
scsibus1 at siop1: 16 targets, 8 luns per target
psycho1 at mainbus0 addr 0xfffce000
psycho: impl 0, version 4: psycho debug: got `ranges' for node f006ccb4: 4 entries
psycho debug: got `bus-range' for node f006ccb4: 128 - 128
bus range 128 to 128; PCI bus 128psycho debug: got `interupt-map' for node f006ccb4
psycho debug: got `interrupt-map-mask' for node f006ccb4

pci1 at psycho1
pci_attach_hook:
        node f009b350 name `TSI,gfxp' devtype `display': got interrupts got assigned-addresses got reg; bus
 128 dev 1 fn 0; tag 00800800
        ; reg: hi 800800 mid 0 lo 0 intr 1
        ; intmapmask: hi fff800 mid 0 lo 0 intr 7
        ; after: hi 800800 mid 0 lo 0 intr 1
                matching for: hi 800800 mid 0 lo 0 intr 1 child_intr 0... BINGO! found it in intr ...pci_co
nf_read: tag 800800; reg 3c; asi = 1d; readaddr = 1fe0180083c (offset = 80083c) ... returning c0c00100
            ; read c0c00100 from intreg
            ; gonna write c0c00100 to intreg
pci_conf_write: tag 800800; reg 3c; data c0c00100; asi = 1d; readaddr = 1fe0180083c (offset = 80083c)
            ; reread c0c00100 from intreg
pci_conf_write: tag 800800; reg 4; data 7; asi = 1d; readaddr = 1fe01800804 (offset = 800804)


pci1: i/o space, memory space enabled
pci_conf_read: tag 800800; reg 0; asi = 1d; readaddr = 1fe01800800 (offset = 800800) ... returning 00093d3d
pci_conf_read: tag 800800; reg 4; asi = 1d; readaddr = 1fe01800804 (offset = 800804) ... returning 02900006
pci_conf_read: tag 800800; reg 8; asi = 1d; readaddr = 1fe01800808 (offset = 800808) ... returning 03800001
pci_conf_read: tag 800800; reg 3c; asi = 1d; readaddr = 1fe0180083c (offset = 80083c) ... returning c0c0010
0
3D Labs GLINT Permedia 2V (miscellaneous display, revision 0x01) at pci1 dev 1 function 0 not configured
timer0 at mainbus0 addr 0xfffa7c00 irq vectors 7ec and 7ed
pcons0 at mainbus0
scsibus0: waiting 2 seconds for devices to settle...
siop0: alloc newcdb at PHY addr 0xfe01c000
siop0: target 0 using tagged queuing
sd0 at scsibus0 target 0 lun 0: <FUJITSU, MAJ3182M SUN18G, 0804> SCSI2 0/direct fixed
siop0: target 0 using 16bit transfers
siop0: target 0 now synchronous at 20.0Mhz, offset 16
sd0: 17274 MB, 7508 cyl, 19 head, 248 sec, 512 bytes/sect x 35378533 sectors
cd0 at scsibus0 target 6 lun 0: <TOSHIBA, DVD-ROM SD-M1401, 1007> SCSI2 5/cdrom removable
siop0: target 6 now synchronous at 20.0Mhz, offset 16
siop0: target 8 using tagged queuing
sd1 at scsibus0 target 8 lun 0: <FUJITSU, MAJ3364MC, 0114> SCSI4 0/direct fixed
siop0: target 8 using 16bit transfers
siop0: target 8 now synchronous at 20.0Mhz, offset 16
sd1: 34858 MB, 14793 cyl, 10 head, 482 sec, 512 bytes/sect x 71390320 sectors
siop0: target 9 using tagged queuing
sd2 at scsibus0 target 9 lun 0: <FUJITSU, MAJ3364MC, 0114> SCSI4 0/direct fixed
siop0: target 9 using 16bit transfers
siop0: target 9 now synchronous at 20.0Mhz, offset 16
sd2: 34858 MB, 14793 cyl, 10 head, 482 sec, 512 bytes/sect x 71390320 sectors
siop0: target 10 using tagged queuing
sd3 at scsibus0 target 10 lun 0: <FUJITSU, MAJ3364MC, 0114> SCSI4 0/direct fixed
siop0: target 10 using 16bit transfers
siop0: target 10 now synchronous at 20.0Mhz, offset 16
sd3: 34858 MB, 14793 cyl, 10 head, 482 sec, 512 bytes/sect x 71390320 sectors
scsibus1: waiting 2 seconds for devices to settle...
siop1: alloc newcdb at PHY addr 0xfe01e000
raidattach: Asked for 4 units
Kernelized RAIDframe activated
root on hme1
mountroot: trying msdos...
mountroot: trying cd9660...
mountroot: trying lfs...
mountroot: trying nfs...
nfs_boot: trying RARP (and RPC/bootparam)
nfs_boot: client_addr=192.168.1.235 (RARP from 192.168.1.150)
nfs_boot: server_addr=192.168.1.150
nfs_boot: hostname=sunbox.ch.foobar.net
nfs_boot: timeout...



> 
> 
> try ftp.netbsd.org:/pub/NetBSD/arch/sparc64/kernels/NetBSD-1.5R-2
> 
> 
> it was built with this patch:
> 
> 
> Index: arch/sparc64/dev/simba.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/arch/sparc64/dev/simba.c,v
> retrieving revision 1.2
> diff -p -p -u -r1.2 simba.c
> --- arch/sparc64/dev/simba.c	2000/05/24 20:27:52	1.2
> +++ arch/sparc64/dev/simba.c	2001/02/11 18:09:28
> @@ -135,6 +135,9 @@ simba_attach(parent, self, aux)
>  	pba.pba_bus = PPB_BUSINFO_SECONDARY(busdata);
>  	pba.pba_intrswiz = pa->pa_intrswiz;
>  	pba.pba_intrtag = pa->pa_intrtag;
> +#ifdef __PCI_OFW_BINDING
> +        pba.pba_node = pa->pa_node;
> +#endif
>  
>  	config_found(self, &pba, simba_print);
>  }
> Index: arch/sparc64/dev/psycho.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/arch/sparc64/dev/psycho.c,v
> retrieving revision 1.28
> diff -p -p -u -r1.28 psycho.c
> --- arch/sparc64/dev/psycho.c	2000/12/04 20:29:34	1.28
> +++ arch/sparc64/dev/psycho.c	2001/02/11 18:09:29
@@ -209,6 +209,9 @@ psycho_attach(parent, self, aux)
>  	pba.pba_dmat = sc->sc_psycho_this->pp_dmat;
>  	pba.pba_iot = sc->sc_psycho_this->pp_iot;
>  	pba.pba_memt = sc->sc_psycho_this->pp_memt;
> +#ifdef __PCI_OFW_BINDING
> +	pba.pba_node = sc->sc_node;
> +#endif
>  
>  	config_found(self, &pba, psycho_print);
>  }
> Index: arch/sparc64/include/pci_machdep.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/arch/sparc64/include/pci_machdep.h,v
> retrieving revision 1.5
> diff -p -p -u -r1.5 pci_machdep.h
> --- arch/sparc64/include/pci_machdep.h	2000/12/28 22:59:10	1.5
> +++ arch/sparc64/include/pci_machdep.h	2001/02/11 18:09:29
> @@ -65,4 +65,7 @@ void		*pci_intr_establish(pci_chipset_ta
>  					 int, int (*)(void *), void *);
>  void		pci_intr_disestablish(pci_chipset_tag_t, void *);
>  
> +/* want pci_attach_args{}->pa_node */
> +#define __PCI_OFW_BINDING
> +
>  #endif /* _MACHINE_PCI_MACHDEP_H_ */
> Index: dev/pci/pci.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/dev/pci/pci.c,v
> retrieving revision 1.49
> diff -p -p -u -r1.49 pci.c
> --- dev/pci/pci.c	2000/06/28 16:08:48	1.49
> +++ dev/pci/pci.c	2001/02/11 18:09:29
> @@ -45,6 +45,11 @@
>  #include <dev/pci/pcivar.h>
>  #include <dev/pci/pcidevs.h>
>  
> +#ifdef __PCI_OFW_BINDING
> +#include <dev/ofw/openfirm.h>
> +#include <dev/ofw/ofw_pci.h>
> +#endif
> +
>  #ifdef PCI_CONFIG_DUMP
>  int pci_config_dump = 1;
>  #else
> @@ -72,11 +77,9 @@ struct cfattach pci_ca = {
>  	sizeof(struct pci_softc), pcimatch, pciattach
>  };
>  
> -#ifdef __PCI_OFW_BINDING
> -void	pci_ofw_probe_bus __P((struct device *));
> -#else
> +void	pci_probe_function(struct device *, struct pci_attach_args *,
> +			   pci_chipset_tag_t, int, int);
>  void	pci_probe_bus __P((struct device *));
> -#endif
>  int	pciprint __P((void *, const char *));
>  int	pcisubmatch __P((struct device *, struct cfdata *, void *));
>  
> @@ -133,16 +136,124 @@ pcimatch(parent, cf, aux)
>  	return 1;
>  }
>  
> -#ifdef __PCI_OFW_BINDING
> +/*
> + * Probe a single function.  Call by both the generic and OFW bus probe
> + * routines.
> + */
>  void
> -pci_ofw_probe_bus(self)
> +pci_probe_function(self, pa, pc, device, function)
>  	struct device *self;
> +	struct pci_attach_args *pa;
> +	pci_chipset_tag_t pc;
> +	int device, function;
>  {
> +	pcireg_t tag, intr, csr, id, class;
>  	struct pci_softc *sc = (struct pci_softc *)self;
> +	int bus = sc->sc_bus;
> +	int pin;
> +
> +	tag = pci_make_tag(pc, bus, device, function);
> +	id = pci_conf_read(pc, tag, PCI_ID_REG);
> +	csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
> +	class = pci_conf_read(pc, tag, PCI_CLASS_REG);
> +	intr = pci_conf_read(pc, tag, PCI_INTERRUPT_REG);
> +
> +	/* Invalid vendor ID value? */
> +	if (PCI_VENDOR(id) == PCI_VENDOR_INVALID)
> +		return;
> +	/* XXX Not invalid, but we've done this ~forever. */
> +	if (PCI_VENDOR(id) == 0)
> +		return;
> +
> +	pa->pa_iot = sc->sc_iot;
> +	pa->pa_memt = sc->sc_memt;
> +	pa->pa_dmat = sc->sc_dmat;
> +	pa->pa_pc = pc;
> +	pa->pa_device = device;
> +	pa->pa_function = function;
> +	pa->pa_tag = tag;
> +	pa->pa_id = id;
> +	pa->pa_class = class;
> +
> +	/* From here on is identical to non-OFW version */
> +	/*
> +	 * Set up memory, I/O enable, and PCI command flags
> +	 * as appropriate.
> +	 */
> +	pa->pa_flags = sc->sc_flags;
> +	if ((csr & PCI_COMMAND_IO_ENABLE) == 0)
> +		pa->pa_flags &= ~PCI_FLAGS_IO_ENABLED;
> +	if ((csr & PCI_COMMAND_MEM_ENABLE) == 0)
> +		pa->pa_flags &= ~PCI_FLAGS_MEM_ENABLED;
> +
> +	if (bus == 0) {
> +		pa->pa_intrswiz = 0;
> +		pa->pa_intrtag = pa->pa_tag;
> +	} else {
> +		pa->pa_intrswiz = sc->sc_intrswiz + device;
> +		pa->pa_intrtag = sc->sc_intrtag;
> +	}
> +	pin = PCI_INTERRUPT_PIN(intr);
> +	if (pin == PCI_INTERRUPT_PIN_NONE) {
> +		/* no interrupt */
> +		pa->pa_intrpin = 0;
> +	} else {
> +		/*
> +		 * swizzle it based on the number of
> +		 * busses we're behind and our device
> +		 * number.
> +		 */
> +		pa->pa_intrpin =			/* XXX */
> +		    ((pin + pa->pa_intrswiz - 1) % 4) + 1;
> +	}
> +	pa->pa_intrline = PCI_INTERRUPT_LINE(intr);
> +
> +	config_found_sm(self, pa, pciprint, pcisubmatch);
> +}
> +
> +#ifdef __PCI_OFW_BINDING
> +static __inline pcireg_t pci_OF_getpropint(int node, char *prop);
> +
> +static __inline pcireg_t
> +pci_OF_getpropint(node, prop)
>  	int node;
> +	char *prop;
> +{
> +	int it, len;
> +
> +	if ((len = OF_getproplen(node, prop)) != sizeof(it) ||
> +	    OF_getprop(node, prop, &it, sizeof(it)) == 0)
> +		return (pcireg_t)~0;
> +
> +	return (pcireg_t)it;
> +
> +}
>  
> +void
> +pci_probe_bus(self)
> +	struct device *self;
> +{
> +	struct pci_softc *sc = (struct pci_softc *)self;
> +	struct ofw_pci_register reg0;
> +	struct pci_attach_args pa;
> +	int node, bus, device, function, len;
> +	pci_chipset_tag_t pc;
> +
> +	bus = sc->sc_bus;
> +	pc = sc->sc_pc;
>  	for (node = OF_child(sc->sc_node); node; node = OF_peer(node)) {
> +		len = OF_getproplen(node, "reg");
> +		if (len <= 0)
> +			continue;
> +		if (OF_getprop(node, "reg", (void *)&reg0, sizeof(reg0)) != len
> )
> +			panic("pci_probe_bus: OF_getprop len botch");
> +
> +		device = OFW_PCI_PHYS_HI_DEVICE(reg0.phys_hi);
> +		function = OFW_PCI_PHYS_HI_FUNCTION(reg0.phys_hi);
> +
> +		pa.pa_node = node;
>  
> +		pci_probe_function(self, &pa, pc, device, function);
>  	}
>  }
>  #else
> @@ -164,9 +275,8 @@ pci_probe_bus(self)
>  
>  	for (device = 0; device < maxndevs; device++) {
>  		pcitag_t tag;
> -		pcireg_t id, class, intr, bhlcr, csr;
> +		pcireg_t id, bhlcr;
>  		struct pci_attach_args pa;
> -		int pin;
>  
>  		tag = pci_make_tag(pc, bus, device, 0);
>  		id = pci_conf_read(pc, tag, PCI_ID_REG);
> @@ -188,64 +298,8 @@ pci_probe_bus(self)
>  		else
>  			nfunctions = 1;
>  
> -		for (function = 0; function < nfunctions; function++) {
> -			tag = pci_make_tag(pc, bus, device, function);
> -			id = pci_conf_read(pc, tag, PCI_ID_REG);
> -			csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
> -			class = pci_conf_read(pc, tag, PCI_CLASS_REG);
> -			intr = pci_conf_read(pc, tag, PCI_INTERRUPT_REG);
> -
> -			/* Invalid vendor ID value? */
> -			if (PCI_VENDOR(id) == PCI_VENDOR_INVALID)
> -				continue;
> -			/* XXX Not invalid, but we've done this ~forever. */
> -			if (PCI_VENDOR(id) == 0)
> -				continue;
> -
> -			pa.pa_iot = iot;
> -			pa.pa_memt = memt;
> -			pa.pa_dmat = sc->sc_dmat;
> -			pa.pa_pc = pc;
> -			pa.pa_device = device;
> -			pa.pa_function = function;
> -			pa.pa_tag = tag;
> -			pa.pa_id = id;
> -			pa.pa_class = class;
> -
> -			/*
> -			 * Set up memory, I/O enable, and PCI command flags
> -			 * as appropriate.
> -			 */
> -			pa.pa_flags = sc->sc_flags;
> -			if ((csr & PCI_COMMAND_IO_ENABLE) == 0)
> -				pa.pa_flags &= ~PCI_FLAGS_IO_ENABLED;
> -			if ((csr & PCI_COMMAND_MEM_ENABLE) == 0)
> -				pa.pa_flags &= ~PCI_FLAGS_MEM_ENABLED;
> -
> -			if (bus == 0) {
> -				pa.pa_intrswiz = 0;
> -				pa.pa_intrtag = tag;
> -			} else {
> -				pa.pa_intrswiz = sc->sc_intrswiz + device;
> -				pa.pa_intrtag = sc->sc_intrtag;
> -			}
> -			pin = PCI_INTERRUPT_PIN(intr);
> -			if (pin == PCI_INTERRUPT_PIN_NONE) {
> -				/* no interrupt */
> -				pa.pa_intrpin = 0;
> -			} else {
> -				/*
> -				 * swizzle it based on the number of
> -				 * busses we're behind and our device
> -				 * number.
> -				 */
> -				pa.pa_intrpin =			/* XXX */
> -				    ((pin + pa.pa_intrswiz - 1) % 4) + 1;
> -			}
> -			pa.pa_intrline = PCI_INTERRUPT_LINE(intr);
> -
> -			config_found_sm(self, &pa, pciprint, pcisubmatch);
> -		}
> +		for (function = 0; function < nfunctions; function++)
> +			pci_probe_function(self, &pa, pc, device, function);
>  	}
>  }
>  #endif
> @@ -309,11 +363,8 @@ pciattach(parent, self, aux)
>  	sc->sc_flags = pba->pba_flags;
>  #ifdef __PCI_OFW_BINDING
>  	sc->sc_node = pba->pba_node;
> -
> -	pci_ofw_probe_bus(self);
> -#else
> -	pci_probe_bus(self);
>  #endif
> +	pci_probe_bus(self);
>  }
>  
>  int
> Index: dev/pci/ppb.c
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/dev/pci/ppb.c,v
> retrieving revision 1.19
> diff -p -p -u -r1.19 ppb.c
> --- dev/pci/ppb.c	1999/11/04 19:04:04	1.19
> +++ dev/pci/ppb.c	2001/02/11 18:09:29
> @@ -117,6 +117,9 @@ ppbattach(parent, self, aux)
>  	pba.pba_bus = PPB_BUSINFO_SECONDARY(busdata);
>  	pba.pba_intrswiz = pa->pa_intrswiz;
>  	pba.pba_intrtag = pa->pa_intrtag;
> +#ifdef __PCI_OFW_BINDING
> +        pba.pba_node = pa->pa_node;
> +#endif
>  
>  	config_found(self, &pba, ppbprint);
>  }
> Index: dev/ofw/ofw_pci.h
> ===================================================================
> RCS file: /cvsroot/syssrc/sys/dev/ofw/ofw_pci.h,v
> retrieving revision 1.2
> diff -p -p -u -r1.2 ofw_pci.h
> --- dev/ofw/ofw_pci.h	1999/05/05 08:09:34	1.2
> +++ dev/ofw/ofw_pci.h	2001/02/11 18:09:30
> @@ -87,4 +87,20 @@
>  #define	OFW_PCI_PHYS_HI_SPACE_MEM32	0x02000000
>  #define	OFW_PCI_PHYS_HI_SPACE_MEM64	0x03000000
>  
> +#define OFW_PCI_PHYS_HI_DEVICE(hi) \
> +	(((hi) & OFW_PCI_PHYS_HI_DEVICEMASK) >> OFW_PCI_PHYS_HI_DEVICESHIFT)
> +#define OFW_PCI_PHYS_HI_FUNCTION(hi) \
> +	(((hi) & OFW_PCI_PHYS_HI_FUNCTIONMASK) >> OFW_PCI_PHYS_HI_FUNCTIONSHIFT
> )
> +
> +/*
> + * This has the 3 32bit cell values, plus 2 more to make up a 64-bit size.
> + */
> +struct ofw_pci_register {
> +	u_int32_t	phys_hi;
> +	u_int32_t	phys_mid;
> +	u_int32_t	phys_lo;
> +	u_int32_t	size_hi;
> +	u_int32_t	size_lo;
> +};
> +
>  #endif /* _DEV_OFW_OFW_PCI_H_ */