diff --git a/release/tools/ec2.conf b/release/tools/ec2.conf --- a/release/tools/ec2.conf +++ b/release/tools/ec2.conf @@ -72,8 +72,11 @@ # Graviton 1 through Graviton 4 have a bug in their ACPI where they # mark the PL061's pins as needing to be configured in PullUp mode - # (in fact the PL061 has no pullup/pulldown resistors). - echo 'debug.acpi.quirks="8"' >> ${DESTDIR}/boot/loader.conf + # (in fact the PL061 has no pullup/pulldown resistors). Graviton 1 + # through Graviton 3 have non-functional PCI _EJ0 and need a value + # written to the PCI power status register in order to eject a + # device. + echo 'debug.acpi.quirks="24"' >> ${DESTDIR}/boot/loader.conf # Load the kernel module for the Amazon "Elastic Network Adapter" echo 'if_ena_load="YES"' >> ${DESTDIR}/boot/loader.conf diff --git a/sys/dev/acpica/acpi_pci.c b/sys/dev/acpica/acpi_pci.c --- a/sys/dev/acpica/acpi_pci.c +++ b/sys/dev/acpica/acpi_pci.c @@ -391,6 +391,8 @@ { device_t child, dev; ACPI_STATUS status; + int pmc; + uint16_t pmstat; int error; dev = context; @@ -416,6 +418,13 @@ device_get_nameunit(child), error); return; } + if ((acpi_quirks & ACPI_Q_CLEAR_PME_ON_DETACH) && + (pci_find_cap(child, PCIY_PMG, &pmc) == 0)) { + pmstat = pci_read_config(child, pmc + PCIR_POWER_STATUS, 2); + pmstat &= ~PCIM_PSTAT_PMEENABLE; + pmstat |= PCIM_PSTAT_PME; + pci_write_config(child, pmc + PCIR_POWER_STATUS, pmstat, 2); + } status = acpi_SetInteger(h, "_EJ0", 1); if (ACPI_FAILURE(status)) { bus_topo_unlock(); diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -230,6 +230,8 @@ * compatible flag and ignoring overrides that redirect IRQ 0 to pin 2. * ACPI_Q_AEI_NOPULL: Specifies that _AEI objects incorrectly designate pins * as "PullUp" and they should be treated as "NoPull" instead. + * ACPI_Q_CLEAR_PME_ON_DETACH: Specifies that PCIM_PSTAT_(PME & ~PMEENABLE) + * should be written to the power status register as part of ACPI Eject. */ extern int acpi_quirks; #define ACPI_Q_OK 0 @@ -237,6 +239,7 @@ #define ACPI_Q_TIMER (1 << 1) #define ACPI_Q_MADT_IRQ0 (1 << 2) #define ACPI_Q_AEI_NOPULL (1 << 3) +#define ACPI_Q_CLEAR_PME_ON_DETACH (1 << 4) #if defined(__amd64__) || defined(__i386__) /*