diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2017-01-25 10:14:41 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2017-01-25 10:14:41 +0000 |
commit | 935e62b2883e539859f91a9a5b12bae08f383a4f (patch) | |
tree | b78392bb2f1ffa1ae58bede78bf87b89b28705d7 /sys/dev | |
parent | f144c83cf0dfca987a10f8df59085cc219dee4a4 (diff) |
Move psci(4) and plrtc(4) so arm64 can use them.
Tested by and ok patrick@
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/fdt/files.fdt | 13 | ||||
-rw-r--r-- | sys/dev/fdt/plrtc.c | 129 | ||||
-rw-r--r-- | sys/dev/fdt/psci.c | 102 |
3 files changed, 243 insertions, 1 deletions
diff --git a/sys/dev/fdt/files.fdt b/sys/dev/fdt/files.fdt index ebe06fc984b..9b229ee282e 100644 --- a/sys/dev/fdt/files.fdt +++ b/sys/dev/fdt/files.fdt @@ -1,4 +1,4 @@ -# $OpenBSD: files.fdt,v 1.3 2017/01/23 14:15:16 kettenis Exp $ +# $OpenBSD: files.fdt,v 1.4 2017/01/25 10:14:40 jsg Exp $ # # Config file and device description for machine-independent FDT code. # Included by ports that need it. @@ -29,3 +29,14 @@ file dev/fdt/sxiehci.c sxiehci device bcmdog attach bcmdog at fdt file dev/fdt/bcm2835_dog.c bcmdog + +# ARM PrimeCell PL031 Real-time clock +device plrtc +attach plrtc at fdt +file dev/fdt/plrtc.c plrtc + +# ARM Power State Coordination Interface +device psci +attach psci at fdt +file dev/fdt/psci.c psci + diff --git a/sys/dev/fdt/plrtc.c b/sys/dev/fdt/plrtc.c new file mode 100644 index 00000000000..1a51440d078 --- /dev/null +++ b/sys/dev/fdt/plrtc.c @@ -0,0 +1,129 @@ +/* $OpenBSD: plrtc.c,v 1.1 2017/01/25 10:14:40 jsg Exp $ */ + +/* + * Copyright (c) 2015 Jonathan Gray <jsg@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/device.h> +#include <sys/malloc.h> +#include <sys/systm.h> + +#include <machine/bus.h> +#include <machine/fdt.h> +#include <dev/clock_subr.h> + +#include <dev/ofw/openfirm.h> +#include <dev/ofw/fdt.h> + +#define RTCDR 0x00 +#define RTCMR 0x04 +#define RTCLR 0x08 +#define RTCCR 0x0c +#define RTCIMSC 0x10 +#define RTCRIS 0x14 +#define RTCMIS 0x18 +#define RTCICR 0x1c + +#define RTCCR_START (1 << 0) + +extern todr_chip_handle_t todr_handle; + +struct plrtc_softc { + struct device sc_dev; + bus_space_tag_t sc_iot; + bus_space_handle_t sc_ioh; +}; + +int plrtc_match(struct device *, void *, void *); +void plrtc_attach(struct device *, struct device *, void *); +int plrtc_gettime(struct todr_chip_handle *, struct timeval *); +int plrtc_settime(struct todr_chip_handle *, struct timeval *); + + +struct cfattach plrtc_ca = { + sizeof(struct plrtc_softc), plrtc_match, plrtc_attach +}; + +struct cfdriver plrtc_cd = { + NULL, "plrtc", DV_DULL +}; + +int +plrtc_gettime(todr_chip_handle_t handle, struct timeval *tv) +{ + struct plrtc_softc *sc = handle->cookie; + uint32_t tod; + + tod = bus_space_read_4(sc->sc_iot, sc->sc_ioh, RTCDR); + + tv->tv_sec = tod; + tv->tv_usec = 0; + + return (0); +} + +int +plrtc_settime(todr_chip_handle_t handle, struct timeval *tv) +{ + struct plrtc_softc *sc = handle->cookie; + + bus_space_write_4(sc->sc_iot, sc->sc_ioh, RTCLR, tv->tv_sec); + + return (0); +} + +int +plrtc_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return (OF_is_compatible(faa->fa_node, "arm,pl031")); +} + +void +plrtc_attach(struct device *parent, struct device *self, void *aux) +{ + struct fdt_attach_args *faa = aux; + struct plrtc_softc *sc = (struct plrtc_softc *) self; + todr_chip_handle_t handle; + + if (faa->fa_nreg < 1) { + printf(": no register data\n"); + return; + } + + sc->sc_iot = faa->fa_iot; + if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr, + faa->fa_reg[0].size, 0, &sc->sc_ioh)) { + printf(": failed to map mem space\n"); + return; + } + + handle = malloc(sizeof(struct todr_chip_handle), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (handle == NULL) + panic("couldn't allocate todr_handle"); + + handle->cookie = sc; + handle->todr_gettime = plrtc_gettime; + handle->todr_settime = plrtc_settime; + todr_handle = handle; + + /* enable the rtc */ + bus_space_write_4(sc->sc_iot, sc->sc_ioh, RTCCR, RTCCR_START); + + printf("\n"); +} diff --git a/sys/dev/fdt/psci.c b/sys/dev/fdt/psci.c new file mode 100644 index 00000000000..fceafd0e9ba --- /dev/null +++ b/sys/dev/fdt/psci.c @@ -0,0 +1,102 @@ +/* $OpenBSD: psci.c,v 1.1 2017/01/25 10:14:40 jsg Exp $ */ + +/* + * Copyright (c) 2016 Jonathan Gray <jsg@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/device.h> +#include <sys/systm.h> + +#include <machine/bus.h> +#include <machine/fdt.h> + +#include <dev/ofw/openfirm.h> +#include <dev/ofw/fdt.h> + +extern void (*cpuresetfn)(void); +extern void (*powerdownfn)(void); + +#define SYSTEM_OFF 0x84000008 +#define SYSTEM_RESET 0x84000009 + +struct psci_softc { + struct device sc_dev; + void (*callfn)(uint32_t, uint32_t, uint32_t, uint32_t); +}; + +struct psci_softc *psci_sc; + +int psci_match(struct device *, void *, void *); +void psci_attach(struct device *, struct device *, void *); +void psci_reset(void); +void psci_powerdown(void); + +extern void hvc_call(uint32_t, uint32_t, uint32_t, uint32_t); +extern void smc_call(uint32_t, uint32_t, uint32_t, uint32_t); + +struct cfattach psci_ca = { + sizeof(struct psci_softc), psci_match, psci_attach +}; + +struct cfdriver psci_cd = { + NULL, "psci", DV_DULL +}; + +int +psci_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + /* reset and shutdown added in 0.2 */ + return OF_is_compatible(faa->fa_node, "arm,psci-0.2"); +} + +void +psci_attach(struct device *parent, struct device *self, void *aux) +{ + struct psci_softc *sc = (struct psci_softc *) self; + struct fdt_attach_args *faa = aux; + char method[128]; + + if (OF_getprop(faa->fa_node, "method", method, sizeof(method))) { + if (strcmp(method, "hvc") == 0) + sc->callfn = hvc_call; + else if (strcmp(method, "smc") == 0) + sc->callfn = smc_call; + } + + printf("\n"); + + psci_sc = sc; + cpuresetfn = psci_reset; + powerdownfn = psci_powerdown; +} + +void +psci_reset(void) +{ + struct psci_softc *sc = psci_sc; + if (sc->callfn) + (*sc->callfn)(SYSTEM_RESET, 0, 0, 0); +} + +void +psci_powerdown(void) +{ + struct psci_softc *sc = psci_sc; + if (sc->callfn) + (*sc->callfn)(SYSTEM_OFF, 0, 0, 0); +} |