1 /* $NetBSD: tx39biu.c,v 1.17 2021/08/07 16:18:54 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1999-2002 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by UCHIYAMA Yasushi. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 __KERNEL_RCSID(0, "$NetBSD: tx39biu.c,v 1.17 2021/08/07 16:18:54 thorpej Exp $"); 34 35 #include "opt_tx39_watchdogtimer.h" 36 #include "opt_tx39biu_debug.h" 37 38 #include <sys/param.h> 39 #include <sys/systm.h> 40 #include <sys/device.h> 41 42 #include <machine/bus.h> 43 #include <machine/debug.h> 44 45 #include <hpcmips/tx/tx39var.h> 46 #include <hpcmips/tx/tx39biureg.h> 47 #include <hpcmips/tx/txcsbusvar.h> 48 49 #ifdef TX39BIU_DEBUG 50 #define DPRINTF_ENABLE 51 #define DPRINTF_DEBUG tx39biu_debug 52 #endif 53 54 #define ISSETPRINT(r, s, m) dbg_bitmask_print((u_int32_t)(r), \ 55 TX39_MEMCONFIG ## s ## _ ##m, #m) 56 57 int tx39biu_match(device_t, cfdata_t, void *); 58 void tx39biu_attach(device_t, device_t, void *); 59 void tx39biu_callback(device_t); 60 int tx39biu_print(void *, const char *); 61 int tx39biu_intr(void *); 62 63 static void *__sc; /* XXX */ 64 #ifdef TX39BIU_DEBUG 65 void tx39biu_dump(tx_chipset_tag_t); 66 #endif 67 68 struct tx39biu_softc { 69 tx_chipset_tag_t sc_tc; 70 }; 71 72 CFATTACH_DECL_NEW(tx39biu, sizeof(struct tx39biu_softc), 73 tx39biu_match, tx39biu_attach, NULL, NULL); 74 75 int 76 tx39biu_match(device_t parent, cfdata_t cf, void *aux) 77 { 78 return (ATTACH_NORMAL); 79 } 80 81 void 82 tx39biu_attach(device_t parent, device_t self, void *aux) 83 { 84 struct txsim_attach_args *ta = aux; 85 struct tx39biu_softc *sc = device_private(self); 86 tx_chipset_tag_t tc; 87 #ifdef TX39_WATCHDOGTIMER 88 txreg_t reg; 89 #endif 90 91 sc->sc_tc = tc = ta->ta_tc; 92 printf("\n"); 93 #ifdef TX39BIU_DEBUG 94 tx39biu_dump(tc); 95 #endif 96 97 #ifdef TX39_WATCHDOGTIMER 98 /* 99 * CLRWRBUSERRINT Bus error connected CPU HwInt0 100 */ 101 reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG); 102 reg |= TX39_MEMCONFIG4_ENWATCH; 103 reg = TX39_MEMCONFIG4_WATCHTIMEVAL_SET(reg, 0xf); 104 tx_conf_write(tc, TX39_MEMCONFIG4_REG, reg); 105 106 reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG); 107 if (reg & TX39_MEMCONFIG4_ENWATCH) { 108 int i; 109 i = TX39_MEMCONFIG4_WATCHTIMEVAL(reg); 110 i = (1000 * (i + 1) * 64) / 36864; 111 printf("WatchDogTimerRate: %dus\n", i); 112 } 113 #endif 114 __sc = sc; 115 116 /* Clear watch dog timer interrupt */ 117 tx39biu_intr(sc); 118 119 /* 120 * Chip select virtual bridge 121 */ 122 config_defer(self, tx39biu_callback); 123 } 124 125 void 126 tx39biu_callback(device_t self) 127 { 128 struct tx39biu_softc *sc = device_private(self); 129 struct csbus_attach_args cba; 130 131 cba.cba_busname = "txcsbus"; 132 cba.cba_tc = sc->sc_tc; 133 config_found(self, &cba, tx39biu_print, CFARGS_NONE); 134 } 135 136 int 137 tx39biu_print(void *aux, const char *pnp) 138 { 139 return (pnp ? QUIET : UNCONF); 140 } 141 142 int 143 tx39biu_intr(void *arg) 144 { 145 struct tx39biu_softc *sc = __sc; 146 tx_chipset_tag_t tc; 147 txreg_t reg; 148 149 if (!sc) { 150 return (0); 151 } 152 tc = sc->sc_tc; 153 /* Clear interrupt */ 154 reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG); 155 reg |= TX39_MEMCONFIG4_CLRWRBUSERRINT; 156 tx_conf_write(tc, TX39_MEMCONFIG4_REG, reg); 157 reg = tx_conf_read(tc, TX39_MEMCONFIG4_REG); 158 reg &= ~TX39_MEMCONFIG4_CLRWRBUSERRINT; 159 tx_conf_write(tc, TX39_MEMCONFIG4_REG, reg); 160 161 return (0); 162 } 163 164 #ifdef TX39BIU_DEBUG 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 #endif /* TX39BIU_DEBUG */ 279