# HG changeset patch
# User cegger@powermacg5.local
# Date 1259875705 -3600
Attach ACPI PCI devices on a acpipcibus

diff -r a3c311dcaed2 -r a2780835dac3 sys/dev/acpi/acpi_pci.c
--- a/sys/dev/acpi/acpi_pci.c
+++ b/sys/dev/acpi/acpi_pci.c
@@ -61,7 +61,13 @@ struct acpi_pcidev {
 	uint32_t ap_pcidev;
 	uint32_t ap_pcifunc;
 	bool ap_pcihost;
+
+	bus_space_tag_t ap_iot;
+	bus_space_tag_t ap_memt;
+	pci_chipset_tag_t ap_pc;
+
 	TAILQ_ENTRY(acpi_pcidev) ap_list;
+	device_t ap_device;
 };
 
 
@@ -128,16 +134,74 @@ acpi_pcidev_add(struct acpi_softc *sc, s
 	ap->ap_pcibus = bus;
 	ap->ap_pcidev = addr >> 16;
 	ap->ap_pcifunc = addr & 0xffff;
+	ap->ap_iot = sc->sc_iot;
+	ap->ap_memt = sc->sc_memt;
+	ap->ap_pc = sc->sc_pc;
 
 	TAILQ_INSERT_TAIL(&acpi_pcidevlist, ap, ap_list);
 
 	return true;
 }
 
-static void
-acpi_pcidev_print(struct acpi_pcidev *ap)
+static int
+acpi_pcidev_print(void *aux, const char *pnp)
 {
-	aprint_debug(" %s", ap->ap_node->ad_name);
+	struct acpipci_attach_args *aa = aux;
+	ACPI_STATUS rv;
+
+	if (pnp) {
+		if (aa->aa_node->ad_devinfo->Valid & ACPI_VALID_HID) {
+			char *pnpstr =
+			    aa->aa_node->ad_devinfo->HardwareId.String;
+			ACPI_BUFFER buf;
+
+			aprint_normal("%s (%s) ", aa->aa_node->ad_name,
+			    pnpstr);
+
+			buf.Pointer = NULL;
+			buf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+			rv = AcpiEvaluateObject(aa->aa_node->ad_handle,
+			    "_STR", NULL, &buf);
+			if (ACPI_SUCCESS(rv)) {
+				ACPI_OBJECT *obj = buf.Pointer;
+				switch (obj->Type) {
+				case ACPI_TYPE_STRING:
+					aprint_normal("[%s] ",
+					    obj->String.Pointer);
+					break;
+				case ACPI_TYPE_BUFFER:
+					aprint_normal("buffer %p ",
+					    obj->Buffer.Pointer);
+					break;
+				default:
+					aprint_normal("type %d ", obj->Type);
+					break;
+				}
+				ACPI_FREE(buf.Pointer);
+			}
+			aprint_normal(" at %s", pnp);
+		} else {
+			aprint_normal("%s at %s",
+			    aa->aa_node->ad_name, pnp);
+		}
+	} else {
+		aprint_normal(" (%s", aa->aa_node->ad_name);
+		if (aa->aa_node->ad_devinfo->Valid & ACPI_VALID_HID) {
+			aprint_normal(", %s",
+			    aa->aa_node->ad_devinfo->HardwareId.String);
+			if (aa->aa_node->ad_devinfo->Valid & ACPI_VALID_UID) {
+				const char *uid;
+
+				uid = aa->aa_node->ad_devinfo->UniqueId.String;
+				if (uid[0] == '\0')
+					uid = "<null>";
+				aprint_normal("-%s", uid);
+			}
+		}
+		aprint_normal(")");
+	}
+
+	return UNCONF;
 }
 
 int
@@ -173,9 +237,34 @@ acpi_pcidev_scan(struct acpi_softc *sc)
 
 	aprint_debug_dev(sc->sc_dev, "pci devices:");
 	TAILQ_FOREACH(ap, &acpi_pcidevlist, ap_list)
-		acpi_pcidev_print(ap);
+		aprint_debug(" %s", ap->ap_node->ad_name);
 	aprint_debug("\n");
 
+	TAILQ_FOREACH(ap, &acpi_pcidevlist, ap_list) {
+		struct acpipci_attach_args aa;
+
+#ifdef ACPIVERBOSE
+		aprint_debug_dev(sc->sc_dev,
+		    "pci %s \"%s\", segment %u, bus %u, dev %u func %u\n",
+		    ap->ap_pcihost ? "host device" : "device",
+		    ap->ap_node->ad_name, ap->ap_pciseg,
+		    ap->ap_pcibus, ap->ap_pcidev, ap->ap_pcifunc);
+#endif
+
+		aa.aa_node = ap->ap_node;
+		aa.aa_pciseg = ap->ap_pciseg;
+		aa.aa_pcibus = ap->ap_pcibus;
+		aa.aa_pcidev = ap->ap_pcidev;
+		aa.aa_pcifunc = ap->ap_pcifunc;
+
+		aa.aa_iot = ap->ap_iot;
+		aa.aa_memt = ap->ap_memt;
+		aa.aa_pc = ap->ap_pc;
+
+		ap->ap_device = config_found_ia(sc->sc_dev,
+		    "acpipcibus", &aa, acpi_pcidev_print);
+	}
+
 	return count;
 }
 
diff -r a3c311dcaed2 -r a2780835dac3 sys/dev/acpi/acpi_pci.h
--- a/sys/dev/acpi/acpi_pci.h
+++ b/sys/dev/acpi/acpi_pci.h
@@ -31,6 +31,23 @@
 #ifndef _SYS_DEV_ACPI_ACPI_PCI_H
 #define _SYS_DEV_ACPI_ACPI_PCI_H
 
+/*
+ * acpibus_attach_args:
+ *
+ *      This structure is used to attach the ACPI "bus".
+ */
+struct acpipci_attach_args {
+	struct acpi_devnode *aa_node;
+	uint32_t aa_pciseg;
+	uint32_t aa_pcibus;
+	uint32_t aa_pcidev;
+	uint32_t aa_pcifunc;
+
+	bus_space_tag_t aa_iot; /* PCI I/O space tag */
+	bus_space_tag_t aa_memt; /* PCI MEM space tag */
+	pci_chipset_tag_t aa_pc; /* PCI chipset */
+};
+
 int acpi_pcidev_scan(struct acpi_softc *);
 ACPI_STATUS acpi_pcidev_find(u_int, u_int, u_int, u_int, ACPI_HANDLE *);
 
diff -r a3c311dcaed2 -r a2780835dac3 sys/dev/acpi/files.acpi
--- a/sys/dev/acpi/files.acpi
+++ b/sys/dev/acpi/files.acpi
@@ -9,8 +9,9 @@ defparam opt_acpi.h	ACPI_DSDT_FILE := "\
 define	acpiapmbus { }
 define	acpinodebus { }
 define	acpiecdtbus { }
+define	acpipcibus {[dev = -1], [function = -1]}
 
-device	acpi: acpica, acpiapmbus, acpinodebus, acpiecdtbus, sysmon_power, sysmon_taskq
+device	acpi: acpica, acpiapmbus, acpinodebus, acpiecdtbus, sysmon_power, sysmon_taskq, acpipcibus
 attach	acpi at acpibus
 file	dev/acpi/acpi.c			acpi
 file	dev/acpi/acpi_resource.c	acpi