diff options
| author | leo <leo@NetBSD.org> | 1996-01-06 20:10:41 +0000 |
|---|---|---|
| committer | leo <leo@NetBSD.org> | 1996-01-06 20:10:41 +0000 |
| commit | 356a61ab951b8d5157fa38e0632e272a7ec0fd01 (patch) | |
| tree | f6c0a1de05010c172f2515de5c432a8e1675d1c1 /sys/arch/atari/dev | |
| parent | 0c5975cdd38e4e3eed9db0d3257a20efef12c5a0 (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.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 |
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 */ |
