diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2018-10-26 20:26:20 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2018-10-26 20:26:20 +0000 |
commit | e90a8f72aab9a823587873f5575ebddbbfa3e572 (patch) | |
tree | bbbe5324783ca6afe881ea20d2fd053d315075b0 /sys/arch | |
parent | d515e992c6942b0787287efb8c685c6c36a73ccc (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/GENERIC | 3 | ||||
-rw-r--r-- | sys/arch/amd64/conf/files.amd64 | 6 | ||||
-rw-r--r-- | sys/arch/amd64/pci/acpipci.c | 133 |
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"); +} |