diff options
author | dfr <dfr@FreeBSD.org> | 1998-06-10 10:57:29 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1998-06-10 10:57:29 +0000 |
commit | 224577d6cf4d0daf37dddd81b9f9c646ad2be083 (patch) | |
tree | 345e0ea224736af311f2e28c0acb268d809bff9c /sys/alpha/tlsb/mcclock_tlsb.c | |
parent | 2e6fba7d51b32033eec1fc27efaa0f8e840825fe (diff) | |
download | FreeBSD-src-224577d6cf4d0daf37dddd81b9f9c646ad2be083.zip FreeBSD-src-224577d6cf4d0daf37dddd81b9f9c646ad2be083.tar.gz |
Add initial support for the FreeBSD/alpha kernel. This is very much a
work in progress and has never booted a real machine. Initial
development and testing was done using SimOS (see
http://simos.stanford.edu for details). On the SimOS simulator, this
port successfully reaches single-user mode and has been tested with
loads as high as one copy of /bin/ls :-).
Obtained from: partly from NetBSD/alpha
Diffstat (limited to 'sys/alpha/tlsb/mcclock_tlsb.c')
-rw-r--r-- | sys/alpha/tlsb/mcclock_tlsb.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/sys/alpha/tlsb/mcclock_tlsb.c b/sys/alpha/tlsb/mcclock_tlsb.c new file mode 100644 index 0000000..15974fc --- /dev/null +++ b/sys/alpha/tlsb/mcclock_tlsb.c @@ -0,0 +1,126 @@ +/* $Id$ */ +/* $NetBSD: mcclock_tlsb.c,v 1.8 1998/05/13 02:50:29 thorpej Exp $ */ + +/* + * Copyright (c) 1997 by Matthew Jacob + * NASA AMES Research Center. + * 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 immediately at the beginning of the file, without modification, + * 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. 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/module.h> +#include <sys/bus.h> + +#include <dev/dec/clockvar.h> +#include <dev/dec/mcclockvar.h> + +#include <alpha/tlsb/gbusvar.h> + +#include <alpha/tlsb/tlsbreg.h> /* XXX */ + +#include <dev/dec/mc146818reg.h> + +#define KV(_addr) ((caddr_t)ALPHA_PHYS_TO_K0SEG((_addr))) +/* + * Registers are 64 bytes apart (and 1 byte wide) + */ +#define REGSHIFT 6 + +struct mcclock_tlsb_softc { + struct mcclock_softc sc_mcclock; + unsigned long regbase; +}; + +static int mcclock_tlsb_probe(bus_t, device_t); +static int mcclock_tlsb_attach(bus_t, device_t); + +static devclass_t mcclock_devclass; + +driver_t mcclock_tlsb_driver = { + "mcclock", + mcclock_tlsb_probe, + mcclock_tlsb_attach, + NULL, + NULL, + DRIVER_TYPE_MISC, + sizeof(struct mcclock_tlsb_softc), + NULL, +}; + +static void mcclock_tlsb_write __P((struct mcclock_softc *, u_int, u_int)); +static u_int mcclock_tlsb_read __P((struct mcclock_softc *, u_int)); + +const struct mcclock_busfns mcclock_tlsb_busfns = { + mcclock_tlsb_write, mcclock_tlsb_read, +}; + +int +mcclock_tlsb_probe(bus_t bus, device_t dev) +{ + device_set_desc(dev, "MC146818A real time clock"); + return 0; +} + +int +mcclock_tlsb_attach(bus_t bus, device_t dev) +{ + struct mcclock_tlsb_softc *sc = device_get_softc(dev); + + /* XXX Should be bus.h'd, so we can accomodate the kn7aa. */ + + sc->sc_mcclock.sc_dev = dev; + sc->regbase = TLSB_GBUS_BASE + gbus_get_offset(dev); + + mcclock_attach(&sc->sc_mcclock, &mcclock_tlsb_busfns); + return 0; +} + +static void +mcclock_tlsb_write(mcsc, reg, val) + struct mcclock_softc *mcsc; + u_int reg, val; +{ + struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)mcsc; + unsigned char *ptr = (unsigned char *) + KV(sc->regbase + (reg << REGSHIFT)); + *ptr = val; +} + +static u_int +mcclock_tlsb_read(mcsc, reg) + struct mcclock_softc *mcsc; + u_int reg; +{ + struct mcclock_tlsb_softc *sc = (struct mcclock_tlsb_softc *)mcsc; + unsigned char *ptr = (unsigned char *) + KV(sc->regbase + (reg << REGSHIFT)); + return *ptr; +} + +DRIVER_MODULE(mcclock_tlsb, gbus, mcclock_tlsb_driver, mcclock_devclass, 0, 0); |