Annotation of sys/arch/hp300/hp300/wscons_machdep.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: wscons_machdep.c,v 1.8 2006/12/18 18:57:26 miod Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2005, Miodrag Vallat
! 5: *
! 6: * Redistribution and use in source and binary forms, with or without
! 7: * modification, are permitted provided that the following conditions
! 8: * are met:
! 9: * 1. Redistributions of source code must retain the above copyright
! 10: * notice, this list of conditions and the following disclaimer.
! 11: * 2. Redistributions in binary form must reproduce the above copyright
! 12: * notice, this list of conditions and the following disclaimer in the
! 13: * documentation and/or other materials provided with the distribution.
! 14: *
! 15: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 16: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
! 18: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
! 19: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 20: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 21: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 22: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 23: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
! 24: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 25: * POSSIBILITY OF SUCH DAMAGE.
! 26: */
! 27: /*
! 28: * Copyright (c) 2002 Michael Shalayeff
! 29: * All rights reserved.
! 30: *
! 31: * Redistribution and use in source and binary forms, with or without
! 32: * modification, are permitted provided that the following conditions
! 33: * are met:
! 34: * 1. Redistributions of source code must retain the above copyright
! 35: * notice, this list of conditions and the following disclaimer.
! 36: * 2. Redistributions in binary form must reproduce the above copyright
! 37: * notice, this list of conditions and the following disclaimer in the
! 38: * documentation and/or other materials provided with the distribution.
! 39: * 3. The name of the author may not be used to endorse or promote products
! 40: * derived from this software without specific prior written permission.
! 41: *
! 42: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 43: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 44: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 45: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
! 46: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 47: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 48: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 49: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 50: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
! 51: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
! 52: * THE POSSIBILITY OF SUCH DAMAGE.
! 53: */
! 54:
! 55: #include <sys/param.h>
! 56: #include <sys/systm.h>
! 57: #include <sys/kernel.h>
! 58: #include <sys/conf.h>
! 59: #include <sys/device.h>
! 60:
! 61: #include <machine/autoconf.h>
! 62: #include <machine/cpu.h>
! 63: #include <machine/hp300spu.h>
! 64:
! 65: #include <dev/cons.h>
! 66:
! 67: #include <dev/wscons/wsconsio.h>
! 68: #include <dev/wscons/wsdisplayvar.h>
! 69: #include <dev/rasops/rasops.h>
! 70:
! 71: #include "wsdisplay.h"
! 72: #include "wskbd.h"
! 73: #if NWSKBD > 0
! 74: #include <dev/wscons/wskbdvar.h>
! 75: #endif
! 76:
! 77: #include "dvbox.h"
! 78: #include "gbox.h"
! 79: #include "hyper.h"
! 80: #include "rbox.h"
! 81: #include "topcat.h"
! 82: #include "tvrx.h"
! 83: #if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
! 84: #include <hp300/dev/dioreg.h>
! 85: #include <hp300/dev/diovar.h>
! 86: #include <hp300/dev/diofbreg.h>
! 87: #include <hp300/dev/diofbvar.h>
! 88: struct diofb diofb_cn;
! 89: #endif
! 90:
! 91: #include "sti.h"
! 92: #if NSTI > 0
! 93: #include <machine/bus.h>
! 94: #include <hp300/dev/sgcreg.h>
! 95: #include <hp300/dev/sgcvar.h>
! 96: #include <dev/ic/stireg.h>
! 97: #include <dev/ic/stivar.h>
! 98: extern int sti_console_scan(int);
! 99: extern void sticninit(void);
! 100: #endif
! 101:
! 102: extern caddr_t internalhpib;
! 103:
! 104: cons_decl(ws);
! 105:
! 106: void (*wsfbcninit)(void) = NULL;
! 107:
! 108: #if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
! 109: int dio_fbidentify(struct diofbreg *);
! 110:
! 111: /*
! 112: * Identify a DIO frame buffer and set up wsfbcninit accordingly.
! 113: */
! 114: int
! 115: dio_fbidentify(struct diofbreg *fbr)
! 116: {
! 117: if (fbr->id == GRFHWID)
! 118: switch (fbr->fbid) {
! 119: #if NDVBOX > 0
! 120: case GID_DAVINCI:
! 121: wsfbcninit = dvboxcninit;
! 122: return (1);
! 123: #endif
! 124: #if NGBOX > 0
! 125: case GID_GATORBOX:
! 126: wsfbcninit = gboxcninit;
! 127: return (1);
! 128: #endif
! 129: #if NHYPER > 0
! 130: case GID_HYPERION:
! 131: wsfbcninit = hypercninit;
! 132: return (1);
! 133: #endif
! 134: #if NRBOX > 0
! 135: case GID_RENAISSANCE:
! 136: wsfbcninit = rboxcninit;
! 137: return (1);
! 138: #endif
! 139: #if NTOPCAT > 0
! 140: case GID_TOPCAT:
! 141: case GID_LRCATSEYE:
! 142: case GID_HRCCATSEYE:
! 143: case GID_HRMCATSEYE:
! 144: wsfbcninit = topcatcninit;
! 145: return (1);
! 146: #endif
! 147: #if NTVRX > 0
! 148: case GID_TIGER:
! 149: wsfbcninit = tvrxcninit;
! 150: return (1);
! 151: #endif
! 152: default:
! 153: break;
! 154: }
! 155:
! 156: return (0);
! 157: }
! 158: #endif
! 159:
! 160: /*
! 161: * This routine handles the dirty work of picking the best frame buffer
! 162: * suitable for the console.
! 163: * We try to behave as close as possible to the PROM's logic, by preferring
! 164: * devices for which we have drivers, in that order:
! 165: * - internal video.
! 166: * - lowest select code on DIO bus.
! 167: * - lowest slot on SGC bus.
! 168: */
! 169: void
! 170: wscnprobe(struct consdev *cp)
! 171: {
! 172: int maj, tmpconscode;
! 173: vsize_t mapsize;
! 174: vaddr_t va;
! 175: #if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
! 176: paddr_t pa;
! 177: u_int scode, sctop;
! 178: struct diofbreg *fbr;
! 179: #endif
! 180:
! 181: for (maj = 0; maj < nchrdev; maj++) {
! 182: if (cdevsw[maj].d_open == wsdisplayopen)
! 183: break;
! 184: }
! 185:
! 186: cp->cn_dev = makedev(maj, 0);
! 187: wsfbcninit = NULL;
! 188:
! 189: #if NDVBOX > 0 || NGBOX > 0 || NRBOX > 0 || NTOPCAT > 0
! 190: /*
! 191: * Look for an ``internal'' frame buffer.
! 192: */
! 193: va = IIOV(GRFIADDR);
! 194: fbr = (struct diofbreg *)va;
! 195: if (!badaddr((caddr_t)va)) {
! 196: if (dio_fbidentify(fbr)) {
! 197: tmpconscode = CONSCODE_INTERNAL;
! 198: mapsize = 0;
! 199: goto found;
! 200: }
! 201: }
! 202: #endif
! 203:
! 204: #if NDVBOX > 0 || NGBOX > 0 || NHYPER > 0 || NRBOX > 0 || NTOPCAT > 0 || NTVRX > 0
! 205: /*
! 206: * Scan the DIO bus.
! 207: */
! 208: sctop = DIO_SCMAX(machineid);
! 209: for (scode = 0; scode < sctop; scode++) {
! 210: /*
! 211: * Skip over the select code hole and the internal
! 212: * HP-IB controller.
! 213: */
! 214: if (DIO_INHOLE(scode) || (scode == 7 && internalhpib))
! 215: continue;
! 216:
! 217: /* Map current PA. */
! 218: pa = (paddr_t)dio_scodetopa(scode);
! 219: va = (vaddr_t)iomap((caddr_t)pa, PAGE_SIZE);
! 220: if (va == NULL)
! 221: continue;
! 222:
! 223: /* Check to see if hardware exists. */
! 224: if (badaddr((caddr_t)va)) {
! 225: iounmap((caddr_t)va, PAGE_SIZE);
! 226: continue;
! 227: }
! 228:
! 229: /* Check hardware. */
! 230: fbr = (struct diofbreg *)va;
! 231: if (dio_fbidentify(fbr)) {
! 232: tmpconscode = scode;
! 233: mapsize = DIO_SIZE(scode, va);
! 234: iounmap((caddr_t)va, PAGE_SIZE);
! 235: va = (vaddr_t)iomap((caddr_t)pa, mapsize);
! 236: if (va == NULL)
! 237: continue;
! 238: goto found;
! 239: } else
! 240: iounmap((caddr_t)va, PAGE_SIZE);
! 241: }
! 242: #endif
! 243:
! 244: #if NSTI > 0
! 245: /*
! 246: * Scan the SGC bus.
! 247: */
! 248: for (scode = 0; scode < SGC_NSLOTS; scode++) {
! 249: int rv;
! 250:
! 251: /* Map current PA. */
! 252: pa = (paddr_t)sgc_slottopa(scode);
! 253: va = (vaddr_t)iomap((caddr_t)pa, PAGE_SIZE);
! 254: if (va == NULL)
! 255: continue;
! 256:
! 257: /* Check to see if hardware exists. */
! 258: rv = badaddr((caddr_t)va);
! 259: iounmap((caddr_t)va, PAGE_SIZE);
! 260: if (rv != 0)
! 261: continue;
! 262:
! 263: /* Check hardware. */
! 264: if (sti_console_scan(scode) != 0) {
! 265: wsfbcninit = sticninit;
! 266: tmpconscode = SGC_SLOT_TO_CONSCODE(scode);
! 267: mapsize = 0;
! 268: va = 0;
! 269: goto found;
! 270: }
! 271: }
! 272: #endif
! 273:
! 274: return;
! 275:
! 276: found:
! 277: cp->cn_pri = CN_INTERNAL;
! 278: #ifdef CONSCODE
! 279: if (CONSCODE == tmpconscode)
! 280: cp->cn_pri = CN_FORCED;
! 281: #endif
! 282:
! 283: /*
! 284: * If our priority is higher than the currently remembered console,
! 285: * install ourselves, and unmap whichever device might be currently
! 286: * mapped.
! 287: */
! 288: if (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri) {
! 289: cn_tab = cp;
! 290: /* Free last mapping. */
! 291: if (convasize)
! 292: iounmap(conaddr, convasize);
! 293: conscode = tmpconscode;
! 294: conaddr = (caddr_t)va;
! 295: convasize = mapsize;
! 296:
! 297: }
! 298: }
! 299:
! 300: void
! 301: wscninit(struct consdev *cp)
! 302: {
! 303: /*
! 304: * Note that this relies on the fact that DIO frame buffers will cause
! 305: * cn_tab to switch to wsdisplaycons, so their cninit function will
! 306: * never get invoked a second time during the second console pass.
! 307: */
! 308: if (wsfbcninit != NULL)
! 309: (*wsfbcninit)();
! 310: }
! 311:
! 312: void
! 313: wscnputc(dev_t dev, int i)
! 314: {
! 315: #if NWSDISPLAY > 0
! 316: wsdisplay_cnputc(dev, i);
! 317: #endif
! 318: }
! 319:
! 320: int
! 321: wscngetc(dev_t dev)
! 322: {
! 323: #if NWSKBD > 0
! 324: return (wskbd_cngetc(dev));
! 325: #else
! 326: return (0);
! 327: #endif
! 328: }
! 329:
! 330: void
! 331: wscnpollc(dev_t dev, int on)
! 332: {
! 333: #if NWSKBD > 0
! 334: wskbd_cnpollc(dev, on);
! 335: #endif
! 336: }
CVSweb