Home | History | Annotate | Line # | Download | only in vr
bcu_vrip.c revision 1.3
      1  1.3      sato /*	$NetBSD: bcu_vrip.c,v 1.3 1999/12/16 09:36:19 sato Exp $	*/
      2  1.1  takemura 
      3  1.1  takemura /*-
      4  1.1  takemura  * Copyright (c) 1999 SATO Kazumi. All rights reserved.
      5  1.1  takemura  * Copyright (c) 1999 PocketBSD Project. All rights reserved.
      6  1.1  takemura  *
      7  1.1  takemura  * Redistribution and use in source and binary forms, with or without
      8  1.1  takemura  * modification, are permitted provided that the following conditions
      9  1.1  takemura  * are met:
     10  1.1  takemura  * 1. Redistributions of source code must retain the above copyright
     11  1.1  takemura  *    notice, this list of conditions and the following disclaimer.
     12  1.1  takemura  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  takemura  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  takemura  *    documentation and/or other materials provided with the distribution.
     15  1.1  takemura  * 3. All advertising materials mentioning features or use of this software
     16  1.1  takemura  *    must display the following acknowledgement:
     17  1.1  takemura  *	This product includes software developed by the PocketBSD project
     18  1.1  takemura  *	and its contributors.
     19  1.1  takemura  * 4. Neither the name of the project nor the names of its contributors
     20  1.1  takemura  *    may be used to endorse or promote products derived from this software
     21  1.1  takemura  *    without specific prior written permission.
     22  1.1  takemura  *
     23  1.1  takemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  1.1  takemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  1.1  takemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  1.1  takemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  1.1  takemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  1.1  takemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  1.1  takemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  1.1  takemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  1.1  takemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  1.1  takemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  1.1  takemura  * SUCH DAMAGE.
     34  1.1  takemura  *
     35  1.1  takemura  */
     36  1.1  takemura 
     37  1.1  takemura #include <sys/param.h>
     38  1.1  takemura #include <sys/systm.h>
     39  1.1  takemura #include <sys/device.h>
     40  1.1  takemura #include <sys/reboot.h>
     41  1.1  takemura 
     42  1.1  takemura #include <machine/bus.h>
     43  1.1  takemura 
     44  1.1  takemura #include <mips/cpuregs.h>
     45  1.1  takemura 
     46  1.1  takemura #include <hpcmips/vr/vr.h>
     47  1.1  takemura #include <hpcmips/vr/vripvar.h>
     48  1.1  takemura #include <hpcmips/vr/vripreg.h>
     49  1.1  takemura #include <hpcmips/vr/bcureg.h>
     50  1.1  takemura #include <hpcmips/vr/bcuvar.h>
     51  1.1  takemura 
     52  1.3      sato static int vrbcu_match __P((struct device *, struct cfdata *, void *));
     53  1.3      sato static void vrbcu_attach __P((struct device *, struct device *, void *));
     54  1.1  takemura 
     55  1.3      sato static void vrbcu_write __P((struct vrbcu_softc *, int, unsigned short));
     56  1.3      sato static unsigned short vrbcu_read __P((struct vrbcu_softc *, int));
     57  1.2      sato 
     58  1.2      sato char	*vr_cpuname=NULL;
     59  1.2      sato int	vr_major=-1;
     60  1.2      sato int	vr_minor=-1;
     61  1.2      sato int	vr_cpuid=-1;
     62  1.1  takemura 
     63  1.1  takemura struct cfattach vrbcu_ca = {
     64  1.3      sato 	sizeof(struct vrbcu_softc), vrbcu_match, vrbcu_attach
     65  1.1  takemura };
     66  1.1  takemura 
     67  1.3      sato struct vrbcu_softc *the_bcu_sc = NULL;
     68  1.3      sato 
     69  1.3      sato static inline void
     70  1.3      sato vrbcu_write(sc, port, val)
     71  1.3      sato 	struct vrbcu_softc *sc;
     72  1.3      sato 	int port;
     73  1.3      sato 	unsigned short val;
     74  1.3      sato {
     75  1.3      sato 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, port, val);
     76  1.3      sato }
     77  1.3      sato 
     78  1.3      sato static inline unsigned short
     79  1.3      sato vrbcu_read(sc, port)
     80  1.3      sato 	struct vrbcu_softc *sc;
     81  1.3      sato 	int port;
     82  1.3      sato {
     83  1.3      sato 	return bus_space_read_2(sc->sc_iot, sc->sc_ioh, port);
     84  1.3      sato }
     85  1.3      sato 
     86  1.1  takemura static int
     87  1.3      sato vrbcu_match(parent, cf, aux)
     88  1.1  takemura      struct device *parent;
     89  1.1  takemura      struct cfdata *cf;
     90  1.1  takemura      void *aux;
     91  1.1  takemura {
     92  1.2      sato 	return 2;
     93  1.1  takemura }
     94  1.1  takemura 
     95  1.1  takemura static void
     96  1.3      sato vrbcu_attach(parent, self, aux)
     97  1.1  takemura      struct device *parent;
     98  1.1  takemura      struct device *self;
     99  1.1  takemura      void *aux;
    100  1.1  takemura {
    101  1.1  takemura 	struct vrip_attach_args *va = aux;
    102  1.3      sato 	struct vrbcu_softc *sc = (struct vrbcu_softc *)self;
    103  1.1  takemura 
    104  1.3      sato 	sc->sc_iot = va->va_iot;
    105  1.3      sato 	bus_space_map(sc->sc_iot, va->va_addr, va->va_size,
    106  1.1  takemura 		0, /* no flags */
    107  1.3      sato 		&sc->sc_ioh);
    108  1.1  takemura 
    109  1.1  takemura 	printf("\n");
    110  1.3      sato 	the_bcu_sc = sc;
    111  1.1  takemura }
    112  1.1  takemura 
    113  1.1  takemura static char *cpuname[] = {
    114  1.1  takemura 	"VR4101",
    115  1.1  takemura 	"VR4102",
    116  1.1  takemura 	"VR4111",
    117  1.1  takemura 	"VR4121",
    118  1.1  takemura 	"UNKNOWN",
    119  1.1  takemura 	"UNKNOWN",
    120  1.1  takemura 	"UNKNOWN",
    121  1.1  takemura 	"UNKNOWN" };
    122  1.1  takemura 
    123  1.2      sato int
    124  1.2      sato vrbcu_vrip_getcpuid(void)
    125  1.2      sato {
    126  1.2      sato 	volatile u_int16_t *revreg;
    127  1.2      sato 
    128  1.2      sato 	if (vr_cpuid != -1)
    129  1.2      sato 		return vr_cpuid;
    130  1.2      sato 
    131  1.2      sato 	if (vr_cpuid == -1) {
    132  1.2      sato 		revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1((VRIP_BCU_ADDR+BCUREVID_REG_W));
    133  1.2      sato 
    134  1.2      sato 		vr_cpuid = *revreg;
    135  1.2      sato 		vr_cpuid = (vr_cpuid&BCUREVID_RIDMASK)>>BCUREVID_RIDSHFT;
    136  1.2      sato 	}
    137  1.2      sato 	return vr_cpuid;
    138  1.2      sato }
    139  1.2      sato 
    140  1.1  takemura char *
    141  1.1  takemura vrbcu_vrip_getcpuname(void)
    142  1.1  takemura {
    143  1.2      sato 	int cpuid;
    144  1.1  takemura 
    145  1.2      sato 	if (vr_cpuname != NULL)
    146  1.2      sato 		return vr_cpuname;
    147  1.1  takemura 
    148  1.2      sato 	cpuid = vrbcu_vrip_getcpuid();
    149  1.2      sato 	vr_cpuname = cpuname[cpuid];
    150  1.2      sato 	return vr_cpuname;
    151  1.1  takemura }
    152  1.1  takemura 
    153  1.2      sato 
    154  1.1  takemura int
    155  1.1  takemura vrbcu_vrip_getcpumajor(void)
    156  1.1  takemura {
    157  1.1  takemura 	volatile u_int16_t *revreg;
    158  1.2      sato 
    159  1.2      sato 	if (vr_major != -1)
    160  1.2      sato 		return vr_major;
    161  1.1  takemura 
    162  1.1  takemura 	revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1((VRIP_BCU_ADDR+BCUREVID_REG_W));
    163  1.1  takemura 
    164  1.2      sato 	vr_major = *revreg;
    165  1.2      sato 	vr_major = (vr_major&BCUREVID_MJREVMASK)>>BCUREVID_MJREVSHFT;
    166  1.2      sato 	return vr_major;
    167  1.1  takemura }
    168  1.1  takemura 
    169  1.1  takemura int
    170  1.1  takemura vrbcu_vrip_getcpuminor(void)
    171  1.1  takemura {
    172  1.1  takemura 	volatile u_int16_t *revreg;
    173  1.2      sato 
    174  1.2      sato 	if (vr_minor != -1)
    175  1.2      sato 		return vr_minor;
    176  1.1  takemura 
    177  1.1  takemura 	revreg = (u_int16_t *)MIPS_PHYS_TO_KSEG1((VRIP_BCU_ADDR+BCUREVID_REG_W));
    178  1.1  takemura 
    179  1.2      sato 	vr_minor = *revreg;
    180  1.2      sato 	vr_minor = (vr_minor&BCUREVID_MNREVMASK)>>BCUREVID_MNREVSHFT;
    181  1.2      sato 	return vr_minor;
    182  1.1  takemura }
    183