diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1996-01-07 13:19:36 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1996-01-07 13:19:36 +0000 |
commit | 1d8b4eab300af38356404b265e7613bb8042a255 (patch) | |
tree | 7038095fc16808e8239ac0551052952fec50bdb4 /sys/arch | |
parent | fa74a8eb679569bcb30aff39747d402a3f9a5571 (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.c | 3 | ||||
-rw-r--r-- | sys/arch/atari/atari/mem.c | 13 | ||||
-rw-r--r-- | sys/arch/atari/conf/ATARITT | 3 | ||||
-rw-r--r-- | sys/arch/atari/conf/FALCON | 3 | ||||
-rw-r--r-- | sys/arch/atari/conf/GENERIC | 3 | ||||
-rw-r--r-- | sys/arch/atari/conf/files.atari | 6 | ||||
-rw-r--r-- | sys/arch/atari/dev/clock.c | 22 | ||||
-rw-r--r-- | sys/arch/atari/dev/clockreg.h | 18 | ||||
-rw-r--r-- | sys/arch/atari/dev/nvram.c | 205 | ||||
-rw-r--r-- | sys/arch/atari/dev/nvramvar.h | 57 |
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 */ |