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