summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2017-01-25 10:14:41 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2017-01-25 10:14:41 +0000
commit935e62b2883e539859f91a9a5b12bae08f383a4f (patch)
treeb78392bb2f1ffa1ae58bede78bf87b89b28705d7 /sys/dev
parentf144c83cf0dfca987a10f8df59085cc219dee4a4 (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.fdt13
-rw-r--r--sys/dev/fdt/plrtc.c129
-rw-r--r--sys/dev/fdt/psci.c102
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);
+}