summaryrefslogtreecommitdiff
path: root/sys/arch/atari/dev
diff options
context:
space:
mode:
authorleo <leo@NetBSD.org>1996-01-06 20:10:41 +0000
committerleo <leo@NetBSD.org>1996-01-06 20:10:41 +0000
commit356a61ab951b8d5157fa38e0632e272a7ec0fd01 (patch)
treef6c0a1de05010c172f2515de5c432a8e1675d1c1 /sys/arch/atari/dev
parent0c5975cdd38e4e3eed9db0d3257a20efef12c5a0 (diff)
Add an nvram-driver. This driver makes it possible to read/write the
configuration info stored in the nvram on the mc146818.
Diffstat (limited to 'sys/arch/atari/dev')
-rw-r--r--sys/arch/atari/dev/clock.c22
-rw-r--r--sys/arch/atari/dev/clockreg.h18
-rw-r--r--sys/arch/atari/dev/nvram.c205
-rw-r--r--sys/arch/atari/dev/nvramvar.h57
4 files changed, 284 insertions, 18 deletions
diff --git a/sys/arch/atari/dev/clock.c b/sys/arch/atari/dev/clock.c
index aee79a46bfd..5baf74c1dd3 100644
--- a/sys/arch/atari/dev/clock.c
+++ b/sys/arch/atari/dev/clock.c
@@ -1,4 +1,4 @@
-/* $NetBSD: clock.c,v 1.6 1995/12/01 19:51:53 leo Exp $ */
+/* $NetBSD: clock.c,v 1.7 1996/01/06 20:11:06 leo Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -314,6 +314,26 @@ profclock(pc, ps)
}
#endif
+/***********************************************************************
+ * Real Time Clock support *
+ ***********************************************************************/
+
+u_int mc146818_read(rtc, regno)
+void *rtc;
+u_int regno;
+{
+ ((struct rtc *)rtc)->rtc_regno = regno;
+ return(((struct rtc *)rtc)->rtc_data & 0377);
+}
+
+void mc146818_write(rtc, regno, value)
+void *rtc;
+u_int regno, value;
+{
+ ((struct rtc *)rtc)->rtc_regno = regno;
+ ((struct rtc *)rtc)->rtc_data = value;
+}
+
/*
* Initialize the time of day register, based on the time base which is, e.g.
* from a filesystem.
diff --git a/sys/arch/atari/dev/clockreg.h b/sys/arch/atari/dev/clockreg.h
index 9ced9f98abb..4642336e2a7 100644
--- a/sys/arch/atari/dev/clockreg.h
+++ b/sys/arch/atari/dev/clockreg.h
@@ -1,4 +1,4 @@
-/* $NetBSD: clockreg.h,v 1.3 1995/06/28 04:30:40 cgd Exp $ */
+/* $NetBSD: clockreg.h,v 1.4 1996/01/06 20:11:07 leo Exp $ */
/*
* Copyright (c) 1995 Leo Weppelman.
@@ -51,22 +51,6 @@ struct rtc {
*/
#include <dev/ic/mc146818reg.h>
-__inline__ u_int mc146818_read(rtc, regno)
-void *rtc;
-u_int regno;
-{
- ((struct rtc *)rtc)->rtc_regno = regno;
- return(((struct rtc *)rtc)->rtc_data & 0377);
-}
-
-__inline__ void mc146818_write(rtc, regno, value)
-void *rtc;
-u_int regno, value;
-{
- ((struct rtc *)rtc)->rtc_regno = regno;
- ((struct rtc *)rtc)->rtc_data = value;
-}
-
/*
* Some useful constants/macros
*/
diff --git a/sys/arch/atari/dev/nvram.c b/sys/arch/atari/dev/nvram.c
new file mode 100644
index 00000000000..8e67b01e3e5
--- /dev/null
+++ b/sys/arch/atari/dev/nvram.c
@@ -0,0 +1,205 @@
+/* $NetBSD: nvram.c,v 1.1 1996/01/06 20:11:08 leo Exp $ */
+
+/*
+ * Copyright (c) 1995 Leo Weppelman.
+ * All rights reserved.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Leo Weppelman.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * Nvram driver
+ */
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/buf.h>
+#include <sys/uio.h>
+
+#include <machine/iomap.h>
+
+#include <atari/dev/clockreg.h>
+#include <atari/dev/nvramvar.h>
+
+#include "nvr.h"
+
+#define MC_NVRAM_CSUM (MC_NVRAM_START + MC_NVRAM_SIZE - 2)
+
+#if NNVR > 0
+static void nvram_set_csum __P((u_char csum));
+static int nvram_csum_valid __P((u_char csum));
+static u_char nvram_csum __P((void));
+
+/*
+ * Auto config stuff....
+ */
+static void nvr_attach __P((struct device *, struct device *, void *));
+static int nvr_match __P((struct device *, struct cfdata *, void *));
+
+struct cfdriver nvrcd = {
+ NULL, "nvr", (cfmatch_t)nvr_match, nvr_attach,
+ DV_DULL, sizeof(struct nvr_softc), NULL, 0 };
+
+/*ARGSUSED*/
+static int
+nvr_match(pdp, cfp, auxp)
+struct device *pdp;
+struct cfdata *cfp;
+void *auxp;
+{
+ if (!strcmp((char *)auxp, "nvr"))
+ return (1);
+ return (0);
+}
+
+/*ARGSUSED*/
+static void
+nvr_attach(pdp, dp, auxp)
+struct device *pdp, *dp;
+void *auxp;
+{
+ struct nvr_softc *nvr_soft;
+ int nreg;
+
+ /*
+ * Check the validity of the NVram contents
+ */
+ if (!nvram_csum_valid(nvram_csum())) {
+ printf(": Invalid checksum - re-initialized");
+ for (nreg = MC_NVRAM_START; nreg < MC_NVRAM_CSUM; nreg++)
+ mc146818_write(RTC, nreg, 0);
+ nvram_set_csum(nvram_csum());
+ }
+ nvr_soft = nvrcd.cd_devs[0];
+ nvr_soft->nvr_flags = NVR_CONFIGURED;
+ printf("\n");
+}
+/*
+ * End of auto config stuff....
+ */
+#endif /* NNVR > 0 */
+
+/*
+ * Kernel internal interface
+ */
+int
+nvr_get_byte(byteno)
+int byteno;
+{
+#if NNVR > 0
+ struct nvr_softc *nvr_soft;
+
+ nvr_soft = nvrcd.cd_devs[0];
+ if (!(nvr_soft->nvr_flags & NVR_CONFIGURED))
+ return(NVR_INVALID);
+ return (mc146818_read(RTC, byteno + MC_NVRAM_START) & 0xff);
+#else
+ return(NVR_INVALID);
+#endif /* NNVR > 0 */
+}
+
+#if NNVR > 0
+
+nvram_uio(uio)
+struct uio *uio;
+{
+ int i;
+ off_t offset;
+ int nleft;
+ u_char buf[MC_NVRAM_CSUM - MC_NVRAM_START + 1];
+ u_char *p;
+ struct nvr_softc *nvr_soft;
+
+ nvr_soft = nvrcd.cd_devs[0];
+ if (!(nvr_soft->nvr_flags & NVR_CONFIGURED))
+ return ENXIO;
+
+#ifdef NV_DEBUG
+ printf("Request to transfer %d bytes offset: %d, %s nvram\n",
+ (long)uio->uio_resid, (long)uio->uio_offset,
+ (uio->uio_rw == UIO_READ) ? "from" : "to");
+#endif /* NV_DEBUG */
+
+ offset = uio->uio_offset + MC_NVRAM_START;
+ nleft = uio->uio_resid;
+ if (offset + nleft >= MC_NVRAM_CSUM) {
+ if (offset == MC_NVRAM_CSUM)
+ return (0);
+ nleft = MC_NVRAM_CSUM - offset;
+ if (nleft <= 0)
+ return (EINVAL);
+ }
+#ifdef NV_DEBUG
+ printf("Translated: offset = %d, bytes: %d\n", (long)offset, nleft);
+#endif /* NV_DEBUG */
+
+ if (uio->uio_rw == UIO_READ) {
+ for (i = 0, p = buf; i < nleft; i++, p++)
+ *p = mc146818_read(RTC, offset + i);
+ }
+ if (i = uiomove(buf, nleft, uio))
+ return (i);
+ if (uio->uio_rw == UIO_WRITE) {
+ for (i = 0, p = buf; i < nleft; i++, p++)
+ mc146818_write(RTC, offset + i, *p);
+ nvram_set_csum(nvram_csum());
+ }
+ return(0);
+}
+
+static u_char
+nvram_csum()
+{
+ u_char csum;
+ int nreg;
+
+ for (csum = 0, nreg = MC_NVRAM_START; nreg < MC_NVRAM_CSUM; nreg++)
+ csum += mc146818_read(RTC, nreg);
+ return(csum);
+}
+
+static int
+nvram_csum_valid(csum)
+u_char csum;
+{
+ if (((~csum & 0xff) != mc146818_read(RTC, MC_NVRAM_CSUM))
+ || (csum != mc146818_read(RTC, MC_NVRAM_CSUM + 1)))
+ return 0;
+ return 1;
+}
+
+static void
+nvram_set_csum(csum)
+u_char csum;
+{
+ mc146818_write(RTC, MC_NVRAM_CSUM, ~csum);
+ mc146818_write(RTC, MC_NVRAM_CSUM + 1, csum);
+}
+#endif /* NNVR > 0 */
diff --git a/sys/arch/atari/dev/nvramvar.h b/sys/arch/atari/dev/nvramvar.h
new file mode 100644
index 00000000000..0c905de4076
--- /dev/null
+++ b/sys/arch/atari/dev/nvramvar.h
@@ -0,0 +1,57 @@
+/* $NetBSD: nvramvar.h,v 1.1 1996/01/06 20:11:09 leo Exp $ */
+
+/*
+ * Copyright (c) 1995 Leo Weppelman.
+ * All rights reserved.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Leo Weppelman.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/*
+ * Nvram driver - variable definitions
+ */
+
+struct nvr_softc {
+ struct device nvr_dev;
+ u_int16_t nvr_flags;
+};
+
+/*
+ * nvr_flags
+ */
+#define NVR_CONFIGURED 1 /* Configured and valid */
+
+#ifdef _KERNEL
+/*
+ * Kernel internal interface to read config info from nvram
+ */
+int nvr_get_byte __P((int));
+
+/*
+ * Error return from nvr_get_byte
+ */
+#define NVR_INVALID (-1)
+#endif /* _KERNEL */