xref: /openbsd/sys/arch/hppa/stand/libsa/dev_hppa.c (revision ed13175a)
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