summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpi/acpimcfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/acpi/acpimcfg.c')
-rw-r--r--sys/dev/acpi/acpimcfg.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/sys/dev/acpi/acpimcfg.c b/sys/dev/acpi/acpimcfg.c
new file mode 100644
index 00000000000..ee265db9918
--- /dev/null
+++ b/sys/dev/acpi/acpimcfg.c
@@ -0,0 +1,73 @@
+/* $OpenBSD: acpimcfg.c,v 1.1 2011/01/04 21:17:49 kettenis Exp $ */
+/*
+ * Copyright (c) 2010 Mark Kettenis <kettenis@openbsd.org>
+ *
+ * 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/systm.h>
+#include <sys/device.h>
+
+#include <machine/apicvar.h>
+
+#include <dev/acpi/acpireg.h>
+#include <dev/acpi/acpivar.h>
+#include <dev/pci/pcivar.h>
+
+int acpimcfg_match(struct device *, void *, void *);
+void acpimcfg_attach(struct device *, struct device *, void *);
+
+struct cfattach acpimcfg_ca = {
+ sizeof(struct device), acpimcfg_match, acpimcfg_attach
+};
+
+struct cfdriver acpimcfg_cd = {
+ NULL, "acpimcfg", DV_DULL
+};
+
+int
+acpimcfg_match(struct device *parent, void *match, void *aux)
+{
+ struct acpi_attach_args *aaa = aux;
+ struct acpi_table_header *hdr;
+
+ /*
+ * If we do not have a table, it is not us
+ */
+ if (aaa->aaa_table == NULL)
+ return (0);
+
+ /*
+ * If it is an MCFG table, we can attach
+ */
+ hdr = (struct acpi_table_header *)aaa->aaa_table;
+ if (memcmp(hdr->signature, MCFG_SIG, sizeof(MCFG_SIG) - 1) != 0)
+ return (0);
+
+ return (1);
+}
+
+void
+acpimcfg_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct acpi_attach_args *aaa = aux;
+ struct acpi_mcfg *mcfg = (struct acpi_mcfg *)aaa->aaa_table;
+
+ printf(" addr 0x%llx, bus %d-%d\n", mcfg->base_address,
+ mcfg->min_bus_number, mcfg->max_bus_number);
+
+ pci_mcfg_addr = mcfg->base_address;
+ pci_mcfg_min_bus = mcfg->min_bus_number;
+ pci_mcfg_max_bus = mcfg->max_bus_number;
+}