summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1996-01-07 13:19:36 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1996-01-07 13:19:36 +0000
commit1d8b4eab300af38356404b265e7613bb8042a255 (patch)
tree7038095fc16808e8239ac0551052952fec50bdb4 /sys/arch
parentfa74a8eb679569bcb30aff39747d402a3f9a5571 (diff)
from leo:
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')
-rw-r--r--sys/arch/atari/atari/autoconf.c3
-rw-r--r--sys/arch/atari/atari/mem.c13
-rw-r--r--sys/arch/atari/conf/ATARITT3
-rw-r--r--sys/arch/atari/conf/FALCON3
-rw-r--r--sys/arch/atari/conf/GENERIC3
-rw-r--r--sys/arch/atari/conf/files.atari6
-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
10 files changed, 309 insertions, 24 deletions
diff --git a/sys/arch/atari/atari/autoconf.c b/sys/arch/atari/atari/autoconf.c
index c9ab04bd657..1c67416f72e 100644
--- a/sys/arch/atari/atari/autoconf.c
+++ b/sys/arch/atari/atari/autoconf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.2 1995/07/11 18:24:57 leo Exp $ */
+/* $NetBSD: autoconf.c,v 1.3 1996/01/06 20:10:41 leo Exp $ */
/*
* Copyright (c) 1995 Leo Weppelman
@@ -254,6 +254,7 @@ mbattach(pdp, dp, auxp)
void *auxp;
{
printf ("\n");
+ config_found(dp, "nvr" , simple_devprint);
config_found(dp, "clock" , simple_devprint);
config_found(dp, "grfbus" , simple_devprint);
config_found(dp, "kbd" , simple_devprint);
diff --git a/sys/arch/atari/atari/mem.c b/sys/arch/atari/atari/mem.c
index 69434437357..a07e040615d 100644
--- a/sys/arch/atari/atari/mem.c
+++ b/sys/arch/atari/atari/mem.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mem.c,v 1.3 1995/04/10 13:09:14 mycroft Exp $ */
+/* $NetBSD: mem.c,v 1.4 1996/01/06 20:10:43 leo Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -55,6 +55,8 @@
#include <vm/vm.h>
+#include "nvr.h"
+
extern u_int lowram;
caddr_t zeropage;
@@ -149,6 +151,15 @@ mmrw(dev, uio, flags)
uio->uio_resid = 0;
return (0);
+/* minor device 11 (/dev/nvram) */
+ case 11:
+#if NNVR > 0
+ error = nvram_uio(uio);
+ return (error);
+#else
+ return (ENXIO);
+#endif
+
/* minor device 12 (/dev/zero) is source of nulls on read, rathole on write */
case 12:
if (uio->uio_rw == UIO_WRITE) {
diff --git a/sys/arch/atari/conf/ATARITT b/sys/arch/atari/conf/ATARITT
index ac46604ffb0..c8cf2209e96 100644
--- a/sys/arch/atari/conf/ATARITT
+++ b/sys/arch/atari/conf/ATARITT
@@ -1,5 +1,5 @@
#
-# $NetBSD: ATARITT,v 1.7 1995/11/30 00:57:44 jtc Exp $
+# $NetBSD: ATARITT,v 1.8 1996/01/06 20:10:59 leo Exp $
#
# ATARI-TT
#
@@ -101,3 +101,4 @@ pseudo-device vnd 3 # 3 pseudo disks (see vnconfig)
zs0 at mainbus0 # Serial support through 8530
grf1 at grfbus0 # second graphics driver
ite1 at grf1 # second tty
+nvr0 at mainbus0 # nvram driver
diff --git a/sys/arch/atari/conf/FALCON b/sys/arch/atari/conf/FALCON
index b7946954a6e..118767a2cec 100644
--- a/sys/arch/atari/conf/FALCON
+++ b/sys/arch/atari/conf/FALCON
@@ -1,5 +1,5 @@
#
-# $NetBSD: FALCON,v 1.4 1995/11/30 00:57:48 jtc Exp $
+# $NetBSD: FALCON,v 1.5 1996/01/06 20:11:00 leo Exp $
#
# ATARI-FALCON
#
@@ -87,3 +87,4 @@ pseudo-device vnd 3 # 3 pseudo disks (see vnconfig)
zs0 at mainbus0 # Serial support through 8530
grf1 at grfbus0 # second graphics driver
ite1 at grf1 # second tty
+nvr0 at mainbus0 # nvram driver
diff --git a/sys/arch/atari/conf/GENERIC b/sys/arch/atari/conf/GENERIC
index fa8d92b6785..4ae036528fa 100644
--- a/sys/arch/atari/conf/GENERIC
+++ b/sys/arch/atari/conf/GENERIC
@@ -1,5 +1,5 @@
#
-# $NetBSD: GENERIC,v 1.9 1995/11/30 21:53:07 leo Exp $
+# $NetBSD: GENERIC,v 1.10 1996/01/06 20:11:01 leo Exp $
#
# Generic atari
#
@@ -112,3 +112,4 @@ pseudo-device ccd 4 # concatenating disk driver
#The following sections describe various hardware options.
#
zs0 at mainbus0 # Serial support through 8530
+nvr0 at mainbus0 # nvram driver
diff --git a/sys/arch/atari/conf/files.atari b/sys/arch/atari/conf/files.atari
index 00716d0231c..a143229ef05 100644
--- a/sys/arch/atari/conf/files.atari
+++ b/sys/arch/atari/conf/files.atari
@@ -1,5 +1,5 @@
#
-# $NetBSD: files.atari,v 1.13 1995/12/01 19:53:07 leo Exp $
+# $NetBSD: files.atari,v 1.14 1996/01/06 20:11:02 leo Exp $
#
maxpartitions 16
@@ -28,6 +28,10 @@ file arch/atari/dev/zs.c zs needs-count
device ramd at mainbus
file arch/atari/dev/ramd.c ramd needs-flag
+# nvram
+device nvr at mainbus
+file arch/atari/dev/nvram.c nvr needs-flag
+
device fdc at mainbus { unit = -1 }
device fd at fdc
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 */