Home | History | Annotate | Line # | Download | only in dev
pdc.c revision 1.3.30.1
      1  1.3.30.1  christos /*	$NetBSD: pdc.c,v 1.3.30.1 2019/06/10 22:06:18 christos Exp $	*/
      2       1.1     skrll 
      3       1.1     skrll /*	$OpenBSD: pdc.c,v 1.14 2001/04/29 21:05:43 mickey Exp $	*/
      4       1.1     skrll 
      5       1.1     skrll /*
      6       1.1     skrll  * Copyright (c) 1998-2003 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 #include <sys/cdefs.h>
     32  1.3.30.1  christos __KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.3.30.1 2019/06/10 22:06:18 christos Exp $");
     33       1.1     skrll 
     34       1.1     skrll #include <sys/param.h>
     35       1.1     skrll #include <sys/systm.h>
     36       1.1     skrll #include <sys/device.h>
     37       1.1     skrll #include <sys/proc.h>
     38       1.1     skrll #include <sys/tty.h>
     39       1.1     skrll #include <sys/callout.h>
     40       1.1     skrll #include <sys/conf.h>
     41       1.1     skrll #include <sys/kauth.h>
     42       1.1     skrll 
     43       1.1     skrll #include <dev/cons.h>
     44       1.1     skrll #include <dev/clock_subr.h>
     45       1.1     skrll 
     46       1.1     skrll #include <machine/pdc.h>
     47       1.1     skrll #include <machine/iomod.h>
     48       1.1     skrll #include <machine/autoconf.h>
     49       1.1     skrll 
     50       1.1     skrll #include <hppa/hppa/machdep.h>
     51       1.1     skrll #include <hppa/dev/cpudevs.h>
     52       1.1     skrll 
     53       1.1     skrll typedef
     54       1.1     skrll struct pdc_softc {
     55       1.1     skrll 	device_t sc_dv;
     56       1.1     skrll 	struct tty *sc_tty;
     57       1.1     skrll 	struct callout sc_to;
     58       1.1     skrll } pdcsoftc_t;
     59       1.1     skrll 
     60       1.1     skrll pdcio_t pdc;
     61       1.1     skrll 
     62       1.1     skrll enum pdc_type pdc_type;
     63       1.1     skrll 
     64       1.1     skrll static struct pdc_result pdcret1 PDC_ALIGNMENT;
     65       1.1     skrll static struct pdc_result pdcret2 PDC_ALIGNMENT;
     66       1.1     skrll static char pdc_consbuf[IODC_MINIOSIZ] PDC_ALIGNMENT;
     67       1.1     skrll 
     68       1.1     skrll iodcio_t pdc_cniodc, pdc_kbdiodc;
     69       1.1     skrll pz_device_t *pz_kbd, *pz_cons;
     70       1.1     skrll 
     71       1.1     skrll int pdcmatch(device_t, cfdata_t, void *);
     72       1.1     skrll void pdcattach(device_t, device_t, void *);
     73       1.1     skrll 
     74       1.1     skrll CFATTACH_DECL_NEW(pdc, sizeof(pdcsoftc_t),
     75       1.1     skrll     pdcmatch, pdcattach, NULL, NULL);
     76       1.1     skrll 
     77       1.1     skrll extern struct cfdriver pdc_cd;
     78       1.1     skrll 
     79       1.1     skrll static int pdc_attached;
     80       1.1     skrll 
     81       1.1     skrll dev_type_open(pdcopen);
     82       1.1     skrll dev_type_close(pdcclose);
     83       1.1     skrll dev_type_read(pdcread);
     84       1.1     skrll dev_type_write(pdcwrite);
     85       1.1     skrll dev_type_ioctl(pdcioctl);
     86       1.1     skrll dev_type_stop(pdcstop);
     87       1.1     skrll dev_type_tty(pdctty);
     88       1.1     skrll dev_type_poll(pdcpoll);
     89       1.1     skrll 
     90       1.1     skrll const struct cdevsw pdc_cdevsw = {
     91       1.2  dholland 	.d_open = pdcopen,
     92       1.2  dholland 	.d_close = pdcclose,
     93       1.2  dholland 	.d_read = pdcread,
     94       1.2  dholland 	.d_write = pdcwrite,
     95       1.2  dholland 	.d_ioctl = pdcioctl,
     96       1.2  dholland 	.d_stop = pdcstop,
     97       1.2  dholland 	.d_tty = pdctty,
     98       1.2  dholland 	.d_poll = pdcpoll,
     99       1.2  dholland 	.d_mmap = nommap,
    100       1.3  dholland 	.d_kqfilter = ttykqfilter,
    101       1.2  dholland 	.d_discard = nodiscard,
    102       1.2  dholland 	.d_flag = D_TTY
    103       1.1     skrll };
    104       1.1     skrll 
    105       1.1     skrll void pdcstart(struct tty *);
    106       1.1     skrll void pdctimeout(void *);
    107       1.1     skrll int pdcparam(struct tty *, struct termios *);
    108       1.1     skrll int pdccnlookc(dev_t, int *);
    109       1.1     skrll 
    110       1.1     skrll static struct cnm_state pdc_cnm_state;
    111       1.1     skrll 
    112       1.1     skrll static int pdcgettod(todr_chip_handle_t, struct timeval *);
    113       1.1     skrll static int pdcsettod(todr_chip_handle_t, struct timeval *);
    114       1.1     skrll 
    115       1.1     skrll void
    116       1.1     skrll pdc_init(void)
    117       1.1     skrll {
    118       1.1     skrll 	static int kbd_iodc[IODC_MAXSIZE/sizeof(int)];
    119       1.1     skrll 	static int cn_iodc[IODC_MAXSIZE/sizeof(int)];
    120       1.1     skrll 	int err;
    121       1.1     skrll 	int pagezero_cookie;
    122       1.1     skrll 
    123       1.1     skrll 	pagezero_cookie = hppa_pagezero_map();
    124       1.1     skrll 
    125       1.1     skrll 	pz_kbd = &PAGE0->mem_kbd;
    126       1.1     skrll 	pz_cons = &PAGE0->mem_cons;
    127       1.1     skrll 
    128       1.1     skrll 	pdc = (pdcio_t)PAGE0->mem_pdc;
    129       1.1     skrll 
    130       1.1     skrll 	/* XXX should we reset the console/kbd here?
    131       1.1     skrll 	   well, /boot did that for us anyway */
    132       1.1     skrll 	if ((err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
    133       1.1     skrll 	      &pdcret1, pz_cons->pz_hpa, IODC_IO, cn_iodc, IODC_MAXSIZE)) < 0 ||
    134       1.1     skrll 	    (err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
    135       1.1     skrll 	      &pdcret1, pz_kbd->pz_hpa, IODC_IO, kbd_iodc, IODC_MAXSIZE)) < 0) {
    136       1.1     skrll #ifdef DEBUG
    137       1.1     skrll 		printf("pdc_init: failed reading IODC (%d)\n", err);
    138       1.1     skrll #endif
    139       1.1     skrll 	}
    140       1.1     skrll 
    141       1.1     skrll 	hppa_pagezero_unmap(pagezero_cookie);
    142       1.1     skrll 
    143       1.1     skrll 	pdc_cniodc = (iodcio_t)cn_iodc;
    144       1.1     skrll 	pdc_kbdiodc = (iodcio_t)kbd_iodc;
    145       1.1     skrll 
    146       1.1     skrll 	/* XXX make pdc current console */
    147       1.1     skrll 	cn_tab = &constab[0];
    148       1.1     skrll }
    149       1.1     skrll 
    150       1.1     skrll void
    151       1.1     skrll pdc_settype(int modelno)
    152       1.1     skrll {
    153       1.1     skrll 	switch (modelno) {
    154       1.1     skrll 		/* 720, 750, 730, 735, 755 */
    155       1.1     skrll 	case HPPA_BOARD_HP720:
    156       1.1     skrll 	case HPPA_BOARD_HP750_66:
    157       1.1     skrll 	case HPPA_BOARD_HP730_66:
    158       1.1     skrll 	case HPPA_BOARD_HP735_99:
    159       1.1     skrll 	case HPPA_BOARD_HP755_99:
    160       1.1     skrll 	case HPPA_BOARD_HP755_125:
    161       1.1     skrll 	case HPPA_BOARD_HP735_130:
    162       1.1     skrll 
    163       1.1     skrll 		/* 710, 705, 7[12]5 */
    164       1.1     skrll 	case HPPA_BOARD_HP710:
    165       1.1     skrll 	case HPPA_BOARD_HP705:
    166       1.1     skrll 	case HPPA_BOARD_HP715_50:
    167       1.1     skrll 	case HPPA_BOARD_HP715_33:
    168       1.1     skrll 	case HPPA_BOARD_HP715S_50:
    169       1.1     skrll 	case HPPA_BOARD_HP715S_33:
    170       1.1     skrll 	case HPPA_BOARD_HP715T_50:
    171       1.1     skrll 	case HPPA_BOARD_HP715T_33:
    172       1.1     skrll 	case HPPA_BOARD_HP715_75:
    173       1.1     skrll 	case HPPA_BOARD_HP715_99:
    174       1.1     skrll 	case HPPA_BOARD_HP725_50:
    175       1.1     skrll 	case HPPA_BOARD_HP725_75:
    176       1.1     skrll 	case HPPA_BOARD_HP725_99:
    177       1.1     skrll 
    178       1.1     skrll 		/* 745, 742, 747 */
    179       1.1     skrll 	case HPPA_BOARD_HP745I_50:
    180       1.1     skrll 	case HPPA_BOARD_HP742I_50:
    181       1.1     skrll 	case HPPA_BOARD_HP747I_100:
    182       1.1     skrll 
    183       1.1     skrll 		/* 712/{60,80,100,120}, 715/{64,80,100,...}, etc */
    184       1.1     skrll 	case HPPA_BOARD_HP712_60:
    185       1.1     skrll 	case HPPA_BOARD_HP712_80:
    186       1.1     skrll 	case HPPA_BOARD_HP712_100:
    187       1.1     skrll 	case HPPA_BOARD_HP743I_64:
    188       1.1     skrll 	case HPPA_BOARD_HP743I_100:
    189       1.1     skrll 	case HPPA_BOARD_HP712_120:
    190       1.1     skrll 	case HPPA_BOARD_HP715_80:
    191       1.1     skrll 	case HPPA_BOARD_HP715_64:
    192       1.1     skrll 	case HPPA_BOARD_HP715_100:
    193       1.1     skrll 	case HPPA_BOARD_HP715_100XC:
    194       1.1     skrll 	case HPPA_BOARD_HP725_100:
    195       1.1     skrll 	case HPPA_BOARD_HP725_120:
    196       1.1     skrll 	case HPPA_BOARD_HP715_100L:
    197       1.1     skrll 	case HPPA_BOARD_HP715_120L:
    198       1.1     skrll 	case HPPA_BOARD_HP725_80L:
    199       1.1     skrll 	case HPPA_BOARD_HP725_100L:
    200       1.1     skrll 	case HPPA_BOARD_HP725_120L:
    201       1.1     skrll 	case HPPA_BOARD_HP743_50:
    202       1.1     skrll 	case HPPA_BOARD_HP743_100:
    203       1.1     skrll 	case HPPA_BOARD_HP715_80M:
    204       1.1     skrll 	case HPPA_BOARD_HP811:
    205       1.1     skrll 	case HPPA_BOARD_HP801:
    206       1.1     skrll 	case HPPA_BOARD_HP743T:
    207       1.1     skrll 		pdc_type = PDC_TYPE_SNAKE;
    208       1.1     skrll 		break;
    209       1.1     skrll 
    210       1.1     skrll 	default:
    211       1.1     skrll 		pdc_type = PDC_TYPE_UNKNOWN;
    212       1.1     skrll 	}
    213       1.1     skrll }
    214       1.1     skrll 
    215       1.1     skrll enum pdc_type
    216       1.1     skrll pdc_gettype(void)
    217       1.1     skrll {
    218       1.1     skrll 
    219       1.1     skrll 	return pdc_type;
    220       1.1     skrll }
    221       1.1     skrll 
    222       1.1     skrll int
    223       1.1     skrll pdcmatch(device_t parent, cfdata_t cf, void *aux)
    224       1.1     skrll {
    225       1.1     skrll 	struct confargs *ca = aux;
    226       1.1     skrll 
    227       1.1     skrll 	/* there could be only one */
    228       1.1     skrll 	if (pdc_attached || strcmp(ca->ca_name, "pdc"))
    229       1.1     skrll 		return 0;
    230       1.1     skrll 
    231       1.1     skrll 	return 1;
    232       1.1     skrll }
    233       1.1     skrll 
    234       1.1     skrll void
    235       1.1     skrll pdcattach(device_t parent, device_t self, void *aux)
    236       1.1     skrll {
    237       1.1     skrll 	static struct todr_chip_handle todr = {
    238       1.1     skrll 		.todr_settime = pdcsettod,
    239       1.1     skrll 		.todr_gettime = pdcgettod,
    240       1.1     skrll 	};
    241       1.1     skrll 	struct pdc_softc *sc = device_private(self);
    242       1.1     skrll 
    243       1.1     skrll 	sc->sc_dv = self;
    244       1.1     skrll 	pdc_attached = 1;
    245       1.1     skrll 
    246       1.1     skrll 	KASSERT(pdc != NULL);
    247       1.1     skrll 
    248       1.1     skrll 	cn_init_magic(&pdc_cnm_state);
    249       1.1     skrll 	cn_set_magic("+++++");
    250       1.1     skrll 
    251       1.1     skrll 	/* attach the TOD clock */
    252       1.1     skrll 	todr_attach(&todr);
    253       1.1     skrll 
    254       1.1     skrll 	aprint_normal("\n");
    255       1.1     skrll 
    256       1.1     skrll 	callout_init(&sc->sc_to, 0);
    257       1.1     skrll }
    258       1.1     skrll 
    259       1.1     skrll int
    260       1.1     skrll pdcopen(dev_t dev, int flag, int mode, struct lwp *l)
    261       1.1     skrll {
    262       1.1     skrll 	struct pdc_softc *sc;
    263       1.1     skrll 	struct tty *tp;
    264       1.1     skrll 	int s;
    265       1.1     skrll 	int error = 0, setuptimeout;
    266       1.1     skrll 
    267       1.1     skrll 	sc = device_lookup_private(&pdc_cd, minor(dev));
    268       1.1     skrll 	if (sc == NULL)
    269       1.1     skrll 		return ENXIO;
    270       1.1     skrll 
    271       1.1     skrll 	s = spltty();
    272       1.1     skrll 
    273       1.1     skrll 	if (sc->sc_tty) {
    274       1.1     skrll 		tp = sc->sc_tty;
    275       1.1     skrll 	} else {
    276       1.1     skrll 		tp = tty_alloc();
    277       1.1     skrll 		sc->sc_tty = tp;
    278       1.1     skrll 		tty_attach(tp);
    279       1.1     skrll 	}
    280       1.1     skrll 
    281       1.1     skrll 	tp->t_oproc = pdcstart;
    282       1.1     skrll 	tp->t_param = pdcparam;
    283       1.1     skrll 	tp->t_dev = dev;
    284       1.1     skrll 
    285       1.1     skrll 	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp)) {
    286       1.1     skrll 		splx(s);
    287       1.1     skrll 		return (EBUSY);
    288       1.1     skrll 	}
    289       1.1     skrll 
    290       1.1     skrll 	if ((tp->t_state & TS_ISOPEN) == 0) {
    291       1.1     skrll 		tp->t_state |= TS_CARR_ON;
    292       1.1     skrll 		ttychars(tp);
    293       1.1     skrll 		tp->t_iflag = TTYDEF_IFLAG;
    294       1.1     skrll 		tp->t_oflag = TTYDEF_OFLAG;
    295       1.1     skrll 		tp->t_cflag = TTYDEF_CFLAG|CLOCAL;
    296       1.1     skrll 		tp->t_lflag = TTYDEF_LFLAG;
    297       1.1     skrll 		tp->t_ispeed = tp->t_ospeed = 9600;
    298       1.1     skrll 		ttsetwater(tp);
    299       1.1     skrll 
    300       1.1     skrll 		setuptimeout = 1;
    301       1.1     skrll 	} else
    302       1.1     skrll 		setuptimeout = 0;
    303       1.1     skrll 	tp->t_state |= TS_CARR_ON;
    304       1.1     skrll 
    305       1.1     skrll 	splx(s);
    306       1.1     skrll 
    307       1.1     skrll 	error = (*tp->t_linesw->l_open)(dev, tp);
    308       1.1     skrll 	if (error == 0 && setuptimeout)
    309       1.1     skrll 		pdctimeout(sc);
    310       1.1     skrll 
    311       1.1     skrll 	return error;
    312       1.1     skrll }
    313       1.1     skrll 
    314       1.1     skrll int
    315       1.1     skrll pdcclose(dev_t dev, int flag, int mode, struct lwp *l)
    316       1.1     skrll {
    317       1.1     skrll 	struct tty *tp;
    318       1.1     skrll 	struct pdc_softc *sc;
    319       1.1     skrll 
    320       1.1     skrll 	sc = device_lookup_private(&pdc_cd, minor(dev));
    321       1.1     skrll 	if (sc == NULL)
    322       1.1     skrll 		return ENXIO;
    323       1.1     skrll 
    324       1.1     skrll 	tp = sc->sc_tty;
    325       1.1     skrll 	callout_stop(&sc->sc_to);
    326       1.1     skrll 	(*tp->t_linesw->l_close)(tp, flag);
    327       1.1     skrll 	ttyclose(tp);
    328       1.1     skrll 	return 0;
    329       1.1     skrll }
    330       1.1     skrll 
    331       1.1     skrll int
    332       1.1     skrll pdcread(dev_t dev, struct uio *uio, int flag)
    333       1.1     skrll {
    334       1.1     skrll 	struct tty *tp;
    335       1.1     skrll 	struct pdc_softc *sc;
    336       1.1     skrll 
    337       1.1     skrll 	sc = device_lookup_private(&pdc_cd, minor(dev));
    338       1.1     skrll 	if (sc == NULL)
    339       1.1     skrll 		return ENXIO;
    340       1.1     skrll 
    341       1.1     skrll 	tp = sc->sc_tty;
    342       1.1     skrll 	return ((*tp->t_linesw->l_read)(tp, uio, flag));
    343       1.1     skrll }
    344       1.1     skrll 
    345       1.1     skrll int
    346       1.1     skrll pdcwrite(dev_t dev, struct uio *uio, int flag)
    347       1.1     skrll {
    348       1.1     skrll 	struct tty *tp;
    349       1.1     skrll 	struct pdc_softc *sc;
    350       1.1     skrll 
    351       1.1     skrll 	sc = device_lookup_private(&pdc_cd, minor(dev));
    352       1.1     skrll 	if (sc == NULL)
    353       1.1     skrll 		return ENXIO;
    354       1.1     skrll 
    355       1.1     skrll 	tp = sc->sc_tty;
    356       1.1     skrll 	return ((*tp->t_linesw->l_write)(tp, uio, flag));
    357       1.1     skrll }
    358       1.1     skrll 
    359       1.1     skrll int
    360       1.1     skrll pdcpoll(dev_t dev, int events, struct lwp *l)
    361       1.1     skrll {
    362       1.1     skrll 	struct pdc_softc *sc = device_lookup_private(&pdc_cd,minor(dev));
    363       1.1     skrll 	struct tty *tp = sc->sc_tty;
    364       1.1     skrll 
    365       1.1     skrll 	return ((*tp->t_linesw->l_poll)(tp, events, l));
    366       1.1     skrll }
    367       1.1     skrll 
    368       1.1     skrll int
    369       1.1     skrll pdcioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
    370       1.1     skrll {
    371       1.1     skrll 	int error;
    372       1.1     skrll 	struct tty *tp;
    373       1.1     skrll 	struct pdc_softc *sc;
    374       1.1     skrll 
    375       1.1     skrll 	sc = device_lookup_private(&pdc_cd, minor(dev));
    376       1.1     skrll 	if (sc == NULL)
    377       1.1     skrll 		return ENXIO;
    378       1.1     skrll 
    379       1.1     skrll 	tp = sc->sc_tty;
    380       1.1     skrll 	error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l);
    381       1.1     skrll 	if (error >= 0)
    382       1.1     skrll 		return error;
    383       1.1     skrll 	error = ttioctl(tp, cmd, data, flag, l);
    384       1.1     skrll 	if (error >= 0)
    385       1.1     skrll 		return error;
    386       1.1     skrll 
    387       1.1     skrll 	return ENOTTY;
    388       1.1     skrll }
    389       1.1     skrll 
    390       1.1     skrll int
    391       1.1     skrll pdcparam(struct tty *tp, struct termios *t)
    392       1.1     skrll {
    393       1.1     skrll 
    394       1.1     skrll 	return 0;
    395       1.1     skrll }
    396       1.1     skrll 
    397       1.1     skrll void
    398       1.1     skrll pdcstart(struct tty *tp)
    399       1.1     skrll {
    400       1.1     skrll 	int s;
    401       1.1     skrll 
    402       1.1     skrll 	s = spltty();
    403       1.1     skrll 	if (tp->t_state & (TS_TTSTOP | TS_BUSY)) {
    404       1.1     skrll 		splx(s);
    405       1.1     skrll 		return;
    406       1.1     skrll 	}
    407       1.1     skrll 	ttypull(tp);
    408       1.1     skrll 	tp->t_state |= TS_BUSY;
    409       1.1     skrll 	while (tp->t_outq.c_cc != 0)
    410       1.1     skrll 		pdccnputc(tp->t_dev, getc(&tp->t_outq));
    411       1.1     skrll 	tp->t_state &= ~TS_BUSY;
    412       1.1     skrll 	splx(s);
    413       1.1     skrll }
    414       1.1     skrll 
    415       1.1     skrll void
    416       1.1     skrll pdcstop(struct tty *tp,	int flag)
    417       1.1     skrll {
    418       1.1     skrll 	int s;
    419       1.1     skrll 
    420       1.1     skrll 	s = spltty();
    421       1.1     skrll 	if (tp->t_state & TS_BUSY)
    422       1.1     skrll 		if ((tp->t_state & TS_TTSTOP) == 0)
    423       1.1     skrll 			tp->t_state |= TS_FLUSH;
    424       1.1     skrll 	splx(s);
    425       1.1     skrll }
    426       1.1     skrll 
    427       1.1     skrll void
    428       1.1     skrll pdctimeout(void *v)
    429       1.1     skrll {
    430       1.1     skrll 	struct pdc_softc *sc = v;
    431       1.1     skrll 	struct tty *tp = sc->sc_tty;
    432       1.1     skrll 	int c;
    433       1.1     skrll 
    434       1.1     skrll 	while (pdccnlookc(tp->t_dev, &c)) {
    435       1.1     skrll 		cn_check_magic(tp->t_dev, c, pdc_cnm_state);
    436       1.1     skrll 		if (tp->t_state & TS_ISOPEN)
    437       1.1     skrll 			(*tp->t_linesw->l_rint)(c, tp);
    438       1.1     skrll 	}
    439       1.1     skrll 	callout_reset(&sc->sc_to, 1, pdctimeout, sc);
    440       1.1     skrll }
    441       1.1     skrll 
    442       1.1     skrll struct tty *
    443       1.1     skrll pdctty(dev_t dev)
    444       1.1     skrll {
    445       1.1     skrll 	struct pdc_softc *sc;
    446       1.1     skrll 
    447       1.1     skrll 	sc = device_lookup_private(&pdc_cd, minor(dev));
    448       1.1     skrll 	if (sc == NULL)
    449       1.1     skrll 		return NULL;
    450       1.1     skrll 
    451       1.1     skrll 	return sc->sc_tty;
    452       1.1     skrll }
    453       1.1     skrll 
    454       1.1     skrll void
    455       1.1     skrll pdccnprobe(struct consdev *cn)
    456       1.1     skrll {
    457       1.1     skrll 
    458       1.1     skrll 	cn->cn_dev = makedev(22,0);
    459       1.1     skrll 	cn->cn_pri = CN_NORMAL;
    460       1.1     skrll }
    461       1.1     skrll 
    462       1.1     skrll void
    463       1.1     skrll pdccninit(struct consdev *cn)
    464       1.1     skrll {
    465       1.1     skrll #ifdef DEBUG
    466       1.1     skrll 	printf("pdc0: console init\n");
    467       1.1     skrll #endif
    468       1.1     skrll }
    469       1.1     skrll 
    470       1.1     skrll int
    471       1.1     skrll pdccnlookc(dev_t dev, int *cp)
    472       1.1     skrll {
    473       1.1     skrll 	int s, err __debugused, l, pagezero_cookie;
    474       1.1     skrll 
    475       1.1     skrll 	s = splhigh();
    476       1.1     skrll 	pagezero_cookie = hppa_pagezero_map();
    477       1.1     skrll 	err = pdc_call(pdc_kbdiodc, 0, pz_kbd->pz_hpa, IODC_IO_CONSIN,
    478       1.1     skrll 	    pz_kbd->pz_spa, pz_kbd->pz_layers, &pdcret1, 0, pdc_consbuf, 1, 0);
    479       1.1     skrll 	l = pdcret1.result[0];
    480       1.1     skrll 	*cp = pdc_consbuf[0];
    481       1.1     skrll 	hppa_pagezero_unmap(pagezero_cookie);
    482       1.1     skrll 	splx(s);
    483       1.1     skrll 
    484       1.1     skrll #ifdef DEBUG
    485       1.1     skrll 	if (err < 0)
    486       1.1     skrll 		printf("pdccnlookc: input error: %d\n", err);
    487       1.1     skrll #endif
    488       1.1     skrll 	return l;
    489       1.1     skrll }
    490       1.1     skrll 
    491       1.1     skrll int
    492       1.1     skrll pdccngetc(dev_t dev)
    493       1.1     skrll {
    494       1.1     skrll 	int c;
    495       1.1     skrll 
    496       1.1     skrll 	if (!pdc)
    497       1.1     skrll 		return 0;
    498       1.1     skrll 	while (!pdccnlookc(dev, &c))
    499       1.1     skrll 		;
    500       1.1     skrll 	return (c);
    501       1.1     skrll }
    502       1.1     skrll 
    503       1.1     skrll void
    504       1.1     skrll pdccnputc(dev_t dev, int c)
    505       1.1     skrll {
    506       1.1     skrll 	int s, err, pagezero_cookie;
    507       1.1     skrll 
    508       1.1     skrll 	s = splhigh();
    509       1.1     skrll 	pagezero_cookie = hppa_pagezero_map();
    510       1.1     skrll 	*pdc_consbuf = c;
    511       1.1     skrll 	err = pdc_call(pdc_cniodc, 0, pz_cons->pz_hpa, IODC_IO_CONSOUT,
    512       1.1     skrll 	    pz_cons->pz_spa, pz_cons->pz_layers, &pdcret1, 0, pdc_consbuf, 1, 0);
    513       1.1     skrll 	hppa_pagezero_unmap(pagezero_cookie);
    514       1.1     skrll 	splx(s);
    515       1.1     skrll 
    516       1.1     skrll 	if (err < 0) {
    517       1.1     skrll #if defined(DDB) || defined(KGDB)
    518       1.1     skrll 		Debugger();
    519       1.1     skrll #endif /* DDB || KGDB */
    520       1.1     skrll 		delay(250000);
    521       1.1     skrll #if 0
    522       1.1     skrll 		/*
    523       1.1     skrll 		 * It's not a good idea to use the output to print
    524       1.1     skrll 		 * an output error.
    525       1.1     skrll 		 */
    526       1.1     skrll 		printf("pdccnputc: output error: %d\n", err);
    527       1.1     skrll #endif
    528       1.1     skrll 	}
    529       1.1     skrll }
    530       1.1     skrll 
    531       1.1     skrll void
    532       1.1     skrll pdccnpollc(dev_t dev, int on)
    533       1.1     skrll {
    534       1.1     skrll }
    535       1.1     skrll 
    536       1.1     skrll static int
    537       1.1     skrll pdcgettod(todr_chip_handle_t tch, struct timeval *tvp)
    538       1.1     skrll {
    539       1.1     skrll 	struct pdc_tod *tod = (struct pdc_tod *)&pdcret1;
    540       1.1     skrll 	int error;
    541       1.1     skrll 
    542       1.1     skrll 	error = pdc_call((iodcio_t)pdc, 1, PDC_TOD, PDC_TOD_READ,
    543       1.1     skrll 	    &pdcret1);
    544       1.1     skrll 
    545       1.1     skrll 	if (error == 0) {
    546       1.1     skrll 		tvp->tv_sec = tod->sec;
    547       1.1     skrll 		tvp->tv_usec = tod->usec;
    548       1.1     skrll 	}
    549       1.1     skrll 	return error;
    550       1.1     skrll }
    551       1.1     skrll 
    552       1.1     skrll static int
    553       1.1     skrll pdcsettod(todr_chip_handle_t tch, struct timeval *tvp)
    554       1.1     skrll {
    555       1.1     skrll 	int error;
    556       1.1     skrll 
    557       1.1     skrll 	error = pdc_call((iodcio_t)pdc, 1, PDC_TOD, PDC_TOD_WRITE,
    558       1.1     skrll 	    tvp->tv_sec, tvp->tv_usec);
    559       1.1     skrll 
    560       1.1     skrll 	return error;
    561       1.1     skrll }
    562       1.1     skrll 
    563       1.1     skrll 
    564       1.1     skrll int
    565       1.1     skrll pdcproc_chassis_display(unsigned long disp)
    566       1.1     skrll {
    567       1.1     skrll 	int err;
    568       1.1     skrll 
    569       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_DISP, disp);
    570  1.3.30.1  christos 
    571       1.1     skrll 	return err;
    572       1.1     skrll }
    573       1.1     skrll 
    574       1.1     skrll int
    575       1.1     skrll pdcproc_chassis_info(struct pdc_chassis_info *pci, struct pdc_chassis_lcd *pcl)
    576       1.1     skrll {
    577       1.1     skrll 	int err;
    578       1.1     skrll 
    579       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_CHASSIS, PDC_CHASSIS_INFO,
    580       1.1     skrll 	    &pdcret1, &pdcret2 , sizeof(*pcl));
    581       1.1     skrll 	if (err < 0)
    582       1.1     skrll 		return err;
    583       1.1     skrll 
    584       1.1     skrll 	memcpy(pci, &pdcret1, sizeof(*pci));
    585       1.1     skrll 	memcpy(pcl, &pdcret2, sizeof(*pcl));
    586  1.3.30.1  christos 
    587       1.1     skrll 	return err;
    588       1.1     skrll }
    589       1.1     skrll 
    590       1.1     skrll int
    591       1.1     skrll pdcproc_pim(int type, struct pdc_pim *pp, void **buf, size_t *sz)
    592       1.1     skrll {
    593       1.1     skrll 	static char data[896] __attribute__((__aligned__(8)));
    594       1.1     skrll 	int err;
    595       1.1     skrll 
    596       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_PIM, type, &pdcret1, data,
    597       1.1     skrll 	    sizeof(data));
    598       1.1     skrll 	if (err < 0)
    599       1.1     skrll 		return err;
    600       1.1     skrll 
    601       1.1     skrll 	memcpy(pp, &pdcret1, sizeof(*pp));
    602       1.1     skrll 	*buf = data;
    603       1.1     skrll 	*sz = sizeof(data);
    604       1.1     skrll 
    605       1.1     skrll 	return err;
    606       1.1     skrll }
    607       1.1     skrll 
    608       1.1     skrll int
    609       1.1     skrll pdcproc_model_info(struct pdc_model *pm)
    610       1.1     skrll {
    611       1.1     skrll 	int err;
    612       1.1     skrll 
    613       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_INFO, &pdcret1);
    614       1.1     skrll 	if (err < 0)
    615       1.1     skrll 		return err;
    616       1.1     skrll 
    617       1.1     skrll 	memcpy(pm, &pdcret1, sizeof(*pm));
    618       1.1     skrll 
    619       1.1     skrll 	return err;
    620       1.1     skrll }
    621       1.1     skrll 
    622       1.1     skrll int
    623       1.1     skrll pdcproc_model_cpuid(struct pdc_cpuid *pc)
    624       1.1     skrll {
    625       1.1     skrll 	int err;
    626       1.1     skrll 
    627       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_MODEL, PDC_MODEL_CPUID, &pdcret1);
    628       1.1     skrll 	if (err < 0)
    629       1.1     skrll 		return err;
    630       1.1     skrll 
    631       1.1     skrll 	memcpy(pc, &pdcret1, sizeof(*pc));
    632       1.1     skrll 
    633       1.1     skrll 	return err;
    634       1.1     skrll }
    635       1.1     skrll 
    636       1.1     skrll int
    637       1.1     skrll pdcproc_cache(struct pdc_cache *pc)
    638       1.1     skrll {
    639       1.1     skrll 	int err;
    640       1.1     skrll 
    641       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_DFLT, &pdcret1);
    642       1.1     skrll 
    643       1.1     skrll 	if (err < 0)
    644       1.1     skrll 		return err;
    645       1.1     skrll 
    646       1.1     skrll 	memcpy(pc, &pdcret1, sizeof(*pc));
    647       1.1     skrll 
    648       1.1     skrll 	return err;
    649       1.1     skrll }
    650       1.1     skrll 
    651       1.1     skrll 
    652       1.1     skrll int
    653       1.1     skrll pdcproc_cache_spidbits(struct pdc_spidb *pcs)
    654       1.1     skrll {
    655       1.1     skrll 	int err;
    656       1.1     skrll 
    657       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_CACHE, PDC_CACHE_GETSPIDB,
    658       1.1     skrll             &pdcret1);
    659       1.1     skrll 
    660       1.1     skrll 	if (err < 0)
    661       1.1     skrll 		return err;
    662       1.1     skrll 
    663       1.1     skrll 	memcpy(pcs, &pdcret1, sizeof(*pcs));
    664       1.1     skrll 
    665       1.1     skrll 	return err;
    666       1.1     skrll }
    667       1.1     skrll 
    668       1.1     skrll int
    669       1.1     skrll pdcproc_hpa_processor(hppa_hpa_t *hpa)
    670       1.1     skrll {
    671       1.1     skrll 	int err;
    672       1.1     skrll 
    673       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_HPA, PDC_HPA_DFLT, &pdcret1);
    674       1.1     skrll 	if (err < 0)
    675       1.1     skrll 		return err;
    676       1.1     skrll 
    677       1.1     skrll 	*hpa = pdcret1.result[0];
    678       1.1     skrll 
    679       1.1     skrll 	return err;
    680       1.1     skrll }
    681       1.1     skrll 
    682       1.1     skrll int
    683       1.1     skrll pdcproc_coproc(struct pdc_coproc *pc)
    684       1.1     skrll {
    685       1.1     skrll 	int err;
    686       1.1     skrll 
    687       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_COPROC, PDC_COPROC_DFLT, &pdcret1);
    688       1.1     skrll 	if (err < 0)
    689       1.1     skrll 		return err;
    690       1.1     skrll 
    691       1.1     skrll 	memcpy(pc, &pdcret1, sizeof(*pc));
    692       1.1     skrll 
    693       1.1     skrll 	return err;
    694       1.1     skrll }
    695       1.1     skrll 
    696       1.1     skrll int
    697       1.1     skrll pdcproc_iodc_read(hppa_hpa_t hpa, int command, int *actcnt,
    698       1.1     skrll     struct pdc_iodc_read *buf1, size_t sz1, struct iodc_data *buf2,
    699       1.1     skrll     size_t sz2)
    700       1.1     skrll {
    701       1.1     skrll 	int err;
    702       1.1     skrll 
    703       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_READ,
    704       1.1     skrll 	    &pdcret1, hpa, command, &pdcret2, sizeof(pdcret2));
    705       1.1     skrll 
    706       1.1     skrll 	if (err < 0)
    707       1.1     skrll 		return err;
    708       1.1     skrll 
    709       1.1     skrll 	if (actcnt != NULL) {
    710       1.1     skrll 		struct pdc_iodc_read *pir = (struct pdc_iodc_read *)&pdcret1;
    711       1.1     skrll 
    712       1.1     skrll 		*actcnt = pir->size;
    713       1.1     skrll 	}
    714       1.1     skrll 
    715       1.1     skrll 	memcpy(buf1, &pdcret1, sz1);
    716       1.1     skrll 	memcpy(buf2, &pdcret2, sz2);
    717       1.1     skrll 
    718       1.1     skrll 	return err;
    719       1.1     skrll }
    720       1.1     skrll 
    721       1.1     skrll int
    722       1.1     skrll pdcproc_iodc_ninit(struct pdc_iodc_minit *pimi, hppa_hpa_t hpa, int sz)
    723       1.1     skrll {
    724       1.1     skrll 	int err;
    725       1.1     skrll 
    726       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_IODC, PDC_IODC_NINIT, &pdcret1,
    727       1.1     skrll 	    hpa, sz);
    728       1.1     skrll 
    729       1.1     skrll 	if (err < 0)
    730       1.1     skrll 		return err;
    731       1.1     skrll 
    732       1.1     skrll 	memcpy(pimi, &pdcret1, sizeof(*pimi));
    733       1.1     skrll 
    734       1.1     skrll 	return err;
    735       1.1     skrll }
    736       1.1     skrll 
    737       1.1     skrll int
    738       1.1     skrll pdcproc_instr(unsigned int *mem)
    739       1.1     skrll {
    740       1.1     skrll 	int err;
    741       1.1     skrll 
    742       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_INSTR, PDC_INSTR_DFLT, &pdcret1);
    743       1.1     skrll 	if (err < 0)
    744       1.1     skrll 		return err;
    745       1.1     skrll 
    746       1.1     skrll 	memcpy(mem, &pdcret1, sizeof(*mem));
    747       1.1     skrll 
    748       1.1     skrll 	return err;
    749       1.1     skrll }
    750  1.3.30.1  christos 
    751       1.1     skrll int
    752       1.1     skrll pdcproc_block_tlb(struct pdc_btlb *pb)
    753       1.1     skrll {
    754       1.1     skrll 	int err;
    755       1.1     skrll 
    756       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_DEFAULT,
    757       1.1     skrll 	    &pdcret1);
    758       1.1     skrll 	if (err < 0)
    759       1.1     skrll 		return err;
    760       1.1     skrll 
    761       1.1     skrll 	memcpy(pb, &pdcret1, sizeof(*pb));
    762       1.1     skrll 
    763       1.1     skrll 	return err;
    764       1.1     skrll }
    765       1.1     skrll 
    766       1.1     skrll int
    767       1.1     skrll pdcproc_btlb_insert(pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz,
    768       1.1     skrll     u_int prot, int index)
    769       1.1     skrll {
    770       1.1     skrll 	int err;
    771       1.1     skrll 
    772       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_INSERT, sp,
    773       1.1     skrll 	    va, pa, sz, prot, index);
    774       1.1     skrll 
    775       1.1     skrll 	return err;
    776       1.1     skrll }
    777       1.1     skrll 
    778       1.1     skrll int
    779       1.1     skrll pdcproc_btlb_purge(pa_space_t sp, vaddr_t va, paddr_t pa, vsize_t sz)
    780       1.1     skrll {
    781       1.1     skrll 	int err;
    782       1.1     skrll 
    783       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_PURGE, sp, va,
    784       1.1     skrll 	    pa, sz);
    785       1.1     skrll 
    786       1.1     skrll 	return err;
    787       1.1     skrll }
    788       1.1     skrll 
    789       1.1     skrll int
    790       1.1     skrll pdcproc_btlb_purgeall(void)
    791       1.1     skrll {
    792       1.1     skrll 	int err;
    793       1.1     skrll 
    794       1.1     skrll 	err =  pdc_call((iodcio_t)pdc, 0, PDC_BLOCK_TLB, PDC_BTLB_PURGE_ALL);
    795       1.1     skrll 
    796       1.1     skrll 	return err;
    797       1.1     skrll }
    798       1.1     skrll 
    799       1.1     skrll int pdcproc_tlb_info(struct pdc_hwtlb *ph)
    800       1.1     skrll {
    801       1.1     skrll 	int err;
    802       1.1     skrll 
    803       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_INFO, &pdcret1);
    804       1.1     skrll 	if (err < 0)
    805       1.1     skrll 		return err;
    806       1.1     skrll 
    807       1.1     skrll 	memcpy(ph, &pdcret1, sizeof(*ph));
    808       1.1     skrll 
    809       1.1     skrll 	return err;
    810       1.1     skrll }
    811       1.1     skrll 
    812       1.1     skrll int
    813       1.1     skrll pdcproc_tlb_config(struct pdc_hwtlb *ph, unsigned long hpt,
    814       1.1     skrll     unsigned long hptsize, unsigned long type)
    815       1.1     skrll {
    816       1.1     skrll 	int err;
    817       1.1     skrll 
    818       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_TLB, PDC_TLB_CONFIG, ph, hpt,
    819       1.1     skrll 	    hptsize, type);
    820       1.1     skrll 
    821       1.1     skrll 	return err;
    822       1.1     skrll }
    823       1.1     skrll 
    824       1.1     skrll int
    825       1.1     skrll pdcproc_system_map_find_mod(struct pdc_system_map_find_mod *psm,
    826       1.1     skrll     struct device_path *dev, int mod)
    827       1.1     skrll {
    828       1.1     skrll 	int err;
    829       1.1     skrll 
    830       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
    831       1.1     skrll 	    PDC_SYSTEM_MAP_FIND_MOD, &pdcret1, &pdcret2, mod);
    832       1.1     skrll 	if (err < 0)
    833       1.1     skrll 		return err;
    834       1.1     skrll 
    835       1.1     skrll 	memcpy(psm, &pdcret1, sizeof(*psm));
    836       1.1     skrll 	memcpy(dev, &pdcret2, sizeof(*dev));
    837       1.1     skrll 
    838       1.1     skrll 	return err;
    839       1.1     skrll }
    840       1.1     skrll 
    841       1.1     skrll int
    842       1.1     skrll pdcproc_system_map_find_addr(struct pdc_system_map_find_addr *psm, int mod,
    843       1.1     skrll     int addr)
    844       1.1     skrll {
    845       1.1     skrll 	int err;
    846       1.1     skrll 
    847       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
    848       1.1     skrll 	    PDC_SYSTEM_MAP_FIND_ADDR, &pdcret1, mod, addr);
    849       1.1     skrll 	if (err < 0)
    850       1.1     skrll 		return err;
    851       1.1     skrll 
    852       1.1     skrll 	memcpy(psm, &pdcret1, sizeof(*psm));
    853       1.1     skrll 
    854       1.1     skrll 	return err;
    855  1.3.30.1  christos 
    856       1.1     skrll }
    857       1.1     skrll 
    858       1.1     skrll int
    859       1.1     skrll pdcproc_system_map_trans_path(struct pdc_memmap *pmm, struct device_path *dev)
    860       1.1     skrll {
    861       1.1     skrll 	int err;
    862       1.1     skrll 
    863       1.1     skrll 	memcpy(&pdcret2, dev, sizeof(*dev));
    864       1.1     skrll 
    865       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_SYSTEM_MAP,
    866       1.1     skrll 	    PDC_SYSTEM_MAP_TRANS_PATH, &pdcret1, &pdcret2);
    867       1.1     skrll 	if (err < 0)
    868       1.1     skrll 		return err;
    869       1.1     skrll 
    870       1.1     skrll 	memcpy(pmm, &pdcret1, sizeof(*pmm));
    871       1.1     skrll 
    872       1.1     skrll 	return err;
    873       1.1     skrll }
    874       1.1     skrll 
    875       1.1     skrll int
    876       1.1     skrll pdcproc_soft_power_info(struct pdc_power_info *pspi)
    877       1.1     skrll {
    878       1.1     skrll 	int err;
    879  1.3.30.1  christos 
    880       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER, PDC_SOFT_POWER_INFO,
    881       1.1     skrll 	    &pdcret1, 0);
    882       1.1     skrll 	if (err < 0)
    883       1.1     skrll 		return err;
    884       1.1     skrll 
    885       1.1     skrll 	memcpy(pspi, &pdcret1, sizeof(*pspi));
    886       1.1     skrll 
    887       1.1     skrll 	return err;
    888       1.1     skrll }
    889       1.1     skrll 
    890       1.1     skrll int
    891       1.1     skrll pdcproc_soft_power_enable(int action)
    892       1.1     skrll {
    893       1.1     skrll 	int err;
    894       1.1     skrll 
    895       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_SOFT_POWER, PDC_SOFT_POWER_ENABLE,
    896       1.1     skrll 	    &pdcret1, action);
    897       1.1     skrll 
    898       1.1     skrll 	return err;
    899       1.1     skrll }
    900       1.1     skrll 
    901       1.1     skrll int
    902       1.1     skrll pdcproc_memmap(struct pdc_memmap *pmm, struct device_path *dev)
    903       1.1     skrll {
    904       1.1     skrll 	int err;
    905       1.1     skrll 
    906       1.1     skrll 	memcpy(&pdcret2, dev, sizeof(*dev));
    907       1.1     skrll 
    908       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_MEMMAP, PDC_MEMMAP_HPA, &pdcret1,
    909       1.1     skrll 	    &pdcret2);
    910       1.1     skrll 	if (err < 0)
    911       1.1     skrll 		return err;
    912       1.1     skrll 
    913       1.1     skrll 	memcpy(pmm, &pdcret1, sizeof(*pmm));
    914       1.1     skrll 
    915       1.1     skrll 	return err;
    916       1.1     skrll }
    917       1.1     skrll 
    918       1.1     skrll int
    919       1.1     skrll pdcproc_ioclrerrors(void)
    920       1.1     skrll {
    921       1.1     skrll 	int err;
    922       1.1     skrll 
    923       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_READ_AND_CLEAR_ERRORS);
    924       1.1     skrll 
    925       1.1     skrll 	return err;
    926       1.1     skrll }
    927       1.1     skrll 
    928       1.1     skrll int
    929       1.1     skrll pdcproc_ioreset(void)
    930       1.1     skrll {
    931       1.1     skrll 	int err;
    932       1.1     skrll 
    933       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_IO, PDC_IO_RESET_DEVICES);
    934       1.1     skrll 
    935       1.1     skrll 	return err;
    936       1.1     skrll }
    937       1.1     skrll 
    938       1.1     skrll int
    939       1.1     skrll pdcproc_doreset(void)
    940       1.1     skrll {
    941       1.1     skrll 	int err;
    942       1.1     skrll 
    943       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_BROADCAST_RESET, PDC_DO_RESET);
    944       1.1     skrll 
    945       1.1     skrll 	return err;
    946       1.1     skrll }
    947       1.1     skrll 
    948       1.1     skrll int
    949       1.1     skrll pdcproc_lan_station_id(char *addr, size_t sz, hppa_hpa_t hpa)
    950       1.1     skrll {
    951       1.1     skrll 	struct pdc_lan_station_id *mac = (struct pdc_lan_station_id *)&pdcret1;
    952       1.1     skrll 	int err;
    953       1.1     skrll 
    954       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_LAN_STATION_ID,
    955       1.1     skrll 	    PDC_LAN_STATION_ID_READ, &pdcret1, hpa);
    956       1.1     skrll 	if (err < 0)
    957       1.1     skrll 		return err;
    958       1.1     skrll 
    959       1.1     skrll 	memcpy(addr, mac->addr, sz);
    960       1.1     skrll 
    961       1.1     skrll 	return 0;
    962       1.1     skrll }
    963       1.1     skrll 
    964       1.1     skrll int
    965       1.1     skrll pdcproc_pci_inttblsz(int *nentries)
    966       1.1     skrll {
    967       1.1     skrll 	struct pdc_pat_io_num *ppio = (struct pdc_pat_io_num *)&pdcret1;
    968       1.1     skrll 	int err;
    969       1.1     skrll 
    970       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SZ,
    971       1.1     skrll 	    &pdcret1);
    972       1.1     skrll 
    973       1.1     skrll 	*nentries = ppio->num;
    974       1.1     skrll 
    975       1.1     skrll 	return err;
    976       1.1     skrll }
    977       1.1     skrll 
    978       1.1     skrll /* Maximum number of supported interrupt routing entries. */
    979       1.1     skrll #define MAX_INT_TBL_SZ	16
    980       1.1     skrll 
    981       1.1     skrll int
    982       1.1     skrll pdcproc_pci_gettable(int nentries, size_t size, void *table)
    983       1.1     skrll {
    984       1.1     skrll 	int err;
    985       1.1     skrll 	static struct pdc_pat_pci_rt int_tbl[MAX_INT_TBL_SZ] PDC_ALIGNMENT;
    986       1.1     skrll 
    987       1.1     skrll 	if (nentries > MAX_INT_TBL_SZ)
    988       1.1     skrll 		panic("interrupt routing table too big (%d entries)", nentries);
    989       1.1     skrll 
    990       1.1     skrll 	pdcret1.result[0] = nentries;
    991       1.1     skrll 
    992       1.1     skrll 	err = pdc_call((iodcio_t)pdc, 0, PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL,
    993       1.1     skrll 	    &pdcret1, 0, &int_tbl);
    994       1.1     skrll 	if (err < 0)
    995       1.1     skrll 		return err;
    996  1.3.30.1  christos 
    997       1.1     skrll 	memcpy(table, int_tbl, size);
    998       1.1     skrll 
    999       1.1     skrll 	return err;
   1000       1.1     skrll }
   1001