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