Home | History | Annotate | Line # | Download | only in dev
vme_pcc.c revision 1.7.2.1
      1  1.7.2.1   minoura /*	$NetBSD: vme_pcc.c,v 1.7.2.1 2000/06/22 17:01:44 minoura Exp $	*/
      2      1.1     chuck 
      3      1.1     chuck /*-
      4      1.7       scw  * Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
      5      1.1     chuck  * All rights reserved.
      6      1.1     chuck  *
      7      1.1     chuck  * This code is derived from software contributed to The NetBSD Foundation
      8      1.7       scw  * by Jason R. Thorpe and Steve C. Woodford.
      9      1.1     chuck  *
     10      1.1     chuck  * Redistribution and use in source and binary forms, with or without
     11      1.1     chuck  * modification, are permitted provided that the following conditions
     12      1.1     chuck  * are met:
     13      1.1     chuck  * 1. Redistributions of source code must retain the above copyright
     14      1.1     chuck  *    notice, this list of conditions and the following disclaimer.
     15      1.1     chuck  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.1     chuck  *    notice, this list of conditions and the following disclaimer in the
     17      1.1     chuck  *    documentation and/or other materials provided with the distribution.
     18      1.1     chuck  * 3. All advertising materials mentioning features or use of this software
     19      1.1     chuck  *    must display the following acknowledgement:
     20      1.1     chuck  *        This product includes software developed by the NetBSD
     21      1.1     chuck  *        Foundation, Inc. and its contributors.
     22      1.1     chuck  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23      1.1     chuck  *    contributors may be used to endorse or promote products derived
     24      1.1     chuck  *    from this software without specific prior written permission.
     25      1.1     chuck  *
     26      1.1     chuck  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27      1.1     chuck  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28      1.1     chuck  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29      1.5       jtc  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30      1.5       jtc  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31      1.1     chuck  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32      1.1     chuck  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33      1.1     chuck  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34      1.1     chuck  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35      1.1     chuck  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36      1.1     chuck  * POSSIBILITY OF SUCH DAMAGE.
     37      1.1     chuck  */
     38      1.1     chuck 
     39      1.1     chuck /*
     40      1.1     chuck  * VME support specific to the Type 1 VMEchip found on the
     41      1.1     chuck  * MVME-147.
     42      1.1     chuck  *
     43      1.1     chuck  * For a manual on the MVME-147, call: 408.991.8634.  (Yes, this
     44      1.1     chuck  * is the Sunnyvale sales office.)
     45      1.1     chuck  */
     46      1.1     chuck 
     47      1.1     chuck #include <sys/param.h>
     48      1.1     chuck #include <sys/kernel.h>
     49      1.1     chuck #include <sys/systm.h>
     50      1.1     chuck #include <sys/device.h>
     51      1.7       scw #include <sys/malloc.h>
     52      1.7       scw #include <sys/kcore.h>
     53      1.1     chuck 
     54      1.1     chuck #include <machine/cpu.h>
     55      1.7       scw #include <machine/bus.h>
     56      1.7       scw 
     57      1.7       scw #include <dev/vme/vmereg.h>
     58      1.7       scw #include <dev/vme/vmevar.h>
     59      1.7       scw 
     60      1.7       scw #include <mvme68k/mvme68k/isr.h>
     61      1.1     chuck 
     62      1.1     chuck #include <mvme68k/dev/pccreg.h>
     63      1.1     chuck #include <mvme68k/dev/pccvar.h>
     64      1.1     chuck #include <mvme68k/dev/vme_pccreg.h>
     65      1.7       scw #include <mvme68k/dev/vme_pccvar.h>
     66      1.7       scw 
     67      1.1     chuck 
     68      1.7       scw int vme_pcc_match __P((struct device *, struct cfdata *, void *));
     69      1.7       scw void vme_pcc_attach __P((struct device *, struct device *, void *));
     70      1.1     chuck 
     71      1.7       scw struct cfattach vmepcc_ca = {
     72      1.7       scw 	sizeof(struct vme_pcc_softc), vme_pcc_match, vme_pcc_attach
     73      1.1     chuck };
     74      1.6   thorpej 
     75      1.7       scw extern struct cfdriver vmepcc_cd;
     76      1.7       scw 
     77      1.7       scw extern phys_ram_seg_t mem_clusters[];
     78      1.7       scw static int vme_pcc_attached;
     79      1.7       scw 
     80      1.7       scw #ifdef DIAGNOSTIC
     81      1.7       scw const char *_vme1_mod_string __P((vme_addr_t, vme_size_t,
     82      1.7       scw 				  vme_am_t, vme_datasize_t));
     83      1.7       scw #endif
     84      1.7       scw 
     85      1.7       scw /*
     86      1.7       scw  * Describe the VMEbus ranges available from the MVME147
     87      1.7       scw  */
     88      1.7       scw struct vme_pcc_range {
     89      1.7       scw 	vme_am_t pr_am;			/* Address Modifier for this range */
     90      1.7       scw 	vme_datasize_t pr_datasize;	/* Usable Data Sizes (D8, D16, * D32) */
     91      1.7       scw 	vme_addr_t pr_locstart;		/* Local-bus start address of range */
     92      1.7       scw 	vme_addr_t pr_start;		/* VMEbus start address of range */
     93      1.7       scw 	vme_addr_t pr_end;		/* VMEbus end address of range */
     94      1.1     chuck };
     95      1.1     chuck 
     96      1.7       scw static struct vme_pcc_range vme_pcc_ranges[] = {
     97      1.7       scw 	{VME_AM_MBO | VME_AM_A24 | VME_AM_DATA | VME_AM_SUPER,
     98      1.7       scw 		VME_D32 | VME_D16 | VME_D8,
     99      1.7       scw 		VME1_A24D32_LOC_START,
    100      1.7       scw 		VME1_A24D32_START,
    101      1.7       scw 		VME1_A24D32_END},
    102      1.7       scw 
    103      1.7       scw 	{VME_AM_MBO | VME_AM_A32 | VME_AM_DATA | VME_AM_SUPER,
    104      1.7       scw 		VME_D32 | VME_D16 | VME_D8,
    105      1.7       scw 		VME1_A32D32_LOC_START,
    106      1.7       scw 		VME1_A32D32_START,
    107      1.7       scw 		VME1_A32D32_END},
    108      1.7       scw 
    109      1.7       scw 	{VME_AM_MBO | VME_AM_A24 | VME_AM_DATA | VME_AM_SUPER,
    110      1.7       scw 		VME_D16 | VME_D8,
    111      1.7       scw 		VME1_A24D16_LOC_START,
    112      1.7       scw 		VME1_A24D16_START,
    113      1.7       scw 		VME1_A24D16_END},
    114      1.7       scw 
    115      1.7       scw 	{VME_AM_MBO | VME_AM_A32 | VME_AM_DATA | VME_AM_SUPER,
    116      1.7       scw 		VME_D16 | VME_D8,
    117      1.7       scw 		VME1_A32D16_LOC_START,
    118      1.7       scw 		VME1_A32D16_START,
    119      1.7       scw 		VME1_A32D16_END},
    120      1.7       scw 
    121      1.7       scw 	{VME_AM_MBO | VME_AM_A16 | VME_AM_DATA | VME_AM_SUPER,
    122      1.7       scw 		VME_D16 | VME_D8,
    123      1.7       scw 		VME1_A16D16_LOC_START,
    124      1.7       scw 		VME1_A16D16_START,
    125      1.7       scw 		VME1_A16D16_END}
    126      1.7       scw };
    127      1.7       scw #define VME1_NRANGES	(sizeof(vme_pcc_ranges)/sizeof(struct vme_pcc_range))
    128      1.1     chuck 
    129      1.1     chuck 
    130      1.7       scw /* ARGSUSED */
    131      1.1     chuck int
    132      1.7       scw vme_pcc_match(parent, cf, aux)
    133      1.1     chuck 	struct device *parent;
    134      1.4       gwr 	struct cfdata *cf;
    135      1.4       gwr 	void *aux;
    136      1.1     chuck {
    137      1.7       scw 	struct pcc_attach_args *pa;
    138      1.7       scw 
    139      1.7       scw 	pa = aux;
    140      1.1     chuck 
    141      1.1     chuck 	/* Only one VME chip, please. */
    142      1.7       scw 	if (vme_pcc_attached)
    143      1.1     chuck 		return (0);
    144      1.1     chuck 
    145      1.7       scw 	if (strcmp(pa->pa_name, vmepcc_cd.cd_name))
    146      1.1     chuck 		return (0);
    147      1.1     chuck 
    148      1.1     chuck 	return (1);
    149      1.1     chuck }
    150      1.1     chuck 
    151      1.1     chuck void
    152      1.7       scw vme_pcc_attach(parent, self, aux)
    153      1.7       scw 	struct device *parent;
    154      1.7       scw 	struct device *self;
    155      1.1     chuck 	void *aux;
    156      1.1     chuck {
    157      1.7       scw 	struct pcc_attach_args *pa;
    158      1.7       scw 	struct vme_pcc_softc *sc;
    159      1.7       scw 	struct vmebus_attach_args vaa;
    160      1.7       scw 	u_int8_t reg;
    161      1.7       scw 	int i;
    162      1.7       scw 
    163      1.7       scw 	sc = (struct vme_pcc_softc *) self;
    164      1.7       scw 	pa = aux;
    165      1.7       scw 
    166      1.7       scw 	sc->sc_dmat = pa->pa_dmat;
    167      1.7       scw 	sc->sc_bust = pa->pa_bust;
    168      1.7       scw 	sc->sc_vmet = MVME68K_VME_BUS_SPACE;
    169      1.7       scw 
    170      1.7       scw 	bus_space_map(sc->sc_bust, pa->pa_offset, VME1REG_SIZE, 0,
    171      1.7       scw 	    &sc->sc_bush);
    172      1.1     chuck 
    173      1.1     chuck 	/* Initialize the chip. */
    174      1.7       scw 	reg = vme1_reg_read(sc, VME1REG_SCON) & ~VME1_SCON_SYSFAIL;
    175      1.7       scw 	vme1_reg_write(sc, VME1REG_SCON, reg);
    176      1.1     chuck 
    177      1.3  christos 	printf(": Type 1 VMEchip, scon jumper %s\n",
    178      1.7       scw 	    (reg & VME1_SCON_SWITCH) ? "enabled" : "disabled");
    179      1.1     chuck 
    180      1.7       scw 	sc->sc_vct.cookie = self;
    181      1.7       scw 	sc->sc_vct.vct_probe = _vme_pcc_probe;
    182      1.7       scw 	sc->sc_vct.vct_map = _vme_pcc_map;
    183      1.7       scw 	sc->sc_vct.vct_unmap = _vme_pcc_unmap;
    184      1.7       scw 	sc->sc_vct.vct_int_map = _vme_pcc_intmap;
    185  1.7.2.1   minoura 	sc->sc_vct.vct_int_evcnt = _vme_pcc_intr_evcnt;
    186      1.7       scw 	sc->sc_vct.vct_int_establish = _vme_pcc_intr_establish;
    187      1.7       scw 	sc->sc_vct.vct_int_disestablish = _vme_pcc_intr_disestablish;
    188      1.7       scw 	sc->sc_vct.vct_dmamap_create = _vme_pcc_dmamap_create;
    189      1.7       scw 	sc->sc_vct.vct_dmamap_destroy = _vme_pcc_dmamap_destroy;
    190      1.7       scw 	sc->sc_vct.vct_dmamem_alloc = _vme_pcc_dmamem_alloc;
    191      1.7       scw 	sc->sc_vct.vct_dmamem_free = _vme_pcc_dmamem_free;
    192      1.7       scw 
    193      1.7       scw 	/*
    194      1.7       scw 	 * Adjust the start address of the first range in vme_pcc_ranges[]
    195      1.7       scw 	 * according to how much onboard memory exists. Disable the first
    196      1.7       scw 	 * range if onboard memory >= 16Mb, and adjust the start of the
    197      1.7       scw 	 * second range (A32D32).
    198      1.7       scw 	 */
    199      1.7       scw 	vme_pcc_ranges[0].pr_start = (vme_addr_t) mem_clusters[0].size;
    200      1.7       scw 	if (mem_clusters[0].size >= 0x01000000) {
    201      1.7       scw 		vme_pcc_ranges[0].pr_am = (vme_am_t) - 1;
    202      1.7       scw 		vme_pcc_ranges[1].pr_start +=
    203      1.7       scw 		    (vme_addr_t) (mem_clusters[0].size - 0x01000000);
    204      1.7       scw 	}
    205      1.1     chuck 
    206      1.7       scw #ifdef DIAGNOSTIC
    207      1.7       scw 	for (i = 0; i < VME1_NRANGES; i++) {
    208      1.7       scw 		vme_addr_t mask;
    209      1.7       scw 
    210      1.7       scw 		switch (vme_pcc_ranges[i].pr_am & VME_AM_ADRSIZEMASK) {
    211      1.7       scw 		case VME_AM_A32:
    212      1.7       scw 			mask = 0xffffffffu;
    213      1.1     chuck 			break;
    214      1.1     chuck 
    215      1.7       scw 		case VME_AM_A24:
    216      1.7       scw 			mask = 0x00ffffffu;
    217      1.1     chuck 			break;
    218      1.1     chuck 
    219      1.7       scw 		case VME_AM_A16:
    220      1.7       scw 			mask = 0x0000ffffu;
    221      1.1     chuck 			break;
    222      1.1     chuck 
    223      1.1     chuck 		default:
    224      1.7       scw 			printf("%s: Map#%d: disabled\n",
    225      1.7       scw 			    sc->sc_dev.dv_xname, i);
    226      1.7       scw 			continue;
    227      1.1     chuck 		}
    228      1.1     chuck 
    229      1.7       scw 		printf("%s: Map#%d: 0x%08x -> %s\n", sc->sc_dev.dv_xname, i,
    230      1.7       scw 		    vme_pcc_ranges[i].pr_locstart + vme_pcc_ranges[i].pr_start,
    231      1.7       scw 		    _vme1_mod_string(vme_pcc_ranges[i].pr_start & mask,
    232      1.7       scw 			(vme_pcc_ranges[i].pr_end -
    233      1.7       scw 			    vme_pcc_ranges[i].pr_start) + 1,
    234      1.7       scw 			vme_pcc_ranges[i].pr_am,
    235      1.7       scw 			vme_pcc_ranges[i].pr_datasize));
    236      1.7       scw 	}
    237      1.7       scw #endif
    238      1.7       scw 
    239      1.7       scw 	vaa.va_vct = &(sc->sc_vct);
    240      1.7       scw 	vaa.va_bdt = sc->sc_dmat;
    241      1.7       scw 	vaa.va_slaveconfig = NULL;
    242      1.7       scw 
    243      1.7       scw 	vme_pcc_attached = 1;
    244      1.7       scw 
    245      1.7       scw 	/* Attach the MI VMEbus glue. */
    246      1.7       scw 	config_found(self, &vaa, 0);
    247      1.7       scw }
    248      1.1     chuck 
    249      1.7       scw /* ARGSUSED */
    250      1.7       scw int
    251      1.7       scw _vme_pcc_map(vsc, vmeaddr, len, am, datasize, swap, tag, handle, resc)
    252      1.7       scw 	void *vsc;
    253      1.7       scw 	vme_addr_t vmeaddr;
    254      1.7       scw 	vme_size_t len;
    255      1.7       scw 	vme_am_t am;
    256      1.7       scw 	vme_datasize_t datasize;
    257      1.7       scw 	vme_swap_t swap;
    258      1.7       scw 	bus_space_tag_t *tag;
    259      1.7       scw 	bus_space_handle_t *handle;
    260      1.7       scw 	vme_mapresc_t *resc;
    261      1.7       scw {
    262      1.7       scw 	struct vme_pcc_softc *sc;
    263      1.7       scw 	struct vme_pcc_mapresc_t *pm;
    264      1.7       scw 	struct vme_pcc_range *pr;
    265      1.7       scw 	vme_addr_t end;
    266      1.7       scw 	paddr_t paddr;
    267      1.7       scw 	int rv;
    268      1.7       scw 	int i;
    269      1.7       scw 
    270      1.7       scw 	sc = vsc;
    271      1.7       scw 	end = (vmeaddr + len) - 1;
    272      1.7       scw 	paddr = 0;
    273      1.7       scw 
    274      1.7       scw 	for (i = 0, pr = &vme_pcc_ranges[0]; i < VME1_NRANGES; i++, pr++) {
    275      1.7       scw 		/* Ignore if range is disabled */
    276      1.7       scw 		if (pr->pr_am == (vme_am_t) - 1)
    277      1.7       scw 			continue;
    278      1.7       scw 
    279      1.7       scw 		/*
    280      1.7       scw 		 * Accept the range if it matches the constraints
    281      1.7       scw 		 */
    282      1.7       scw 		if (am == pr->pr_am &&
    283      1.7       scw 		    datasize <= pr->pr_datasize &&
    284      1.7       scw 		    vmeaddr >= pr->pr_start && end <= pr->pr_end) {
    285      1.7       scw 			/*
    286      1.7       scw 			 * We have a match.
    287      1.7       scw 			 */
    288      1.7       scw 			paddr = pr->pr_locstart + vmeaddr;
    289      1.1     chuck 			break;
    290      1.7       scw 		}
    291      1.7       scw 	}
    292      1.7       scw 
    293      1.7       scw 	if (paddr == 0) {
    294      1.7       scw #ifdef DIAGNOSTIC
    295      1.7       scw 		printf("%s: Unable to map %s\n", sc->sc_dev.dv_xname,
    296      1.7       scw 		    _vme1_mod_string(vmeaddr, len, am, datasize));
    297      1.7       scw #endif
    298      1.7       scw 		return (ENOMEM);
    299      1.7       scw 	}
    300      1.7       scw 	if ((rv = bus_space_map(sc->sc_vmet, paddr, len, 0, handle)) != 0)
    301      1.7       scw 		return (rv);
    302      1.7       scw 
    303      1.7       scw 	if ((pm = malloc(sizeof(*pm), M_DEVBUF, M_NOWAIT)) == NULL) {
    304      1.7       scw 		bus_space_unmap(sc->sc_vmet, *handle, len);
    305      1.7       scw 		return (ENOMEM);
    306      1.7       scw 	}
    307      1.7       scw 	*tag = sc->sc_vmet;
    308      1.7       scw 	pm->pm_am = am;
    309      1.7       scw 	pm->pm_datasize = datasize;
    310      1.7       scw 	pm->pm_addr = vmeaddr;
    311      1.7       scw 	pm->pm_size = len;
    312      1.7       scw 	pm->pm_handle = *handle;
    313      1.7       scw 	*resc = (vme_mapresc_t *) pm;
    314      1.7       scw 
    315      1.7       scw 	return (0);
    316      1.7       scw }
    317      1.7       scw 
    318      1.7       scw void
    319      1.7       scw _vme_pcc_unmap(vsc, resc)
    320      1.7       scw 	void *vsc;
    321      1.7       scw 	vme_mapresc_t resc;
    322      1.7       scw {
    323      1.7       scw 	struct vme_pcc_softc *sc;
    324      1.7       scw 	struct vme_pcc_mapresc_t *pm;
    325      1.7       scw 
    326      1.7       scw 	sc = (struct vme_pcc_softc *) vsc;
    327      1.7       scw 	pm = (struct vme_pcc_mapresc_t *) resc;
    328      1.7       scw 
    329      1.7       scw 	bus_space_unmap(sc->sc_vmet, pm->pm_handle, pm->pm_size);
    330      1.7       scw 
    331      1.7       scw 	free(pm, M_DEVBUF);
    332      1.7       scw }
    333      1.7       scw 
    334      1.7       scw int
    335      1.7       scw _vme_pcc_probe(vsc, vmeaddr, len, am, datasize, callback, arg)
    336      1.7       scw 	void *vsc;
    337      1.7       scw 	vme_addr_t vmeaddr;
    338      1.7       scw 	vme_size_t len;
    339      1.7       scw 	vme_am_t am;
    340      1.7       scw 	vme_datasize_t datasize;
    341      1.7       scw 	int (*callback) __P((void *, bus_space_tag_t, bus_space_handle_t));
    342      1.7       scw 	void *arg;
    343      1.7       scw {
    344      1.7       scw 	bus_space_tag_t tag;
    345      1.7       scw 	bus_space_handle_t handle;
    346      1.7       scw 	vme_mapresc_t resc;
    347      1.7       scw 	int rv;
    348      1.7       scw 
    349      1.7       scw 	rv = _vme_pcc_map(vsc, vmeaddr, len, am, datasize,
    350      1.7       scw 	    0, &tag, &handle, &resc);
    351      1.7       scw 	if (rv)
    352      1.7       scw 		return (rv);
    353      1.7       scw 
    354      1.7       scw 	if (callback)
    355      1.7       scw 		rv = (*callback) (arg, tag, handle);
    356      1.7       scw 	else {
    357      1.7       scw 		/*
    358      1.7       scw 		 * FIXME: datasize is fixed by hardware, so using badaddr() in
    359      1.7       scw 		 * this way may cause several accesses to each VMEbus address.
    360      1.7       scw 		 * Also, using 'handle' in this way is a bit presumptuous...
    361      1.7       scw 		 */
    362      1.7       scw 		rv = badaddr((caddr_t) handle, (int) len) ? EIO : 0;
    363      1.7       scw 	}
    364      1.7       scw 
    365      1.7       scw 	_vme_pcc_unmap(vsc, resc);
    366      1.7       scw 
    367      1.7       scw 	return (rv);
    368      1.7       scw }
    369      1.7       scw 
    370      1.7       scw /* ARGSUSED */
    371      1.7       scw int
    372      1.7       scw _vme_pcc_intmap(vsc, level, vector, handlep)
    373      1.7       scw 	void *vsc;
    374      1.7       scw 	int level, vector;
    375      1.7       scw 	vme_intr_handle_t *handlep;
    376      1.7       scw {
    377      1.7       scw 
    378      1.7       scw 	if (level < 1 || level > 7 || vector < 0x80 || vector > 0xff)
    379      1.7       scw 		return (EINVAL);
    380      1.7       scw 
    381      1.7       scw 	/* This is rather gross */
    382      1.7       scw 	*handlep = (void *) (int) ((level << 8) | vector);
    383      1.7       scw 
    384      1.7       scw 	return (0);
    385  1.7.2.1   minoura }
    386  1.7.2.1   minoura 
    387  1.7.2.1   minoura const struct evcnt *
    388  1.7.2.1   minoura _vme_pcc_intr_evcnt(vsc, handle)
    389  1.7.2.1   minoura 	void *vsc;
    390  1.7.2.1   minoura 	vme_intr_handle_t handle;
    391  1.7.2.1   minoura {
    392  1.7.2.1   minoura 
    393  1.7.2.1   minoura 	/* XXX for now, no evcnt parent reported */
    394  1.7.2.1   minoura 	return NULL;
    395      1.7       scw }
    396      1.7       scw 
    397      1.7       scw void *
    398      1.7       scw _vme_pcc_intr_establish(vsc, handle, prior, func, arg)
    399      1.7       scw 	void *vsc;
    400      1.7       scw 	vme_intr_handle_t handle;
    401      1.7       scw 	int prior;
    402      1.7       scw 	int (*func) __P((void *));
    403      1.7       scw 	void *arg;
    404      1.7       scw {
    405      1.7       scw 	struct vme_pcc_softc *sc;
    406      1.7       scw 	int level, vector;
    407      1.1     chuck 
    408      1.7       scw 	sc = vsc;
    409      1.7       scw 	level = ((int) handle) >> 8;
    410      1.7       scw 	vector = ((int) handle) & 0xff;
    411      1.7       scw 
    412      1.7       scw 	isrlink_vectored(func, arg, level, vector);
    413      1.7       scw 	sc->sc_irqref[level]++;
    414      1.7       scw 
    415      1.7       scw 	/*
    416      1.7       scw 	 * There had better not be another VMEbus master responding
    417      1.7       scw 	 * to this interrupt level...
    418      1.7       scw 	 */
    419      1.7       scw 	vme1_reg_write(sc, VME1REG_IRQEN,
    420      1.7       scw 	    vme1_reg_read(sc, VME1REG_IRQEN) | VME1_IRQ_VME(level));
    421      1.1     chuck 
    422      1.7       scw 	return ((void *) handle);
    423      1.7       scw }
    424      1.1     chuck 
    425      1.7       scw void
    426      1.7       scw _vme_pcc_intr_disestablish(vsc, handle)
    427      1.7       scw 	void *vsc;
    428      1.7       scw 	vme_intr_handle_t handle;
    429      1.7       scw {
    430      1.7       scw 	struct vme_pcc_softc *sc;
    431      1.7       scw 	int level, vector;
    432      1.1     chuck 
    433      1.7       scw 	sc = (struct vme_pcc_softc *) vsc;
    434      1.7       scw 	level = ((int) handle) >> 8;
    435      1.7       scw 	vector = ((int) handle) & 0xff;
    436      1.7       scw 
    437      1.7       scw 	isrunlink_vectored(vector);
    438      1.7       scw 
    439      1.7       scw 	/* Disable VME IRQ if possible. */
    440      1.7       scw 	switch (sc->sc_irqref[level]) {
    441      1.7       scw 	case 0:
    442      1.7       scw 		printf("vme_pcc_intr_disestablish: nothing using IRQ %d\n",
    443      1.7       scw 		    level);
    444      1.7       scw 		panic("vme_pcc_intr_disestablish");
    445      1.7       scw 		/* NOTREACHED */
    446      1.7       scw 
    447      1.7       scw 	case 1:
    448      1.7       scw 		vme1_reg_write(sc, VME1REG_IRQEN,
    449      1.7       scw 		    vme1_reg_read(sc, VME1REG_IRQEN) & ~VME1_IRQ_VME(level));
    450      1.7       scw 		/* FALLTHROUGH */
    451      1.1     chuck 
    452      1.1     chuck 	default:
    453      1.7       scw 		sc->sc_irqref[level]--;
    454      1.1     chuck 	}
    455      1.7       scw }
    456      1.7       scw 
    457      1.7       scw /* ARGSUSED */
    458      1.7       scw int
    459      1.7       scw _vme_pcc_dmamap_create(vsc, len, am, datasize, swap, nsegs,
    460      1.7       scw     segsz, bound, flags, mapp)
    461      1.7       scw 	void *vsc;
    462      1.7       scw 	vme_size_t len;
    463      1.7       scw 	vme_am_t am;
    464      1.7       scw 	vme_datasize_t datasize;
    465      1.7       scw 	vme_swap_t swap;
    466      1.7       scw 	int nsegs;
    467      1.7       scw 	vme_size_t segsz;
    468      1.7       scw 	vme_addr_t bound;
    469      1.7       scw 	int flags;
    470      1.7       scw 	bus_dmamap_t *mapp;
    471      1.7       scw {
    472      1.1     chuck 
    473      1.7       scw 	return (EINVAL);
    474      1.1     chuck }
    475      1.1     chuck 
    476      1.7       scw /* ARGSUSED */
    477      1.1     chuck void
    478      1.7       scw _vme_pcc_dmamap_destroy(vsc, map)
    479      1.7       scw 	void *vsc;
    480      1.7       scw 	bus_dmamap_t map;
    481      1.1     chuck {
    482      1.7       scw }
    483      1.1     chuck 
    484      1.7       scw /* ARGSUSED */
    485      1.7       scw int
    486      1.7       scw _vme_pcc_dmamem_alloc(vsc, len, am, datasizes, swap,
    487      1.7       scw     segs, nsegs, rsegs, flags)
    488      1.7       scw 	void *vsc;
    489      1.7       scw 	vme_size_t len;
    490      1.7       scw 	vme_am_t am;
    491      1.7       scw 	vme_datasize_t datasizes;
    492      1.7       scw 	vme_swap_t swap;
    493      1.7       scw 	bus_dma_segment_t *segs;
    494      1.7       scw 	int nsegs;
    495      1.7       scw 	int *rsegs;
    496      1.7       scw 	int flags;
    497      1.7       scw {
    498      1.7       scw 
    499      1.7       scw 	return (EINVAL);
    500      1.1     chuck }
    501      1.1     chuck 
    502      1.7       scw /* ARGSUSED */
    503      1.1     chuck void
    504      1.7       scw _vme_pcc_dmamem_free(vsc, segs, nsegs)
    505      1.7       scw 	void *vsc;
    506      1.7       scw 	bus_dma_segment_t *segs;
    507      1.7       scw 	int nsegs;
    508      1.1     chuck {
    509      1.7       scw }
    510      1.7       scw 
    511      1.7       scw #ifdef DIAGNOSTIC
    512      1.7       scw const char *
    513      1.7       scw _vme1_mod_string(addr, len, am, ds)
    514      1.7       scw 	vme_addr_t addr;
    515      1.7       scw 	vme_size_t len;
    516      1.7       scw 	vme_am_t am;
    517      1.7       scw 	vme_datasize_t ds;
    518      1.7       scw {
    519      1.7       scw 	static const char *mode[] = {"BLT64)", "DATA)", "PROG)", "BLT32)"};
    520      1.7       scw 	static const char *dsiz[] = {"(", "(D8,", "(D16,", "(D16-D8,",
    521      1.7       scw 	"(D32,", "(D32,D8,", "(D32-D16,", "(D32-D8,"};
    522      1.7       scw 	static char mstring[40];
    523      1.7       scw 	char *fmt;
    524      1.7       scw 
    525      1.7       scw 	switch (am & VME_AM_ADRSIZEMASK) {
    526      1.7       scw 	case VME_AM_A32:
    527      1.7       scw 		fmt = "A32:%08x-%08x ";
    528      1.7       scw 		break;
    529      1.7       scw 
    530      1.7       scw 	case VME_AM_A24:
    531      1.7       scw 		fmt = "A24:%06x-%06x ";
    532      1.7       scw 		break;
    533      1.7       scw 
    534      1.7       scw 	case VME_AM_A16:
    535      1.7       scw 		fmt = "A16:%04x-%04x ";
    536      1.7       scw 		break;
    537      1.7       scw 
    538      1.7       scw 	case VME_AM_USERDEF:
    539      1.7       scw 		fmt = "USR:%08x-%08x ";
    540      1.7       scw 		break;
    541      1.7       scw 	}
    542      1.7       scw 
    543      1.7       scw 	sprintf(mstring, fmt, addr, addr + len - 1);
    544      1.7       scw 	strcat(mstring, dsiz[ds & 0x7]);
    545      1.7       scw 	strcat(mstring, ((am & VME_AM_PRIVMASK) == VME_AM_USER) ?
    546      1.7       scw 	    "USER," : "SUPER,");
    547      1.7       scw 	strcat(mstring, mode[am & VME_AM_MODEMASK]);
    548      1.1     chuck 
    549      1.7       scw 	return (mstring);
    550      1.1     chuck }
    551      1.7       scw #endif
    552