> Date: Mon, 27 Jul 2020 11:10:42 -0400 > From: Bryan Steele <bry...@gmail.com> > > On Mon, Jul 27, 2020 at 05:02:41PM +0200, Mark Kettenis wrote: > > Recent ACPI versions have deprecated "Processor()" nodes in favout of > > "Device()" nodes with a _HID() method that returns "ACPI0007". This > > diff tries to support machines with firmware that implements this. If > > you see something like: > > > > "ACPI0007" at acpi0 not configured > > > > please try the following diff and report back with an updated dmesg. > > > > Cheers, > > > > Mark > > > > Wrong diff?
Yes, too many diffs that start with acpi... Thanks, Mark > > Index: dev/acpi/acpi.c > > =================================================================== > > RCS file: /cvs/src/sys/dev/acpi/acpi.c,v > > retrieving revision 1.384 > > diff -u -p -r1.384 acpi.c > > --- dev/acpi/acpi.c 11 May 2020 17:57:17 -0000 1.384 > > +++ dev/acpi/acpi.c 13 May 2020 18:44:32 -0000 > > @@ -72,6 +72,7 @@ int acpi_debug = 16; > > > > int acpi_poll_enabled; > > int acpi_hasprocfvs; > > +int acpi_haspci; > > > > #define ACPIEN_RETRIES 15 > > > > Index: dev/acpi/acpivar.h > > =================================================================== > > RCS file: /cvs/src/sys/dev/acpi/acpivar.h,v > > retrieving revision 1.108 > > diff -u -p -r1.108 acpivar.h > > --- dev/acpi/acpivar.h 8 May 2020 11:18:01 -0000 1.108 > > +++ dev/acpi/acpivar.h 13 May 2020 18:44:32 -0000 > > @@ -43,6 +43,7 @@ extern int acpi_debug; > > #endif > > > > extern int acpi_hasprocfvs; > > +extern int acpi_haspci; > > > > struct klist; > > struct acpiec_softc; > > Index: arch/amd64/amd64/mainbus.c > > =================================================================== > > RCS file: /cvs/src/sys/arch/amd64/amd64/mainbus.c,v > > retrieving revision 1.49 > > diff -u -p -r1.49 mainbus.c > > --- arch/amd64/amd64/mainbus.c 7 Sep 2019 13:46:19 -0000 1.49 > > +++ arch/amd64/amd64/mainbus.c 13 May 2020 18:44:32 -0000 > > @@ -231,6 +231,13 @@ mainbus_attach(struct device *parent, st > > #endif > > > > #if NPCI > 0 > > +#if NACPI > 0 > > + if (acpi_haspci) { > > + extern void acpipci_attach_busses(struct device *); > > + > > + acpipci_attach_busses(self); > > + } else > > +#endif > > { > > pci_init_extents(); > > > > @@ -245,9 +252,6 @@ mainbus_attach(struct device *parent, st > > mba.mba_pba.pba_domain = pci_ndomains++; > > mba.mba_pba.pba_bus = 0; > > config_found(self, &mba.mba_pba, mainbus_print); > > -#if NACPI > 0 > > - acpi_pciroots_attach(self, &mba.mba_pba, mainbus_print); > > -#endif > > } > > #endif > > > > Index: arch/amd64/conf/RAMDISK > > =================================================================== > > RCS file: /cvs/src/sys/arch/amd64/conf/RAMDISK,v > > retrieving revision 1.77 > > diff -u -p -r1.77 RAMDISK > > --- arch/amd64/conf/RAMDISK 5 Mar 2020 16:36:30 -0000 1.77 > > +++ arch/amd64/conf/RAMDISK 13 May 2020 18:44:32 -0000 > > @@ -30,6 +30,7 @@ acpi0 at bios? > > #acpicpu* at acpi? > > acpicmos* at acpi? > > acpiec* at acpi? > > +acpipci* at acpi? > > acpiprt* at acpi? > > acpimadt0 at acpi? > > #acpitz* at acpi? > > Index: arch/amd64/conf/RAMDISK_CD > > =================================================================== > > RCS file: /cvs/src/sys/arch/amd64/conf/RAMDISK_CD,v > > retrieving revision 1.188 > > diff -u -p -r1.188 RAMDISK_CD > > --- arch/amd64/conf/RAMDISK_CD 15 Feb 2020 08:49:11 -0000 1.188 > > +++ arch/amd64/conf/RAMDISK_CD 13 May 2020 18:44:32 -0000 > > @@ -37,6 +37,7 @@ acpi0 at bios? > > #acpicpu* at acpi? > > acpicmos* at acpi? > > acpiec* at acpi? > > +acpipci* at acpi? > > acpiprt* at acpi? > > acpimadt0 at acpi? > > #acpitz* at acpi? > > Index: arch/amd64/pci/acpipci.c > > =================================================================== > > RCS file: /cvs/src/sys/arch/amd64/pci/acpipci.c,v > > retrieving revision 1.3 > > diff -u -p -r1.3 acpipci.c > > --- arch/amd64/pci/acpipci.c 7 Sep 2019 13:46:19 -0000 1.3 > > +++ arch/amd64/pci/acpipci.c 13 May 2020 18:44:32 -0000 > > @@ -53,6 +53,19 @@ struct acpipci_softc { > > struct device sc_dev; > > struct acpi_softc *sc_acpi; > > struct aml_node *sc_node; > > + > > + bus_space_tag_t sc_iot; > > + bus_space_tag_t sc_memt; > > + bus_dma_tag_t sc_dmat; > > + > > + struct extent *sc_busex; > > + struct extent *sc_memex; > > + struct extent *sc_ioex; > > + char sc_busex_name[32]; > > + char sc_ioex_name[32]; > > + char sc_memex_name[32]; > > + int sc_bus; > > + uint32_t sc_seg; > > }; > > > > int acpipci_match(struct device *, void *, void *); > > @@ -72,6 +85,11 @@ const char *acpipci_hids[] = { > > NULL > > }; > > > > +void acpipci_attach_deferred(struct device *); > > +int acpipci_print(void *, const char *); > > +int acpipci_parse_resources(int, union acpi_resource *, void *); > > +void acpipci_osc(struct acpipci_softc *); > > + > > int > > acpipci_match(struct device *parent, void *match, void *aux) > > { > > @@ -86,15 +104,225 @@ acpipci_attach(struct device *parent, st > > { > > struct acpi_attach_args *aaa = aux; > > struct acpipci_softc *sc = (struct acpipci_softc *)self; > > - struct aml_value args[4]; > > struct aml_value res; > > - static uint8_t uuid[16] = ACPI_PCI_UUID; > > - uint32_t buf[3]; > > + uint64_t bbn = 0; > > + uint64_t seg = 0; > > + > > + acpi_haspci = 1; > > + > > + sc->sc_iot = aaa->aaa_iot; > > + sc->sc_memt = aaa->aaa_memt; > > + sc->sc_dmat = aaa->aaa_dmat; > > > > sc->sc_acpi = (struct acpi_softc *)parent; > > sc->sc_node = aaa->aaa_node; > > printf(" %s", sc->sc_node->name); > > > > + acpipci_osc(sc); > > + > > + aml_evalinteger(sc->sc_acpi, sc->sc_node, "_BBN", 0, NULL, &bbn); > > + sc->sc_bus = bbn; > > + > > + aml_evalinteger(sc->sc_acpi, sc->sc_node, "_SEG", 0, NULL, &seg); > > + sc->sc_seg = seg; > > + > > + if (aml_evalname(sc->sc_acpi, sc->sc_node, "_CRS", 0, NULL, &res)) { > > + printf(": can't find resources\n"); > > + > > + pci_init_extents(); > > + sc->sc_busex = pcibus_ex; > > + sc->sc_ioex = pciio_ex; > > + sc->sc_memex = pcimem_ex; > > + > > + return; > > + } > > + > > + /* Create extents for our address spaces. */ > > + snprintf(sc->sc_busex_name, sizeof(sc->sc_busex_name), > > + "%s pcibus", sc->sc_dev.dv_xname); > > + snprintf(sc->sc_ioex_name, sizeof(sc->sc_ioex_name), > > + "%s pciio", sc->sc_dev.dv_xname); > > + snprintf(sc->sc_memex_name, sizeof(sc->sc_memex_name), > > + "%s pcimem", sc->sc_dev.dv_xname); > > + sc->sc_busex = extent_create(sc->sc_busex_name, 0, 255, > > + M_DEVBUF, NULL, 0, EX_WAITOK | EX_FILLED); > > + sc->sc_ioex = extent_create(sc->sc_ioex_name, 0, 0xffffffff, > > + M_DEVBUF, NULL, 0, EX_WAITOK | EX_FILLED); > > + sc->sc_memex = extent_create(sc->sc_memex_name, 0, (u_long)-1, > > + M_DEVBUF, NULL, 0, EX_WAITOK | EX_FILLED); > > + > > + aml_parse_resource(&res, acpipci_parse_resources, sc); > > + > > + if (sc->sc_acpi->sc_major < 5) { > > + extent_destroy(sc->sc_ioex); > > + extent_destroy(sc->sc_memex); > > + > > + pci_init_extents(); > > + sc->sc_ioex = pciio_ex; > > + sc->sc_memex = pcimem_ex; > > + } > > + > > + printf("\n"); > > + > > +#ifdef DIAGNOSTIC > > + extent_print(sc->sc_busex); > > + extent_print(sc->sc_ioex); > > + extent_print(sc->sc_memex); > > +#endif > > +} > > + > > +void > > +acpipci_attach_bus(struct device *parent, struct acpipci_softc *sc) > > +{ > > + struct pcibus_attach_args pba; > > + pcitag_t tag; > > + pcireg_t id, class; > > + > > + memset(&pba, 0, sizeof(pba)); > > + pba.pba_busname = "pci"; > > + pba.pba_iot = sc->sc_iot; > > + pba.pba_memt = sc->sc_memt; > > + pba.pba_dmat = sc->sc_dmat; > > + pba.pba_busex = sc->sc_busex; > > + pba.pba_ioex = sc->sc_ioex; > > + pba.pba_memex = sc->sc_memex; > > + pba.pba_pmemex = sc->sc_memex; > > + pba.pba_domain = pci_ndomains++; > > + pba.pba_bus = sc->sc_bus; > > + > > + /* Enable MSI in ACPI 2.0 and above, unless we're told not to. */ > > + if (sc->sc_acpi->sc_fadt->hdr.revision >= 2 && > > + (sc->sc_acpi->sc_fadt->iapc_boot_arch & FADT_NO_MSI) == 0) > > + pba.pba_flags |= PCI_FLAGS_MSI_ENABLED; > > + > > + /* > > + * Don't enable MSI on chipsets from low-end manifacturers > > + * like VIA and SiS. We do this by looking at the host > > + * bridge, which should be device 0 function 0. > > + */ > > + tag = pci_make_tag(pba.pba_pc, sc->sc_bus, 0, 0); > > + id = pci_conf_read(pba.pba_pc, tag, PCI_ID_REG); > > + class = pci_conf_read(pba.pba_pc, tag, PCI_CLASS_REG); > > + if (PCI_CLASS(class) == PCI_CLASS_BRIDGE && > > + PCI_SUBCLASS(class) != PCI_SUBCLASS_BRIDGE_HOST && > > + PCI_VENDOR(id) != PCI_VENDOR_AMD && > > + PCI_VENDOR(id) != PCI_VENDOR_NVIDIA && > > + PCI_VENDOR(id) != PCI_VENDOR_INTEL) > > + pba.pba_flags &= ~PCI_FLAGS_MSI_ENABLED; > > + > > + /* > > + * Don't enable MSI on a HyperTransport bus. In order to > > + * determine that a bus is a HyperTransport bus, we look at > > + * device 24 function 0, which is the HyperTransport > > + * host/primary interface integrated on most 64-bit AMD CPUs. > > + * If that device has a HyperTransport capability, this must > > + * be a HyperTransport bus and we disable MSI. > > + */ > > + tag = pci_make_tag(pba.pba_pc, sc->sc_bus, 24, 0); > > + if (pci_get_capability(pba.pba_pc, tag, PCI_CAP_HT, NULL, NULL)) > > + pba.pba_flags &= ~PCI_FLAGS_MSI_ENABLED; > > + > > + config_found(parent, &pba, acpipci_print); > > +} > > + > > +void > > +acpipci_attach_busses(struct device *parent) > > +{ > > + int i; > > + > > + for (i = 0; i < acpipci_cd.cd_ndevs; i++) { > > + if (acpipci_cd.cd_devs[i]) > > + acpipci_attach_bus(parent, acpipci_cd.cd_devs[i]); > > + } > > +} > > + > > +int > > +acpipci_print(void *aux, const char *pnp) > > +{ > > + struct pcibus_attach_args *pba = aux; > > + > > + if (pnp) > > + printf("%s at %s", pba->pba_busname, pnp); > > + printf(" bus %d", pba->pba_bus); > > + return (UNCONF); > > +} > > + > > +int > > +acpipci_parse_resources(int crsidx, union acpi_resource *crs, void *arg) > > +{ > > + struct acpipci_softc *sc = arg; > > + int type = AML_CRSTYPE(crs); > > + int restype, tflags = 0; > > + u_long min, len = 0, tra = 0; > > + > > + switch (type) { > > + case LR_WORD: > > + restype = crs->lr_word.type; > > + tflags = crs->lr_word.tflags; > > + min = crs->lr_word._min; > > + len = crs->lr_word._len; > > + tra = crs->lr_word._tra; > > + break; > > + case LR_DWORD: > > + restype = crs->lr_dword.type; > > + tflags = crs->lr_dword.tflags; > > + min = crs->lr_dword._min; > > + len = crs->lr_dword._len; > > + tra = crs->lr_dword._tra; > > + break; > > + case LR_QWORD: > > + restype = crs->lr_qword.type; > > + tflags = crs->lr_qword.tflags; > > + min = crs->lr_qword._min; > > + len = crs->lr_qword._len; > > + tra = crs->lr_qword._tra; > > + break; > > + case LR_MEM32FIXED: > > + /* > > + * Coreboot on the PC Engines apu2 incorrectly uses a > > + * Memory32Fixed resource descriptor to describe mmio > > + * address space forwarded to the PCI bus. > > + */ > > + restype = LR_TYPE_MEMORY; > > + min = crs->lr_m32fixed._bas; > > + len = crs->lr_m32fixed._len; > > + break; > > + } > > + > > + if (len == 0) > > + return 0; > > + > > + switch (restype) { > > + case LR_TYPE_MEMORY: > > + if (tflags & LR_MEMORY_TTP) > > + return 0; > > + extent_free(sc->sc_memex, min, len, EX_WAITOK | EX_CONFLICTOK); > > + break; > > + case LR_TYPE_IO: > > + if (tflags & LR_IO_TTP) > > + return 0; > > + extent_free(sc->sc_ioex, min, len, EX_WAITOK | EX_CONFLICTOK); > > + break; > > + case LR_TYPE_BUS: > > + extent_free(sc->sc_busex, min, len, EX_WAITOK); > > + /* > > + * Let _CRS minimum bus number override _BBN. > > + */ > > + sc->sc_bus = min; > > + break; > > + } > > + > > + return 0; > > +} > > + > > +void > > +acpipci_osc(struct acpipci_softc *sc) > > +{ > > + struct aml_value args[4]; > > + struct aml_value res; > > + static uint8_t uuid[16] = ACPI_PCI_UUID; > > + uint32_t buf[3]; > > + > > memset(args, 0, sizeof(args)); > > args[0].type = AML_OBJTYPE_BUFFER; > > args[0].v_buffer = uuid; > > @@ -112,10 +340,8 @@ acpipci_attach(struct device *parent, st > > buf[1] = ACPI_PCI_PCIE_CONFIG | ACPI_PCI_MSI; > > buf[2] = ACPI_PCI_PCIE_HOTPLUG; > > > > - if (aml_evalname(sc->sc_acpi, sc->sc_node, "_OSC", 4, args, &res)) { > > - printf(": _OSC failed\n"); > > + if (aml_evalname(sc->sc_acpi, sc->sc_node, "_OSC", 4, args, &res)) > > return; > > - } > > > > if (res.type == AML_OBJTYPE_BUFFER) { > > size_t len = res.length; > > @@ -128,6 +354,4 @@ acpipci_attach(struct device *parent, st > > len -= 4; > > } > > } > > - > > - printf("\n"); > > } > > Index: arch/amd64/pci/pci_machdep.c > > =================================================================== > > RCS file: /cvs/src/sys/arch/amd64/pci/pci_machdep.c,v > > retrieving revision 1.73 > > diff -u -p -r1.73 pci_machdep.c > > --- arch/amd64/pci/pci_machdep.c 7 Sep 2019 13:46:19 -0000 1.73 > > +++ arch/amd64/pci/pci_machdep.c 13 May 2020 18:44:32 -0000 > > @@ -163,64 +163,6 @@ void > > pci_attach_hook(struct device *parent, struct device *self, > > struct pcibus_attach_args *pba) > > { > > - pci_chipset_tag_t pc = pba->pba_pc; > > - pcitag_t tag; > > - pcireg_t id, class; > > - > > - if (pba->pba_bus != 0) > > - return; > > - > > - /* > > - * In order to decide whether the system supports MSI we look > > - * at the host bridge, which should be device 0 function 0 on > > - * bus 0. It is better to not enable MSI on systems that > > - * support it than the other way around, so be conservative > > - * here. So we don't enable MSI if we don't find a host > > - * bridge there. We also deliberately don't enable MSI on > > - * chipsets from low-end manifacturers like VIA and SiS. > > - */ > > - tag = pci_make_tag(pc, 0, 0, 0); > > - id = pci_conf_read(pc, tag, PCI_ID_REG); > > - class = pci_conf_read(pc, tag, PCI_CLASS_REG); > > - > > - if (PCI_CLASS(class) != PCI_CLASS_BRIDGE || > > - PCI_SUBCLASS(class) != PCI_SUBCLASS_BRIDGE_HOST) > > - return; > > - > > - switch (PCI_VENDOR(id)) { > > - case PCI_VENDOR_INTEL: > > - /* > > - * In the wonderful world of virtualization you can > > - * have the latest 64-bit AMD multicore CPU behind a > > - * prehistoric Intel host bridge. Give them what they > > - * deserve. > > - */ > > - switch (PCI_PRODUCT(id)) { > > - case PCI_PRODUCT_INTEL_82441FX: /* QEMU */ > > - case PCI_PRODUCT_INTEL_82443BX: /* VMWare */ > > - break; > > - default: > > - pba->pba_flags |= PCI_FLAGS_MSI_ENABLED; > > - break; > > - } > > - break; > > - case PCI_VENDOR_NVIDIA: > > - case PCI_VENDOR_AMD: > > - pba->pba_flags |= PCI_FLAGS_MSI_ENABLED; > > - break; > > - } > > - > > - /* > > - * Don't enable MSI on a HyperTransport bus. In order to > > - * determine that bus 0 is a HyperTransport bus, we look at > > - * device 24 function 0, which is the HyperTransport > > - * host/primary interface integrated on most 64-bit AMD CPUs. > > - * If that device has a HyperTransport capability, bus 0 must > > - * be a HyperTransport bus and we disable MSI. > > - */ > > - tag = pci_make_tag(pc, 0, 24, 0); > > - if (pci_get_capability(pc, tag, PCI_CAP_HT, NULL, NULL)) > > - pba->pba_flags &= ~PCI_FLAGS_MSI_ENABLED; > > } > > > > int > > > > > >