diff options
author | jhb <jhb@FreeBSD.org> | 2006-02-01 15:45:29 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-02-01 15:45:29 +0000 |
commit | 16c9ed73d6b803cc7c25cdeec1d82956eb5bc231 (patch) | |
tree | 7f7e63d69e06c87fd4f488209e042af6d504d377 /sys | |
parent | 41ffd5b92bd381c4a81a8758108bd2811397537e (diff) | |
download | FreeBSD-src-16c9ed73d6b803cc7c25cdeec1d82956eb5bc231.zip FreeBSD-src-16c9ed73d6b803cc7c25cdeec1d82956eb5bc231.tar.gz |
Don't add an agp child in vgapci's attach routine if the PCIY_AGP
capability is present as not all devices supported by the agp_i810 driver
(such as i915) have the AGP capability. Instead, add an identify routine
to the agp_i810 driver that uses the PCI ID to determine if it should
create an agp child device.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/agp/agp_i810.c | 10 | ||||
-rw-r--r-- | sys/dev/pci/vga_pci.c | 7 | ||||
-rw-r--r-- | sys/pci/agp_i810.c | 10 |
3 files changed, 20 insertions, 7 deletions
diff --git a/sys/dev/agp/agp_i810.c b/sys/dev/agp/agp_i810.c index 1aa187b..7b21a41 100644 --- a/sys/dev/agp/agp_i810.c +++ b/sys/dev/agp/agp_i810.c @@ -194,6 +194,15 @@ agp_i810_find_bridge(device_t dev) return 0; } +static void +agp_i810_identify(driver_t *driver, device_t parent) +{ + + if (device_find_child(parent, "agp", -1) == NULL && + agp_i810_match(parent)) + device_add_child(parent, "agp", -1); +} + static int agp_i810_probe(device_t dev) { @@ -799,6 +808,7 @@ agp_i810_unbind_memory(device_t dev, struct agp_memory *mem) static device_method_t agp_i810_methods[] = { /* Device interface */ + DEVMETHOD(device_identify, agp_i810_identify), DEVMETHOD(device_probe, agp_i810_probe), DEVMETHOD(device_attach, agp_i810_attach), DEVMETHOD(device_detach, agp_i810_detach), diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c index ea7ce33..54424a2 100644 --- a/sys/dev/pci/vga_pci.c +++ b/sys/dev/pci/vga_pci.c @@ -70,13 +70,6 @@ vga_pci_attach(device_t dev) bus_generic_probe(dev); - /* - * If AGP capabilities are present on this device, then create - * an AGP child. - */ - if (pci_find_extcap(dev, PCIY_AGP, NULL) == 0) - device_add_child(dev, "agp", -1); - /* Always create a drm child for now to make it easier on drm. */ device_add_child(dev, "drm", -1); bus_generic_attach(dev); diff --git a/sys/pci/agp_i810.c b/sys/pci/agp_i810.c index 1aa187b..7b21a41 100644 --- a/sys/pci/agp_i810.c +++ b/sys/pci/agp_i810.c @@ -194,6 +194,15 @@ agp_i810_find_bridge(device_t dev) return 0; } +static void +agp_i810_identify(driver_t *driver, device_t parent) +{ + + if (device_find_child(parent, "agp", -1) == NULL && + agp_i810_match(parent)) + device_add_child(parent, "agp", -1); +} + static int agp_i810_probe(device_t dev) { @@ -799,6 +808,7 @@ agp_i810_unbind_memory(device_t dev, struct agp_memory *mem) static device_method_t agp_i810_methods[] = { /* Device interface */ + DEVMETHOD(device_identify, agp_i810_identify), DEVMETHOD(device_probe, agp_i810_probe), DEVMETHOD(device_attach, agp_i810_attach), DEVMETHOD(device_detach, agp_i810_detach), |