# 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 = ""; + 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