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