141488Smckusick /*
241488Smckusick * Copyright (c) 1988 University of Utah.
3*63163Sbostic * Copyright (c) 1990, 1993
4*63163Sbostic * The Regents of the University of California. All rights reserved.
541488Smckusick *
641488Smckusick * This code is derived from software contributed to Berkeley by
741488Smckusick * the Systems Programming Group of the University of Utah Computer
841488Smckusick * Science Department.
941488Smckusick *
1041488Smckusick * %sccs.include.redist.c%
1141488Smckusick *
1254073Shibler * from: Utah $Hdr: autoconf.c 1.16 92/05/29$
1341488Smckusick *
14*63163Sbostic * @(#)autoconf.c 8.1 (Berkeley) 06/10/93
1541488Smckusick */
1641488Smckusick
1756510Sbostic #include <hp300/stand/samachdep.h>
1856510Sbostic #include <hp300/stand/rominfo.h>
1956510Sbostic #include <sys/param.h>
2056510Sbostic #include <sys/reboot.h>
2141488Smckusick
2256510Sbostic #include <hp/dev/device.h>
2356510Sbostic #include <hp/dev/grfreg.h>
2441488Smckusick
2554073Shibler /*
2654073Shibler * Mapping of ROM MSUS types to BSD major device numbers
2754073Shibler * WARNING: major numbers must match bdevsw indices in hp300/conf.c.
2854073Shibler */
2954073Shibler char rom2mdev[] = {
3054073Shibler 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-13: none */
3154073Shibler 4, /* 14: SCSI disk */
3254073Shibler 0, /* 15: none */
3354073Shibler 2, /* 16: CS/80 device on HPIB */
3454073Shibler 2, /* 17: CS/80 device on HPIB */
3554073Shibler 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 18-31: none */
3654073Shibler };
3754073Shibler
3849334Shibler struct hp_hw sc_table[MAXCTLRS];
3954073Shibler int cpuspeed;
4041488Smckusick
4142375Smckusick extern int internalhpib;
4242375Smckusick
4342375Smckusick #if 0
4442375Smckusick printrominfo()
4542375Smckusick {
4642375Smckusick struct rominfo *rp = (struct rominfo *)ROMADDR;
4754073Shibler
4842375Smckusick printf("boottype %x, name %s, lowram %x, sysflag %x\n",
4942375Smckusick rp->boottype, rp->name, rp->lowram, rp->sysflag&0xff);
5042375Smckusick printf("rambase %x, ndrives %x, sysflag2 %x, msus %x\n",
5142375Smckusick rp->rambase, rp->ndrives, rp->sysflag2&0xff, rp->msus);
5242375Smckusick }
5342375Smckusick #endif
5442375Smckusick
configure()5541488Smckusick configure()
5641488Smckusick {
5754073Shibler u_long msustobdev();
5854073Shibler
5954073Shibler switch (machineid) {
6054073Shibler case HP_320:
6154073Shibler case HP_330:
6254073Shibler case HP_340:
6354073Shibler cpuspeed = MHZ_16;
6454073Shibler break;
6554073Shibler case HP_350:
6654073Shibler case HP_360:
6754073Shibler cpuspeed = MHZ_25;
6854073Shibler break;
6954073Shibler case HP_370:
7054073Shibler cpuspeed = MHZ_33;
7154073Shibler break;
7254073Shibler case HP_375:
7354073Shibler cpuspeed = MHZ_50;
7454073Shibler break;
7554073Shibler case HP_380:
7654073Shibler cpuspeed = MHZ_25 * 2; /* XXX */
7754073Shibler break;
7857299Shibler case HP_433:
7957299Shibler cpuspeed = MHZ_33 * 2; /* XXX */
8054073Shibler break;
8157299Shibler default: /* assume the fastest (largest delay value) */
8257299Shibler cpuspeed = MHZ_50;
8357299Shibler break;
8454073Shibler }
8541488Smckusick find_devs();
8641488Smckusick cninit();
8742375Smckusick #if 0
8842375Smckusick printrominfo();
8942375Smckusick #endif
9041488Smckusick hpibinit();
9141488Smckusick scsiinit();
9254073Shibler if ((bootdev & B_MAGICMASK) != B_DEVMAGIC)
9354073Shibler bootdev = msustobdev();
9441488Smckusick }
9541488Smckusick
9654073Shibler /*
9754073Shibler * Convert HP MSUS to a valid bootdev layout:
9854073Shibler * TYPE comes from MSUS device type as mapped by rom2mdev
9954073Shibler * PARTITION is set to 0 ('a')
10054073Shibler * UNIT comes from MSUS unit (almost always 0)
10154073Shibler * CONTROLLER comes from MSUS primary address
10254073Shibler * ADAPTOR comes from SCSI/HPIB driver logical unit number
10354073Shibler * (passed back via unused hw_pa field)
10454073Shibler */
10554073Shibler u_long
msustobdev()10654073Shibler msustobdev()
10754073Shibler {
10854073Shibler struct rominfo *rp = (struct rominfo *) ROMADDR;
10954073Shibler u_long bdev = 0;
11054073Shibler register struct hp_hw *hw;
11154073Shibler int sc;
11254073Shibler
11354073Shibler sc = (rp->msus >> 8) & 0xFF;
11454073Shibler for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++)
11554073Shibler if (hw->hw_sc == sc)
11654073Shibler break;
11754073Shibler bdev |= rom2mdev[(rp->msus >> 24) & 0x1F] << B_TYPESHIFT;
11854073Shibler bdev |= 0 << B_PARTITIONSHIFT;
11954073Shibler bdev |= ((rp->msus >> 16) & 0xFF) << B_UNITSHIFT;
12054073Shibler bdev |= (rp->msus & 0xFF) << B_CONTROLLERSHIFT;
12154073Shibler bdev |= (int)hw->hw_pa << B_ADAPTORSHIFT;
12254073Shibler bdev |= B_DEVMAGIC;
12354073Shibler #if 0
12454073Shibler printf("msus %x -> bdev %x\n", rp->msus, bdev);
12554073Shibler #endif
12654073Shibler return (bdev);
12754073Shibler }
12854073Shibler
sctoaddr(sc)12941488Smckusick sctoaddr(sc)
13041488Smckusick int sc;
13141488Smckusick {
13241488Smckusick if (sc == -1)
13341488Smckusick return(GRFIADDR);
13442375Smckusick if (sc == 7 && internalhpib)
13541488Smckusick return(internalhpib);
13641488Smckusick if (sc < 32)
13749334Shibler return(DIOBASE + sc * DIOCSIZE);
13849334Shibler if (sc >= 132)
13949334Shibler return(DIOIIBASE + (sc - 132) * DIOIICSIZE);
14041488Smckusick return(sc);
14141488Smckusick }
14241488Smckusick
14341488Smckusick /*
14449334Shibler * Probe all DIO select codes (0 - 32), the internal display address,
14549334Shibler * and DIO-II select codes (132 - 256).
14645420Smckusick *
14741488Smckusick * Note that we only care about displays, SCSIs and HP-IBs.
14841488Smckusick */
find_devs()14941488Smckusick find_devs()
15041488Smckusick {
15149334Shibler short sc, sctop;
15241488Smckusick u_char *id_reg;
15349334Shibler register caddr_t addr;
15441488Smckusick register struct hp_hw *hw;
15541488Smckusick
15641488Smckusick hw = sc_table;
15749334Shibler sctop = machineid == HP_320 ? 32 : 256;
15849334Shibler for (sc = -1; sc < sctop; sc++) {
15949334Shibler if (sc >= 32 && sc < 132)
16049334Shibler continue;
16149334Shibler addr = (caddr_t) sctoaddr(sc);
16241488Smckusick if (badaddr(addr))
16341488Smckusick continue;
16441488Smckusick
16541488Smckusick id_reg = (u_char *) addr;
16654073Shibler hw->hw_pa = 0; /* XXX used to pass back LUN from driver */
16749334Shibler if (sc >= 132)
16849334Shibler hw->hw_size = (id_reg[0x101] + 1) * 0x100000;
16949334Shibler else
17049334Shibler hw->hw_size = DIOCSIZE;
17149334Shibler hw->hw_kva = addr;
17249334Shibler hw->hw_id = id_reg[1];
17341488Smckusick hw->hw_sc = sc;
17441488Smckusick
17542375Smckusick /*
17642375Smckusick * Not all internal HP-IBs respond rationally to id requests
17742375Smckusick * so we just go by the "internal HPIB" indicator in SYSFLAG.
17842375Smckusick */
17942375Smckusick if (sc == 7 && internalhpib) {
18049334Shibler hw->hw_type = C_HPIB;
18142375Smckusick hw++;
18242375Smckusick continue;
18342375Smckusick }
18442375Smckusick
18541488Smckusick switch (hw->hw_id) {
18642375Smckusick case 5: /* 98642A */
18749334Shibler case 5+128: /* 98642A remote */
18849334Shibler hw->hw_type = D_COMMDCM;
18942375Smckusick break;
19041488Smckusick case 8: /* 98625B */
19141488Smckusick case 128: /* 98624A */
19249334Shibler hw->hw_type = C_HPIB;
19341488Smckusick break;
19441488Smckusick case 57: /* Displays */
19549334Shibler hw->hw_type = D_BITMAP;
19649334Shibler hw->hw_secid = id_reg[0x15];
19749334Shibler switch (hw->hw_secid) {
19841488Smckusick case 4: /* renaissance */
19941488Smckusick case 8: /* davinci */
20041488Smckusick sc++; /* occupy 2 select codes */
20141488Smckusick break;
20241488Smckusick }
20341488Smckusick break;
20441488Smckusick case 9:
20549334Shibler hw->hw_type = D_KEYBOARD;
20641488Smckusick break;
20741488Smckusick case 7:
20849334Shibler case 7+32:
20949334Shibler case 7+64:
21049334Shibler case 7+96:
21149334Shibler hw->hw_type = C_SCSI;
21241488Smckusick break;
21341488Smckusick default: /* who cares */
21449334Shibler hw->hw_type = D_MISC;
21541488Smckusick break;
21641488Smckusick }
21741488Smckusick hw++;
21841488Smckusick }
21941488Smckusick }
220