1*539ffff0Sskrll /* $NetBSD: pdc.c,v 1.4 2019/04/15 20:40:37 skrll Exp $ */
26d3ceb1dSskrll
36d3ceb1dSskrll /* $OpenBSD: pdc.c,v 1.14 2001/04/29 21:05:43 mickey Exp $ */
46d3ceb1dSskrll
56d3ceb1dSskrll /*
66d3ceb1dSskrll * Copyright (c) 1998-2003 Michael Shalayeff
76d3ceb1dSskrll * All rights reserved.
86d3ceb1dSskrll *
96d3ceb1dSskrll * Redistribution and use in source and binary forms, with or without
106d3ceb1dSskrll * modification, are permitted provided that the following conditions
116d3ceb1dSskrll * are met:
126d3ceb1dSskrll * 1. Redistributions of source code must retain the above copyright
136d3ceb1dSskrll * notice, this list of conditions and the following disclaimer.
146d3ceb1dSskrll * 2. Redistributions in binary form must reproduce the above copyright
156d3ceb1dSskrll * notice, this list of conditions and the following disclaimer in the
166d3ceb1dSskrll * documentation and/or other materials provided with the distribution.
176d3ceb1dSskrll *
186d3ceb1dSskrll * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
196d3ceb1dSskrll * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
206d3ceb1dSskrll * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
216d3ceb1dSskrll * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
226d3ceb1dSskrll * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
236d3ceb1dSskrll * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
246d3ceb1dSskrll * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
256d3ceb1dSskrll * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
266d3ceb1dSskrll * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
276d3ceb1dSskrll * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
286d3ceb1dSskrll * THE POSSIBILITY OF SUCH DAMAGE.
296d3ceb1dSskrll */
306d3ceb1dSskrll
316d3ceb1dSskrll #include <sys/cdefs.h>
32*539ffff0Sskrll __KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.4 2019/04/15 20:40:37 skrll Exp $");
336d3ceb1dSskrll
346d3ceb1dSskrll #include <sys/param.h>
356d3ceb1dSskrll #include <sys/systm.h>
366d3ceb1dSskrll #include <sys/device.h>
376d3ceb1dSskrll #include <sys/proc.h>
386d3ceb1dSskrll #include <sys/tty.h>
396d3ceb1dSskrll #include <sys/callout.h>
406d3ceb1dSskrll #include <sys/conf.h>
416d3ceb1dSskrll #include <sys/kauth.h>
426d3ceb1dSskrll
436d3ceb1dSskrll #include <dev/cons.h>
446d3ceb1dSskrll #include <dev/clock_subr.h>
456d3ceb1dSskrll
466d3ceb1dSskrll #include <machine/pdc.h>
476d3ceb1dSskrll #include <machine/iomod.h>
486d3ceb1dSskrll #include <machine/autoconf.h>
496d3ceb1dSskrll
506d3ceb1dSskrll #include <hppa/hppa/machdep.h>
516d3ceb1dSskrll #include <hppa/dev/cpudevs.h>
526d3ceb1dSskrll
536d3ceb1dSskrll typedef
546d3ceb1dSskrll struct pdc_softc {
556d3ceb1dSskrll device_t sc_dv;
566d3ceb1dSskrll struct tty *sc_tty;
576d3ceb1dSskrll struct callout sc_to;
586d3ceb1dSskrll } pdcsoftc_t;
596d3ceb1dSskrll
606d3ceb1dSskrll pdcio_t pdc;
616d3ceb1dSskrll
626d3ceb1dSskrll enum pdc_type pdc_type;
636d3ceb1dSskrll
646d3ceb1dSskrll static struct pdc_result pdcret1 PDC_ALIGNMENT;
656d3ceb1dSskrll static struct pdc_result pdcret2 PDC_ALIGNMENT;
666d3ceb1dSskrll static char pdc_consbuf[IODC_MINIOSIZ] PDC_ALIGNMENT;
676d3ceb1dSskrll
686d3ceb1dSskrll iodcio_t pdc_cniodc, pdc_kbdiodc;
696d3ceb1dSskrll pz_device_t *pz_kbd, *pz_cons;
706d3ceb1dSskrll
716d3ceb1dSskrll int pdcmatch(device_t, cfdata_t, void *);
726d3ceb1dSskrll void pdcattach(device_t, device_t, void *);
736d3ceb1dSskrll
746d3ceb1dSskrll CFATTACH_DECL_NEW(pdc, sizeof(pdcsoftc_t),
756d3ceb1dSskrll pdcmatch, pdcattach, NULL, NULL);
766d3ceb1dSskrll
776d3ceb1dSskrll extern struct cfdriver pdc_cd;
786d3ceb1dSskrll
796d3ceb1dSskrll static int pdc_attached;
806d3ceb1dSskrll
816d3ceb1dSskrll dev_type_open(pdcopen);
826d3ceb1dSskrll dev_type_close(pdcclose);
836d3ceb1dSskrll dev_type_read(pdcread);
846d3ceb1dSskrll dev_type_write(pdcwrite);
856d3ceb1dSskrll dev_type_ioctl(pdcioctl);
866d3ceb1dSskrll dev_type_stop(pdcstop);
876d3ceb1dSskrll dev_type_tty(pdctty);
886d3ceb1dSskrll dev_type_poll(pdcpoll);
896d3ceb1dSskrll
906d3ceb1dSskrll const struct cdevsw pdc_cdevsw = {
91232c06f4Sdholland .d_open = pdcopen,
92232c06f4Sdholland .d_close = pdcclose,
93232c06f4Sdholland .d_read = pdcread,
94232c06f4Sdholland .d_write = pdcwrite,
95232c06f4Sdholland .d_ioctl = pdcioctl,
96232c06f4Sdholland .d_stop = pdcstop,
97232c06f4Sdholland .d_tty = pdctty,
98232c06f4Sdholland .d_poll = pdcpoll,
99232c06f4Sdholland .d_mmap = nommap,
10019f9d57eSdholland .d_kqfilter = ttykqfilter,
101232c06f4Sdholland .d_discard = nodiscard,
102232c06f4Sdholland .d_flag = D_TTY
1036d3ceb1dSskrll };
1046d3ceb1dSskrll
1056d3ceb1dSskrll void pdcstart(struct tty *);
1066d3ceb1dSskrll void pdctimeout(void *);
1076d3ceb1dSskrll int pdcparam(struct tty *, struct termios *);
1086d3ceb1dSskrll int pdccnlookc(dev_t, int *);
1096d3ceb1dSskrll
1106d3ceb1dSskrll static struct cnm_state pdc_cnm_state;
1116d3ceb1dSskrll
1126d3ceb1dSskrll static int pdcgettod(todr_chip_handle_t, struct timeval *);
1136d3ceb1dSskrll static int pdcsettod(todr_chip_handle_t, struct timeval *);
1146d3ceb1dSskrll
1156d3ceb1dSskrll void
pdc_init(void)1166d3ceb1dSskrll pdc_init(void)
1176d3ceb1dSskrll {
1186d3ceb1dSskrll static int kbd_iodc[IODC_MAXSIZE/sizeof(int)];
1196d3ceb1dSskrll static int cn_iodc[IODC_MAXSIZE/sizeof(int)];
1206d3ceb1dSskrll int err;
1216d3ceb1dSskrll int pagezero_cookie;
1226d3ceb1dSskrll
1236d3ceb1dSskrll pagezero_cookie = hppa_pagezero_map();
1246d3ceb1dSskrll
1256d3ceb1dSskrll pz_kbd = &PAGE0->mem_kbd;
1266d3ceb1dSskrll pz_cons = &PAGE0->mem_cons;
1276d3ceb1dSskrll
1286d3ceb1dSskrll pdc = (pdcio_t)PAGE0->mem_pdc;
1296d3ceb1dSskrll
1306d3ceb1dSskrll /* XXX should we reset the console/kbd here?
1316d3ceb1dSskrll well, /boot did that for us anyway */
1326d3ceb1dSskrll if ((err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
1336d3ceb1dSskrll &pdcret1, pz_cons->pz_hpa, IODC_IO, cn_iodc, IODC_MAXSIZE)) < 0 ||
1346d3ceb1dSskrll (err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
1356d3ceb1dSskrll &pdcret1, pz_kbd->pz_hpa, IODC_IO, kbd_iodc, IODC_MAXSIZE)) < 0) {
1366d3ceb1dSskrll #ifdef DEBUG
1376d3ceb1dSskrll printf("pdc_init: failed reading IODC (%d)\n", err);
1386d3ceb1dSskrll #endif
1396d3ceb1dSskrll }
1406d3ceb1dSskrll
1416d3ceb1dSskrll hppa_pagezero_unmap(pagezero_cookie);
1426d3ceb1dSskrll
1436d3ceb1dSskrll pdc_cniodc = (iodcio_t)cn_iodc;
1446d3ceb1dSskrll pdc_kbdiodc = (iodcio_t)kbd_iodc;
1456d3ceb1dSskrll
1466d3ceb1dSskrll /* XXX make pdc current console */
1476d3ceb1dSskrll cn_tab = &constab[0];
1486d3ceb1dSskrll }
1496d3ceb1dSskrll
1506d3ceb1dSskrll void
pdc_settype(int modelno)1516d3ceb1dSskrll pdc_settype(int modelno)
1526d3ceb1dSskrll {
1536d3ceb1dSskrll switch (modelno) {
1546d3ceb1dSskrll /* 720, 750, 730, 735, 755 */
1556d3ceb1dSskrll case HPPA_BOARD_HP720:
1566d3ceb1dSskrll case HPPA_BOARD_HP750_66:
1576d3ceb1dSskrll case HPPA_BOARD_HP730_66:
1586d3ceb1dSskrll case HPPA_BOARD_HP735_99:
1596d3ceb1dSskrll case HPPA_BOARD_HP755_99:
1606d3ceb1dSskrll case HPPA_BOARD_HP755_125:
1616d3ceb1dSskrll case HPPA_BOARD_HP735_130:
1626d3ceb1dSskrll
1636d3ceb1dSskrll /* 710, 705, 7[12]5 */
1646d3ceb1dSskrll case HPPA_BOARD_HP710:
1656d3ceb1dSskrll case HPPA_BOARD_HP705:
1666d3ceb1dSskrll case HPPA_BOARD_HP715_50:
1676d3ceb1dSskrll case HPPA_BOARD_HP715_33:
1686d3ceb1dSskrll case HPPA_BOARD_HP715S_50:
1696d3ceb1dSskrll case HPPA_BOARD_HP715S_33:
1706d3ceb1dSskrll case HPPA_BOARD_HP715T_50:
1716d3ceb1dSskrll case HPPA_BOARD_HP715T_33:
1726d3ceb1dSskrll case HPPA_BOARD_HP715_75:
1736d3ceb1dSskrll case HPPA_BOARD_HP715_99:
1746d3ceb1dSskrll case HPPA_BOARD_HP725_50:
1756d3ceb1dSskrll case HPPA_BOARD_HP725_75:
1766d3ceb1dSskrll case HPPA_BOARD_HP725_99:
1776d3ceb1dSskrll
1786d3ceb1dSskrll /* 745, 742, 747 */
1796d3ceb1dSskrll case HPPA_BOARD_HP745I_50:
1806d3ceb1dSskrll case HPPA_BOARD_HP742I_50:
1816d3ceb1dSskrll case HPPA_BOARD_HP747I_100:
1826d3ceb1dSskrll
1836d3ceb1dSskrll /* 712/{60,80,100,120}, 715/{64,80,100,...}, etc */
1846d3ceb1dSskrll case HPPA_BOARD_HP712_60:
1856d3ceb1dSskrll case HPPA_BOARD_HP712_80:
1866d3ceb1dSskrll case HPPA_BOARD_HP712_100:
1876d3ceb1dSskrll case HPPA_BOARD_HP743I_64:
1886d3ceb1dSskrll case HPPA_BOARD_HP743I_100:
1896d3ceb1dSskrll case HPPA_BOARD_HP712_120:
1906d3ceb1dSskrll case HPPA_BOARD_HP715_80:
1916d3ceb1dSskrll case HPPA_BOARD_HP715_64:
1926d3ceb1dSskrll case HPPA_BOARD_HP715_100:
1936d3ceb1dSskrll case HPPA_BOARD_HP715_100XC:
1946d3ceb1dSskrll case HPPA_BOARD_HP725_100:
1956d3ceb1dSskrll case HPPA_BOARD_HP725_120:
1966d3ceb1dSskrll case HPPA_BOARD_HP715_100L:
1976d3ceb1dSskrll case HPPA_BOARD_HP715_120L:
1986d3ceb1dSskrll case HPPA_BOARD_HP725_80L:
1996d3ceb1dSskrll case HPPA_BOARD_HP725_100L:
2006d3ceb1dSskrll case HPPA_BOARD_HP725_120L:
2016d3ceb1dSskrll case HPPA_BOARD_HP743_50:
2026d3ceb1dSskrll case HPPA_BOARD_HP743_100:
2036d3ceb1dSskrll case HPPA_BOARD_HP715_80M:
2046d3ceb1dSskrll case HPPA_BOARD_HP811:
2056d3ceb1dSskrll case HPPA_BOARD_HP801:
2066d3ceb1dSskrll case HPPA_BOARD_HP743T:
2076d3ceb1dSskrll pdc_type = PDC_TYPE_SNAKE;
2086d3ceb1dSskrll break;
2096d3ceb1dSskrll
2106d3ceb1dSskrll default:
2116d3ceb1dSskrll pdc_type = PDC_TYPE_UNKNOWN;
2126d3ceb1dSskrll }
2136d3ceb1dSskrll }
2146d3ceb1dSskrll
2156d3ceb1dSskrll enum pdc_type
pdc_gettype(void)2166d3ceb1dSskrll pdc_gettype(void)
2176d3ceb1dSskrll {
2186d3ceb1dSskrll
2196d3ceb1dSskrll return pdc_type;
2206d3ceb1dSskrll }
2216d3ceb1dSskrll
2226d3ceb1dSskrll int
pdcmatch(device_t parent,cfdata_t cf,void * aux)2236d3ceb1dSskrll pdcmatch(device_t parent, cfdata_t cf, void *aux)
2246d3ceb1dSskrll {
2256d3ceb1dSskrll struct confargs *ca = aux;
2266d3ceb1dSskrll
2276d3ceb1dSskrll /* there could be only one */
2286d3ceb1dSskrll if (pdc_attached || strcmp(ca->ca_name, "pdc"))
2296d3ceb1dSskrll return 0;
2306d3ceb1dSskrll
2316d3ceb1dSskrll return 1;
2326d3ceb1dSskrll }
2336d3ceb1dSskrll
2346d3ceb1dSskrll void
pdcattach(device_t parent,device_t self,void * aux)2356d3ceb1dSskrll pdcattach(device_t parent, device_t self, void *aux)
2366d3ceb1dSskrll {
2376d3ceb1dSskrll static struct todr_chip_handle todr = {
2386d3ceb1dSskrll .todr_settime = pdcsettod,
2396d3ceb1dSskrll .todr_gettime = pdcgettod,
2406d3ceb1dSskrll };
2416d3ceb1dSskrll struct pdc_softc *sc = device_private(self);
2426d3ceb1dSskrll
2436d3ceb1dSskrll sc->sc_dv = self;
2446d3ceb1dSskrll pdc_attached = 1;
2456d3ceb1dSskrll
2466d3ceb1dSskrll KASSERT(pdc != NULL);
2476d3ceb1dSskrll
2486d3ceb1dSskrll cn_init_magic(&pdc_cnm_state);
2496d3ceb1dSskrll cn_set_magic("+++++");
2506d3ceb1dSskrll
2516d3ceb1dSskrll /* attach the TOD clock */
2526d3ceb1dSskrll todr_attach(&todr);
2536d3ceb1dSskrll
2546d3ceb1dSskrll aprint_normal("\n");
2556d3ceb1dSskrll
2566d3ceb1dSskrll callout_init(&sc->sc_to, 0);
2576d3ceb1dSskrll }
2586d3ceb1dSskrll
2596d3ceb1dSskrll int
pdcopen(dev_t dev,int flag,int mode,struct lwp * l)2606d3ceb1dSskrll pdcopen(dev_t dev, int flag, int mode, struct lwp *l)
2616d3ceb1dSskrll {
2626d3ceb1dSskrll struct pdc_softc *sc;
2636d3ceb1dSskrll struct tty *tp;
2646d3ceb1dSskrll int s;
2656d3ceb1dSskrll int error = 0, setuptimeout;
2666d3ceb1dSskrll
2676d3ceb1dSskrll sc = device_lookup_private(&pdc_cd, minor(dev));
2686d3ceb1dSskrll if (sc == NULL)
2696d3ceb1dSskrll return ENXIO;
2706d3ceb1dSskrll
2716d3ceb1dSskrll s = spltty();
2726d3ceb1dSskrll
2736d3ceb1dSskrll if (sc->sc_tty) {
2746d3ceb1dSskrll tp = sc->sc_tty;
2756d3ceb1dSskrll } else {
2766d3ceb1dSskrll tp = tty_alloc();
2776d3ceb1dSskrll sc->sc_tty = tp;
2786d3ceb1dSskrll tty_attach(tp);
2796d3ceb1dSskrll }
2806d3ceb1dSskrll
2816d3ceb1dSskrll tp->t_oproc = pdcstart;
2826d3ceb1dSskrll tp->t_param = pdcparam;
2836d3ceb1dSskrll tp->t_dev = dev;
2846d3ceb1dSskrll
2856d3ceb1dSskrll if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp)) {
2866d3ceb1dSskrll splx(s);
2876d3ceb1dSskrll return (EBUSY);
2886d3ceb1dSskrll }
2896d3ceb1dSskrll
2906d3ceb1dSskrll if ((tp->t_state & TS_ISOPEN) == 0) {
2916d3ceb1dSskrll tp->t_state |= TS_CARR_ON;
2926d3ceb1dSskrll ttychars(tp);
2936d3ceb1dSskrll tp->t_iflag = TTYDEF_IFLAG;
2946d3ceb1dSskrll tp->t_oflag = TTYDEF_OFLAG;
2956d3ceb1dSskrll tp->t_cflag = TTYDEF_CFLAG|CLOCAL;
2966d3ceb1dSskrll tp->t_lflag = TTYDEF_LFLAG;
2976d3ceb1dSskrll tp->t_ispeed = tp->t_ospeed = 9600;
2986d3ceb1dSskrll ttsetwater(tp);
2996d3ceb1dSskrll
3006d3ceb1dSskrll setuptimeout = 1;
3016d3ceb1dSskrll } else
3026d3ceb1dSskrll setuptimeout = 0;
3036d3ceb1dSskrll tp->t_state |= TS_CARR_ON;
3046d3ceb1dSskrll
3056d3ceb1dSskrll splx(s);
3066d3ceb1dSskrll
3076d3ceb1dSskrll error = (*tp->t_linesw->l_open)(dev, tp);
3086d3ceb1dSskrll if (error == 0 && setuptimeout)
3096d3ceb1dSskrll pdctimeout(sc);
3106d3ceb1dSskrll
3116d3ceb1dSskrll return error;
3126d3ceb1dSskrll }
3136d3ceb1dSskrll
3146d3ceb1dSskrll int
pdcclose(dev_t dev,int flag,int mode,struct lwp * l)3156d3ceb1dSskrll pdcclose(dev_t dev, int flag, int mode, struct lwp *l)
3166d3ceb1dSskrll {
3176d3ceb1dSskrll struct tty *tp;
3186d3ceb1dSskrll struct pdc_softc *sc;
3196d3ceb1dSskrll
3206d3ceb1dSskrll sc = device_lookup_private(&pdc_cd, minor(dev));
3216d3ceb1dSskrll if (sc == NULL)
3226d3ceb1dSskrll return ENXIO;
3236d3ceb1dSskrll
3246d3ceb1dSskrll tp = sc->sc_tty;
3256d3ceb1dSskrll callout_stop(&sc->sc_to);
3266d3ceb1dSskrll (*tp->t_linesw->l_close)(tp, flag);
3276d3ceb1dSskrll ttyclose(tp);
3286d3ceb1dSskrll return 0;
3296d3ceb1dSskrll }
3306d3ceb1dSskrll
3316d3ceb1dSskrll int
pdcread(dev_t dev,struct uio * uio,int flag)3326d3ceb1dSskrll pdcread(dev_t dev, struct uio *uio, int flag)
3336d3ceb1dSskrll {
3346d3ceb1dSskrll struct tty *tp;
3356d3ceb1dSskrll struct pdc_softc *sc;
3366d3ceb1dSskrll
3376d3ceb1dSskrll sc = device_lookup_private(&pdc_cd, minor(dev));
3386d3ceb1dSskrll if (sc == NULL)
3396d3ceb1dSskrll return ENXIO;
3406d3ceb1dSskrll
3416d3ceb1dSskrll tp = sc->sc_tty;
3426d3ceb1dSskrll return ((*tp->t_linesw->l_read)(tp, uio, flag));
3436d3ceb1dSskrll }
3446d3ceb1dSskrll
3456d3ceb1dSskrll int
pdcwrite(dev_t dev,struct uio * uio,int flag)3466d3ceb1dSskrll pdcwrite(dev_t dev, struct uio *uio, int flag)
3476d3ceb1dSskrll {
3486d3ceb1dSskrll struct tty *tp;
3496d3ceb1dSskrll struct pdc_softc *sc;
3506d3ceb1dSskrll
3516d3ceb1dSskrll sc = device_lookup_private(&pdc_cd, minor(dev));
3526d3ceb1dSskrll if (sc == NULL)
3536d3ceb1dSskrll return ENXIO;
3546d3ceb1dSskrll
3556d3ceb1dSskrll tp = sc->sc_tty;
3566d3ceb1dSskrll return ((*tp->t_linesw->l_write)(tp, uio, flag));
3576d3ceb1dSskrll }
3586d3ceb1dSskrll
3596d3ceb1dSskrll int
pdcpoll(dev_t dev,int events,struct lwp * l)3606d3ceb1dSskrll pdcpoll(dev_t dev, int events, struct lwp *l)
3616d3ceb1dSskrll {
3626d3ceb1dSskrll struct pdc_softc *sc = device_lookup_private(&pdc_cd,minor(dev));
3636d3ceb1dSskrll struct tty *tp = sc->sc_tty;
3646d3ceb1dSskrll
3656d3ceb1dSskrll return ((*tp->t_linesw->l_poll)(tp, events, l));
3666d3ceb1dSskrll }
3676d3ceb1dSskrll
3686d3ceb1dSskrll int
pdcioctl(dev_t dev,u_long cmd,void * data,int flag,struct lwp * l)3696d3ceb1dSskrll pdcioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
3706d3ceb1dSskrll {
3716d3ceb1dSskrll int error;
3726d3ceb1dSskrll struct tty *tp;
3736d3ceb1dSskrll struct pdc_softc *sc;
3746d3ceb1dSskrll
3756d3ceb1dSskrll sc = device_lookup_private(&pdc_cd, minor(dev));
3766d3ceb1dSskrll if (sc == NULL)
3776d3ceb1dSskrll return ENXIO;
3786d3ceb1dSskrll
3796d3ceb1dSskrll tp = sc->sc_tty;
3806d3ceb1dSskrll error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l);
3816d3ceb1dSskrll if (error >= 0)
3826d3ceb1dSskrll return error;
3836d3ceb1dSskrll error = ttioctl(tp, cmd, data, flag, l);
3846d3ceb1dSskrll if (error >= 0)
3856d3ceb1dSskrll return error;
3866d3ceb1dSskrll
3876d3ceb1dSskrll return ENOTTY;
3886d3ceb1dSskrll }
3896d3ceb1dSskrll
3906d3ceb1dSskrll int
pdcparam(struct tty * tp,struct termios * t)3916d3ceb1dSskrll pdcparam(struct tty *tp, struct termios *t)
3926d3ceb1dSskrll {
3936d3ceb1dSskrll
3946d3ceb1dSskrll return 0;
3956d3ceb1dSskrll }
3966d3ceb1dSskrll
3976d3ceb1dSskrll void
pdcstart(struct tty * tp)3986d3ceb1dSskrll pdcstart(struct tty *tp)
3996d3ceb1dSskrll {
4006d3ceb1dSskrll int s;
4016d3ceb1dSskrll
4026d3ceb1dSskrll s = spltty();
4036d3ceb1dSskrll if (tp->t_state & (TS_TTSTOP | TS_BUSY)) {
4046d3ceb1dSskrll splx(s);
4056d3ceb1dSskrll return;
4066d3ceb1dSskrll }
4076d3ceb1dSskrll ttypull(tp);
4086d3ceb1dSskrll tp->t_state |= TS_BUSY;
4096d3ceb1dSskrll while (tp->t_outq.c_cc != 0)
4106d3ceb1dSskrll pdccnputc(tp->t_dev, getc(&tp->t_outq));
4116d3ceb1dSskrll tp->t_state &= ~TS_BUSY;
4126d3ceb1dSskrll splx(s);
4136d3ceb1dSskrll }
4146d3ceb1dSskrll
4156d3ceb1dSskrll void
pdcstop(struct tty * tp,int flag)4166d3ceb1dSskrll pdcstop(struct tty *tp, int flag)
4176d3ceb1dSskrll {
4186d3ceb1dSskrll int s;
4196d3ceb1dSskrll
4206d3ceb1dSskrll s = spltty();
4216d3ceb1dSskrll if (tp->t_state & TS_BUSY)
4226d3ceb1dSskrll if ((tp->t_state & TS_TTSTOP) == 0)
4236d3ceb1dSskrll tp->t_state |= TS_FLUSH;
4246d3ceb1dSskrll splx(s);
4256d3ceb1dSskrll }
4266d3ceb1dSskrll
4276d3ceb1dSskrll void
pdctimeout(void * v)4286d3ceb1dSskrll pdctimeout(void *v)
4296d3ceb1dSskrll {
4306d3ceb1dSskrll struct pdc_softc *sc = v;
4316d3ceb1dSskrll struct tty *tp = sc->sc_tty;
4326d3ceb1dSskrll int c;
4336d3ceb1dSskrll
4346d3ceb1dSskrll while (pdccnlookc(tp->t_dev, &c)) {
4356d3ceb1dSskrll cn_check_magic(tp->t_dev, c, pdc_cnm_state);
4366d3ceb1dSskrll if (tp->t_state & TS_ISOPEN)
4376d3ceb1dSskrll (*tp->t_linesw->l_rint)(c, tp);
4386d3ceb1dSskrll }
4396d3ceb1dSskrll callout_reset(&sc->sc_to, 1, pdctimeout, sc);
4406d3ceb1dSskrll }
4416d3ceb1dSskrll
4426d3ceb1dSskrll struct tty *
pdctty(dev_t dev)4436d3ceb1dSskrll pdctty(dev_t dev)
4446d3ceb1dSskrll {
4456d3ceb1dSskrll struct pdc_softc *sc;
4466d3ceb1dSskrll
4476d3ceb1dSskrll sc = device_lookup_private(&pdc_cd, minor(dev));
4486d3ceb1dSskrll if (sc == NULL)
4496d3ceb1dSskrll return NULL;
4506d3ceb1dSskrll
4516d3ceb1dSskrll return sc->sc_tty;
4526d3ceb1dSskrll }
4536d3ceb1dSskrll
4546d3ceb1dSskrll void
pdccnprobe(struct consdev * cn)4556d3ceb1dSskrll pdccnprobe(struct consdev *cn)
4566d3ceb1dSskrll {
4576d3ceb1dSskrll
4586d3ceb1dSskrll cn->cn_dev = makedev(22,0);
4596d3ceb1dSskrll cn->cn_pri = CN_NORMAL;
4606d3ceb1dSskrll }
4616d3ceb1dSskrll
4626d3ceb1dSskrll void
pdccninit(struct consdev * cn)4636d3ceb1dSskrll pdccninit(struct consdev *cn)
4646d3ceb1dSskrll {
4656d3ceb1dSskrll #ifdef DEBUG
4666d3ceb1dSskrll printf("pdc0: console init\n");
4676d3ceb1dSskrll #endif
4686d3ceb1dSskrll }
4696d3ceb1dSskrll
4706d3ceb1dSskrll int
pdccnlookc(dev_t dev,int * cp)4716d3ceb1dSskrll pdccnlookc(dev_t dev, int *cp)
4726d3ceb1dSskrll {
4736d3ceb1dSskrll int s, err __debugused, l, pagezero_cookie;
4746d3ceb1dSskrll
4756d3ceb1dSskrll s = splhigh();
4766d3ceb1dSskrll pagezero_cookie = hppa_pagezero_map();
4776d3ceb1dSskrll err = pdc_call(pdc_kbdiodc, 0, pz_kbd->pz_hpa, IODC_IO_CONSIN,
4786d3ceb1dSskrll pz_kbd->pz_spa, pz_kbd->pz_layers, &pdcret1, 0, pdc_consbuf, 1, 0);
4796d3ceb1dSskrll l = pdcret1.result[0];
4806d3ceb1dSskrll *cp = pdc_consbuf[0];
4816d3ceb1dSskrll hppa_pagezero_unmap(pagezero_cookie);
4826d3ceb1dSskrll splx(s);
4836d3ceb1dSskrll
4846d3ceb1dSskrll #ifdef DEBUG
4856d3ceb1dSskrll if (err < 0)
4866d3ceb1dSskrll printf("pdccnlookc: input error: %d\n", err);
4876d3ceb1dSskrll #endif
4886d3ceb1dSskrll return l;
4896d3ceb1dSskrll }
4906d3ceb1dSskrll
4916d3ceb1dSskrll int
pdccngetc(dev_t dev)4926d3ceb1dSskrll pdccngetc(dev_t dev)
4936d3ceb1dSskrll {
4946d3ceb1dSskrll int c;
4956d3ceb1dSskrll
4966d3ceb1dSskrll if (!pdc)
4976d3ceb1dSskrll return 0;
4986d3ceb1dSskrll while (!pdccnlookc(dev, &c))
4996d3ceb1dSskrll ;
5006d3ceb1dSskrll return (c);
5016d3ceb1dSskrll }
5026d3ceb1dSskrll
5036d3ceb1dSskrll void
pdccnputc(dev_t dev,int c)5046d3ceb1dSskrll pdccnputc(dev_t dev, int c)
5056d3ceb1dSskrll {
5066d3ceb1dSskrll int s, err, pagezero_cookie;
5076d3ceb1dSskrll
5086d3ceb1dSskrll s = splhigh();
5096d3ceb1dSskrll pagezero_cookie = hppa_pagezero_map();
5106d3ceb1dSskrll *pdc_consbuf = c;
5116d3ceb1dSskrll err = pdc_call(pdc_cniodc, 0, pz_cons->pz_hpa, IODC_IO_CONSOUT,
5126d3ceb1dSskrll pz_cons->pz_spa, pz_cons->pz_layers, &pdcret1, 0, pdc_consbuf, 1, 0);
5136d3ceb1dSskrll hppa_pagezero_unmap(pagezero_cookie);
5146d3ceb1dSskrll splx(s);
5156d3ceb1dSskrll
5166d3ceb1dSskrll if (err < 0) {
5176d3ceb1dSskrll #if defined(DDB) || defined(KGDB)
5186d3ceb1dSskrll Debugger();
5196d3ceb1dSskrll #endif /* DDB || KGDB */
5206d3ceb1dSskrll delay(250000);
5216d3ceb1dSskrll #if 0
5226d3ceb1dSskrll /*
5236d3ceb1dSskrll * It's not a good idea to use the output to print
5246d3ceb1dSskrll * an output error.
5256d3ceb1dSskrll */
5266d3ceb1dSskrll printf("pdccnputc: output error: %d\n", err);
5276d3ceb1dSskrll #endif
5286d3ceb1dSskrll }
5296d3ceb1dSskrll }
5306d3ceb1dSskrll
5316d3ceb1dSskrll void
pdccnpollc(dev_t dev,int on)5326d3ceb1dSskrll pdccnpollc(dev_t dev, int on)
5336d3ceb1dSskrll {
5346d3ceb1dSskrll }
5356d3ceb1dSskrll
5366d3ceb1dSskrll static int
pdcgettod(todr_chip_handle_t tch,struct timeval * tvp)5376d3ceb1dSskrll pdcgettod(todr_chip_handle_t tch, struct timeval *tvp)
5386d3ceb1dSskrll {
5396d3ceb1dSskrll struct pdc_tod *tod = (struct pdc_tod *)&pdcret1;
5406d3ceb1dSskrll int error;
5416d3ceb1dSskrll
5426d3ceb1dSskrll error = pdc_call((iodcio_t)pdc, 1, PDC_TOD, PDC_TOD_READ,
5436d3ceb1dSskrll &pdcret1);
5446d3ceb1dSskrll
5456d3ceb1dSskrll if (error == 0) {
5466d3ceb1dSskrll tvp->tv_sec = tod->sec;
5476d3ceb1dSskrll tvp->tv_usec = tod->usec;
5486d3ceb1dSskrll }
5496d3ceb1dSskrll return error;
5506d3ceb1dSskrll }
5516d3ceb1dSskrll
5526d3ceb1dSskrll static int
pdcsettod(todr_chip_handle_t tch,struct timeval * tvp)5536d3ceb1dSskrll pdcsettod(todr_chip_handle_t tch, struct timeval *tvp)
5546d3ceb1dSskrll {
5556d3ceb1dSskrll int error;
5566d3ceb1dSskrll
5576d3ceb1dSskrll error = pdc_call((iodcio_t)pdc, 1, PDC_TOD, PDC_TOD_WRITE,
5586d3ceb1dSskrll tvp->tv_sec, tvp->tv_usec);
5596d3ceb1dSskrll
5606d3ceb1dSskrll return error;
5616d3ceb1dSskrll }
5626d3ceb1dSskrll
5636d3ceb1dSskrll
5646d3ceb1dSskrll int
pdcproc_chassis_display(unsigned long disp)5656d3ceb1dSskrll pdcproc_chassis_display(unsigned long disp)
5666d3ceb1dSskrll {
5676d3ceb1dSskrll int err;
5686d3ceb1dSskrll
5696d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_DISP, disp);
5706d3ceb1dSskrll
5716d3ceb1dSskrll return err;
5726d3ceb1dSskrll }
5736d3ceb1dSskrll
5746d3ceb1dSskrll int
pdcproc_chassis_info(struct pdc_chassis_info * pci,struct pdc_chassis_lcd * pcl)5756d3ceb1dSskrll pdcproc_chassis_info(struct pdc_chassis_info *pci, struct pdc_chassis_lcd *pcl)
5766d3ceb1dSskrll {
5776d3ceb1dSskrll int err;
5786d3ceb1dSskrll
5796d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_INFO,
5806d3ceb1dSskrll &pdcret1, &pdcret2 , sizeof(*pcl));
5816d3ceb1dSskrll if (err < 0)
5826d3ceb1dSskrll return err;
5836d3ceb1dSskrll
5846d3ceb1dSskrll memcpy(pci, &pdcret1, sizeof(*pci));
5856d3ceb1dSskrll memcpy(pcl, &pdcret2, sizeof(*pcl));
5866d3ceb1dSskrll
5876d3ceb1dSskrll return err;
5886d3ceb1dSskrll }
5896d3ceb1dSskrll
5906d3ceb1dSskrll int
pdcproc_pim(int type,struct pdc_pim * pp,void ** buf,size_t * sz)5916d3ceb1dSskrll pdcproc_pim(int type, struct pdc_pim *pp, void **buf, size_t *sz)
5926d3ceb1dSskrll {
5936d3ceb1dSskrll static char data[896] __attribute__((__aligned__(8)));
5946d3ceb1dSskrll int err;
5956d3ceb1dSskrll
5966d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_PIM, type, &pdcret1, data,
5976d3ceb1dSskrll sizeof(data));
5986d3ceb1dSskrll if (err < 0)
5996d3ceb1dSskrll return err;
6006d3ceb1dSskrll
6016d3ceb1dSskrll memcpy(pp, &pdcret1, sizeof(*pp));
6026d3ceb1dSskrll *buf = data;
6036d3ceb1dSskrll *sz = sizeof(data);
6046d3ceb1dSskrll
6056d3ceb1dSskrll return err;
6066d3ceb1dSskrll }
6076d3ceb1dSskrll
6086d3ceb1dSskrll int
pdcproc_model_info(struct pdc_model * pm)6096d3ceb1dSskrll pdcproc_model_info(struct pdc_model *pm)
6106d3ceb1dSskrll {
6116d3ceb1dSskrll int err;
6126d3ceb1dSskrll
6136d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_INFO, &pdcret1);
6146d3ceb1dSskrll if (err < 0)
6156d3ceb1dSskrll return err;
6166d3ceb1dSskrll
6176d3ceb1dSskrll memcpy(pm, &pdcret1, sizeof(*pm));
6186d3ceb1dSskrll
6196d3ceb1dSskrll return err;
6206d3ceb1dSskrll }
6216d3ceb1dSskrll
6226d3ceb1dSskrll int
pdcproc_model_cpuid(struct pdc_cpuid * pc)6236d3ceb1dSskrll pdcproc_model_cpuid(struct pdc_cpuid *pc)
6246d3ceb1dSskrll {
6256d3ceb1dSskrll int err;
6266d3ceb1dSskrll
6276d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_CPUID, &pdcret1);
6286d3ceb1dSskrll if (err < 0)
6296d3ceb1dSskrll return err;
6306d3ceb1dSskrll
6316d3ceb1dSskrll memcpy(pc, &pdcret1, sizeof(*pc));
6326d3ceb1dSskrll
6336d3ceb1dSskrll return err;
6346d3ceb1dSskrll }
6356d3ceb1dSskrll
6366d3ceb1dSskrll int
pdcproc_cache(struct pdc_cache * pc)6376d3ceb1dSskrll pdcproc_cache(struct pdc_cache *pc)
6386d3ceb1dSskrll {
6396d3ceb1dSskrll int err;
6406d3ceb1dSskrll
6416d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_DFLT, &pdcret1);
6426d3ceb1dSskrll
6436d3ceb1dSskrll if (err < 0)
6446d3ceb1dSskrll return err;
6456d3ceb1dSskrll
6466d3ceb1dSskrll memcpy(pc, &pdcret1, sizeof(*pc));
6476d3ceb1dSskrll
6486d3ceb1dSskrll return err;
6496d3ceb1dSskrll }
6506d3ceb1dSskrll
6516d3ceb1dSskrll
6526d3ceb1dSskrll int
pdcproc_cache_spidbits(struct pdc_spidb * pcs)6536d3ceb1dSskrll pdcproc_cache_spidbits(struct pdc_spidb *pcs)
6546d3ceb1dSskrll {
6556d3ceb1dSskrll int err;
6566d3ceb1dSskrll
6576d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_GETSPIDB,
6586d3ceb1dSskrll &pdcret1);
6596d3ceb1dSskrll
6606d3ceb1dSskrll if (err < 0)
6616d3ceb1dSskrll return err;
6626d3ceb1dSskrll
6636d3ceb1dSskrll memcpy(pcs, &pdcret1, sizeof(*pcs));
6646d3ceb1dSskrll
6656d3ceb1dSskrll return err;
6666d3ceb1dSskrll }
6676d3ceb1dSskrll
6686d3ceb1dSskrll int
pdcproc_hpa_processor(hppa_hpa_t * hpa)6696d3ceb1dSskrll pdcproc_hpa_processor(hppa_hpa_t *hpa)
6706d3ceb1dSskrll {
6716d3ceb1dSskrll int err;
6726d3ceb1dSskrll
6736d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_HPA, PDC_HPA_DFLT, &pdcret1);
6746d3ceb1dSskrll if (err < 0)
6756d3ceb1dSskrll return err;
6766d3ceb1dSskrll
6776d3ceb1dSskrll *hpa = pdcret1.result[0];
6786d3ceb1dSskrll
6796d3ceb1dSskrll return err;
6806d3ceb1dSskrll }
6816d3ceb1dSskrll
6826d3ceb1dSskrll int
pdcproc_coproc(struct pdc_coproc * pc)6836d3ceb1dSskrll pdcproc_coproc(struct pdc_coproc *pc)
6846d3ceb1dSskrll {
6856d3ceb1dSskrll int err;
6866d3ceb1dSskrll
6876d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_COPROC, PDC_COPROC_DFLT, &pdcret1);
6886d3ceb1dSskrll if (err < 0)
6896d3ceb1dSskrll return err;
6906d3ceb1dSskrll
6916d3ceb1dSskrll memcpy(pc, &pdcret1, sizeof(*pc));
6926d3ceb1dSskrll
6936d3ceb1dSskrll return err;
6946d3ceb1dSskrll }
6956d3ceb1dSskrll
6966d3ceb1dSskrll int
pdcproc_iodc_read(hppa_hpa_t hpa,int command,int * actcnt,struct pdc_iodc_read * buf1,size_t sz1,struct iodc_data * buf2,size_t sz2)6976d3ceb1dSskrll pdcproc_iodc_read(hppa_hpa_t hpa, int command, int *actcnt,
6986d3ceb1dSskrll struct pdc_iodc_read *buf1, size_t sz1, struct iodc_data *buf2,
6996d3ceb1dSskrll size_t sz2)
7006d3ceb1dSskrll {
7016d3ceb1dSskrll int err;
7026d3ceb1dSskrll
7036d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
7046d3ceb1dSskrll &pdcret1, hpa, command, &pdcret2, sizeof(pdcret2));
7056d3ceb1dSskrll
7066d3ceb1dSskrll if (err < 0)
7076d3ceb1dSskrll return err;
7086d3ceb1dSskrll
7096d3ceb1dSskrll if (actcnt != NULL) {
7106d3ceb1dSskrll struct pdc_iodc_read *pir = (struct pdc_iodc_read *)&pdcret1;
7116d3ceb1dSskrll
7126d3ceb1dSskrll *actcnt = pir->size;
7136d3ceb1dSskrll }
7146d3ceb1dSskrll
7156d3ceb1dSskrll memcpy(buf1, &pdcret1, sz1);
7166d3ceb1dSskrll memcpy(buf2, &pdcret2, sz2);
7176d3ceb1dSskrll
7186d3ceb1dSskrll return err;
7196d3ceb1dSskrll }
7206d3ceb1dSskrll
7216d3ceb1dSskrll int
pdcproc_iodc_ninit(struct pdc_iodc_minit * pimi,hppa_hpa_t hpa,int sz)7226d3ceb1dSskrll pdcproc_iodc_ninit(struct pdc_iodc_minit *pimi, hppa_hpa_t hpa, int sz)
7236d3ceb1dSskrll {
7246d3ceb1dSskrll int err;
7256d3ceb1dSskrll
7266d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_NINIT, &pdcret1,
7276d3ceb1dSskrll hpa, sz);
7286d3ceb1dSskrll
7296d3ceb1dSskrll if (err < 0)
7306d3ceb1dSskrll return err;
7316d3ceb1dSskrll
7326d3ceb1dSskrll memcpy(pimi, &pdcret1, sizeof(*pimi));
7336d3ceb1dSskrll
7346d3ceb1dSskrll return err;
7356d3ceb1dSskrll }
7366d3ceb1dSskrll
7376d3ceb1dSskrll int
pdcproc_instr(unsigned int * mem)7386d3ceb1dSskrll pdcproc_instr(unsigned int *mem)
7396d3ceb1dSskrll {
7406d3ceb1dSskrll int err;
7416d3ceb1dSskrll
7426d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_INSTR, PDC_INSTR_DFLT, &pdcret1);
7436d3ceb1dSskrll if (err < 0)
7446d3ceb1dSskrll return err;
7456d3ceb1dSskrll
7466d3ceb1dSskrll memcpy(mem, &pdcret1, sizeof(*mem));
7476d3ceb1dSskrll
7486d3ceb1dSskrll return err;
7496d3ceb1dSskrll }
7506d3ceb1dSskrll
7516d3ceb1dSskrll int
pdcproc_block_tlb(struct pdc_btlb * pb)7526d3ceb1dSskrll pdcproc_block_tlb(struct pdc_btlb *pb)
7536d3ceb1dSskrll {
7546d3ceb1dSskrll int err;
7556d3ceb1dSskrll
7566d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_DEFAULT,
7576d3ceb1dSskrll &pdcret1);
7586d3ceb1dSskrll if (err < 0)
7596d3ceb1dSskrll return err;
7606d3ceb1dSskrll
7616d3ceb1dSskrll memcpy(pb, &pdcret1, sizeof(*pb));
7626d3ceb1dSskrll
7636d3ceb1dSskrll return err;
7646d3ceb1dSskrll }
7656d3ceb1dSskrll
7666d3ceb1dSskrll int
pdcproc_btlb_insert(pa_space_t sp,vaddr_t va,paddr_t pa,vsize_t sz,u_int prot,int index)7676d3ceb1dSskrll pdcproc_btlb_insert(pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz,
7686d3ceb1dSskrll u_int prot, int index)
7696d3ceb1dSskrll {
7706d3ceb1dSskrll int err;
7716d3ceb1dSskrll
7726d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_INSERT, sp,
7736d3ceb1dSskrll va, pa, sz, prot, index);
7746d3ceb1dSskrll
7756d3ceb1dSskrll return err;
7766d3ceb1dSskrll }
7776d3ceb1dSskrll
7786d3ceb1dSskrll int
pdcproc_btlb_purge(pa_space_t sp,vaddr_t va,paddr_t pa,vsize_t sz)7796d3ceb1dSskrll pdcproc_btlb_purge(pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz)
7806d3ceb1dSskrll {
7816d3ceb1dSskrll int err;
7826d3ceb1dSskrll
7836d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_PURGE, sp, va,
7846d3ceb1dSskrll pa, sz);
7856d3ceb1dSskrll
7866d3ceb1dSskrll return err;
7876d3ceb1dSskrll }
7886d3ceb1dSskrll
7896d3ceb1dSskrll int
pdcproc_btlb_purgeall(void)7906d3ceb1dSskrll pdcproc_btlb_purgeall(void)
7916d3ceb1dSskrll {
7926d3ceb1dSskrll int err;
7936d3ceb1dSskrll
7946d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_PURGE_ALL);
7956d3ceb1dSskrll
7966d3ceb1dSskrll return err;
7976d3ceb1dSskrll }
7986d3ceb1dSskrll
pdcproc_tlb_info(struct pdc_hwtlb * ph)7996d3ceb1dSskrll int pdcproc_tlb_info(struct pdc_hwtlb *ph)
8006d3ceb1dSskrll {
8016d3ceb1dSskrll int err;
8026d3ceb1dSskrll
8036d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_INFO, &pdcret1);
8046d3ceb1dSskrll if (err < 0)
8056d3ceb1dSskrll return err;
8066d3ceb1dSskrll
8076d3ceb1dSskrll memcpy(ph, &pdcret1, sizeof(*ph));
8086d3ceb1dSskrll
8096d3ceb1dSskrll return err;
8106d3ceb1dSskrll }
8116d3ceb1dSskrll
8126d3ceb1dSskrll int
pdcproc_tlb_config(struct pdc_hwtlb * ph,unsigned long hpt,unsigned long hptsize,unsigned long type)8136d3ceb1dSskrll pdcproc_tlb_config(struct pdc_hwtlb *ph, unsigned long hpt,
8146d3ceb1dSskrll unsigned long hptsize, unsigned long type)
8156d3ceb1dSskrll {
8166d3ceb1dSskrll int err;
8176d3ceb1dSskrll
8186d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_CONFIG, ph, hpt,
8196d3ceb1dSskrll hptsize, type);
8206d3ceb1dSskrll
8216d3ceb1dSskrll return err;
8226d3ceb1dSskrll }
8236d3ceb1dSskrll
8246d3ceb1dSskrll int
pdcproc_system_map_find_mod(struct pdc_system_map_find_mod * psm,struct device_path * dev,int mod)8256d3ceb1dSskrll pdcproc_system_map_find_mod(struct pdc_system_map_find_mod *psm,
8266d3ceb1dSskrll struct device_path *dev, int mod)
8276d3ceb1dSskrll {
8286d3ceb1dSskrll int err;
8296d3ceb1dSskrll
8306d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
8316d3ceb1dSskrll PDC_SYSTEM_MAP_FIND_MOD, &pdcret1, &pdcret2, mod);
8326d3ceb1dSskrll if (err < 0)
8336d3ceb1dSskrll return err;
8346d3ceb1dSskrll
8356d3ceb1dSskrll memcpy(psm, &pdcret1, sizeof(*psm));
8366d3ceb1dSskrll memcpy(dev, &pdcret2, sizeof(*dev));
8376d3ceb1dSskrll
8386d3ceb1dSskrll return err;
8396d3ceb1dSskrll }
8406d3ceb1dSskrll
8416d3ceb1dSskrll int
pdcproc_system_map_find_addr(struct pdc_system_map_find_addr * psm,int mod,int addr)8426d3ceb1dSskrll pdcproc_system_map_find_addr(struct pdc_system_map_find_addr *psm, int mod,
8436d3ceb1dSskrll int addr)
8446d3ceb1dSskrll {
8456d3ceb1dSskrll int err;
8466d3ceb1dSskrll
8476d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
8486d3ceb1dSskrll PDC_SYSTEM_MAP_FIND_ADDR, &pdcret1, mod, addr);
8496d3ceb1dSskrll if (err < 0)
8506d3ceb1dSskrll return err;
8516d3ceb1dSskrll
8526d3ceb1dSskrll memcpy(psm, &pdcret1, sizeof(*psm));
8536d3ceb1dSskrll
8546d3ceb1dSskrll return err;
8556d3ceb1dSskrll
8566d3ceb1dSskrll }
8576d3ceb1dSskrll
8586d3ceb1dSskrll int
pdcproc_system_map_trans_path(struct pdc_memmap * pmm,struct device_path * dev)8596d3ceb1dSskrll pdcproc_system_map_trans_path(struct pdc_memmap *pmm, struct device_path *dev)
8606d3ceb1dSskrll {
8616d3ceb1dSskrll int err;
8626d3ceb1dSskrll
8636d3ceb1dSskrll memcpy(&pdcret2, dev, sizeof(*dev));
8646d3ceb1dSskrll
8656d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
8666d3ceb1dSskrll PDC_SYSTEM_MAP_TRANS_PATH, &pdcret1, &pdcret2);
8676d3ceb1dSskrll if (err < 0)
8686d3ceb1dSskrll return err;
8696d3ceb1dSskrll
8706d3ceb1dSskrll memcpy(pmm, &pdcret1, sizeof(*pmm));
8716d3ceb1dSskrll
8726d3ceb1dSskrll return err;
8736d3ceb1dSskrll }
8746d3ceb1dSskrll
8756d3ceb1dSskrll int
pdcproc_soft_power_info(struct pdc_power_info * pspi)8766d3ceb1dSskrll pdcproc_soft_power_info(struct pdc_power_info *pspi)
8776d3ceb1dSskrll {
8786d3ceb1dSskrll int err;
8796d3ceb1dSskrll
8806d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER, PDC_SOFT_POWER_INFO,
8816d3ceb1dSskrll &pdcret1, 0);
8826d3ceb1dSskrll if (err < 0)
8836d3ceb1dSskrll return err;
8846d3ceb1dSskrll
8856d3ceb1dSskrll memcpy(pspi, &pdcret1, sizeof(*pspi));
8866d3ceb1dSskrll
8876d3ceb1dSskrll return err;
8886d3ceb1dSskrll }
8896d3ceb1dSskrll
8906d3ceb1dSskrll int
pdcproc_soft_power_enable(int action)8916d3ceb1dSskrll pdcproc_soft_power_enable(int action)
8926d3ceb1dSskrll {
8936d3ceb1dSskrll int err;
8946d3ceb1dSskrll
8956d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER, PDC_SOFT_POWER_ENABLE,
8966d3ceb1dSskrll &pdcret1, action);
8976d3ceb1dSskrll
8986d3ceb1dSskrll return err;
8996d3ceb1dSskrll }
9006d3ceb1dSskrll
9016d3ceb1dSskrll int
pdcproc_memmap(struct pdc_memmap * pmm,struct device_path * dev)9026d3ceb1dSskrll pdcproc_memmap(struct pdc_memmap *pmm, struct device_path *dev)
9036d3ceb1dSskrll {
9046d3ceb1dSskrll int err;
9056d3ceb1dSskrll
9066d3ceb1dSskrll memcpy(&pdcret2, dev, sizeof(*dev));
9076d3ceb1dSskrll
9086d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_MEMMAP, PDC_MEMMAP_HPA, &pdcret1,
9096d3ceb1dSskrll &pdcret2);
9106d3ceb1dSskrll if (err < 0)
9116d3ceb1dSskrll return err;
9126d3ceb1dSskrll
9136d3ceb1dSskrll memcpy(pmm, &pdcret1, sizeof(*pmm));
9146d3ceb1dSskrll
9156d3ceb1dSskrll return err;
9166d3ceb1dSskrll }
9176d3ceb1dSskrll
9186d3ceb1dSskrll int
pdcproc_ioclrerrors(void)9196d3ceb1dSskrll pdcproc_ioclrerrors(void)
9206d3ceb1dSskrll {
9216d3ceb1dSskrll int err;
9226d3ceb1dSskrll
9236d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_READ_AND_CLEAR_ERRORS);
9246d3ceb1dSskrll
9256d3ceb1dSskrll return err;
9266d3ceb1dSskrll }
9276d3ceb1dSskrll
9286d3ceb1dSskrll int
pdcproc_ioreset(void)9296d3ceb1dSskrll pdcproc_ioreset(void)
9306d3ceb1dSskrll {
9316d3ceb1dSskrll int err;
9326d3ceb1dSskrll
9336d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_RESET_DEVICES);
9346d3ceb1dSskrll
9356d3ceb1dSskrll return err;
9366d3ceb1dSskrll }
9376d3ceb1dSskrll
9386d3ceb1dSskrll int
pdcproc_doreset(void)9396d3ceb1dSskrll pdcproc_doreset(void)
9406d3ceb1dSskrll {
9416d3ceb1dSskrll int err;
9426d3ceb1dSskrll
9436d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_BROADCAST_RESET, PDC_DO_RESET);
9446d3ceb1dSskrll
9456d3ceb1dSskrll return err;
9466d3ceb1dSskrll }
9476d3ceb1dSskrll
9486d3ceb1dSskrll int
pdcproc_lan_station_id(char * addr,size_t sz,hppa_hpa_t hpa)9496d3ceb1dSskrll pdcproc_lan_station_id(char *addr, size_t sz, hppa_hpa_t hpa)
9506d3ceb1dSskrll {
9516d3ceb1dSskrll struct pdc_lan_station_id *mac = (struct pdc_lan_station_id *)&pdcret1;
9526d3ceb1dSskrll int err;
9536d3ceb1dSskrll
9546d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_LAN_STATION_ID,
9556d3ceb1dSskrll PDC_LAN_STATION_ID_READ, &pdcret1, hpa);
9566d3ceb1dSskrll if (err < 0)
9576d3ceb1dSskrll return err;
9586d3ceb1dSskrll
9596d3ceb1dSskrll memcpy(addr, mac->addr, sz);
9606d3ceb1dSskrll
9616d3ceb1dSskrll return 0;
9626d3ceb1dSskrll }
9636d3ceb1dSskrll
9646d3ceb1dSskrll int
pdcproc_pci_inttblsz(int * nentries)9656d3ceb1dSskrll pdcproc_pci_inttblsz(int *nentries)
9666d3ceb1dSskrll {
9676d3ceb1dSskrll struct pdc_pat_io_num *ppio = (struct pdc_pat_io_num *)&pdcret1;
9686d3ceb1dSskrll int err;
9696d3ceb1dSskrll
9706d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SZ,
9716d3ceb1dSskrll &pdcret1);
9726d3ceb1dSskrll
9736d3ceb1dSskrll *nentries = ppio->num;
9746d3ceb1dSskrll
9756d3ceb1dSskrll return err;
9766d3ceb1dSskrll }
9776d3ceb1dSskrll
9786d3ceb1dSskrll /* Maximum number of supported interrupt routing entries. */
9796d3ceb1dSskrll #define MAX_INT_TBL_SZ 16
9806d3ceb1dSskrll
9816d3ceb1dSskrll int
pdcproc_pci_gettable(int nentries,size_t size,void * table)9826d3ceb1dSskrll pdcproc_pci_gettable(int nentries, size_t size, void *table)
9836d3ceb1dSskrll {
9846d3ceb1dSskrll int err;
9856d3ceb1dSskrll static struct pdc_pat_pci_rt int_tbl[MAX_INT_TBL_SZ] PDC_ALIGNMENT;
9866d3ceb1dSskrll
9876d3ceb1dSskrll if (nentries > MAX_INT_TBL_SZ)
9886d3ceb1dSskrll panic("interrupt routing table too big (%d entries)", nentries);
9896d3ceb1dSskrll
9906d3ceb1dSskrll pdcret1.result[0] = nentries;
9916d3ceb1dSskrll
9926d3ceb1dSskrll err = pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL,
9936d3ceb1dSskrll &pdcret1, 0, &int_tbl);
9946d3ceb1dSskrll if (err < 0)
9956d3ceb1dSskrll return err;
9966d3ceb1dSskrll
9976d3ceb1dSskrll memcpy(table, int_tbl, size);
9986d3ceb1dSskrll
9996d3ceb1dSskrll return err;
10006d3ceb1dSskrll }
1001