1*ed13175aSmickey /* $OpenBSD: dev_hppa.c,v 1.6 2003/01/14 11:38:56 mickey Exp $ */ 2775f85d8Smickey 3775f85d8Smickey /* 4775f85d8Smickey * Copyright (c) 1998 Michael Shalayeff 5775f85d8Smickey * All rights reserved. 6775f85d8Smickey * 7775f85d8Smickey * Redistribution and use in source and binary forms, with or without 8775f85d8Smickey * modification, are permitted provided that the following conditions 9775f85d8Smickey * are met: 10775f85d8Smickey * 1. Redistributions of source code must retain the above copyright 11775f85d8Smickey * notice, this list of conditions and the following disclaimer. 12775f85d8Smickey * 2. Redistributions in binary form must reproduce the above copyright 13775f85d8Smickey * notice, this list of conditions and the following disclaimer in the 14775f85d8Smickey * documentation and/or other materials provided with the distribution. 15775f85d8Smickey * 3. All advertising materials mentioning features or use of this software 16775f85d8Smickey * must display the following acknowledgement: 17775f85d8Smickey * This product includes software developed by Michael Shalayeff. 18775f85d8Smickey * 4. The name of the author may not be used to endorse or promote products 19775f85d8Smickey * derived from this software without specific prior written permission. 20775f85d8Smickey * 21775f85d8Smickey * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22775f85d8Smickey * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23775f85d8Smickey * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24775f85d8Smickey * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25775f85d8Smickey * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26775f85d8Smickey * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27775f85d8Smickey * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28775f85d8Smickey * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29775f85d8Smickey * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30775f85d8Smickey * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31775f85d8Smickey * SUCH DAMAGE. 32775f85d8Smickey * 33775f85d8Smickey */ 34775f85d8Smickey 35775f85d8Smickey #include "libsa.h" 36775f85d8Smickey #include <sys/param.h> 37775f85d8Smickey #include <sys/disklabel.h> 38775f85d8Smickey #include <sys/reboot.h> 39775f85d8Smickey #include <dev/cons.h> 40775f85d8Smickey 41861d5a9aSmickey #include <machine/iomod.h> 42775f85d8Smickey 43861d5a9aSmickey #include "dev_hppa.h" 44775f85d8Smickey 45775f85d8Smickey extern int debug; 46775f85d8Smickey 47775f85d8Smickey const char cdevs[][4] = { 48775f85d8Smickey "ite", "", "", "", "", "", "", "", 49775f85d8Smickey "", "", "", "", "" 50775f85d8Smickey }; 51775f85d8Smickey const int ncdevs = NENTS(cdevs); 52775f85d8Smickey 53775f85d8Smickey const struct pdc_devs { 54775f85d8Smickey char name[3]; 55775f85d8Smickey int dev_type; 56775f85d8Smickey } pdc_devs[] = { 57775f85d8Smickey { "ct", 0 }, 5892faafdaSmickey { "dk", 1 }, 59861d5a9aSmickey { "lf", 2 }, 60775f85d8Smickey { "", -1 }, 61775f85d8Smickey { "rd", -1 }, 62775f85d8Smickey { "sw", -1 }, 63861d5a9aSmickey { "fl", -1 }, 64775f85d8Smickey }; 65775f85d8Smickey 66775f85d8Smickey /* pass dev_t to the open routines */ 67775f85d8Smickey int 68775f85d8Smickey devopen(f, fname, file) 69775f85d8Smickey struct open_file *f; 70775f85d8Smickey const char *fname; 71775f85d8Smickey char **file; 72775f85d8Smickey { 7392faafdaSmickey register struct hppa_dev *hpd; 74775f85d8Smickey register const struct pdc_devs *dp = pdc_devs; 75775f85d8Smickey register int rc = 1; 76775f85d8Smickey 77861d5a9aSmickey if (!(*file = strchr(fname, ':'))) 78861d5a9aSmickey return ENODEV; 79861d5a9aSmickey else 80861d5a9aSmickey (*file)++; 81775f85d8Smickey 8292faafdaSmickey #ifdef DEBUGBUG 83775f85d8Smickey if (debug) 84775f85d8Smickey printf("devopen: "); 85775f85d8Smickey #endif 86775f85d8Smickey 87775f85d8Smickey for (dp = pdc_devs; dp < &pdc_devs[NENTS(pdc_devs)]; dp++) 88861d5a9aSmickey if (!strncmp(fname, dp->name, sizeof(dp->name)-1)) 89775f85d8Smickey break; 90775f85d8Smickey 91775f85d8Smickey if (dp >= &pdc_devs[NENTS(pdc_devs)] || dp->dev_type < 0) 92775f85d8Smickey return ENODEV; 9392faafdaSmickey #ifdef DEBUGBUG 94861d5a9aSmickey if (debug) 95861d5a9aSmickey printf("%s\n", dp->name); 96861d5a9aSmickey #endif 97775f85d8Smickey 9892faafdaSmickey if (!(hpd = alloc(sizeof *hpd))) { 9992faafdaSmickey #ifdef DEBUG 10092faafdaSmickey printf ("devopen: no mem\n"); 10192faafdaSmickey #endif 10292faafdaSmickey } else { 10392faafdaSmickey bzero(hpd, sizeof *hpd); 10492faafdaSmickey hpd->bootdev = bootdev; 10592faafdaSmickey hpd->buf = (char *)(((u_int)hpd->ua_buf + IODC_MINIOSIZ-1) & 10692faafdaSmickey ~(IODC_MINIOSIZ-1)); 10792faafdaSmickey f->f_devdata = hpd; 108775f85d8Smickey if ((rc = (*devsw[dp->dev_type].dv_open)(f, file)) == 0) { 109775f85d8Smickey f->f_dev = &devsw[dp->dev_type]; 110775f85d8Smickey return 0; 111775f85d8Smickey } 11292faafdaSmickey free (hpd, 0); 11392faafdaSmickey f->f_devdata = NULL; 11492faafdaSmickey } 115775f85d8Smickey 116861d5a9aSmickey if (!(f->f_flags & F_NODEV)) 117775f85d8Smickey f->f_dev = &devsw[dp->dev_type]; 118775f85d8Smickey 119861d5a9aSmickey if (!f->f_devdata) 120861d5a9aSmickey *file = NULL; 121861d5a9aSmickey 122775f85d8Smickey return rc; 123775f85d8Smickey } 124775f85d8Smickey 125775f85d8Smickey void 126861d5a9aSmickey devboot(dev, p) 127861d5a9aSmickey dev_t dev; 128775f85d8Smickey char *p; 129775f85d8Smickey { 130775f85d8Smickey register const char *q; 131861d5a9aSmickey if (!dev) { 132861d5a9aSmickey int type, unit; 133861d5a9aSmickey 134861d5a9aSmickey switch (PAGE0->mem_boot.pz_class) { 135861d5a9aSmickey case PCL_RANDOM: 136bfaa29ecSmickey type = 1; 137861d5a9aSmickey unit = PAGE0->mem_boot.pz_layers[0]; 138861d5a9aSmickey break; 139861d5a9aSmickey case PCL_SEQU: 140bfaa29ecSmickey type = 0; 141861d5a9aSmickey unit = PAGE0->mem_boot.pz_layers[0]; 142861d5a9aSmickey break; 143861d5a9aSmickey case PCL_NET_MASK|PCL_SEQU: 144861d5a9aSmickey type = 2; 145861d5a9aSmickey unit = 0; 146861d5a9aSmickey break; 147861d5a9aSmickey default: 148861d5a9aSmickey type = 0; 149861d5a9aSmickey unit = 0; 150861d5a9aSmickey break; 151861d5a9aSmickey } 152*ed13175aSmickey dev = bootdev = MAKEBOOTDEV(type, 0, 0, unit, B_PARTITION(dev)); 153861d5a9aSmickey } 154775f85d8Smickey #ifdef _TEST 155775f85d8Smickey *p++ = '/'; 156775f85d8Smickey *p++ = 'd'; 157775f85d8Smickey *p++ = 'e'; 158775f85d8Smickey *p++ = 'v'; 159775f85d8Smickey *p++ = '/'; 160775f85d8Smickey *p++ = 'r'; 161775f85d8Smickey #endif 162775f85d8Smickey /* quick copy device name */ 163861d5a9aSmickey for (q = pdc_devs[B_TYPE(dev)].name; (*p++ = *q++);); 164861d5a9aSmickey p[-1] = '0' + B_UNIT(dev); 165861d5a9aSmickey *p++ = 'a' + B_PARTITION(dev); 166775f85d8Smickey *p = '\0'; 167775f85d8Smickey } 168775f85d8Smickey 169775f85d8Smickey int pch_pos; 170775f85d8Smickey 171775f85d8Smickey void 172775f85d8Smickey putchar(c) 173775f85d8Smickey int c; 174775f85d8Smickey { 175775f85d8Smickey switch(c) { 176775f85d8Smickey case '\177': /* DEL erases */ 177775f85d8Smickey cnputc('\b'); 178775f85d8Smickey cnputc(' '); 179775f85d8Smickey case '\b': 180775f85d8Smickey cnputc('\b'); 181775f85d8Smickey if (pch_pos) 182775f85d8Smickey pch_pos--; 183775f85d8Smickey break; 184775f85d8Smickey case '\t': 185775f85d8Smickey do 186775f85d8Smickey cnputc(' '); 187775f85d8Smickey while(++pch_pos % 8); 188775f85d8Smickey break; 189775f85d8Smickey case '\n': 190775f85d8Smickey case '\r': 191775f85d8Smickey cnputc(c); 192775f85d8Smickey pch_pos=0; 193775f85d8Smickey break; 194775f85d8Smickey default: 195775f85d8Smickey cnputc(c); 196775f85d8Smickey pch_pos++; 197775f85d8Smickey break; 198775f85d8Smickey } 199775f85d8Smickey } 200775f85d8Smickey 201775f85d8Smickey int 202775f85d8Smickey getchar() 203775f85d8Smickey { 204775f85d8Smickey register int c = cngetc(); 205775f85d8Smickey 206775f85d8Smickey if (c == '\r') 207775f85d8Smickey c = '\n'; 208775f85d8Smickey 209775f85d8Smickey if ((c < ' ' && c != '\n') || c == '\177') 210775f85d8Smickey return(c); 211775f85d8Smickey 212775f85d8Smickey putchar(c); 213775f85d8Smickey 214775f85d8Smickey return(c); 215775f85d8Smickey } 216775f85d8Smickey 217775f85d8Smickey char ttyname_buf[8]; 218775f85d8Smickey char * 219775f85d8Smickey ttyname(fd) 220775f85d8Smickey int fd; 221775f85d8Smickey { 222775f85d8Smickey sprintf(ttyname_buf, "%s%d", cdevs[major(cn_tab->cn_dev)], 223775f85d8Smickey minor(cn_tab->cn_dev)); 224775f85d8Smickey return (ttyname_buf); 225775f85d8Smickey } 226775f85d8Smickey 227775f85d8Smickey dev_t 228775f85d8Smickey ttydev(name) 229775f85d8Smickey char *name; 230775f85d8Smickey { 231775f85d8Smickey int i, unit = -1; 232775f85d8Smickey char *no = name + strlen(name) - 1; 233775f85d8Smickey 234775f85d8Smickey while (no >= name && *no >= '0' && *no <= '9') 235775f85d8Smickey unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0'; 236775f85d8Smickey if (no < name || unit < 0) 237775f85d8Smickey return (NODEV); 238775f85d8Smickey for (i = 0; i < ncdevs; i++) 239775f85d8Smickey if (strncmp(name, cdevs[i], no - name + 1) == 0) 240775f85d8Smickey return (makedev(i, unit)); 241775f85d8Smickey return (NODEV); 242775f85d8Smickey } 243