xref: /openbsd/sys/arch/hppa/stand/libsa/dev_hppa.c (revision 36dba039)
1*36dba039Sjsg /*	$OpenBSD: dev_hppa.c,v 1.18 2024/04/14 03:26:25 jsg Exp $	*/
2775f85d8Smickey 
3775f85d8Smickey /*
4fef2e65fSmickey  * Copyright (c) 1998-2004 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  *
16775f85d8Smickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17fef2e65fSmickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18fef2e65fSmickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19fef2e65fSmickey  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20fef2e65fSmickey  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21fef2e65fSmickey  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22fef2e65fSmickey  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23fef2e65fSmickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24fef2e65fSmickey  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25fef2e65fSmickey  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26fef2e65fSmickey  * THE POSSIBILITY OF SUCH DAMAGE.
27775f85d8Smickey  */
28775f85d8Smickey 
29775f85d8Smickey #include "libsa.h"
30775f85d8Smickey #include <sys/param.h>
31775f85d8Smickey #include <sys/disklabel.h>
32775f85d8Smickey #include <sys/reboot.h>
33775f85d8Smickey #include <dev/cons.h>
34775f85d8Smickey 
35861d5a9aSmickey #include <machine/iomod.h>
36775f85d8Smickey 
37861d5a9aSmickey #include "dev_hppa.h"
38775f85d8Smickey 
39775f85d8Smickey extern int debug;
40775f85d8Smickey 
41775f85d8Smickey const char cdevs[][4] = {
42775f85d8Smickey 	"ite", "", "", "", "", "", "", "",
43775f85d8Smickey 	"", "", "", "", ""
44775f85d8Smickey };
45cf92b8d0Sjasper const int ncdevs = nitems(cdevs);
46775f85d8Smickey 
47775f85d8Smickey const struct pdc_devs {
48775f85d8Smickey 	char	name[3];
49775f85d8Smickey 	int	dev_type;
50775f85d8Smickey } pdc_devs[] = {
514d145fc6Smickey 	{ "dk",  0 },
524d145fc6Smickey 	{ "ct",  1 },
53861d5a9aSmickey 	{ "lf",  2 },
54775f85d8Smickey 	{ "",   -1 },
55775f85d8Smickey 	{ "rd", -1 },
56775f85d8Smickey 	{ "sw", -1 },
57861d5a9aSmickey 	{ "fl", -1 },
58775f85d8Smickey };
59775f85d8Smickey 
60775f85d8Smickey /* pass dev_t to the open routines */
61775f85d8Smickey int
devopen(f,fname,file)62775f85d8Smickey devopen(f, fname, file)
63775f85d8Smickey 	struct open_file *f;
64775f85d8Smickey 	const char *fname;
65775f85d8Smickey 	char **file;
66775f85d8Smickey {
6749629e33Smickey 	struct hppa_dev *hpd;
6849629e33Smickey 	const struct pdc_devs *dp = pdc_devs;
6949629e33Smickey 	int rc = 1;
70775f85d8Smickey 
71861d5a9aSmickey 	if (!(*file = strchr(fname, ':')))
72861d5a9aSmickey 		return ENODEV;
73861d5a9aSmickey 	else
74861d5a9aSmickey 		(*file)++;
75775f85d8Smickey 
76acec6f8fSmiod #ifdef DEBUG
77775f85d8Smickey 	if (debug)
78775f85d8Smickey 		printf("devopen: ");
79775f85d8Smickey #endif
80775f85d8Smickey 
81cf92b8d0Sjasper 	for (dp = pdc_devs; dp < &pdc_devs[nitems(pdc_devs)]; dp++)
82861d5a9aSmickey 		if (!strncmp(fname, dp->name, sizeof(dp->name)-1))
83775f85d8Smickey 			break;
84775f85d8Smickey 
85cf92b8d0Sjasper 	if (dp >= &pdc_devs[nitems(pdc_devs)] || dp->dev_type < 0)
86775f85d8Smickey 		return ENODEV;
87acec6f8fSmiod #ifdef DEBUG
88861d5a9aSmickey 	if (debug)
89861d5a9aSmickey 		printf("%s\n", dp->name);
90861d5a9aSmickey #endif
91775f85d8Smickey 
9292faafdaSmickey 	if (!(hpd = alloc(sizeof *hpd))) {
9392faafdaSmickey #ifdef DEBUG
9492faafdaSmickey 		printf ("devopen: no mem\n");
9592faafdaSmickey #endif
9692faafdaSmickey 	} else {
9792faafdaSmickey 		bzero(hpd, sizeof *hpd);
9892faafdaSmickey 		hpd->bootdev = bootdev;
9992faafdaSmickey 		hpd->buf = (char *)(((u_int)hpd->ua_buf + IODC_MINIOSIZ-1) &
10092faafdaSmickey 			~(IODC_MINIOSIZ-1));
10192faafdaSmickey 		f->f_devdata = hpd;
102775f85d8Smickey 		if ((rc = (*devsw[dp->dev_type].dv_open)(f, file)) == 0) {
103775f85d8Smickey 			f->f_dev = &devsw[dp->dev_type];
104775f85d8Smickey 			return 0;
105775f85d8Smickey 		}
10692faafdaSmickey 		free (hpd, 0);
10792faafdaSmickey 		f->f_devdata = NULL;
10892faafdaSmickey 	}
109775f85d8Smickey 
110861d5a9aSmickey 	if (!(f->f_flags & F_NODEV))
111775f85d8Smickey 		f->f_dev = &devsw[dp->dev_type];
112775f85d8Smickey 
113861d5a9aSmickey 	if (!f->f_devdata)
114861d5a9aSmickey 		*file = NULL;
115861d5a9aSmickey 
116775f85d8Smickey 	return rc;
117775f85d8Smickey }
118775f85d8Smickey 
119775f85d8Smickey void
devboot(dev,p)120861d5a9aSmickey devboot(dev, p)
121861d5a9aSmickey 	dev_t dev;
122775f85d8Smickey 	char *p;
123775f85d8Smickey {
12449629e33Smickey 	const char *q;
125e99050a3Smiod 	int unit;
126e99050a3Smiod 
127861d5a9aSmickey 	if (!dev) {
128e99050a3Smiod 		int type;
129861d5a9aSmickey 
130861d5a9aSmickey 		switch (PAGE0->mem_boot.pz_class) {
131861d5a9aSmickey 		case PCL_RANDOM:
1324d145fc6Smickey 			type = 0;
133861d5a9aSmickey 			unit = PAGE0->mem_boot.pz_layers[0];
134861d5a9aSmickey 			break;
135861d5a9aSmickey 		case PCL_SEQU:
1364d145fc6Smickey 			type = 1;
137861d5a9aSmickey 			unit = PAGE0->mem_boot.pz_layers[0];
138861d5a9aSmickey 			break;
139861d5a9aSmickey 		case PCL_NET_MASK|PCL_SEQU:
140861d5a9aSmickey 			type = 2;
141861d5a9aSmickey 			unit = 0;
142861d5a9aSmickey 			break;
143861d5a9aSmickey 		default:
144861d5a9aSmickey 			type = 0;
145861d5a9aSmickey 			unit = 0;
146861d5a9aSmickey 			break;
147861d5a9aSmickey 		}
148ed13175aSmickey 		dev = bootdev = MAKEBOOTDEV(type, 0, 0, unit, B_PARTITION(dev));
149861d5a9aSmickey 	}
150775f85d8Smickey #ifdef _TEST
151775f85d8Smickey 	*p++ = '/';
152775f85d8Smickey 	*p++ = 'd';
153775f85d8Smickey 	*p++ = 'e';
154775f85d8Smickey 	*p++ = 'v';
155775f85d8Smickey 	*p++ = '/';
156775f85d8Smickey 	*p++ = 'r';
157775f85d8Smickey #endif
158775f85d8Smickey 	/* quick copy device name */
159*36dba039Sjsg 	for (q = pdc_devs[B_TYPE(dev)].name; (*p++ = *q++);)
160*36dba039Sjsg 		;
161e99050a3Smiod 	unit = B_UNIT(dev);
162e99050a3Smiod 	if (unit >= 10) {
163e99050a3Smiod 		p[-1] = '0' + unit / 10;
164e99050a3Smiod 		*p++ = '0' + (unit % 10);
165e99050a3Smiod 	} else
166e99050a3Smiod 		p[-1] = '0' + unit;
167861d5a9aSmickey 	*p++ = 'a' + B_PARTITION(dev);
168775f85d8Smickey 	*p = '\0';
169775f85d8Smickey }
170775f85d8Smickey 
171775f85d8Smickey char ttyname_buf[8];
1723052da24Sjasper 
173775f85d8Smickey char *
ttyname(fd)174775f85d8Smickey ttyname(fd)
175775f85d8Smickey 	int fd;
176775f85d8Smickey {
1771ee9984cSderaadt 	snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
1781ee9984cSderaadt 	    cdevs[major(cn_tab->cn_dev)],
179775f85d8Smickey 	    minor(cn_tab->cn_dev));
180775f85d8Smickey 	return (ttyname_buf);
181775f85d8Smickey }
182775f85d8Smickey 
183775f85d8Smickey dev_t
ttydev(name)184775f85d8Smickey ttydev(name)
185775f85d8Smickey 	char *name;
186775f85d8Smickey {
187775f85d8Smickey 	int i, unit = -1;
188775f85d8Smickey 	char *no = name + strlen(name) - 1;
189775f85d8Smickey 
190775f85d8Smickey 	while (no >= name && *no >= '0' && *no <= '9')
191775f85d8Smickey 		unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
192775f85d8Smickey 	if (no < name || unit < 0)
193775f85d8Smickey 		return (NODEV);
194775f85d8Smickey 	for (i = 0; i < ncdevs; i++)
195775f85d8Smickey 		if (strncmp(name, cdevs[i], no - name + 1) == 0)
196775f85d8Smickey 			return (makedev(i, unit));
197775f85d8Smickey 	return (NODEV);
198775f85d8Smickey }
199