From 16c9ed73d6b803cc7c25cdeec1d82956eb5bc231 Mon Sep 17 00:00:00 2001 From: jhb Date: Wed, 1 Feb 2006 15:45:29 +0000 Subject: 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. --- sys/dev/agp/agp_i810.c | 10 ++++++++++ sys/dev/pci/vga_pci.c | 7 ------- 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), -- cgit v1.1