xref: /openbsd/sys/arch/hppa/stand/libsa/dev_hppa.c (revision 9e6efb0a)
1 /*	$OpenBSD: dev_hppa.c,v 1.18 2024/04/14 03:26:25 jsg Exp $	*/
2 
3 /*
4  * Copyright (c) 1998-2004 Michael Shalayeff
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 #include "libsa.h"
30 #include <sys/param.h>
31 #include <sys/disklabel.h>
32 #include <sys/reboot.h>
33 #include <dev/cons.h>
34 
35 #include <machine/iomod.h>
36 
37 #include "dev_hppa.h"
38 
39 extern int debug;
40 
41 const char cdevs[][4] = {
42 	"ite", "", "", "", "", "", "", "",
43 	"", "", "", "", ""
44 };
45 const int ncdevs = nitems(cdevs);
46 
47 const struct pdc_devs {
48 	char	name[3];
49 	int	dev_type;
50 } pdc_devs[] = {
51 	{ "dk",  0 },
52 	{ "ct",  1 },
53 	{ "lf",  2 },
54 	{ "",   -1 },
55 	{ "rd", -1 },
56 	{ "sw", -1 },
57 	{ "fl", -1 },
58 };
59 
60 /* pass dev_t to the open routines */
61 int
62 devopen(f, fname, file)
63 	struct open_file *f;
64 	const char *fname;
65 	char **file;
66 {
67 	struct hppa_dev *hpd;
68 	const struct pdc_devs *dp = pdc_devs;
69 	int rc = 1;
70 
71 	if (!(*file = strchr(fname, ':')))
72 		return ENODEV;
73 	else
74 		(*file)++;
75 
76 #ifdef DEBUG
77 	if (debug)
78 		printf("devopen: ");
79 #endif
80 
81 	for (dp = pdc_devs; dp < &pdc_devs[nitems(pdc_devs)]; dp++)
82 		if (!strncmp(fname, dp->name, sizeof(dp->name)-1))
83 			break;
84 
85 	if (dp >= &pdc_devs[nitems(pdc_devs)] || dp->dev_type < 0)
86 		return ENODEV;
87 #ifdef DEBUG
88 	if (debug)
89 		printf("%s\n", dp->name);
90 #endif
91 
92 	if (!(hpd = alloc(sizeof *hpd))) {
93 #ifdef DEBUG
94 		printf ("devopen: no mem\n");
95 #endif
96 	} else {
97 		bzero(hpd, sizeof *hpd);
98 		hpd->bootdev = bootdev;
99 		hpd->buf = (char *)(((u_int)hpd->ua_buf + IODC_MINIOSIZ-1) &
100 			~(IODC_MINIOSIZ-1));
101 		f->f_devdata = hpd;
102 		if ((rc = (*devsw[dp->dev_type].dv_open)(f, file)) == 0) {
103 			f->f_dev = &devsw[dp->dev_type];
104 			return 0;
105 		}
106 		free (hpd, 0);
107 		f->f_devdata = NULL;
108 	}
109 
110 	if (!(f->f_flags & F_NODEV))
111 		f->f_dev = &devsw[dp->dev_type];
112 
113 	if (!f->f_devdata)
114 		*file = NULL;
115 
116 	return rc;
117 }
118 
119 void
120 devboot(dev, p)
121 	dev_t dev;
122 	char *p;
123 {
124 	const char *q;
125 	int unit;
126 
127 	if (!dev) {
128 		int type;
129 
130 		switch (PAGE0->mem_boot.pz_class) {
131 		case PCL_RANDOM:
132 			type = 0;
133 			unit = PAGE0->mem_boot.pz_layers[0];
134 			break;
135 		case PCL_SEQU:
136 			type = 1;
137 			unit = PAGE0->mem_boot.pz_layers[0];
138 			break;
139 		case PCL_NET_MASK|PCL_SEQU:
140 			type = 2;
141 			unit = 0;
142 			break;
143 		default:
144 			type = 0;
145 			unit = 0;
146 			break;
147 		}
148 		dev = bootdev = MAKEBOOTDEV(type, 0, 0, unit, B_PARTITION(dev));
149 	}
150 #ifdef _TEST
151 	*p++ = '/';
152 	*p++ = 'd';
153 	*p++ = 'e';
154 	*p++ = 'v';
155 	*p++ = '/';
156 	*p++ = 'r';
157 #endif
158 	/* quick copy device name */
159 	for (q = pdc_devs[B_TYPE(dev)].name; (*p++ = *q++);)
160 		;
161 	unit = B_UNIT(dev);
162 	if (unit >= 10) {
163 		p[-1] = '0' + unit / 10;
164 		*p++ = '0' + (unit % 10);
165 	} else
166 		p[-1] = '0' + unit;
167 	*p++ = 'a' + B_PARTITION(dev);
168 	*p = '\0';
169 }
170 
171 char ttyname_buf[8];
172 
173 char *
174 ttyname(fd)
175 	int fd;
176 {
177 	snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
178 	    cdevs[major(cn_tab->cn_dev)],
179 	    minor(cn_tab->cn_dev));
180 	return (ttyname_buf);
181 }
182 
183 dev_t
184 ttydev(name)
185 	char *name;
186 {
187 	int i, unit = -1;
188 	char *no = name + strlen(name) - 1;
189 
190 	while (no >= name && *no >= '0' && *no <= '9')
191 		unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
192 	if (no < name || unit < 0)
193 		return (NODEV);
194 	for (i = 0; i < ncdevs; i++)
195 		if (strncmp(name, cdevs[i], no - name + 1) == 0)
196 			return (makedev(i, unit));
197 	return (NODEV);
198 }
199