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 */

Reply via email to