summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2018-10-26 20:26:20 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2018-10-26 20:26:20 +0000
commite90a8f72aab9a823587873f5575ebddbbfa3e572 (patch)
treebbbe5324783ca6afe881ea20d2fd053d315075b0 /sys/arch
parentd515e992c6942b0787287efb8c685c6c36a73ccc (diff)
Add acpipci(4) on amd64. For now this only calls the PCI-specific _OSC
method to let the ACPI implementation know what features we support.
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/amd64/conf/GENERIC3
-rw-r--r--sys/arch/amd64/conf/files.amd646
-rw-r--r--sys/arch/amd64/pci/acpipci.c133
3 files changed, 140 insertions, 2 deletions
diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC
index 9a74efca601..ba4a3d36d19 100644
--- a/sys/arch/amd64/conf/GENERIC
+++ b/sys/arch/amd64/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.463 2018/08/31 00:09:13 jmatthew Exp $
+# $OpenBSD: GENERIC,v 1.464 2018/10/26 20:26:19 kettenis Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -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?
diff --git a/sys/arch/amd64/conf/files.amd64 b/sys/arch/amd64/conf/files.amd64
index fe34441c442..260fd500bad 100644
--- a/sys/arch/amd64/conf/files.amd64
+++ b/sys/arch/amd64/conf/files.amd64
@@ -1,4 +1,4 @@
-# $OpenBSD: files.amd64,v 1.100 2018/08/21 18:06:12 anton Exp $
+# $OpenBSD: files.amd64,v 1.101 2018/10/26 20:26:19 kettenis Exp $
maxpartitions 16
maxusers 2 16 128
@@ -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
#
diff --git a/sys/arch/amd64/pci/acpipci.c b/sys/arch/amd64/pci/acpipci.c
new file mode 100644
index 00000000000..4bc996b2c13
--- /dev/null
+++ b/sys/arch/amd64/pci/acpipci.c
@@ -0,0 +1,133 @@
+/* $OpenBSD: acpipci.c,v 1.1 2018/10/26 20:26:19 kettenis Exp $ */
+/*
+ * 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");
+}