Annotation of sys/arch/hppa/stand/libsa/cmd_hppa.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cmd_hppa.c,v 1.8 2004/04/07 18:24:20 mickey Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2002 Miodrag Vallat
! 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. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 19: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
! 20: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 21: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 22: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
! 24: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
! 25: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
! 26: * THE POSSIBILITY OF SUCH DAMAGE.
! 27: */
! 28:
! 29: /*#define DEBUG*/
! 30:
! 31: #include <sys/param.h>
! 32: /* would come from <sys/param.h> if -D_KERNEL */
! 33: #define offsetof(s, e) ((size_t)&((s *)0)->e)
! 34:
! 35: #include <machine/iomod.h>
! 36: #include <machine/pdc.h>
! 37:
! 38: #include <arch/hppa/dev/cpudevs.h>
! 39:
! 40: #include <libsa.h>
! 41: #include "cmd.h"
! 42: #include "dev_hppa.h" /* pdc */
! 43:
! 44: extern struct stable_storage sstor;
! 45: extern int sstorsiz;
! 46:
! 47: /* storage sizes we're interested in */
! 48: #define CONSOLEOFFSET \
! 49: offsetof(struct stable_storage, ss_console)
! 50: #define CONSOLESIZE \
! 51: (offsetof(struct stable_storage, ss_console) + \
! 52: sizeof(struct device_path))
! 53:
! 54: #define KEYBOARDOFFSET \
! 55: offsetof(struct stable_storage, ss_keyboard)
! 56: #define KEYBOARDSIZE \
! 57: (offsetof(struct stable_storage, ss_keyboard) + \
! 58: sizeof(struct device_path))
! 59:
! 60: /*
! 61: * Table for the possible console devices found during the device walk.
! 62: */
! 63: struct consoledev {
! 64: struct device_path dp;
! 65: int type;
! 66: int iodc_type;
! 67: int iodc_model;
! 68: };
! 69:
! 70: #define PS2 1
! 71: #define HIL 2
! 72: #define SERIAL 3
! 73: #define GRAPHICS 4
! 74:
! 75: /* max. serial ports */
! 76: #define MAX_SERIALS 4
! 77: /* max. HIL and PS2 */
! 78: #define MAX_KEYBOARDS 2
! 79: /* max. heads */
! 80: #define MAX_GRAPHICS 4
! 81:
! 82: struct consoledev serials[MAX_SERIALS];
! 83: struct consoledev keyboards[MAX_KEYBOARDS];
! 84: struct consoledev graphics[MAX_GRAPHICS];
! 85:
! 86: /* Relaxed device comparison */
! 87: #define MATCH(dev1, dev2) \
! 88: (dev1).dp_mod == (dev2).dp_mod && \
! 89: (dev1).dp_bc[0] == (dev2).dp_bc[0] && \
! 90: (dev1).dp_bc[1] == (dev2).dp_bc[1] && \
! 91: (dev1).dp_bc[2] == (dev2).dp_bc[2] && \
! 92: (dev1).dp_bc[3] == (dev2).dp_bc[3] && \
! 93: (dev1).dp_bc[4] == (dev2).dp_bc[4] && \
! 94: (dev1).dp_bc[5] == (dev2).dp_bc[5]
! 95:
! 96: int walked;
! 97:
! 98: void bus_walk(struct device_path *);
! 99: void register_device(struct consoledev *, int,
! 100: struct device_path *, struct iodc_data *, int, int);
! 101:
! 102: int Xconsole(void);
! 103: void print_console(void);
! 104: int set_graphics(struct device_path *, int, char *);
! 105: int set_serial(struct device_path *, int, char *);
! 106: int set_console(struct device_path *);
! 107:
! 108: int Xkeyboard(void);
! 109: void print_keyboard(void);
! 110: int set_keyboard(struct device_path *);
! 111:
! 112: struct cmd_table cmd_machine[] = {
! 113: { "console", CMDT_CMD, Xconsole },
! 114: { "keyboard", CMDT_CMD, Xkeyboard },
! 115: { NULL, },
! 116: };
! 117:
! 118: /* value to console speed table */
! 119: int i_speeds[] = {
! 120: 50,
! 121: 75,
! 122: 110,
! 123: 150,
! 124: 300,
! 125: 600,
! 126: 1200,
! 127: 2400,
! 128: 4800,
! 129: 7200,
! 130: 9600,
! 131: 19200,
! 132: 38400,
! 133: 57600,
! 134: 115200,
! 135: 230400,
! 136: };
! 137:
! 138: char *c_speeds[] = {
! 139: "50",
! 140: "75",
! 141: "110",
! 142: "150",
! 143: "300",
! 144: "600",
! 145: "1200",
! 146: "2400",
! 147: "4800",
! 148: "7200",
! 149: "9600",
! 150: "19200",
! 151: "38400",
! 152: "57600",
! 153: "115200",
! 154: "230400",
! 155: };
! 156:
! 157: /* values to console parity table */
! 158: char *parities[] = {
! 159: "none",
! 160: "odd",
! 161: "<unknown parity>",
! 162: "even",
! 163: };
! 164:
! 165: /*
! 166: * C O N S O L E S E T T I N G S
! 167: */
! 168:
! 169: void
! 170: print_console()
! 171: {
! 172: int port, mode, speed, parity, bits;
! 173: int i;
! 174:
! 175: #ifdef DEBUG
! 176: printf("console flags %x mod %x bc %d/%d/%d/%d/%d/%d\n",
! 177: sstor.ss_console.dp_flags,
! 178: sstor.ss_console.dp_mod,
! 179: sstor.ss_console.dp_bc[0],
! 180: sstor.ss_console.dp_bc[1],
! 181: sstor.ss_console.dp_bc[2],
! 182: sstor.ss_console.dp_bc[3],
! 183: sstor.ss_console.dp_bc[4],
! 184: sstor.ss_console.dp_bc[5]);
! 185:
! 186: printf("console path %x/%x/%x/%x/%x/%x\n",
! 187: sstor.ss_console.dp_layers[0],
! 188: sstor.ss_console.dp_layers[1],
! 189: sstor.ss_console.dp_layers[2],
! 190: sstor.ss_console.dp_layers[3],
! 191: sstor.ss_console.dp_layers[4],
! 192: sstor.ss_console.dp_layers[5]);
! 193: #endif
! 194:
! 195: printf("Console path: ");
! 196:
! 197: /* look for a serial console */
! 198: for (port = i = 0; i < MAX_SERIALS; i++)
! 199: if (MATCH(serials[i].dp, sstor.ss_console)) {
! 200: port = i + 1;
! 201: break;
! 202: }
! 203:
! 204: if (port == 0) {
! 205: /*
! 206: * Graphics console
! 207: */
! 208:
! 209: for (port = i = 0; i < MAX_GRAPHICS; i++)
! 210: if (MATCH(graphics[i].dp, sstor.ss_console)) {
! 211: port = i;
! 212: break;
! 213: }
! 214:
! 215: /*
! 216: * If the console could still not be identified, consider
! 217: * it is a simplified encoding for the default graphics
! 218: * console. Hence port == 0, no need to check.
! 219: */
! 220: if (port == 0)
! 221: printf("graphics");
! 222: else
! 223: printf("graphics_%d", port);
! 224:
! 225: mode = sstor.ss_console.dp_layers[0];
! 226: if (mode != 0)
! 227: printf(".%d", mode);
! 228: } else {
! 229: /*
! 230: * Serial console
! 231: */
! 232:
! 233: if (port == 1)
! 234: printf("rs232");
! 235: else
! 236: printf("rs232_%d", port);
! 237:
! 238: speed = PZL_SPEED(sstor.ss_console.dp_layers[0]);
! 239: printf(".%d", i_speeds[speed]);
! 240:
! 241: bits = PZL_BITS(sstor.ss_console.dp_layers[0]);
! 242: printf(".%d", bits);
! 243:
! 244: parity = PZL_PARITY(sstor.ss_console.dp_layers[0]);
! 245: printf(".%s", parities[parity]);
! 246: }
! 247:
! 248: printf("\n");
! 249: }
! 250:
! 251: int
! 252: set_graphics(console, port, arg)
! 253: struct device_path *console;
! 254: int port;
! 255: char *arg;
! 256: {
! 257: int maxmode, mode = 0;
! 258: char *digit;
! 259:
! 260: /* head */
! 261: if (graphics[port].type == 0) {
! 262: printf("no such device found\n");
! 263: return 0;
! 264: }
! 265:
! 266: /* mode */
! 267: if (arg != NULL) {
! 268: for (digit = arg; *digit != '\0'; digit++) {
! 269: if (*digit >= '0' && *digit <= '9')
! 270: mode = 10 * mode + (*digit - '0');
! 271: else {
! 272: printf("invalid mode specification, %s\n",
! 273: arg);
! 274: return 0;
! 275: }
! 276: }
! 277:
! 278: if (mode <= 0) {
! 279: printf("invalid mode specification, %s\n",
! 280: arg);
! 281: return 0;
! 282: }
! 283: }
! 284:
! 285: /*
! 286: * If we are just changing the mode of the same graphics
! 287: * console, check that our mode is in the valid range.
! 288: */
! 289: if (MATCH(graphics[port].dp, sstor.ss_console)) {
! 290: maxmode = sstor.ss_console.dp_layers[1];
! 291:
! 292: /* pick back same mode if unspecified */
! 293: if (mode == 0)
! 294: mode = sstor.ss_console.dp_layers[0];
! 295:
! 296: if (mode > maxmode) {
! 297: printf("invalid mode value, available range is 1-%d\n",
! 298: maxmode);
! 299: return 0;
! 300: }
! 301: } else {
! 302: if (mode == 0)
! 303: mode = 1;
! 304: maxmode = mode;
! 305: }
! 306:
! 307: *console = graphics[port].dp;
! 308: console->dp_layers[0] = mode;
! 309: console->dp_layers[1] = maxmode;
! 310: console->dp_layers[2] = console->dp_layers[3] =
! 311: console->dp_layers[4] = console->dp_layers[5] = 0;
! 312:
! 313: return 1;
! 314: }
! 315:
! 316: int
! 317: set_serial(console, port, arg)
! 318: struct device_path *console;
! 319: int port;
! 320: char *arg;
! 321: {
! 322: char *dot;
! 323: int i;
! 324: int speed, parity, bits;
! 325:
! 326: /* port */
! 327: port--;
! 328: if (serials[port].type == 0) {
! 329: printf("no such device found\n");
! 330: return 0;
! 331: }
! 332:
! 333: /* speed */
! 334: dot = strchr(arg, '.');
! 335: if (dot != NULL)
! 336: *dot++ = '\0';
! 337:
! 338: speed = 0;
! 339: if (arg == NULL || *arg == '\0') {
! 340: for (i = 0; i < NENTS(i_speeds); i++)
! 341: if (i_speeds[i] == 9600) {
! 342: speed = i;
! 343: break;
! 344: }
! 345: } else {
! 346: for (i = 0; i < NENTS(c_speeds); i++)
! 347: if (strcmp(arg, c_speeds[i]) == 0) {
! 348: speed = i;
! 349: break;
! 350: }
! 351: if (speed == 0) {
! 352: printf("invalid speed specification, %s\n", arg);
! 353: return 0;
! 354: }
! 355: }
! 356:
! 357: /* data bits */
! 358: arg = dot;
! 359: dot = strchr(arg, '.');
! 360:
! 361: if (arg == NULL || *arg == '\0')
! 362: bits = 8;
! 363: else {
! 364: if (dot == arg + 1)
! 365: bits = *arg - '0';
! 366: else
! 367: bits = 0;
! 368:
! 369: if (bits < 5 || bits > 8) {
! 370: printf("invalid bits specification, %s\n", arg);
! 371: return 0;
! 372: }
! 373: }
! 374: if (dot != NULL)
! 375: *dot++ = '\0';
! 376:
! 377: /* parity */
! 378: arg = dot;
! 379: if (arg == NULL || *arg == '\0')
! 380: parity = 0; /* none */
! 381: else {
! 382: parity = -1;
! 383: for (i = 0; i <= 3; i++)
! 384: if (strcmp(arg, parities[i]) == 0) {
! 385: parity = i;
! 386: break;
! 387: }
! 388: if (parity == 2)
! 389: parity = -1; /* unknown parity */
! 390: }
! 391: if (parity < 0) {
! 392: printf("invalid parity specification, %s\n", arg);
! 393: return 0;
! 394: }
! 395:
! 396: *console = serials[port].dp;
! 397: console->dp_layers[0] = PZL_ENCODE(bits, parity, speed);
! 398:
! 399: return 1;
! 400: }
! 401:
! 402: int
! 403: set_console(console)
! 404: struct device_path *console;
! 405: {
! 406: char *arg = cmd.argv[1], *dot;
! 407: int port;
! 408:
! 409: /* extract first word */
! 410: dot = strchr(arg, '.');
! 411: if (dot != NULL)
! 412: *dot++ = '\0';
! 413:
! 414: /*
! 415: * Graphics console
! 416: */
! 417: if (strcmp(arg, "graphics") == 0)
! 418: return set_graphics(console, 0, dot);
! 419: if (strncmp(arg, "graphics_", 9) == 0) {
! 420: port = arg[9] - '0';
! 421: if (port > 0 && port < MAX_GRAPHICS)
! 422: return set_graphics(console, port, dot);
! 423: }
! 424:
! 425: /*
! 426: * Serial console
! 427: */
! 428: if (strcmp(arg, "rs232") == 0)
! 429: return set_serial(console, 1, dot);
! 430: if (strncmp(arg, "rs232_", 6) == 0) {
! 431: port = arg[6] - '0';
! 432: if (port > 0 && port <= MAX_SERIALS)
! 433: return set_serial(console, port, dot);
! 434: }
! 435:
! 436: printf("invalid device specification, %s\n", arg);
! 437: return 0;
! 438: }
! 439:
! 440: int
! 441: Xconsole()
! 442: {
! 443: struct device_path console;
! 444: int rc;
! 445:
! 446: /* walk the device list if not already done */
! 447: if (walked == 0) {
! 448: bus_walk(NULL);
! 449: walked++;
! 450: }
! 451:
! 452: if (sstorsiz < CONSOLESIZE) {
! 453: printf("no console information in stable storage\n");
! 454: return 0;
! 455: }
! 456:
! 457: if (cmd.argc == 1) {
! 458: print_console();
! 459: } else {
! 460: console = sstor.ss_console;
! 461: if (set_console(&console)) {
! 462: if (memcmp(&sstor.ss_console, &console,
! 463: sizeof console) != 0) {
! 464: sstor.ss_console = console;
! 465:
! 466: /* alea jacta est */
! 467: rc = (*pdc)(PDC_STABLE, PDC_STABLE_WRITE,
! 468: CONSOLEOFFSET, &sstor.ss_console,
! 469: sizeof(sstor.ss_console));
! 470: if (rc != 0) {
! 471: printf("failed to save console settings, error %d\n",
! 472: rc);
! 473: /* read sstor again for safety */
! 474: (*pdc)(PDC_STABLE, PDC_STABLE_READ,
! 475: CONSOLEOFFSET, &sstor.ss_console,
! 476: sizeof(sstor.ss_console));
! 477: } else
! 478: printf("you will need to power-cycle "
! 479: "your machine for the changes "
! 480: "to take effect.\n");
! 481: }
! 482: print_console();
! 483: }
! 484: }
! 485:
! 486: return 0;
! 487: }
! 488:
! 489: /*
! 490: * K E Y B O A R D S E T T I N G S
! 491: */
! 492:
! 493: void
! 494: print_keyboard()
! 495: {
! 496: int type;
! 497: int i;
! 498:
! 499: #ifdef DEBUG
! 500: printf("keyboard flags %x mod %x bc %d/%d/%d/%d/%d/%d\n",
! 501: sstor.ss_keyboard.dp_flags,
! 502: sstor.ss_keyboard.dp_mod,
! 503: sstor.ss_keyboard.dp_bc[0],
! 504: sstor.ss_keyboard.dp_bc[1],
! 505: sstor.ss_keyboard.dp_bc[2],
! 506: sstor.ss_keyboard.dp_bc[3],
! 507: sstor.ss_keyboard.dp_bc[4],
! 508: sstor.ss_keyboard.dp_bc[5]);
! 509:
! 510: printf("keyboard path %x/%x/%x/%x/%x/%x\n",
! 511: sstor.ss_keyboard.dp_layers[0],
! 512: sstor.ss_keyboard.dp_layers[1],
! 513: sstor.ss_keyboard.dp_layers[2],
! 514: sstor.ss_keyboard.dp_layers[3],
! 515: sstor.ss_keyboard.dp_layers[4],
! 516: sstor.ss_keyboard.dp_layers[5]);
! 517: #endif
! 518:
! 519: printf("Keyboard path: ");
! 520:
! 521: for (type = i = 0; i < MAX_KEYBOARDS; i++)
! 522: if (MATCH(keyboards[i].dp, sstor.ss_keyboard)) {
! 523: type = keyboards[i].type;
! 524: break;
! 525: }
! 526:
! 527: switch (type) {
! 528: case HIL:
! 529: printf("hil");
! 530: break;
! 531: case PS2:
! 532: printf("ps2");
! 533: break;
! 534: default:
! 535: printf("unknown");
! 536: break;
! 537: }
! 538:
! 539: printf("\n");
! 540: }
! 541:
! 542: int
! 543: set_keyboard(keyboard)
! 544: struct device_path *keyboard;
! 545: {
! 546: int i;
! 547: char *arg = cmd.argv[1];
! 548: int type;
! 549:
! 550: if (strcmp(arg, "hil") == 0)
! 551: type = HIL;
! 552: else if (strcmp(arg, "ps2") == 0)
! 553: type = PS2;
! 554: else {
! 555: printf("invalid device specification, %s\n", arg);
! 556: return 0;
! 557: }
! 558:
! 559: for (i = 0; i < MAX_KEYBOARDS; i++)
! 560: if (keyboards[i].type == type) {
! 561: *keyboard = keyboards[i].dp;
! 562: return 1;
! 563: }
! 564:
! 565: printf("no such device found\n");
! 566: return 0;
! 567: }
! 568:
! 569: int
! 570: Xkeyboard()
! 571: {
! 572: struct device_path keyboard;
! 573: int rc;
! 574:
! 575: /* walk the device list if not already done */
! 576: if (walked == 0) {
! 577: bus_walk(NULL);
! 578: walked++;
! 579: }
! 580:
! 581: if (sstorsiz < KEYBOARDSIZE) {
! 582: printf("no keyboard information in stable storage\n");
! 583: return 0;
! 584: }
! 585:
! 586: if (cmd.argc == 1) {
! 587: print_keyboard();
! 588: } else {
! 589: keyboard = sstor.ss_keyboard;
! 590: if (set_keyboard(&keyboard)) {
! 591: if (memcmp(&sstor.ss_keyboard, &keyboard,
! 592: sizeof keyboard) != 0) {
! 593: sstor.ss_keyboard = keyboard;
! 594:
! 595: /* alea jacta est */
! 596: rc = (*pdc)(PDC_STABLE, PDC_STABLE_WRITE,
! 597: KEYBOARDOFFSET, &sstor.ss_keyboard,
! 598: sizeof(sstor.ss_keyboard));
! 599: if (rc != 0) {
! 600: printf("failed to save keyboard settings, error %d\n",
! 601: rc);
! 602: /* read sstor again for safety */
! 603: (*pdc)(PDC_STABLE, PDC_STABLE_READ,
! 604: KEYBOARDOFFSET, &sstor.ss_keyboard,
! 605: sizeof(sstor.ss_keyboard));
! 606: } else
! 607: printf("you will need to power-cycle "
! 608: "your machine for the changes "
! 609: "to take effect.\n");
! 610: }
! 611: print_keyboard();
! 612: }
! 613: }
! 614:
! 615: return 0;
! 616: }
! 617:
! 618: /*
! 619: * U T I L I T I E S
! 620: */
! 621:
! 622: /*
! 623: * Bus walker.
! 624: * This routine will walk all the modules on a given bus, registering
! 625: * serial ports, keyboard and graphics devices as they are found.
! 626: */
! 627: void
! 628: bus_walk(struct device_path *idp)
! 629: {
! 630: struct device_path dp;
! 631: struct pdc_memmap memmap;
! 632: struct iodc_data mptr;
! 633: int err, i, kluge_ps2 = 0; /* kluge, see below */
! 634:
! 635: for (i = 0; i < MAXMODBUS; i++) {
! 636:
! 637: if (idp) {
! 638: dp.dp_bc[0] = idp->dp_bc[1];
! 639: dp.dp_bc[1] = idp->dp_bc[2];
! 640: dp.dp_bc[2] = idp->dp_bc[3];
! 641: dp.dp_bc[3] = idp->dp_bc[4];
! 642: dp.dp_bc[4] = idp->dp_bc[5];
! 643: dp.dp_bc[5] = idp->dp_mod;
! 644: } else {
! 645: dp.dp_bc[0] = dp.dp_bc[1] = dp.dp_bc[2] =
! 646: dp.dp_bc[3] = dp.dp_bc[4] = dp.dp_bc[5] = -1;
! 647: }
! 648:
! 649: dp.dp_mod = i;
! 650: if ((pdc)(PDC_MEMMAP, PDC_MEMMAP_HPA, &memmap, &dp) < 0 &&
! 651: (pdc)(PDC_SYSMAP, PDC_SYSMAP_HPA, &memmap, &dp) < 0)
! 652: continue;
! 653:
! 654: if ((err = (pdc)(PDC_IODC, PDC_IODC_READ, &pdcbuf, memmap.hpa,
! 655: IODC_DATA, &mptr, sizeof(mptr))) < 0)
! 656: continue;
! 657:
! 658: #ifdef DEBUG
! 659: printf("device %d/%d/%d/%d/%d/%d "
! 660: "flags %d mod %x type %x model %x\n",
! 661: dp.dp_bc[0], dp.dp_bc[1], dp.dp_bc[2], dp.dp_bc[3],
! 662: dp.dp_bc[4], dp.dp_bc[5], dp.dp_flags, dp.dp_mod,
! 663: mptr.iodc_type, mptr.iodc_sv_model);
! 664: #endif
! 665: /*
! 666: * If the device can be considered as a valid rs232,
! 667: * graphics console or keyboard, register it.
! 668: *
! 669: * Unfortunately, devices which should be considered as
! 670: * ``main'' aren't necessarily seen first.
! 671: * The rules we try to enforce here are as follows:
! 672: * - GIO PS/2 ports wins over any other PS/2 port.
! 673: * - the first GIO serial found wins over any other
! 674: * serial port.
! 675: * The second rule is a bit tricky to achieve, since on
! 676: * some machines (for example, 715/100XC), the two serial
! 677: * ports are not seen as attached to the same busses...
! 678: */
! 679: switch (mptr.iodc_type) {
! 680: case HPPA_TYPE_BCPORT:
! 681: bus_walk(&dp);
! 682: break;
! 683: case HPPA_TYPE_BHA:
! 684: case HPPA_TYPE_BRIDGE:
! 685: /* if there was no phantomas here */
! 686: if (dp.dp_bc[5] == -1) {
! 687: dp.dp_bc[0] = dp.dp_bc[1];
! 688: dp.dp_bc[1] = dp.dp_bc[2];
! 689: dp.dp_bc[2] = dp.dp_bc[3];
! 690: dp.dp_bc[3] = dp.dp_bc[4];
! 691: dp.dp_bc[4] = dp.dp_bc[5];
! 692: dp.dp_bc[5] = dp.dp_mod;
! 693: dp.dp_mod = 0;
! 694: }
! 695: bus_walk(&dp);
! 696: break;
! 697: case HPPA_TYPE_ADIRECT:
! 698: switch (mptr.iodc_sv_model) {
! 699: case HPPA_ADIRECT_RS232:
! 700: register_device(serials, MAX_SERIALS,
! 701: &dp, &mptr, SERIAL, 0);
! 702: break;
! 703: case HPPA_ADIRECT_HIL:
! 704: register_device(keyboards, MAX_KEYBOARDS,
! 705: &dp, &mptr, HIL, 0);
! 706: break;
! 707: case HPPA_ADIRECT_PEACOCK:
! 708: case HPPA_ADIRECT_LEONARDO:
! 709: register_device(graphics, MAX_GRAPHICS,
! 710: &dp, &mptr, GRAPHICS, 0);
! 711: break;
! 712: }
! 713: break;
! 714: case HPPA_TYPE_FIO:
! 715: switch (mptr.iodc_sv_model) {
! 716: case HPPA_FIO_HIL:
! 717: register_device(keyboards, MAX_KEYBOARDS,
! 718: &dp, &mptr, HIL, 0);
! 719: break;
! 720: case HPPA_FIO_RS232:
! 721: register_device(serials, MAX_SERIALS,
! 722: &dp, &mptr, SERIAL, 0);
! 723: break;
! 724: case HPPA_FIO_DINOPCK:
! 725: register_device(keyboards, MAX_KEYBOARDS,
! 726: &dp, &mptr, PS2, 0);
! 727: break;
! 728: case HPPA_FIO_GPCIO:
! 729: /*
! 730: * KLUGE! At this point, there is no way to
! 731: * know if this port is the keyboard port or
! 732: * the mouse port.
! 733: * Let's assume the first port found is the
! 734: * keyboard, and ignore the others.
! 735: */
! 736: if (kluge_ps2 != 0)
! 737: break;
! 738: register_device(keyboards, MAX_KEYBOARDS,
! 739: &dp, &mptr, PS2, 1);
! 740: kluge_ps2++;
! 741: break;
! 742: case HPPA_FIO_GRS232:
! 743: {
! 744: int j, first;
! 745:
! 746: /*
! 747: * If a GIO serial port is already registered,
! 748: * register as extra port...
! 749: */
! 750: first = 1;
! 751: for (j = 0; j < MAX_SERIALS; j++)
! 752: if (serials[j].type == SERIAL &&
! 753: serials[j].iodc_type ==
! 754: HPPA_TYPE_FIO &&
! 755: serials[j].iodc_model ==
! 756: HPPA_FIO_GRS232) {
! 757: first = 0;
! 758: break;
! 759: }
! 760:
! 761: register_device(serials, MAX_SERIALS,
! 762: &dp, &mptr, SERIAL, first);
! 763: }
! 764: break;
! 765: case HPPA_FIO_SGC:
! 766: register_device(graphics, MAX_GRAPHICS,
! 767: &dp, &mptr, GRAPHICS, 0);
! 768: break;
! 769: case HPPA_FIO_GSGC:
! 770: register_device(graphics, MAX_GRAPHICS,
! 771: &dp, &mptr, GRAPHICS, 1);
! 772: break;
! 773: }
! 774: break;
! 775: }
! 776: }
! 777: }
! 778:
! 779: void
! 780: register_device(devlist, cnt, dp, mptr, type, first)
! 781: struct consoledev *devlist;
! 782: int cnt;
! 783: struct device_path *dp;
! 784: struct iodc_data *mptr;
! 785: int type;
! 786: int first;
! 787: {
! 788: int i;
! 789: struct consoledev *dev;
! 790:
! 791: for (i = 0, dev = devlist; i < cnt; i++, dev++)
! 792: if (dev->type == 0)
! 793: break;
! 794:
! 795: if (i == cnt) {
! 796: #ifdef DEBUG
! 797: printf("can't register device, need more room!\n");
! 798: #endif
! 799: return;
! 800: }
! 801:
! 802: /*
! 803: * If this is supposedly the main device, insert on top
! 804: */
! 805: if (first != 0) {
! 806: memcpy(devlist + 1, devlist,
! 807: (cnt - 1) * sizeof(struct consoledev));
! 808: dev = devlist;
! 809: }
! 810:
! 811: dev->dp = *dp;
! 812: dev->type = type;
! 813: dev->iodc_type = mptr->iodc_type;
! 814: dev->iodc_model = mptr->iodc_sv_model;
! 815:
! 816: #ifdef DEBUG
! 817: printf("(registered as type %d)\n", type);
! 818: #endif
! 819: }
CVSweb