Diff below adds an acpipci(4) driver on amd64. For now the main
purpose of this driver is to make the PCI-specific _OSC calls to
advertise the functionality we support. Most notably this advertises
support for PCIE native hotplug as we have some indications that this
will help Thunderbolt 3 support on some machines.
I'd like to see this tested on a wide range of amd64 hardware, but
especially on laptops. Please reply with a diff of your dmesg before
and after. Make sure you run make config before building a new kernel.
Thanks,
Mark
Index: arch/amd64/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v
retrieving revision 1.463
diff -u -p -r1.463 GENERIC
--- arch/amd64/conf/GENERIC 31 Aug 2018 00:09:13 -0000 1.463
+++ arch/amd64/conf/GENERIC 22 Oct 2018 19:23:00 -0000
@@ -47,6 +47,7 @@ acpicpu* at acpi?
acpicmos* at acpi?
acpidock* at acpi?
acpiec* at acpi?
+acpipci* at acpi?
acpiprt* at acpi?
acpisbs* at acpi?
acpitz* at acpi?
Index: arch/amd64/conf/files.amd64
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/files.amd64,v
retrieving revision 1.100
diff -u -p -r1.100 files.amd64
--- arch/amd64/conf/files.amd64 21 Aug 2018 18:06:12 -0000 1.100
+++ arch/amd64/conf/files.amd64 22 Oct 2018 19:23:00 -0000
@@ -236,6 +236,10 @@ attach acpi at bios
file arch/amd64/amd64/acpi_machdep.c acpi
file arch/amd64/amd64/acpi_wakecode.S acpi & !small_kernel
+device acpipci
+attach acpipci at acpi
+file arch/amd64/pci/acpipci.c acpipci
+
#
# VMM
#
Index: arch/amd64/pci/acpipci.c
===================================================================
RCS file: arch/amd64/pci/acpipci.c
diff -N arch/amd64/pci/acpipci.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ arch/amd64/pci/acpipci.c 22 Oct 2018 19:23:00 -0000
@@ -0,0 +1,133 @@
+/* $OpenBSD$ */
+/*
+ * Copyright (c) 2018 Mark Kettenis
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/extent.h>
+#include <sys/malloc.h>
+#include <sys/systm.h>
+
+#include <dev/acpi/acpireg.h>
+#include <dev/acpi/acpivar.h>
+#include <dev/acpi/acpidev.h>
+#include <dev/acpi/amltypes.h>
+#include <dev/acpi/dsdt.h>
+
+#include <dev/pci/pcidevs.h>
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+
+/* 33DB4D5B-1FF7-401C-9657-7441C03DD766 */
+#define ACPI_PCI_UUID \
+ { 0x5b, 0x4d, 0xdb, 0x33, \
+ 0xf7, 0x1f, \
+ 0x1c, 0x40, \
+ 0x96, 0x57, \
+ 0x74, 0x41, 0xc0, 0x3d, 0xd7, 0x66 }
+
+/* Support field. */
+#define ACPI_PCI_PCIE_CONFIG 0x00000001
+#define ACPI_PCI_ASPM 0x00000002
+#define ACPI_PCI_CPMC 0x00000004
+#define ACPI_PCI_SEGMENTS 0x00000008
+#define ACPI_PCI_MSI 0x00000010
+
+/* Control field. */
+#define ACPI_PCI_PCIE_HOTPLUG 0x00000001
+
+struct acpipci_softc {
+ struct device sc_dev;
+ struct acpi_softc *sc_acpi;
+ struct aml_node *sc_node;
+};
+
+int acpipci_match(struct device *, void *, void *);
+void acpipci_attach(struct device *, struct device *, void *);
+
+struct cfattach acpipci_ca = {
+ sizeof(struct acpipci_softc), acpipci_match, acpipci_attach
+};
+
+struct cfdriver acpipci_cd = {
+ NULL, "acpipci", DV_DULL
+};
+
+const char *acpipci_hids[] = {
+ "PNP0A08",
+ "PNP0A03",
+ NULL
+};
+
+int
+acpipci_match(struct device *parent, void *match, void *aux)
+{
+ struct acpi_attach_args *aaa = aux;
+ struct cfdata *cf = match;
+
+ return acpi_matchhids(aaa, acpipci_hids, cf->cf_driver->cd_name);
+}
+
+void
+acpipci_attach(struct device *parent, struct device *self, void *aux)
+{
+ 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];
+
+ sc->sc_acpi = (struct acpi_softc *)parent;
+ sc->sc_node = aaa->aaa_node;
+ printf(" %s", sc->sc_node->name);
+
+ memset(args, 0, sizeof(args));
+ args[0].type = AML_OBJTYPE_BUFFER;
+ args[0].v_buffer = uuid;
+ args[0].length = sizeof(uuid);
+ args[1].type = AML_OBJTYPE_INTEGER;
+ args[1].v_integer = 1;
+ args[2].type = AML_OBJTYPE_INTEGER;
+ args[2].v_integer = 3;
+ args[3].type = AML_OBJTYPE_BUFFER;
+ args[3].v_buffer = (uint8_t *)buf;
+ args[3].length = sizeof(buf);
+
+ memset(buf, 0, sizeof(buf));
+ buf[0] = 0x0;
+ 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");
+ return;
+ }
+
+ if (res.type == AML_OBJTYPE_BUFFER) {
+ size_t len = res.length;
+ uint32_t *p = (uint32_t *)res.v_buffer;
+
+ printf(":");
+ while (len >= 4) {
+ printf(" 0x%08x", *p);
+ p++;
+ len -= 4;
+ }
+ }
+
+ printf("\n");
+}
Index: dev/acpi/acpi.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpi.c,v
retrieving revision 1.359
diff -u -p -r1.359 acpi.c
--- dev/acpi/acpi.c 30 Aug 2018 10:11:34 -0000 1.359
+++ dev/acpi/acpi.c 22 Oct 2018 19:23:01 -0000
@@ -2982,10 +2982,6 @@ const char *acpi_skip_hids[] = {
"PNP0200", /* PC-class DMA Controller */
"PNP0201", /* EISA DMA Controller */
"PNP0800", /* Microsoft Sound System Compatible Device */
-#if defined(__amd64__) || defined(__i386__)
- "PNP0A03", /* PCI Bus */
- "PNP0A08", /* PCI Express Bus */
-#endif
"PNP0C01", /* System Board */
"PNP0C02", /* PNP Motherboard Resources */
"PNP0C04", /* x87-compatible Floating Point Processing Unit */