tx39biu.c revision 1.3       1 /*	$NetBSD: tx39biu.c,v 1.3 1999/12/26 17:06:02 uch Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1999, by UCHIYAMA Yasushi
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. The name of the developer may NOT be used to endorse or promote products
     13  *    derived from this software without specific prior written permission.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25  * SUCH DAMAGE.
     26  *
     27  */
     28 #include "opt_tx39_debug.h"
     29 #include "opt_tx39_watchdogtimer.h"
     30 #include "opt_tx39biudebug.h"
     31 
     32 #include <sys/param.h>
     33 #include <sys/systm.h>
     34 #include <sys/device.h>
     35 
     36 #include <machine/bus.h>
     37 
     38 #include <hpcmips/tx/tx39var.h>
     39 #include <hpcmips/tx/tx39biureg.h>
     40 
     41 #include <hpcmips/tx/txcsbusvar.h>
     42 
     43 #define ISSET(x, s)	((x) & (1 << (s)))
     44 #define ISSETPRINT(r, s, m) __is_set_print((u_int32_t)(r), \
     45 	TX39_MEMCONFIG##s##_##m, #m)
     46 
     47 int	tx39biu_match __P((struct device*, struct cfdata*, void*));
     48 void	tx39biu_attach __P((struct device*, struct device*, void*));
     49 void	tx39biu_callback __P((struct device*));
     50 int	tx39biu_print __P((void*, const char*));
     51 int	tx39biu_intr __P((void*));
     52 
     53 static void *__sc; /* XXX */
     54 
     55 void	tx39biu_dump __P((tx_chipset_tag_t));
     56 
     57 struct tx39biu_softc {
     58 	struct	device sc_dev;
     59 	tx_chipset_tag_t sc_tc;
     60 };
     61 
     62 struct cfattach tx39biu_ca = {
     63 	sizeof(struct tx39biu_softc), tx39biu_match, tx39biu_attach
     64 };
     65 
     66 int
     67 tx39biu_match(parent, cf, aux)
     68 	struct device *parent;
     69 	struct cfdata *cf;
     70 	void *aux;
     71 {
     72 	return 1;
     73 }
     74 
     75 void
     76 tx39biu_attach(parent, self, aux)
     77 	struct device *parent;
     78 	struct device *self;
     79 	void *aux;
     80 {
     81 	struct txsim_attach_args *ta = aux;
     82 	struct tx39biu_softc *sc = (void*)self;
     83 	tx_chipset_tag_t tc;
     84 #ifdef TX39_WATCHDOGTIMER
     85 	txreg_t reg;
     86 #endif
     87 
     88 	sc->sc_tc = tc = ta->ta_tc;
     89 	printf("\n");
     90 #ifdef TX39BIUDEBUG
     91 	tx39biu_dump(tc);
     92 #endif
     93 
     94 #ifdef TX39_WATCHDOGTIMER
     95 	/*
     96 	 * CLRWRBUSERRINT Bus error connected CPU HwInt0
     97 	 */
     98 	reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG);
     99 	reg |= TX39_MEMCONFIG4_ENWATCH;
    100 	reg = TX39_MEMCONFIG4_WATCHTIMEVAL_SET(reg, 0xf);
    101 	tx_conf_write(tc, TX39_MEMCONFIG4_REG, reg);
    102 
    103 	reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG);
    104 	if (reg & TX39_MEMCONFIG4_ENWATCH) {
    105 		int i;
    106 		i = TX39_MEMCONFIG4_WATCHTIMEVAL(reg);
    107 		i = (1000 * (i + 1) * 64) / 36864;
    108 		printf("WatchDogTimerRate: %dus\n", i);
    109 	}
    110 #endif
    111 	__sc = sc;
    112 
    113 	/*	Clear watch dog timer interrupt */
    114 	tx39biu_intr(sc);
    115 
    116 	/*
    117 	 *	Chip select virtual bridge
    118 	 */
    119 	config_defer(self, tx39biu_callback);
    120 }
    121 
    122 void
    123 tx39biu_callback(self)
    124 	struct device *self;
    125 {
    126 	struct tx39biu_softc *sc = (void*)self;
    127 	struct csbus_attach_args cba;
    128 
    129 	cba.cba_busname = "txcsbus";
    130 	cba.cba_tc = sc->sc_tc;
    131 	config_found(self, &cba, tx39biu_print);
    132 }
    133 
    134 int
    135 tx39biu_print(aux, pnp)
    136 	void *aux;
    137 	const char *pnp;
    138 {
    139 	return pnp ? QUIET : UNCONF;
    140 }
    141 
    142 int
    143 tx39biu_intr(arg)
    144 	void *arg;
    145 {
    146 	struct tx39biu_softc *sc = __sc;
    147 	tx_chipset_tag_t tc;
    148 	txreg_t reg;
    149 
    150 	if (!sc) {
    151 		return 0;
    152 	}
    153 	tc = sc->sc_tc;
    154 	/* Clear interrupt */
    155 	reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG);
    156 	reg |= TX39_MEMCONFIG4_CLRWRBUSERRINT;
    157 	tx_conf_write(tc, TX39_MEMCONFIG4_REG, reg);
    158 	reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG);
    159 	reg &= ~TX39_MEMCONFIG4_CLRWRBUSERRINT;
    160 	tx_conf_write(tc, TX39_MEMCONFIG4_REG, reg);
    161 
    162 	return 0;
    163 }
    164 
    165 void
    166 tx39biu_dump(tc)
    167 	tx_chipset_tag_t tc;
    168 {
    169 	char *rowsel[] = {"18,17:9", "22,18,20,19,17:9", "20,22,21,19,17:9",
    170 			  "22,23,21,19,17:9"};
    171 	char *colsel[] = {"22,20,18,8:1", "19,18,8:2", "21,20,18,8:2",
    172 			  "23,22,20,18,8:2", "24,22,20,18,8:2",
    173 			  "18,p,X,8:0","22,p,X,21,8:0", "18,p,X,21,8:1",
    174 			  "22,p,X,23,21,8:1", "24,23,21,8:2"};
    175 	txreg_t reg;
    176 	int i;
    177 	/*
    178 	 *	Memory config 0 register
    179 	 */
    180 	reg = tx_conf_read(tc, TX39_MEMCONFIG0_REG);
    181 	printf(" config0:");
    182 	ISSETPRINT(reg, 0, ENDCLKOUTTRI);
    183 	ISSETPRINT(reg, 0, DISDQMINIT);
    184 	ISSETPRINT(reg, 0, ENSDRAMPD);
    185 	ISSETPRINT(reg, 0, SHOWDINO);
    186 	ISSETPRINT(reg, 0, ENRMAP2);
    187 	ISSETPRINT(reg, 0, ENRMAP1);
    188 	ISSETPRINT(reg, 0, ENWRINPAGE);
    189 	ISSETPRINT(reg, 0, ENCS3USER);
    190 	ISSETPRINT(reg, 0, ENCS2USER);
    191 	ISSETPRINT(reg, 0, ENCS1USER);
    192 	ISSETPRINT(reg, 0, ENCS1DRAM);
    193 	ISSETPRINT(reg, 0, CS3SIZE);
    194 	ISSETPRINT(reg, 0, CS2SIZE);
    195 	ISSETPRINT(reg, 0, CS1SIZE);
    196 	ISSETPRINT(reg, 0, CS0SIZE);
    197 	printf("\n");
    198 	for (i = 0; i < 2; i++) {
    199 		int r, c;
    200 		printf(" BANK%d: ", i);
    201 		switch (i ? TX39_MEMCONFIG0_BANK1CONF(reg)
    202 			: TX39_MEMCONFIG0_BANK0CONF(reg)) {
    203 		case TX39_MEMCONFIG0_BANKCONF_16BITSDRAM:
    204 			printf("16bit SDRAM");
    205 			break;
    206 		case TX39_MEMCONFIG0_BANKCONF_8BITSDRAM:
    207 			printf("8bit SDRAM");
    208 			break;
    209 		case TX39_MEMCONFIG0_BANKCONF_32BITSDHDRAM:
    210 			printf("32bit DRAM/HDRAM");
    211 			break;
    212 		case TX39_MEMCONFIG0_BANKCONF_16BITSDHDRAM:
    213 			printf("16bit DRAM/HDRAM");
    214 			break;
    215 		}
    216 		if (i == 1) {
    217 			r = TX39_MEMCONFIG0_ROWSEL1(reg);
    218 			c = TX39_MEMCONFIG0_COLSEL1(reg);
    219 		} else {
    220 			r = TX39_MEMCONFIG0_ROWSEL0(reg);
    221 			c = TX39_MEMCONFIG0_COLSEL0(reg);
    222 		}
    223 		printf(" ROW %s COL %s\n", rowsel[r], colsel[c]);
    224 	}
    225 
    226 	/*
    227 	 *	Memory config 3 register
    228 	 */
    229 	printf(" config3:");
    230 	reg = tx_conf_read(tc, TX39_MEMCONFIG3_REG);
    231 #ifdef TX391X
    232 	ISSETPRINT(reg, 3, ENMCS3PAGE);
    233 	ISSETPRINT(reg, 3, ENMCS2PAGE);
    234 	ISSETPRINT(reg, 3, ENMCS1PAGE);
    235 	ISSETPRINT(reg, 3, ENMCS0PAGE);
    236 #endif /* TX391X */
    237 	ISSETPRINT(reg, 3, ENCS3PAGE);
    238 	ISSETPRINT(reg, 3, ENCS2PAGE);
    239 	ISSETPRINT(reg, 3, ENCS1PAGE);
    240 	ISSETPRINT(reg, 3, ENCS0PAGE);
    241 	ISSETPRINT(reg, 3, CARD2WAITEN);
    242 	ISSETPRINT(reg, 3, CARD1WAITEN);
    243 	ISSETPRINT(reg, 3, CARD2IOEN);
    244 	ISSETPRINT(reg, 3, CARD1IOEN);
    245 #ifdef TX391X
    246 	ISSETPRINT(reg, 3, PORT8SEL);
    247 #endif /* TX391X */
    248 #ifdef TX392X
    249 	ISSETPRINT(reg, 3, CARD2_8SEL);
    250 	ISSETPRINT(reg, 3, CARD1_8SEL);
    251 #endif /* TX392X */
    252 
    253 	printf("\n");
    254 
    255 	/*
    256 	 *	Memory config 4 register
    257 	 */
    258 	reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG);
    259 	printf(" config4:");
    260 	ISSETPRINT(reg, 4, ENBANK1HDRAM);
    261 	ISSETPRINT(reg, 4, ENBANK0HDRAM);
    262 	ISSETPRINT(reg, 4, ENARB);
    263 	ISSETPRINT(reg, 4, DISSNOOP);
    264 	ISSETPRINT(reg, 4, CLRWRBUSERRINT);
    265 	ISSETPRINT(reg, 4, ENBANK1OPT);
    266 	ISSETPRINT(reg, 4, ENBANK0OPT);
    267 	ISSETPRINT(reg, 4, ENWATCH);
    268 	ISSETPRINT(reg, 4, MEMPOWERDOWN);
    269 	ISSETPRINT(reg, 4, ENRFSH1);
    270 	ISSETPRINT(reg, 4, ENRFSH0);
    271 	if (reg & TX39_MEMCONFIG4_ENWATCH) {
    272 		i = TX39_MEMCONFIG4_WATCHTIMEVAL(reg);
    273 		i = (1000 * (i + 1) * 64) / 36864;
    274 		printf("WatchDogTimerRate: %dus", i);
    275 	}
    276 	printf("\n");
    277 }
    278 
    279