1 1.65 christos /* $NetBSD: vr.c,v 1.65 2014/03/26 17:53:36 christos Exp $ */ 2 1.1 takemura 3 1.1 takemura /*- 4 1.35 takemura * Copyright (c) 1999-2002 5 1.1 takemura * Shin Takemura and 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.42 lukem 37 1.42 lukem #include <sys/cdefs.h> 38 1.65 christos __KERNEL_RCSID(0, "$NetBSD: vr.c,v 1.65 2014/03/26 17:53:36 christos Exp $"); 39 1.29 uch 40 1.29 uch #include "opt_vr41xx.h" 41 1.31 uch #include "opt_tx39xx.h" 42 1.24 lukem #include "opt_kgdb.h" 43 1.24 lukem 44 1.59 matt #define __INTR_PRIVATE 45 1.59 matt 46 1.1 takemura #include <sys/param.h> 47 1.1 takemura #include <sys/systm.h> 48 1.5 takemura #include <sys/reboot.h> 49 1.50 ad #include <sys/device.h> 50 1.50 ad #include <sys/bus.h> 51 1.57 uebayasi #include <sys/cpu.h> 52 1.1 takemura 53 1.31 uch #include <uvm/uvm_extern.h> 54 1.31 uch 55 1.60 tsutsui #include <mips/cache.h> 56 1.60 tsutsui #include <mips/locore.h> 57 1.60 tsutsui 58 1.1 takemura #include <machine/sysconf.h> 59 1.32 takemura #include <machine/bootinfo.h> 60 1.32 takemura #include <machine/bus_space_hpcmips.h> 61 1.35 takemura #include <machine/platid.h> 62 1.35 takemura #include <machine/platid_mask.h> 63 1.1 takemura 64 1.26 enami #include <dev/hpc/hpckbdvar.h> 65 1.30 uch 66 1.1 takemura #include <hpcmips/vr/vr.h> 67 1.11 takemura #include <hpcmips/vr/vr_asm.h> 68 1.22 sato #include <hpcmips/vr/vrcpudef.h> 69 1.3 takemura #include <hpcmips/vr/vripreg.h> 70 1.1 takemura #include <hpcmips/vr/rtcreg.h> 71 1.1 takemura 72 1.38 takemura #include "vrip_common.h" 73 1.38 takemura #if NVRIP_COMMON > 0 74 1.8 takemura #include <hpcmips/vr/vripvar.h> 75 1.8 takemura #endif 76 1.8 takemura 77 1.9 sato #include "vrbcu.h" 78 1.9 sato #if NVRBCU > 0 79 1.9 sato #include <hpcmips/vr/bcuvar.h> 80 1.9 sato #endif 81 1.9 sato 82 1.5 takemura #include "vrdsu.h" 83 1.5 takemura #if NVRDSU > 0 84 1.5 takemura #include <hpcmips/vr/vrdsuvar.h> 85 1.5 takemura #endif 86 1.5 takemura 87 1.1 takemura #include "com.h" 88 1.35 takemura #include "com_vrip.h" 89 1.35 takemura #include "com_hpcio.h" 90 1.35 takemura #if NCOM > 0 91 1.1 takemura #include <sys/termios.h> 92 1.1 takemura #include <sys/ttydefaults.h> 93 1.1 takemura #include <dev/ic/comreg.h> 94 1.1 takemura #include <dev/ic/comvar.h> 95 1.35 takemura #if NCOM_VRIP > 0 96 1.1 takemura #include <hpcmips/vr/siureg.h> 97 1.1 takemura #include <hpcmips/vr/com_vripvar.h> 98 1.33 takemura #endif 99 1.35 takemura #if NCOM_HPCIO > 0 100 1.35 takemura #include <hpcmips/dev/com_hpciovar.h> 101 1.33 takemura #endif 102 1.1 takemura #ifndef CONSPEED 103 1.1 takemura #define CONSPEED TTYDEF_SPEED 104 1.1 takemura #endif 105 1.1 takemura #endif 106 1.1 takemura 107 1.15 takemura #include "hpcfb.h" 108 1.3 takemura #include "vrkiu.h" 109 1.25 enami #if (NVRKIU > 0) || (NHPCFB > 0) 110 1.3 takemura #include <dev/wscons/wsdisplayvar.h> 111 1.15 takemura #include <dev/rasops/rasops.h> 112 1.3 takemura #endif 113 1.3 takemura 114 1.15 takemura #if NHPCFB > 0 115 1.20 uch #include <dev/hpc/hpcfbvar.h> 116 1.3 takemura #endif 117 1.3 takemura 118 1.15 takemura #if NVRKIU > 0 119 1.26 enami #include <arch/hpcmips/vr/vrkiureg.h> 120 1.3 takemura #include <arch/hpcmips/vr/vrkiuvar.h> 121 1.3 takemura #endif 122 1.3 takemura 123 1.31 uch #ifdef DEBUG 124 1.31 uch #define STATIC 125 1.31 uch #else 126 1.31 uch #define STATIC static 127 1.31 uch #endif 128 1.31 uch 129 1.31 uch /* 130 1.31 uch * This is a mask of bits to clear in the SR when we go to a 131 1.31 uch * given interrupt priority level. 132 1.31 uch */ 133 1.59 matt const struct ipl_sr_map __ipl_sr_map_vr = { 134 1.59 matt .sr_bits = { 135 1.59 matt [IPL_NONE] = 0, 136 1.59 matt [IPL_SOFTCLOCK] = MIPS_SOFT_INT_MASK_0, 137 1.59 matt [IPL_SOFTNET] = MIPS_SOFT_INT_MASK, 138 1.59 matt [IPL_VM] = MIPS_SOFT_INT_MASK 139 1.59 matt | MIPS_INT_MASK_0, 140 1.59 matt [IPL_SCHED] = MIPS_SOFT_INT_MASK 141 1.59 matt | MIPS_INT_MASK_0 142 1.59 matt | MIPS_INT_MASK_1, 143 1.59 matt [IPL_DDB] = MIPS_INT_MASK, 144 1.63 tsutsui [IPL_HIGH] = MIPS_INT_MASK, 145 1.59 matt }, 146 1.31 uch }; 147 1.31 uch 148 1.31 uch #if defined(VR41XX) && defined(TX39XX) 149 1.31 uch #define VR_INTR vr_intr 150 1.31 uch #else 151 1.31 uch #define VR_INTR cpu_intr /* locore_mips3 directly call this */ 152 1.31 uch #endif 153 1.31 uch 154 1.31 uch void vr_init(void); 155 1.59 matt void VR_INTR(int, vaddr_t, uint32_t); 156 1.31 uch extern void vr_idle(void); 157 1.31 uch STATIC void vr_cons_init(void); 158 1.47 christos STATIC void vr_fb_init(void **); 159 1.31 uch STATIC void vr_mem_init(paddr_t); 160 1.31 uch STATIC void vr_find_dram(paddr_t, paddr_t); 161 1.31 uch STATIC void vr_reboot(int, char *); 162 1.1 takemura 163 1.1 takemura /* 164 1.1 takemura * CPU interrupt dispatch table (HwInt[0:3]) 165 1.1 takemura */ 166 1.59 matt STATIC int vr_null_handler(void *, uint32_t, uint32_t); 167 1.64 tsutsui STATIC int (*vr_intr_handler[4])(void *, vaddr_t, uint32_t) = 168 1.1 takemura { 169 1.31 uch vr_null_handler, 170 1.31 uch vr_null_handler, 171 1.31 uch vr_null_handler, 172 1.31 uch vr_null_handler 173 1.1 takemura }; 174 1.31 uch STATIC void *vr_intr_arg[4]; 175 1.1 takemura 176 1.35 takemura #if NCOM > 0 177 1.35 takemura /* 178 1.35 takemura * machine dependent serial console info 179 1.35 takemura */ 180 1.35 takemura static struct vr_com_platdep { 181 1.35 takemura platid_mask_t *platidmask; 182 1.35 takemura int (*attach)(bus_space_tag_t, int, int, int, tcflag_t, int); 183 1.35 takemura int addr; 184 1.35 takemura int freq; 185 1.35 takemura } platdep_com_table[] = { 186 1.35 takemura #if NCOM_HPCIO > 0 187 1.35 takemura { 188 1.35 takemura &platid_mask_MACH_NEC_MCR_SIGMARION2, 189 1.35 takemura com_hpcio_cndb_attach, /* attach proc */ 190 1.35 takemura 0x0b600000, /* base address */ 191 1.35 takemura COM_FREQ, /* frequency */ 192 1.35 takemura }, 193 1.35 takemura #endif 194 1.35 takemura #if NCOM_VRIP > 0 195 1.37 takemura #ifdef VR4102 196 1.37 takemura { 197 1.37 takemura &platid_mask_CPU_MIPS_VR_4102, 198 1.37 takemura com_vrip_cndb_attach, /* attach proc */ 199 1.37 takemura VR4102_SIU_ADDR, /* base address */ 200 1.37 takemura VRCOM_FREQ, /* frequency */ 201 1.37 takemura }, 202 1.37 takemura #endif /* VR4102 */ 203 1.37 takemura #ifdef VR4111 204 1.37 takemura { 205 1.37 takemura &platid_mask_CPU_MIPS_VR_4111, 206 1.37 takemura com_vrip_cndb_attach, /* attach proc */ 207 1.37 takemura VR4102_SIU_ADDR, /* base address */ 208 1.37 takemura VRCOM_FREQ, /* frequency */ 209 1.37 takemura }, 210 1.37 takemura #endif /* VR4111 */ 211 1.37 takemura #ifdef VR4121 212 1.37 takemura { 213 1.37 takemura &platid_mask_CPU_MIPS_VR_4121, 214 1.37 takemura com_vrip_cndb_attach, /* attach proc */ 215 1.37 takemura VR4102_SIU_ADDR, /* base address */ 216 1.37 takemura VRCOM_FREQ, /* frequency */ 217 1.37 takemura }, 218 1.37 takemura #endif /* VR4121 */ 219 1.37 takemura #ifdef VR4122 220 1.37 takemura { 221 1.37 takemura &platid_mask_CPU_MIPS_VR_4122, 222 1.37 takemura com_vrip_cndb_attach, /* attach proc */ 223 1.37 takemura VR4122_SIU_ADDR, /* base address */ 224 1.37 takemura VRCOM_FREQ, /* frequency */ 225 1.37 takemura }, 226 1.37 takemura #endif /* VR4122 */ 227 1.37 takemura #ifdef VR4131 228 1.37 takemura { 229 1.37 takemura &platid_mask_CPU_MIPS_VR_4122, 230 1.37 takemura com_vrip_cndb_attach, /* attach proc */ 231 1.37 takemura VR4122_SIU_ADDR, /* base address */ 232 1.37 takemura VRCOM_FREQ, /* frequency */ 233 1.37 takemura }, 234 1.37 takemura #endif /* VR4131 */ 235 1.37 takemura #ifdef SINGLE_VRIP_BASE 236 1.35 takemura { 237 1.35 takemura &platid_wild, 238 1.35 takemura com_vrip_cndb_attach, /* attach proc */ 239 1.35 takemura VRIP_SIU_ADDR, /* base address */ 240 1.35 takemura VRCOM_FREQ, /* frequency */ 241 1.35 takemura }, 242 1.37 takemura #endif /* SINGLE_VRIP_BASE */ 243 1.37 takemura #else /* NCOM_VRIP > 0 */ 244 1.35 takemura /* dummy */ 245 1.35 takemura { 246 1.35 takemura &platid_wild, 247 1.35 takemura NULL, /* attach proc */ 248 1.35 takemura 0, /* base address */ 249 1.35 takemura 0, /* frequency */ 250 1.35 takemura }, 251 1.37 takemura #endif /* NCOM_VRIP > 0 */ 252 1.35 takemura }; 253 1.35 takemura #endif /* NCOM > 0 */ 254 1.35 takemura 255 1.39 takemura #if NVRKIU > 0 256 1.39 takemura /* 257 1.39 takemura * machine dependent keyboard info 258 1.39 takemura */ 259 1.39 takemura static struct vr_kiu_platdep { 260 1.39 takemura platid_mask_t *platidmask; 261 1.39 takemura int addr; 262 1.39 takemura } platdep_kiu_table[] = { 263 1.39 takemura #ifdef VR4102 264 1.39 takemura { 265 1.39 takemura &platid_mask_CPU_MIPS_VR_4102, 266 1.39 takemura VR4102_KIU_ADDR, /* base address */ 267 1.39 takemura }, 268 1.39 takemura #endif /* VR4102 */ 269 1.39 takemura #ifdef VR4111 270 1.39 takemura { 271 1.39 takemura &platid_mask_CPU_MIPS_VR_4111, 272 1.39 takemura VR4102_KIU_ADDR, /* base address */ 273 1.39 takemura }, 274 1.39 takemura #endif /* VR4111 */ 275 1.39 takemura #ifdef VR4121 276 1.39 takemura { 277 1.39 takemura &platid_mask_CPU_MIPS_VR_4121, 278 1.39 takemura VR4102_KIU_ADDR, /* base address */ 279 1.39 takemura }, 280 1.39 takemura #endif /* VR4121 */ 281 1.39 takemura { 282 1.39 takemura &platid_wild, 283 1.39 takemura #ifdef SINGLE_VRIP_BASE 284 1.39 takemura VRIP_KIU_ADDR, /* base address */ 285 1.39 takemura #else 286 1.39 takemura VRIP_NO_ADDR, /* base address */ 287 1.39 takemura #endif /* SINGLE_VRIP_BASE */ 288 1.39 takemura }, 289 1.39 takemura }; 290 1.39 takemura #endif /* NVRKIU > 0 */ 291 1.39 takemura 292 1.1 takemura void 293 1.52 cegger vr_init(void) 294 1.1 takemura { 295 1.1 takemura /* 296 1.1 takemura * Platform Specific Function Hooks 297 1.1 takemura */ 298 1.29 uch platform.cpu_idle = vr_idle; 299 1.31 uch platform.cpu_intr = VR_INTR; 300 1.29 uch platform.cons_init = vr_cons_init; 301 1.29 uch platform.fb_init = vr_fb_init; 302 1.29 uch platform.mem_init = vr_mem_init; 303 1.29 uch platform.reboot = vr_reboot; 304 1.1 takemura 305 1.9 sato #if NVRBCU > 0 306 1.65 christos cpuname_printf("NEC %s rev%d.%d %d.%03dMHz", 307 1.1 takemura vrbcu_vrip_getcpuname(), 308 1.1 takemura vrbcu_vrip_getcpumajor(), 309 1.10 shin vrbcu_vrip_getcpuminor(), 310 1.10 shin vrbcu_vrip_getcpuclock() / 1000000, 311 1.10 shin (vrbcu_vrip_getcpuclock() % 1000000) / 1000); 312 1.9 sato #else 313 1.65 christos cpuname_printf("NEC VR41xx"); 314 1.9 sato #endif 315 1.4 uch } 316 1.4 uch 317 1.13 shin void 318 1.28 uch vr_mem_init(paddr_t kernend) 319 1.4 uch { 320 1.25 enami 321 1.13 shin mem_clusters[0].start = 0; 322 1.13 shin mem_clusters[0].size = kernend; 323 1.13 shin mem_cluster_cnt = 1; 324 1.25 enami 325 1.13 shin vr_find_dram(kernend, 0x02000000); 326 1.13 shin vr_find_dram(0x02000000, 0x04000000); 327 1.13 shin vr_find_dram(0x04000000, 0x06000000); 328 1.13 shin vr_find_dram(0x06000000, 0x08000000); 329 1.13 shin } 330 1.13 shin 331 1.13 shin void 332 1.28 uch vr_find_dram(paddr_t addr, paddr_t end) 333 1.13 shin { 334 1.13 shin int n; 335 1.48 he char *page; 336 1.13 shin #ifdef NARLY_MEMORY_PROBE 337 1.13 shin int x, i; 338 1.13 shin #endif 339 1.13 shin 340 1.25 enami #ifdef VR_FIND_DRAMLIM 341 1.25 enami if (VR_FIND_DRAMLIM < end) 342 1.25 enami end = VR_FIND_DRAMLIM; 343 1.31 uch #endif /* VR_FIND_DRAMLIM */ 344 1.13 shin n = mem_cluster_cnt; 345 1.41 thorpej for (; addr < end; addr += PAGE_SIZE) { 346 1.13 shin 347 1.48 he page = (char *)MIPS_PHYS_TO_KSEG1(addr); 348 1.56 jun /* 349 1.56 jun XXX see port-hpcmips/42934 350 1.13 shin if (badaddr(page, 4)) 351 1.13 shin goto bad; 352 1.56 jun */ 353 1.14 shin 354 1.14 shin /* stop memory probing at first memory image */ 355 1.53 cegger if (memcmp(page, (void *)MIPS_PHYS_TO_KSEG0(0), 128) == 0) 356 1.14 shin return; 357 1.13 shin 358 1.13 shin *(volatile int *)(page+0) = 0xa5a5a5a5; 359 1.13 shin *(volatile int *)(page+4) = 0x5a5a5a5a; 360 1.13 shin wbflush(); 361 1.13 shin if (*(volatile int *)(page+0) != 0xa5a5a5a5) 362 1.13 shin goto bad; 363 1.13 shin 364 1.13 shin *(volatile int *)(page+0) = 0x5a5a5a5a; 365 1.13 shin *(volatile int *)(page+4) = 0xa5a5a5a5; 366 1.13 shin wbflush(); 367 1.13 shin if (*(volatile int *)(page+0) != 0x5a5a5a5a) 368 1.13 shin goto bad; 369 1.13 shin 370 1.13 shin #ifdef NARLY_MEMORY_PROBE 371 1.13 shin x = random(); 372 1.41 thorpej for (i = 0; i < PAGE_SIZE; i += 4) 373 1.13 shin *(volatile int *)(page+i) = (x ^ i); 374 1.4 uch wbflush(); 375 1.41 thorpej for (i = 0; i < PAGE_SIZE; i += 4) 376 1.13 shin if (*(volatile int *)(page+i) != (x ^ i)) 377 1.13 shin goto bad; 378 1.13 shin 379 1.13 shin x = random(); 380 1.41 thorpej for (i = 0; i < PAGE_SIZE; i += 4) 381 1.13 shin *(volatile int *)(page+i) = (x ^ i); 382 1.13 shin wbflush(); 383 1.41 thorpej for (i = 0; i < PAGE_SIZE; i += 4) 384 1.13 shin if (*(volatile int *)(page+i) != (x ^ i)) 385 1.13 shin goto bad; 386 1.31 uch #endif /* NARLY_MEMORY_PROBE */ 387 1.13 shin 388 1.13 shin if (!mem_clusters[n].size) 389 1.13 shin mem_clusters[n].start = addr; 390 1.41 thorpej mem_clusters[n].size += PAGE_SIZE; 391 1.13 shin continue; 392 1.13 shin 393 1.13 shin bad: 394 1.13 shin if (mem_clusters[n].size) 395 1.13 shin ++n; 396 1.13 shin continue; 397 1.4 uch } 398 1.13 shin if (mem_clusters[n].size) 399 1.13 shin ++n; 400 1.13 shin mem_cluster_cnt = n; 401 1.4 uch } 402 1.4 uch 403 1.4 uch void 404 1.47 christos vr_fb_init(void **kernend) 405 1.4 uch { 406 1.4 uch /* Nothing to do */ 407 1.1 takemura } 408 1.1 takemura 409 1.1 takemura void 410 1.52 cegger vr_cons_init(void) 411 1.1 takemura { 412 1.35 takemura #if NCOM > 0 || NHPCFB > 0 || NVRKIU > 0 413 1.30 uch bus_space_tag_t iot = hpcmips_system_bus_space(); 414 1.1 takemura #endif 415 1.35 takemura #if NCOM > 0 416 1.35 takemura static struct vr_com_platdep *com_info; 417 1.35 takemura #endif 418 1.39 takemura #if NVRKIU > 0 419 1.39 takemura static struct vr_kiu_platdep *kiu_info; 420 1.39 takemura #endif 421 1.1 takemura 422 1.1 takemura #if NCOM > 0 423 1.35 takemura com_info = platid_search(&platid, platdep_com_table, 424 1.35 takemura sizeof(platdep_com_table)/sizeof(*platdep_com_table), 425 1.35 takemura sizeof(*platdep_com_table)); 426 1.18 jeffs #ifdef KGDB 427 1.35 takemura if (com_info->attach != NULL) { 428 1.35 takemura /* if KGDB is defined, always use the serial port for KGDB */ 429 1.35 takemura if ((*com_info->attach)(iot, com_info->addr, 9600, 430 1.35 takemura com_info->freq, 431 1.35 takemura (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8, 1)) { 432 1.35 takemura printf("%s(%d): can't init kgdb's serial port", 433 1.23 enami __FILE__, __LINE__); 434 1.1 takemura } 435 1.54 jun } 436 1.33 takemura #else /* KGDB */ 437 1.35 takemura if (com_info->attach != NULL && (bootinfo->bi_cnuse&BI_CNUSE_SERIAL)) { 438 1.33 takemura /* Serial console */ 439 1.35 takemura if ((*com_info->attach)(iot, com_info->addr, CONSPEED, 440 1.35 takemura com_info->freq, 441 1.35 takemura (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8, 0)) { 442 1.33 takemura printf("%s(%d): can't init serial console", 443 1.33 takemura __FILE__, __LINE__); 444 1.33 takemura } else { 445 1.33 takemura return; 446 1.33 takemura } 447 1.33 takemura } 448 1.33 takemura #endif /* KGDB */ 449 1.35 takemura #endif /* NCOM > 0 */ 450 1.1 takemura 451 1.15 takemura #if NHPCFB > 0 452 1.17 uch if (hpcfb_cnattach(NULL)) { 453 1.3 takemura printf("%s(%d): can't init fb console", __FILE__, __LINE__); 454 1.3 takemura } else { 455 1.3 takemura goto find_keyboard; 456 1.3 takemura } 457 1.25 enami find_keyboard: 458 1.30 uch #endif /* NHPCFB > 0 */ 459 1.3 takemura 460 1.39 takemura #if NVRKIU > 0 461 1.39 takemura kiu_info = platid_search(&platid, platdep_kiu_table, 462 1.39 takemura sizeof(platdep_kiu_table)/sizeof(*platdep_kiu_table), 463 1.39 takemura sizeof(*platdep_kiu_table)); 464 1.39 takemura if (kiu_info->addr != VRIP_NO_ADDR) { 465 1.39 takemura if (vrkiu_cnattach(iot, kiu_info->addr)) { 466 1.39 takemura printf("%s(%d): can't init vrkiu as console", 467 1.39 takemura __FILE__, __LINE__); 468 1.39 takemura } else { 469 1.39 takemura return; 470 1.39 takemura } 471 1.3 takemura } 472 1.39 takemura #endif /* NVRKIU > 0 */ 473 1.5 takemura } 474 1.5 takemura 475 1.40 shin extern char vr_hibernate[]; 476 1.40 shin extern char evr_hibernate[]; 477 1.40 shin 478 1.5 takemura void 479 1.28 uch vr_reboot(int howto, char *bootstr) 480 1.5 takemura { 481 1.7 takemura /* 482 1.7 takemura * power down 483 1.7 takemura */ 484 1.7 takemura if ((howto & RB_POWERDOWN) == RB_POWERDOWN) { 485 1.7 takemura printf("fake powerdown\n"); 486 1.40 shin /* 487 1.40 shin * copy vr_hibernate() to top of physical memory. 488 1.40 shin */ 489 1.40 shin memcpy((void *)MIPS_KSEG0_START, vr_hibernate, 490 1.40 shin evr_hibernate - (char *)vr_hibernate); 491 1.40 shin /* sync I&D cache */ 492 1.40 shin mips_dcache_wbinv_all(); 493 1.40 shin mips_icache_sync_all(); 494 1.40 shin /* 495 1.40 shin * call vr_hibernate() at MIPS_KSEG0_START. 496 1.40 shin */ 497 1.40 shin ((void (*)(void *,int))MIPS_KSEG0_START)( 498 1.40 shin (void *)MIPS_KSEG0_START, ptoa(physmem)); 499 1.7 takemura /* not reach */ 500 1.7 takemura vr_reboot(howto&~RB_HALT, bootstr); 501 1.7 takemura } 502 1.7 takemura /* 503 1.8 takemura * halt 504 1.7 takemura */ 505 1.8 takemura if (howto & RB_HALT) { 506 1.38 takemura #if NVRIP_COMMON > 0 507 1.61 tsutsui vrip_splpiu(); 508 1.8 takemura vrip_intr_suspend(); 509 1.5 takemura #else 510 1.8 takemura splhigh(); 511 1.5 takemura #endif 512 1.7 takemura __asm(".set noreorder"); 513 1.44 mycroft __asm(".word " ___STRING(VR_OPCODE_SUSPEND)); 514 1.6 sato __asm("nop"); 515 1.6 sato __asm("nop"); 516 1.6 sato __asm("nop"); 517 1.6 sato __asm("nop"); 518 1.6 sato __asm("nop"); 519 1.7 takemura __asm(".set reorder"); 520 1.38 takemura #if NVRIP_COMMON > 0 521 1.8 takemura vrip_intr_resume(); 522 1.8 takemura #endif 523 1.6 sato } 524 1.8 takemura /* 525 1.8 takemura * reset 526 1.8 takemura */ 527 1.8 takemura #if NVRDSU 528 1.8 takemura vrdsu_reset(); 529 1.8 takemura #else 530 1.8 takemura printf("%s(%d): There is no DSU.", __FILE__, __LINE__); 531 1.8 takemura #endif 532 1.1 takemura } 533 1.1 takemura 534 1.30 uch /* 535 1.30 uch * Handle interrupts. 536 1.30 uch */ 537 1.31 uch void 538 1.59 matt VR_INTR(int ppl, vaddr_t pc, uint32_t status) 539 1.30 uch { 540 1.59 matt uint32_t ipending; 541 1.59 matt int ipl; 542 1.51 tsutsui 543 1.59 matt while (ppl < (ipl = splintr(&ipending))) { 544 1.59 matt /* Deal with unneded compare interrupts occasionally so that 545 1.59 matt * we can keep spllowersoftclock. */ 546 1.59 matt if (ipending & MIPS_INT_MASK_5) { 547 1.59 matt mips3_cp0_compare_write(0); 548 1.59 matt } 549 1.31 uch 550 1.59 matt if (ipending & MIPS_INT_MASK_1) { 551 1.62 tsutsui (*vr_intr_handler[1])(vr_intr_arg[1], pc, status); 552 1.59 matt } 553 1.31 uch 554 1.59 matt if (ipending & MIPS_INT_MASK_0) { 555 1.59 matt (*vr_intr_handler[0])(vr_intr_arg[0], pc, status); 556 1.59 matt } 557 1.31 uch } 558 1.30 uch } 559 1.30 uch 560 1.1 takemura void * 561 1.64 tsutsui vr_intr_establish(int line, int (*ih_fun)(void *, vaddr_t, uint32_t), 562 1.28 uch void *ih_arg) 563 1.1 takemura { 564 1.28 uch 565 1.31 uch KDASSERT(vr_intr_handler[line] == vr_null_handler); 566 1.31 uch 567 1.31 uch vr_intr_handler[line] = ih_fun; 568 1.31 uch vr_intr_arg[line] = ih_arg; 569 1.1 takemura 570 1.31 uch return ((void *)line); 571 1.1 takemura } 572 1.1 takemura 573 1.1 takemura void 574 1.28 uch vr_intr_disestablish(void *ih) 575 1.1 takemura { 576 1.1 takemura int line = (int)ih; 577 1.28 uch 578 1.31 uch vr_intr_handler[line] = vr_null_handler; 579 1.31 uch vr_intr_arg[line] = NULL; 580 1.1 takemura } 581 1.1 takemura 582 1.1 takemura int 583 1.64 tsutsui vr_null_handler(void *arg, vaddr_t pc, uint32_t status) 584 1.1 takemura { 585 1.31 uch 586 1.31 uch printf("vr_null_handler\n"); 587 1.28 uch 588 1.28 uch return (0); 589 1.1 takemura } 590 1.22 sato 591 1.22 sato /* 592 1.22 sato int x4181 = VR4181; 593 1.22 sato int x4101 = VR4101; 594 1.22 sato int x4102 = VR4102; 595 1.22 sato int x4111 = VR4111; 596 1.22 sato int x4121 = VR4121; 597 1.22 sato int x4122 = VR4122; 598 1.22 sato int xo4181 = ONLY_VR4181; 599 1.22 sato int xo4101 = ONLY_VR4101; 600 1.22 sato int xo4102 = ONLY_VR4102; 601 1.22 sato int xo4111_4121 = ONLY_VR4111_4121; 602 1.22 sato int g4101=VRGROUP_4101; 603 1.22 sato int g4102=VRGROUP_4102; 604 1.22 sato int g4181=VRGROUP_4181; 605 1.22 sato int g4102_4121=VRGROUP_4102_4121; 606 1.22 sato int g4111_4121=VRGROUP_4111_4121; 607 1.22 sato int g4102_4122=VRGROUP_4102_4122; 608 1.22 sato int g4111_4122=VRGROUP_4111_4122; 609 1.22 sato int single_vrip_base=SINGLE_VRIP_BASE; 610 1.22 sato int vrip_base_addr=VRIP_BASE_ADDR; 611 1.22 sato */ 612