On Sun, Jul 01, 2018 at 06:13:43PM +0200, Mark Kettenis wrote:
> Diff below actually enables acpi(4) on arm64. Mostly stubs for bits of code
> that isn't needed on hardware-reduced ACPI. But the functions have to be
> there for things to compile.
>
> This is enough to boot my MACCHIATOBin multi-user. A few more drivers
> are coming, the crucial bit being pci(4) support. At that point a
> typical server system should mostly work.
>
> ok?
>
reads ok to me, go for it
>
> Index: arch/arm64/arm64/acpi_machdep.c
> ===================================================================
> RCS file: arch/arm64/arm64/acpi_machdep.c
> diff -N arch/arm64/arm64/acpi_machdep.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ arch/arm64/arm64/acpi_machdep.c 1 Jul 2018 16:06:03 -0000
> @@ -0,0 +1,190 @@
> +/* $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/malloc.h>
> +#include <sys/systm.h>
> +
> +#include <uvm/uvm_extern.h>
> +
> +#include <machine/bus.h>
> +#include <machine/fdt.h>
> +
> +#include <dev/ofw/openfirm.h>
> +#include <dev/ofw/fdt.h>
> +
> +#include <dev/acpi/acpivar.h>
> +
> +int lid_action;
> +
> +int acpi_fdt_match(struct device *, void *, void *);
> +void acpi_fdt_attach(struct device *, struct device *, void *);
> +void acpi_attach(struct device *, struct device *, void *);
> +
> +struct cfattach acpi_fdt_ca = {
> + sizeof(struct acpi_softc), acpi_fdt_match, acpi_fdt_attach
> +};
> +
> +int
> +acpi_fdt_match(struct device *parent, void *match, void *aux)
> +{
> + struct fdt_attach_args *faa = aux;
> +
> + return OF_is_compatible(faa->fa_node, "openbsd,acpi-5.0");
> +}
> +
> +void
> +acpi_fdt_attach(struct device *parent, struct device *self, void *aux)
> +{
> + struct acpi_softc *sc = (struct acpi_softc *)self;
> + struct fdt_attach_args *faa = aux;
> + bus_dma_tag_t dmat;
> +
> + /* Create coherent DMA tag. */
> + dmat = malloc(sizeof(*sc->sc_dmat), M_DEVBUF, M_WAITOK | M_ZERO);
> + memcpy(dmat, faa->fa_dmat, sizeof(*dmat));
> + dmat->_flags |= BUS_DMA_COHERENT;
> +
> + sc->sc_memt = faa->fa_iot;
> + sc->sc_dmat = dmat;
> +
> + acpi_attach_common(sc, faa->fa_reg[0].addr);
> +}
> +
> +int
> +acpi_map(paddr_t pa, size_t len, struct acpi_mem_map *handle)
> +{
> + paddr_t pgpa = trunc_page(pa);
> + paddr_t endpa = round_page(pa + len);
> + vaddr_t va = uvm_km_valloc(kernel_map, endpa - pgpa);
> +
> + if (va == 0)
> + return (ENOMEM);
> +
> + handle->baseva = va;
> + handle->va = (u_int8_t *)(va + (pa & PGOFSET));
> + handle->vsize = endpa - pgpa;
> + handle->pa = pa;
> +
> + do {
> + pmap_kenter_pa(va, pgpa, PROT_READ | PROT_WRITE);
> + va += NBPG;
> + pgpa += NBPG;
> + } while (pgpa < endpa);
> +
> + return 0;
> +}
> +
> +void
> +acpi_unmap(struct acpi_mem_map *handle)
> +{
> + pmap_kremove(handle->baseva, handle->vsize);
> + uvm_km_free(kernel_map, handle->baseva, handle->vsize);
> +}
> +
> +int
> +acpi_bus_space_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size,
> + int flags, bus_space_handle_t *bshp)
> +{
> + return bus_space_map(t, addr, size, flags, bshp);
> +}
> +
> +void
> +acpi_bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
> + bus_size_t size)
> +{
> + bus_space_unmap(t, bsh, size);
> +}
> +
> +int
> +acpi_acquire_glk(uint32_t *lock)
> +{
> + /* No global lock. */
> + return 1;
> +}
> +
> +int
> +acpi_release_glk(uint32_t *lock)
> +{
> + /* No global lock. */
> + return 0;
> +}
> +
> +void
> +acpi_attach_machdep(struct acpi_softc *sc)
> +{
> + /* Nothing to do. */
> +}
> +
> +void *
> +acpi_intr_establish(int irq, int flags, int level,
> + int (*func)(void *), void *arg, const char *name)
> +{
> + struct interrupt_controller *ic;
> + uint32_t interrupt[3];
> +
> + extern LIST_HEAD(, interrupt_controller) interrupt_controllers;
> + LIST_FOREACH(ic, &interrupt_controllers, ic_list) {
> + if (ic->ic_phandle == 1)
> + break;
> + }
> + if (ic == NULL)
> + return NULL;
> +
> + interrupt[0] = 0;
> + interrupt[1] = irq - 32;
> + interrupt[2] = 0x4;
> +
> + return ic->ic_establish(ic->ic_cookie, interrupt, level,
> + func, arg, (char *)name);
> +}
> +
> +void
> +acpi_sleep_clocks(struct acpi_softc *sc, int state)
> +{
> +}
> +
> +void
> +acpi_resume_clocks(struct acpi_softc *sc)
> +{
> +}
> +
> +int
> +acpi_sleep_cpu(struct acpi_softc *sc, int state)
> +{
> + return 0;
> +}
> +
> +void
> +acpi_resume_cpu(struct acpi_softc *sc)
> +{
> +}
> +
> +#ifdef MULTIPROCESSOR
> +
> +void
> +acpi_sleep_mp(void)
> +{
> +}
> +
> +void
> +acpi_resume_mp(void)
> +{
> +}
> +
> +#endif
> Index: arch/arm64/conf/GENERIC
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/conf/GENERIC,v
> retrieving revision 1.73
> diff -u -p -r1.73 GENERIC
> --- arch/arm64/conf/GENERIC 2 Jun 2018 12:31:25 -0000 1.73
> +++ arch/arm64/conf/GENERIC 1 Jul 2018 16:06:03 -0000
> @@ -37,6 +37,11 @@ config bsd swap generic
> mainbus0 at root
> cpu0 at mainbus?
> efi0 at mainbus?
> +acpi0 at mainbus?
> +acpibtn* at acpi?
> +acpiec* at acpi?
> +ahci* at acpi?
> +com* at acpi?
> simplebus* at fdt?
>
> scsibus* at scsi?
> Index: arch/arm64/conf/RAMDISK
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/conf/RAMDISK,v
> retrieving revision 1.60
> diff -u -p -r1.60 RAMDISK
> --- arch/arm64/conf/RAMDISK 16 May 2018 13:42:35 -0000 1.60
> +++ arch/arm64/conf/RAMDISK 1 Jul 2018 16:06:03 -0000
> @@ -48,6 +48,10 @@ config bsd root on rd0a swap on rd0b
> mainbus0 at root
> cpu0 at mainbus?
> efi0 at mainbus?
> +acpi0 at mainbus?
> +acpiec* at acpi?
> +ahci* at acpi?
> +com* at acpi?
> simplebus* at fdt?
>
> scsibus* at scsi?
> Index: arch/arm64/conf/files.arm64
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/conf/files.arm64,v
> retrieving revision 1.23
> diff -u -p -r1.23 files.arm64
> --- arch/arm64/conf/files.arm64 5 Jun 2018 20:41:19 -0000 1.23
> +++ arch/arm64/conf/files.arm64 1 Jul 2018 16:06:03 -0000
> @@ -136,3 +136,9 @@ file arch/arm64/dev/bcm2835_dwctwo.c bc
> device pciecam: pcibus
> attach pciecam at fdt
> file arch/arm64/dev/pciecam.c pciecam
> +
> +# ACPI
> +include "dev/acpi/files.acpi"
> +
> +attach acpi at fdt with acpi_fdt
> +file arch/arm64/arm64/acpi_machdep.c acpi_fdt
>