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