dev_hppa.c revision 1.2.10.2 1 1.2.10.2 tls /* $NetBSD: dev_hppa.c,v 1.2.10.2 2014/08/20 00:03:05 tls Exp $ */
2 1.2.10.2 tls
3 1.2.10.2 tls /* $OpenBSD: dev_hppa.c,v 1.5 1999/04/20 20:01:01 mickey Exp $ */
4 1.2.10.2 tls
5 1.2.10.2 tls /*
6 1.2.10.2 tls * Copyright (c) 1998-2004 Michael Shalayeff
7 1.2.10.2 tls * All rights reserved.
8 1.2.10.2 tls *
9 1.2.10.2 tls * Redistribution and use in source and binary forms, with or without
10 1.2.10.2 tls * modification, are permitted provided that the following conditions
11 1.2.10.2 tls * are met:
12 1.2.10.2 tls * 1. Redistributions of source code must retain the above copyright
13 1.2.10.2 tls * notice, this list of conditions and the following disclaimer.
14 1.2.10.2 tls * 2. Redistributions in binary form must reproduce the above copyright
15 1.2.10.2 tls * notice, this list of conditions and the following disclaimer in the
16 1.2.10.2 tls * documentation and/or other materials provided with the distribution.
17 1.2.10.2 tls *
18 1.2.10.2 tls * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 1.2.10.2 tls * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 1.2.10.2 tls * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 1.2.10.2 tls * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
22 1.2.10.2 tls * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 1.2.10.2 tls * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 1.2.10.2 tls * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 1.2.10.2 tls * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 1.2.10.2 tls * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27 1.2.10.2 tls * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28 1.2.10.2 tls * THE POSSIBILITY OF SUCH DAMAGE.
29 1.2.10.2 tls *
30 1.2.10.2 tls */
31 1.2.10.2 tls
32 1.2.10.2 tls #include "libsa.h"
33 1.2.10.2 tls #include <sys/param.h>
34 1.2.10.2 tls #include <sys/disklabel.h>
35 1.2.10.2 tls #include <sys/reboot.h>
36 1.2.10.2 tls #include <dev/cons.h>
37 1.2.10.2 tls
38 1.2.10.2 tls #include <machine/iomod.h>
39 1.2.10.2 tls
40 1.2.10.2 tls #include "dev_hppa.h"
41 1.2.10.2 tls
42 1.2.10.2 tls extern int debug;
43 1.2.10.2 tls
44 1.2.10.2 tls const char cdevs[][4] = {
45 1.2.10.2 tls "ite", "", "", "", "", "", "", "",
46 1.2.10.2 tls "", "", "", "", ""
47 1.2.10.2 tls };
48 1.2.10.2 tls const int ncdevs = NENTS(cdevs);
49 1.2.10.2 tls
50 1.2.10.2 tls const struct pdc_devs {
51 1.2.10.2 tls char name[3];
52 1.2.10.2 tls int dev_type;
53 1.2.10.2 tls } pdc_devs[] = {
54 1.2.10.2 tls { "dk", 0 },
55 1.2.10.2 tls { "ct", 1 },
56 1.2.10.2 tls { "lf", 2 },
57 1.2.10.2 tls { "", -1 },
58 1.2.10.2 tls { "rd", -1 },
59 1.2.10.2 tls { "sw", -1 },
60 1.2.10.2 tls { "fl", -1 },
61 1.2.10.2 tls };
62 1.2.10.2 tls
63 1.2.10.2 tls /* pass dev_t to the open routines */
64 1.2.10.2 tls int
65 1.2.10.2 tls devopen(struct open_file *f, const char *fname, char **file)
66 1.2.10.2 tls {
67 1.2.10.2 tls struct hppa_dev *hpd;
68 1.2.10.2 tls const struct pdc_devs *dp = pdc_devs;
69 1.2.10.2 tls int bdev, badapt, bctlr, bunit, bpart;
70 1.2.10.2 tls unsigned long n;
71 1.2.10.2 tls char *p;
72 1.2.10.2 tls int rc = 1;
73 1.2.10.2 tls
74 1.2.10.2 tls if (!(*file = strchr(fname, ':')))
75 1.2.10.2 tls return ENODEV;
76 1.2.10.2 tls else
77 1.2.10.2 tls (*file)++;
78 1.2.10.2 tls
79 1.2.10.2 tls #ifdef DEBUGBUG
80 1.2.10.2 tls if (debug)
81 1.2.10.2 tls printf("devopen: ");
82 1.2.10.2 tls #endif
83 1.2.10.2 tls
84 1.2.10.2 tls for (dp = pdc_devs; dp < &pdc_devs[NENTS(pdc_devs)]; dp++)
85 1.2.10.2 tls if (!strncmp(fname, dp->name, sizeof(dp->name)-1))
86 1.2.10.2 tls break;
87 1.2.10.2 tls
88 1.2.10.2 tls if (dp >= &pdc_devs[NENTS(pdc_devs)] || dp->dev_type < 0)
89 1.2.10.2 tls return ENODEV;
90 1.2.10.2 tls bdev = dp->dev_type;
91 1.2.10.2 tls n = strtoul(fname + sizeof(dp->name)-1, &p, 10);
92 1.2.10.2 tls if (n == ULONG_MAX)
93 1.2.10.2 tls return ENODEV;
94 1.2.10.2 tls bunit = n & 0xf;
95 1.2.10.2 tls bctlr = (n >> 4) & 0xf;
96 1.2.10.2 tls badapt = (n >> 8) & 0xf;
97 1.2.10.2 tls if (*p >= 'a' && *p < 'a' + MAXPARTITIONS) {
98 1.2.10.2 tls bpart = *p - 'a';
99 1.2.10.2 tls } else {
100 1.2.10.2 tls bpart = 0;
101 1.2.10.2 tls }
102 1.2.10.2 tls bootdev = MAKEBOOTDEV(bdev, badapt, bctlr, bunit, bpart);
103 1.2.10.2 tls
104 1.2.10.2 tls #ifdef DEBUGBUG
105 1.2.10.2 tls if (debug)
106 1.2.10.2 tls printf("%s\n", dp->name);
107 1.2.10.2 tls #endif
108 1.2.10.2 tls
109 1.2.10.2 tls if (!(hpd = alloc(sizeof *hpd))) {
110 1.2.10.2 tls #ifdef DEBUG
111 1.2.10.2 tls printf ("devopen: no mem\n");
112 1.2.10.2 tls #endif
113 1.2.10.2 tls } else {
114 1.2.10.2 tls memset(hpd, 0, sizeof *hpd);
115 1.2.10.2 tls hpd->bootdev = bootdev;
116 1.2.10.2 tls hpd->buf = (char *)(((u_int)hpd->ua_buf + IODC_MINIOSIZ-1) &
117 1.2.10.2 tls ~(IODC_MINIOSIZ-1));
118 1.2.10.2 tls f->f_devdata = hpd;
119 1.2.10.2 tls if ((rc = (*devsw[dp->dev_type].dv_open)(f, file)) == 0) {
120 1.2.10.2 tls f->f_dev = &devsw[dp->dev_type];
121 1.2.10.2 tls return 0;
122 1.2.10.2 tls }
123 1.2.10.2 tls dealloc (hpd, 0);
124 1.2.10.2 tls f->f_devdata = NULL;
125 1.2.10.2 tls }
126 1.2.10.2 tls
127 1.2.10.2 tls if (!(f->f_flags & F_NODEV))
128 1.2.10.2 tls f->f_dev = &devsw[dp->dev_type];
129 1.2.10.2 tls
130 1.2.10.2 tls if (!f->f_devdata)
131 1.2.10.2 tls *file = NULL;
132 1.2.10.2 tls
133 1.2.10.2 tls return rc;
134 1.2.10.2 tls }
135 1.2.10.2 tls
136 1.2.10.2 tls void
137 1.2.10.2 tls devboot(btdev_t dev, char *p)
138 1.2.10.2 tls {
139 1.2.10.2 tls const char *q;
140 1.2.10.2 tls if (!dev) {
141 1.2.10.2 tls int type, unit;
142 1.2.10.2 tls
143 1.2.10.2 tls switch (PAGE0->mem_boot.pz_class) {
144 1.2.10.2 tls case PCL_RANDOM:
145 1.2.10.2 tls type = 0;
146 1.2.10.2 tls unit = PAGE0->mem_boot.pz_layers[0];
147 1.2.10.2 tls break;
148 1.2.10.2 tls case PCL_SEQU:
149 1.2.10.2 tls type = 1;
150 1.2.10.2 tls unit = PAGE0->mem_boot.pz_layers[0];
151 1.2.10.2 tls break;
152 1.2.10.2 tls case PCL_NET_MASK|PCL_SEQU:
153 1.2.10.2 tls type = 2;
154 1.2.10.2 tls unit = 0;
155 1.2.10.2 tls break;
156 1.2.10.2 tls default:
157 1.2.10.2 tls type = 0;
158 1.2.10.2 tls unit = 0;
159 1.2.10.2 tls break;
160 1.2.10.2 tls }
161 1.2.10.2 tls dev = bootdev = MAKEBOOTDEV(type, 0, 0, unit, 0);
162 1.2.10.2 tls }
163 1.2.10.2 tls #ifdef _TEST
164 1.2.10.2 tls *p++ = '/';
165 1.2.10.2 tls *p++ = 'd';
166 1.2.10.2 tls *p++ = 'e';
167 1.2.10.2 tls *p++ = 'v';
168 1.2.10.2 tls *p++ = '/';
169 1.2.10.2 tls *p++ = 'r';
170 1.2.10.2 tls #endif
171 1.2.10.2 tls /* quick copy device name */
172 1.2.10.2 tls for (q = pdc_devs[B_TYPE(dev)].name; (*p++ = *q++););
173 1.2.10.2 tls p[-1] = '0' + B_UNIT(dev);
174 1.2.10.2 tls *p++ = 'a' + B_PARTITION(dev);
175 1.2.10.2 tls *p = '\0';
176 1.2.10.2 tls }
177 1.2.10.2 tls
178 1.2.10.2 tls int pch_pos;
179 1.2.10.2 tls
180 1.2.10.2 tls void
181 1.2.10.2 tls putchar(int c)
182 1.2.10.2 tls {
183 1.2.10.2 tls switch(c) {
184 1.2.10.2 tls case '\177': /* DEL erases */
185 1.2.10.2 tls cnputc('\b');
186 1.2.10.2 tls cnputc(' ');
187 1.2.10.2 tls case '\b':
188 1.2.10.2 tls cnputc('\b');
189 1.2.10.2 tls if (pch_pos)
190 1.2.10.2 tls pch_pos--;
191 1.2.10.2 tls break;
192 1.2.10.2 tls case '\t':
193 1.2.10.2 tls do
194 1.2.10.2 tls cnputc(' ');
195 1.2.10.2 tls while(++pch_pos % 8);
196 1.2.10.2 tls break;
197 1.2.10.2 tls case '\n':
198 1.2.10.2 tls /*
199 1.2.10.2 tls * XXX fredette - probably only necessary
200 1.2.10.2 tls * when using a serial console?
201 1.2.10.2 tls */
202 1.2.10.2 tls cnputc(c);
203 1.2.10.2 tls c = '\r';
204 1.2.10.2 tls /* FALLTHROUGH */
205 1.2.10.2 tls case '\r':
206 1.2.10.2 tls cnputc(c);
207 1.2.10.2 tls pch_pos=0;
208 1.2.10.2 tls break;
209 1.2.10.2 tls default:
210 1.2.10.2 tls cnputc(c);
211 1.2.10.2 tls pch_pos++;
212 1.2.10.2 tls break;
213 1.2.10.2 tls }
214 1.2.10.2 tls }
215 1.2.10.2 tls
216 1.2.10.2 tls int
217 1.2.10.2 tls getchar(void)
218 1.2.10.2 tls {
219 1.2.10.2 tls int c = cngetc();
220 1.2.10.2 tls
221 1.2.10.2 tls if (c == '\r')
222 1.2.10.2 tls c = '\n';
223 1.2.10.2 tls
224 1.2.10.2 tls if ((c < ' ' && c != '\n') || c == '\177')
225 1.2.10.2 tls return(c);
226 1.2.10.2 tls
227 1.2.10.2 tls /*
228 1.2.10.2 tls * XXX fredette - probably only unnecessary
229 1.2.10.2 tls * when using a serial console?
230 1.2.10.2 tls */
231 1.2.10.2 tls #if 0
232 1.2.10.2 tls putchar(c);
233 1.2.10.2 tls #endif
234 1.2.10.2 tls
235 1.2.10.2 tls return(c);
236 1.2.10.2 tls }
237 1.2.10.2 tls
238 1.2.10.2 tls int
239 1.2.10.2 tls tgetchar(void)
240 1.2.10.2 tls {
241 1.2.10.2 tls int c;
242 1.2.10.2 tls
243 1.2.10.2 tls if ((c = tcngetc()) == 0)
244 1.2.10.2 tls return(0);
245 1.2.10.2 tls return(getchar());
246 1.2.10.2 tls }
247 1.2.10.2 tls
248 1.2.10.2 tls #if 0
249 1.2.10.2 tls char ttyname_buf[8];
250 1.2.10.2 tls char *
251 1.2.10.2 tls ttyname(int fd)
252 1.2.10.2 tls {
253 1.2.10.2 tls snprintf(ttyname_buf, sizeof(ttyname_buf), "%s%d",
254 1.2.10.2 tls cdevs[major(cn_tab->cn_dev)],
255 1.2.10.2 tls minor(cn_tab->cn_dev));
256 1.2.10.2 tls return (ttyname_buf);
257 1.2.10.2 tls }
258 1.2.10.2 tls
259 1.2.10.2 tls dev_t
260 1.2.10.2 tls ttydev(char *name)
261 1.2.10.2 tls {
262 1.2.10.2 tls int i, unit = -1;
263 1.2.10.2 tls char *no = name + strlen(name) - 1;
264 1.2.10.2 tls
265 1.2.10.2 tls while (no >= name && *no >= '0' && *no <= '9')
266 1.2.10.2 tls unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
267 1.2.10.2 tls if (no < name || unit < 0)
268 1.2.10.2 tls return (NODEV);
269 1.2.10.2 tls for (i = 0; i < ncdevs; i++)
270 1.2.10.2 tls if (strncmp(name, cdevs[i], no - name + 1) == 0)
271 1.2.10.2 tls return (makedev(i, unit));
272 1.2.10.2 tls return (NODEV);
273 1.2.10.2 tls }
274 1.2.10.2 tls #endif
275