Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm Add ARM MD ACPI implementation.



details:   https://anonhg.NetBSD.org/src/rev/6710d0c1e1a4
branches:  trunk
changeset: 433929:6710d0c1e1a4
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Fri Oct 12 22:12:11 2018 +0000

description:
Add ARM MD ACPI implementation.

diffstat:

 sys/arch/arm/acpi/acpi_machdep.c    |  254 ++++++++++++++++++++++++++++++++++++
 sys/arch/arm/include/acpi_machdep.h |   68 +++++++++
 2 files changed, 322 insertions(+), 0 deletions(-)

diffs (truncated from 330 to 300 lines):

diff -r 1f07d47f2686 -r 6710d0c1e1a4 sys/arch/arm/acpi/acpi_machdep.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/acpi/acpi_machdep.c  Fri Oct 12 22:12:11 2018 +0000
@@ -0,0 +1,254 @@
+/* $NetBSD: acpi_machdep.c,v 1.1 2018/10/12 22:12:11 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2018 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jared McNeill <jmcneill%invisible.ca@localhost>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.1 2018/10/12 22:12:11 jmcneill Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/device.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <dev/fdt/fdtvar.h>
+
+#include <dev/acpi/acpica.h>
+#include <dev/acpi/acpivar.h>
+
+#include <arm/pic/picvar.h>
+
+#include <arm/locore.h>
+
+#include <machine/acpi_machdep.h>
+
+extern struct bus_space arm_generic_bs_tag;
+
+ACPI_STATUS
+acpi_md_OsInitialize(void)
+{
+       return AE_OK;
+}
+
+ACPI_PHYSICAL_ADDRESS
+acpi_md_OsGetRootPointer(void)
+{
+       uint64_t pa;
+
+       const int chosen = OF_finddevice("/chosen");
+       if (chosen == -1)
+               return 0;
+
+       if (of_getprop_uint64(chosen, "netbsd,acpi-root-table", &pa) != 0)
+               return 0;
+
+       return (ACPI_PHYSICAL_ADDRESS)pa;
+}
+
+ACPI_STATUS
+acpi_md_OsInstallInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER handler, void *context,
+    void **cookiep, const char *xname)
+{
+       const int ipl = IPL_TTY;
+       const int type = IST_LEVEL;     /* TODO: MADT */
+
+       *cookiep = intr_establish(irq, ipl, type, (int (*)(void *))handler, context);
+
+       return *cookiep == NULL ? AE_NO_MEMORY : AE_OK;
+}
+
+void
+acpi_md_OsRemoveInterruptHandler(void *cookie)
+{
+       intr_disestablish(cookie);
+}
+
+ACPI_STATUS
+acpi_md_OsMapMemory(ACPI_PHYSICAL_ADDRESS pa, UINT32 size, void **vap)
+{
+       paddr_t spa, epa, curpa;
+       vaddr_t va, curva;
+
+       spa = trunc_page(pa);
+       epa = round_page(pa + size);
+
+       va = uvm_km_alloc(kernel_map, epa - spa, 0, UVM_KMF_VAONLY);
+       if (va == 0)
+               return AE_NO_MEMORY;
+
+       for (curpa = spa, curva = va; curpa < epa; curpa += PAGE_SIZE, curva += PAGE_SIZE)
+               pmap_kenter_pa(curva, curpa, VM_PROT_READ | VM_PROT_WRITE, 0);
+       pmap_update(pmap_kernel());
+
+       *vap = (void *)(va + (pa - spa));
+
+       return AE_OK;
+}
+
+void
+acpi_md_OsUnmapMemory(void *va, UINT32 size)
+{
+       vaddr_t ova;
+       vsize_t osz;
+
+       ova = trunc_page((vaddr_t)va);
+       osz = round_page((vaddr_t)va + size) - (vaddr_t)va;
+
+       pmap_kremove(ova, osz);
+       pmap_update(pmap_kernel());
+       uvm_km_free(kernel_map, ova, osz, UVM_KMF_VAONLY);
+}
+
+ACPI_STATUS
+acpi_md_OsGetPhysicalAddress(void *va, ACPI_PHYSICAL_ADDRESS *pap)
+{
+       paddr_t pa;
+
+       if (!pmap_extract(pmap_kernel(), (vaddr_t)va, &pa))
+               return AE_ERROR;
+
+       *pap = pa;
+
+       return AE_OK;
+}
+
+BOOLEAN
+acpi_md_OsReadable(void *va, UINT32 len)
+{
+       vaddr_t sva, eva;
+       pt_entry_t *pte;
+
+       sva = trunc_page((vaddr_t)va);
+       eva = round_page((vaddr_t)va + len);
+
+       if (sva < VM_MIN_KERNEL_ADDRESS)
+               return FALSE;
+
+       for (; sva < eva; sva += PAGE_SIZE) {
+               pte = kvtopte(sva);
+               if ((*pte & (LX_BLKPAG_AF|LX_BLKPAG_AP_RO)) != (LX_BLKPAG_AF|LX_BLKPAG_AP_RO))
+                       return FALSE;
+       }
+
+       return TRUE;
+}
+
+BOOLEAN
+acpi_md_OsWritable(void *va, UINT32 len)
+{
+       vaddr_t sva, eva;
+       pt_entry_t *pte;
+
+       sva = trunc_page((vaddr_t)va);
+       eva = round_page((vaddr_t)va + len);
+
+       if (sva < VM_MIN_KERNEL_ADDRESS)
+               return FALSE;
+
+       for (; sva < eva; sva += PAGE_SIZE) {
+               pte = kvtopte(sva);
+               if ((*pte & (LX_BLKPAG_AF|LX_BLKPAG_AP_RW)) != (LX_BLKPAG_AF|LX_BLKPAG_AP_RW))
+                       return FALSE;
+       }
+
+       return TRUE;
+}
+
+void
+acpi_md_OsEnableInterrupt(void)
+{
+       cpsie(I32_bit);
+}
+
+void
+acpi_md_OsDisableInterrupt(void)
+{
+       cpsid(I32_bit);
+}
+
+int
+acpi_md_sleep(int state)
+{
+       printf("ERROR: ACPI sleep not implemented on this platform\n");
+       return -1;
+}
+
+uint32_t
+acpi_md_pdc(void)
+{
+       return 0;
+}
+
+uint32_t
+acpi_md_ncpus(void)
+{
+       return kcpuset_countset(kcpuset_attached);
+}
+
+static ACPI_STATUS
+acpi_md_madt_probe(ACPI_SUBTABLE_HEADER *hdrp, void *aux)
+{
+       struct acpi_softc * const sc = aux;
+
+       config_found_ia(sc->sc_dev, "acpimadtbus", hdrp, NULL);
+
+       return AE_OK;
+}
+
+static ACPI_STATUS
+acpi_md_gtdt_probe(ACPI_GTDT_HEADER *hdrp, void *aux)
+{
+       struct acpi_softc * const sc = aux;
+
+       config_found_ia(sc->sc_dev, "acpigtdtbus", hdrp, NULL);
+
+       return AE_OK;
+}
+
+void
+acpi_md_callback(struct acpi_softc *sc)
+{
+       ACPI_TABLE_HEADER *hdrp;
+
+       if (acpi_madt_map() != AE_OK)
+               panic("Failed to map MADT");
+       acpi_madt_walk(acpi_md_madt_probe, sc);
+       acpi_madt_unmap();
+
+       if (acpi_gtdt_map() != AE_OK)
+               panic("Failed to map GTDT");
+       acpi_gtdt_walk(acpi_md_gtdt_probe, sc);
+       acpi_gtdt_unmap();
+
+       if (ACPI_SUCCESS(AcpiGetTable(ACPI_SIG_GTDT, 0, &hdrp)))
+               config_found_ia(sc->sc_dev, "acpisdtbus", hdrp, NULL);
+}
diff -r 1f07d47f2686 -r 6710d0c1e1a4 sys/arch/arm/include/acpi_machdep.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/include/acpi_machdep.h       Fri Oct 12 22:12:11 2018 +0000
@@ -0,0 +1,68 @@
+/* $NetBSD: acpi_machdep.h,v 1.1 2018/10/12 22:12:12 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2018 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jared McNeill <jmcneill%invisible.ca@localhost>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _ARM_ACPI_MACHDEP_H
+#define _ARM_ACPI_MACHDEP_H
+
+struct acpi_softc;
+
+ACPI_STATUS            acpi_md_OsInitialize(void);
+ACPI_PHYSICAL_ADDRESS  acpi_md_OsGetRootPointer(void);



Home | Main Index | Thread Index | Old Index