Date: Sat, 6 Jan 2001 20:07:15 -0500 (EST) From: Andrew Gallatin <gallatin@cs.duke.edu> To: freebsd-current@freebsd.org Subject: holy buses & user-level pci access problem Message-ID: <14935.49104.217145.400932@grasshopper.cs.duke.edu>
next in thread | raw e-mail | index | archive | help
When trying to figure out a bizzare failure of the X server on my
UP1000, I found a bug in the user-level pci bus code. This machine
is rather wacky in that it has 2 busses: 0 and 2. 0 is the pci bus,
2 is the AGP bus, behind the AMD-751 host-pci bridge (pcib1):
<...>
pcib0: <AMD 751 PCI host bus adapter> on irongate0
pci0: <PCI bus> on pcib0
pcib1: <AMD-751 PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci2: <PCI bus> on pcib1
pci2: <VGA-compatible display device> at 5.0
isab0: <AcerLabs M1533 portable PCI-ISA bridge> at device 7.0 on pci0
<...>
# pciconf -l
none0@pci0:0:0: class=0x060000 card=0x00000000 chip=0x70061022 rev=0x25 hdr=0x00
pcib1@pci0:1:0: class=0x060400 card=0x00000000 chip=0x70071022 rev=0x01 hdr=0x01
isab0@pci0:7:0: class=0x060100 card=0x00000000 chip=0x153310b9 rev=0xc3 hdr=0x00
dc0@pci0:9:0: class=0x020000 card=0x500b1011 chip=0x00191011 rev=0x30 hdr=0x00
sym0@pci0:10:0: class=0x010000 card=0x00000000 chip=0x000f1000 rev=0x04 hdr=0x00
fxp0@pci0:11:0: class=0x020000 card=0x00018086 chip=0x12298086 rev=0x02 hdr=0x00
atapci0@pci0:16:0: class=0x0101fa card=0x00000000 chip=0x522910b9 rev=0xc1 hdr=0x00
alpm0@pci0:17:0: class=0x000000 card=0x00000000 chip=0x710110b9 rev=0x00 hdr=0x00
vga_pci0@pci2:5:0: class=0x030000 card=0x0a351048 chip=0x3d07104c rev=0x11 hdr=0x00
# pciconf -r pci2:5:0 0
pciconf: ioctl(PCIOCREAD): Operation not supported by device
# pciconf -r pci1:5:0 0
0x3d07104c
Wow.
Note that by doing PCIOREADs of the DEVVENDOR, the graphics card is
found at 1:5:0 and not 2:5:0 -- this confuses the hell out of the
XFree86 resource mapping code, since there isn't a bus 1 on this
system. It tries to remap the card into the memory space of bus 0 and
fails miserably.
I've got a special-case hack to the XFree86-4 port that I could commit
(lie to the resource code and tell it the bridge is a bridge to bus1),
but I'd rather have it fixed correctly.
I think this (in sys/dev/pci/pci_user.c) is the culprit:
/*
* Assume that the user-level bus number is
* actually the pciN instance number. We map
* from that to the real pcib+bus combination.
*/
But I'm at a loss as to how to fix this bug and not introduce a binary
incompatability by adding a hose field to struct pcisel in pciio.h
Can anybody with more newbus fu than me help me out here?
Thanks,
Drew
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?14935.49104.217145.400932>
