Home | History | Annotate | Line # | Download | only in pci
mcpcia_dma.c revision 1.15.128.1
      1  1.15.128.1     yamt /* $NetBSD: mcpcia_dma.c,v 1.15.128.1 2008/05/16 02:21:48 yamt Exp $ */
      2         1.1   mjacob 
      3         1.1   mjacob /*-
      4        1.12  thorpej  * Copyright (c) 1997, 1998, 1999 The NetBSD Foundation, Inc.
      5         1.1   mjacob  * All rights reserved.
      6         1.1   mjacob  *
      7         1.1   mjacob  * This code is derived from software contributed to The NetBSD Foundation
      8         1.7  thorpej  * by Jason R. Thorpe and Matthew Jacob of the Numerical Aerospace Simulation
      9         1.7  thorpej  * Facility, NASA Ames Research Center.
     10         1.1   mjacob  *
     11         1.1   mjacob  * Redistribution and use in source and binary forms, with or without
     12         1.1   mjacob  * modification, are permitted provided that the following conditions
     13         1.1   mjacob  * are met:
     14         1.1   mjacob  * 1. Redistributions of source code must retain the above copyright
     15         1.1   mjacob  *    notice, this list of conditions and the following disclaimer.
     16         1.1   mjacob  * 2. Redistributions in binary form must reproduce the above copyright
     17         1.1   mjacob  *    notice, this list of conditions and the following disclaimer in the
     18         1.1   mjacob  *    documentation and/or other materials provided with the distribution.
     19         1.1   mjacob  *
     20         1.1   mjacob  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     21         1.1   mjacob  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22         1.1   mjacob  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23         1.1   mjacob  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     24        1.10       pk  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25         1.1   mjacob  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26         1.1   mjacob  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27         1.1   mjacob  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28         1.1   mjacob  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29         1.1   mjacob  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30         1.1   mjacob  * POSSIBILITY OF SUCH DAMAGE.
     31         1.1   mjacob  */
     32         1.1   mjacob 
     33         1.1   mjacob #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
     34         1.1   mjacob 
     35  1.15.128.1     yamt __KERNEL_RCSID(0, "$NetBSD: mcpcia_dma.c,v 1.15.128.1 2008/05/16 02:21:48 yamt Exp $");
     36         1.1   mjacob 
     37         1.1   mjacob #include <sys/param.h>
     38         1.1   mjacob #include <sys/systm.h>
     39         1.1   mjacob #include <sys/kernel.h>
     40         1.1   mjacob #include <sys/device.h>
     41         1.1   mjacob #include <sys/malloc.h>
     42        1.13      mrg 
     43        1.13      mrg #include <uvm/uvm_extern.h>
     44         1.1   mjacob 
     45         1.1   mjacob #define _ALPHA_BUS_DMA_PRIVATE
     46         1.1   mjacob #include <machine/bus.h>
     47         1.1   mjacob 
     48         1.1   mjacob #include <dev/pci/pcireg.h>
     49         1.1   mjacob #include <dev/pci/pcivar.h>
     50         1.1   mjacob #include <alpha/pci/mcpciareg.h>
     51         1.1   mjacob #include <alpha/pci/mcpciavar.h>
     52         1.1   mjacob #include <alpha/pci/pci_kn300.h>
     53         1.1   mjacob 
     54         1.1   mjacob bus_dma_tag_t mcpcia_dma_get_tag __P((bus_dma_tag_t, alpha_bus_t));
     55         1.1   mjacob 
     56         1.1   mjacob int	mcpcia_bus_dmamap_load_sgmap __P((bus_dma_tag_t, bus_dmamap_t, void *,
     57         1.1   mjacob 	    bus_size_t, struct proc *, int));
     58         1.1   mjacob 
     59         1.1   mjacob int	mcpcia_bus_dmamap_load_mbuf_sgmap __P((bus_dma_tag_t, bus_dmamap_t,
     60         1.1   mjacob 	    struct mbuf *, int));
     61         1.1   mjacob 
     62         1.1   mjacob int	mcpcia_bus_dmamap_load_uio_sgmap __P((bus_dma_tag_t, bus_dmamap_t,
     63         1.1   mjacob 	    struct uio *, int));
     64         1.1   mjacob 
     65         1.1   mjacob int	mcpcia_bus_dmamap_load_raw_sgmap __P((bus_dma_tag_t, bus_dmamap_t,
     66         1.1   mjacob 	    bus_dma_segment_t *, int, bus_size_t, int));
     67         1.1   mjacob 
     68         1.1   mjacob void	mcpcia_bus_dmamap_unload_sgmap __P((bus_dma_tag_t, bus_dmamap_t));
     69         1.1   mjacob 
     70         1.3  thorpej /*
     71        1.12  thorpej  * Direct-mapped window: 2G at 2G
     72         1.3  thorpej  */
     73         1.3  thorpej #define	MCPCIA_DIRECT_MAPPED_BASE	(2UL*1024UL*1024UL*1024UL)
     74        1.12  thorpej #define	MCPCIA_DIRECT_MAPPED_SIZE	(2UL*1024UL*1024UL*1024UL)
     75        1.12  thorpej 
     76        1.12  thorpej /*
     77        1.12  thorpej  * SGMAP window for PCI: 1G at 1G
     78        1.12  thorpej  */
     79        1.12  thorpej #define	MCPCIA_PCI_SG_MAPPED_BASE	(1UL*1024UL*1024UL*1024UL)
     80        1.12  thorpej #define	MCPCIA_PCI_SG_MAPPED_SIZE	(1UL*1024UL*1024UL*1024UL)
     81         1.3  thorpej 
     82         1.3  thorpej /*
     83         1.3  thorpej  * SGMAP window for ISA: 8M at 8M
     84         1.3  thorpej  */
     85         1.3  thorpej #define	MCPCIA_ISA_SG_MAPPED_BASE	(8*1024*1024)
     86         1.3  thorpej #define	MCPCIA_ISA_SG_MAPPED_SIZE	(8*1024*1024)
     87         1.1   mjacob 
     88        1.15  thorpej /* MCPCIA has a 256-byte out-bound DMA prefetch threshold. */
     89        1.15  thorpej #define	MCPCIA_SG_MAPPED_PFTHRESH	256
     90        1.15  thorpej 
     91        1.11  thorpej #define	MCPCIA_SGTLB_INVALIDATE(ccp)					\
     92        1.11  thorpej do {									\
     93        1.11  thorpej 	alpha_mb();							\
     94        1.11  thorpej 	REGVAL(MCPCIA_SG_TBIA(ccp)) = 0xdeadbeef;			\
     95        1.11  thorpej 	alpha_mb();							\
     96        1.11  thorpej } while (0)
     97         1.1   mjacob 
     98         1.1   mjacob void
     99         1.1   mjacob mcpcia_dma_init(ccp)
    100         1.1   mjacob 	struct mcpcia_config *ccp;
    101         1.1   mjacob {
    102         1.1   mjacob 	bus_dma_tag_t t;
    103         1.1   mjacob 
    104         1.1   mjacob 	/*
    105         1.1   mjacob 	 * Initialize the DMA tag used for direct-mapped DMA.
    106         1.1   mjacob 	 */
    107         1.1   mjacob 	t = &ccp->cc_dmat_direct;
    108         1.1   mjacob 	t->_cookie = ccp;
    109         1.2  thorpej 	t->_wbase = MCPCIA_DIRECT_MAPPED_BASE;
    110         1.4  thorpej 	t->_wsize = MCPCIA_DIRECT_MAPPED_SIZE;
    111        1.12  thorpej 	t->_next_window = &ccp->cc_dmat_pci_sgmap;
    112         1.5  thorpej 	t->_boundary = 0;
    113         1.3  thorpej 	t->_sgmap = NULL;
    114         1.1   mjacob 	t->_get_tag = mcpcia_dma_get_tag;
    115         1.1   mjacob 	t->_dmamap_create = _bus_dmamap_create;
    116         1.1   mjacob 	t->_dmamap_destroy = _bus_dmamap_destroy;
    117         1.2  thorpej 	t->_dmamap_load = _bus_dmamap_load_direct;
    118         1.2  thorpej 	t->_dmamap_load_mbuf = _bus_dmamap_load_mbuf_direct;
    119         1.2  thorpej 	t->_dmamap_load_uio = _bus_dmamap_load_uio_direct;
    120         1.2  thorpej 	t->_dmamap_load_raw = _bus_dmamap_load_raw_direct;
    121         1.1   mjacob 	t->_dmamap_unload = _bus_dmamap_unload;
    122         1.1   mjacob 	t->_dmamap_sync = _bus_dmamap_sync;
    123         1.1   mjacob 
    124         1.1   mjacob 	t->_dmamem_alloc = _bus_dmamem_alloc;
    125         1.1   mjacob 	t->_dmamem_free = _bus_dmamem_free;
    126         1.1   mjacob 	t->_dmamem_map = _bus_dmamem_map;
    127         1.1   mjacob 	t->_dmamem_unmap = _bus_dmamem_unmap;
    128         1.1   mjacob 	t->_dmamem_mmap = _bus_dmamem_mmap;
    129         1.1   mjacob 
    130         1.1   mjacob 	/*
    131        1.12  thorpej 	 * Initialize the DMA tag used for sgmap-mapped PCI DMA.
    132        1.12  thorpej 	 */
    133        1.12  thorpej 	t = &ccp->cc_dmat_pci_sgmap;
    134        1.12  thorpej 	t->_cookie = ccp;
    135        1.12  thorpej 	t->_wbase = MCPCIA_PCI_SG_MAPPED_BASE;
    136        1.12  thorpej 	t->_wsize = MCPCIA_PCI_SG_MAPPED_SIZE;
    137        1.12  thorpej 	t->_next_window = NULL;
    138        1.12  thorpej 	t->_boundary = 0;
    139        1.12  thorpej 	t->_sgmap = &ccp->cc_pci_sgmap;
    140        1.15  thorpej 	t->_pfthresh = MCPCIA_SG_MAPPED_PFTHRESH;
    141        1.12  thorpej 	t->_get_tag = mcpcia_dma_get_tag;
    142        1.14  thorpej 	t->_dmamap_create = alpha_sgmap_dmamap_create;
    143        1.14  thorpej 	t->_dmamap_destroy = alpha_sgmap_dmamap_destroy;
    144        1.12  thorpej 	t->_dmamap_load = mcpcia_bus_dmamap_load_sgmap;
    145        1.12  thorpej 	t->_dmamap_load_mbuf = mcpcia_bus_dmamap_load_mbuf_sgmap;
    146        1.12  thorpej 	t->_dmamap_load_uio = mcpcia_bus_dmamap_load_uio_sgmap;
    147        1.12  thorpej 	t->_dmamap_load_raw = mcpcia_bus_dmamap_load_raw_sgmap;
    148        1.12  thorpej 	t->_dmamap_unload = mcpcia_bus_dmamap_unload_sgmap;
    149        1.12  thorpej 	t->_dmamap_sync = _bus_dmamap_sync;
    150        1.12  thorpej 
    151        1.12  thorpej 	t->_dmamem_alloc = _bus_dmamem_alloc;
    152        1.12  thorpej 	t->_dmamem_free = _bus_dmamem_free;
    153        1.12  thorpej 	t->_dmamem_map = _bus_dmamem_map;
    154        1.12  thorpej 	t->_dmamem_unmap = _bus_dmamem_unmap;
    155        1.12  thorpej 	t->_dmamem_mmap = _bus_dmamem_mmap;
    156        1.12  thorpej 
    157        1.12  thorpej 	/*
    158         1.3  thorpej 	 * Initialize the DMA tag used for sgmap-mapped ISA DMA.
    159         1.1   mjacob 	 */
    160        1.12  thorpej 	t = &ccp->cc_dmat_isa_sgmap;
    161         1.1   mjacob 	t->_cookie = ccp;
    162         1.3  thorpej 	t->_wbase = MCPCIA_ISA_SG_MAPPED_BASE;
    163         1.3  thorpej 	t->_wsize = MCPCIA_ISA_SG_MAPPED_SIZE;
    164         1.3  thorpej 	t->_next_window = NULL;
    165         1.5  thorpej 	t->_boundary = 0;
    166        1.12  thorpej 	t->_sgmap = &ccp->cc_isa_sgmap;
    167        1.15  thorpej 	t->_pfthresh = MCPCIA_SG_MAPPED_PFTHRESH;
    168         1.1   mjacob 	t->_get_tag = mcpcia_dma_get_tag;
    169        1.14  thorpej 	t->_dmamap_create = alpha_sgmap_dmamap_create;
    170        1.14  thorpej 	t->_dmamap_destroy = alpha_sgmap_dmamap_destroy;
    171         1.1   mjacob 	t->_dmamap_load = mcpcia_bus_dmamap_load_sgmap;
    172         1.1   mjacob 	t->_dmamap_load_mbuf = mcpcia_bus_dmamap_load_mbuf_sgmap;
    173         1.1   mjacob 	t->_dmamap_load_uio = mcpcia_bus_dmamap_load_uio_sgmap;
    174         1.1   mjacob 	t->_dmamap_load_raw = mcpcia_bus_dmamap_load_raw_sgmap;
    175         1.1   mjacob 	t->_dmamap_unload = mcpcia_bus_dmamap_unload_sgmap;
    176         1.1   mjacob 	t->_dmamap_sync = _bus_dmamap_sync;
    177         1.1   mjacob 
    178         1.1   mjacob 	t->_dmamem_alloc = _bus_dmamem_alloc;
    179         1.1   mjacob 	t->_dmamem_free = _bus_dmamem_free;
    180         1.1   mjacob 	t->_dmamem_map = _bus_dmamem_map;
    181         1.1   mjacob 	t->_dmamem_unmap = _bus_dmamem_unmap;
    182         1.1   mjacob 	t->_dmamem_mmap = _bus_dmamem_mmap;
    183         1.1   mjacob 
    184         1.1   mjacob 	/*
    185        1.12  thorpej 	 * Initialize the SGMAPs.
    186         1.1   mjacob 	 */
    187        1.12  thorpej 	alpha_sgmap_init(&ccp->cc_dmat_pci_sgmap, &ccp->cc_pci_sgmap,
    188        1.12  thorpej 	    "mcpcia pci sgmap",
    189        1.12  thorpej 	    MCPCIA_PCI_SG_MAPPED_BASE, 0, MCPCIA_PCI_SG_MAPPED_SIZE,
    190        1.12  thorpej 	    sizeof(u_int64_t), NULL, 0);
    191         1.1   mjacob 
    192        1.12  thorpej 	alpha_sgmap_init(&ccp->cc_dmat_isa_sgmap, &ccp->cc_isa_sgmap,
    193        1.12  thorpej 	    "mcpcia isa sgmap",
    194         1.3  thorpej 	    MCPCIA_ISA_SG_MAPPED_BASE, 0, MCPCIA_ISA_SG_MAPPED_SIZE,
    195         1.3  thorpej 	    sizeof(u_int64_t), NULL, 0);
    196         1.1   mjacob 
    197         1.1   mjacob 	/*
    198         1.1   mjacob 	 * Disable windows first.
    199         1.1   mjacob 	 */
    200         1.1   mjacob 
    201        1.11  thorpej 	REGVAL(MCPCIA_W0_BASE(ccp)) = 0;
    202        1.11  thorpej 	REGVAL(MCPCIA_W1_BASE(ccp)) = 0;
    203        1.11  thorpej 	REGVAL(MCPCIA_W2_BASE(ccp)) = 0;
    204        1.11  thorpej 	REGVAL(MCPCIA_W3_BASE(ccp)) = 0;
    205        1.11  thorpej 	REGVAL(MCPCIA_T0_BASE(ccp)) = 0;
    206        1.11  thorpej 	REGVAL(MCPCIA_T1_BASE(ccp)) = 0;
    207        1.11  thorpej 	REGVAL(MCPCIA_T2_BASE(ccp)) = 0;
    208        1.11  thorpej 	REGVAL(MCPCIA_T3_BASE(ccp)) = 0;
    209         1.1   mjacob 	alpha_mb();
    210         1.1   mjacob 
    211         1.1   mjacob 	/*
    212         1.1   mjacob 	 * Set up window 0 as an 8MB SGMAP-mapped window starting at 8MB.
    213         1.1   mjacob 	 */
    214        1.11  thorpej 	REGVAL(MCPCIA_W0_MASK(ccp)) = MCPCIA_WMASK_8M;
    215        1.11  thorpej 	REGVAL(MCPCIA_T0_BASE(ccp)) =
    216        1.12  thorpej 		ccp->cc_isa_sgmap.aps_ptpa >> MCPCIA_TBASEX_SHIFT;
    217        1.12  thorpej 	alpha_mb();
    218        1.11  thorpej 	REGVAL(MCPCIA_W0_BASE(ccp)) =
    219         1.3  thorpej 		MCPCIA_WBASE_EN | MCPCIA_WBASE_SG | MCPCIA_ISA_SG_MAPPED_BASE;
    220         1.1   mjacob 	alpha_mb();
    221         1.1   mjacob 
    222        1.11  thorpej 	MCPCIA_SGTLB_INVALIDATE(ccp);
    223         1.1   mjacob 
    224         1.1   mjacob 	/*
    225        1.12  thorpej 	 * Set up window 1 as a 2 GB Direct-mapped window starting at 2GB.
    226         1.1   mjacob 	 */
    227         1.1   mjacob 
    228        1.12  thorpej 	REGVAL(MCPCIA_W1_MASK(ccp)) = MCPCIA_WMASK_2G;
    229        1.12  thorpej 	REGVAL(MCPCIA_T1_BASE(ccp)) = 0;
    230        1.12  thorpej 	alpha_mb();
    231        1.12  thorpej 	REGVAL(MCPCIA_W1_BASE(ccp)) =
    232         1.1   mjacob 		MCPCIA_DIRECT_MAPPED_BASE | MCPCIA_WBASE_EN;
    233         1.1   mjacob 	alpha_mb();
    234         1.1   mjacob 
    235        1.12  thorpej 	/*
    236        1.12  thorpej 	 * Set up window 2 as a 1G SGMAP-mapped window starting at 1G.
    237        1.12  thorpej 	 */
    238        1.12  thorpej 
    239        1.12  thorpej 	REGVAL(MCPCIA_W2_MASK(ccp)) = MCPCIA_WMASK_1G;
    240        1.12  thorpej 	REGVAL(MCPCIA_T2_BASE(ccp)) =
    241        1.12  thorpej 		ccp->cc_pci_sgmap.aps_ptpa >> MCPCIA_TBASEX_SHIFT;
    242        1.12  thorpej 	alpha_mb();
    243        1.12  thorpej 	REGVAL(MCPCIA_W2_BASE(ccp)) =
    244        1.12  thorpej 		MCPCIA_WBASE_EN | MCPCIA_WBASE_SG | MCPCIA_PCI_SG_MAPPED_BASE;
    245        1.12  thorpej 	alpha_mb();
    246        1.12  thorpej 
    247         1.1   mjacob 	/* XXX XXX BEGIN XXX XXX */
    248         1.1   mjacob 	{							/* XXX */
    249         1.6  thorpej 		extern paddr_t alpha_XXX_dmamap_or;		/* XXX */
    250         1.1   mjacob 		alpha_XXX_dmamap_or = MCPCIA_DIRECT_MAPPED_BASE;/* XXX */
    251         1.1   mjacob 	}							/* XXX */
    252         1.1   mjacob 	/* XXX XXX END XXX XXX */
    253         1.1   mjacob }
    254         1.1   mjacob 
    255         1.1   mjacob /*
    256         1.1   mjacob  * Return the bus dma tag to be used for the specified bus type.
    257         1.1   mjacob  * INTERNAL USE ONLY!
    258         1.1   mjacob  */
    259         1.1   mjacob bus_dma_tag_t
    260         1.1   mjacob mcpcia_dma_get_tag(t, bustype)
    261         1.1   mjacob 	bus_dma_tag_t t;
    262         1.1   mjacob 	alpha_bus_t bustype;
    263         1.1   mjacob {
    264         1.1   mjacob 	struct mcpcia_config *ccp = t->_cookie;
    265         1.1   mjacob 
    266         1.1   mjacob 	switch (bustype) {
    267         1.1   mjacob 	case ALPHA_BUS_PCI:
    268         1.1   mjacob 	case ALPHA_BUS_EISA:
    269         1.1   mjacob 		/*
    270        1.12  thorpej 		 * Start off using the direct-mapped window.  We will
    271        1.12  thorpej 		 * automatically fall backed onto the chained PCI SGMAP
    272        1.12  thorpej 		 * window if necessary.
    273         1.1   mjacob 		 */
    274         1.1   mjacob 		return (&ccp->cc_dmat_direct);
    275         1.1   mjacob 
    276         1.1   mjacob 	case ALPHA_BUS_ISA:
    277         1.1   mjacob 		/*
    278         1.1   mjacob 		 * ISA doesn't have enough address bits to use
    279         1.1   mjacob 		 * the direct-mapped DMA window, so we must use
    280         1.1   mjacob 		 * SGMAPs.
    281         1.1   mjacob 		 */
    282        1.12  thorpej 		return (&ccp->cc_dmat_isa_sgmap);
    283         1.1   mjacob 
    284         1.1   mjacob 	default:
    285         1.1   mjacob 		panic("mcpcia_dma_get_tag: shouldn't be here, really...");
    286         1.1   mjacob 	}
    287         1.1   mjacob }
    288         1.1   mjacob 
    289         1.1   mjacob /*
    290         1.1   mjacob  * Load a MCPCIA SGMAP-mapped DMA map with a linear buffer.
    291         1.1   mjacob  */
    292         1.1   mjacob int
    293         1.1   mjacob mcpcia_bus_dmamap_load_sgmap(t, map, buf, buflen, p, flags)
    294         1.1   mjacob 	bus_dma_tag_t t;
    295         1.1   mjacob 	bus_dmamap_t map;
    296         1.1   mjacob 	void *buf;
    297         1.1   mjacob 	bus_size_t buflen;
    298         1.1   mjacob 	struct proc *p;
    299         1.1   mjacob 	int flags;
    300         1.1   mjacob {
    301         1.1   mjacob 	int error;
    302         1.1   mjacob 	struct mcpcia_config *ccp = t->_cookie;
    303         1.1   mjacob 
    304         1.3  thorpej 	error = pci_sgmap_pte64_load(t, map, buf, buflen, p, flags,
    305         1.3  thorpej 	    t->_sgmap);
    306         1.1   mjacob 	if (error == 0)
    307        1.11  thorpej 		MCPCIA_SGTLB_INVALIDATE(ccp);
    308         1.1   mjacob 	return (error);
    309         1.1   mjacob }
    310         1.1   mjacob 
    311         1.1   mjacob /*
    312         1.1   mjacob  * Load a MCPCIA SGMAP-mapped DMA map with an mbuf chain.
    313         1.1   mjacob  */
    314         1.1   mjacob int
    315         1.1   mjacob mcpcia_bus_dmamap_load_mbuf_sgmap(t, map, m, flags)
    316         1.1   mjacob 	bus_dma_tag_t t;
    317         1.1   mjacob 	bus_dmamap_t map;
    318         1.1   mjacob 	struct mbuf *m;
    319         1.1   mjacob 	int flags;
    320         1.1   mjacob {
    321         1.1   mjacob 	int error;
    322         1.1   mjacob 	struct mcpcia_config *ccp = t->_cookie;
    323         1.1   mjacob 
    324         1.3  thorpej 	error = pci_sgmap_pte64_load_mbuf(t, map, m, flags, t->_sgmap);
    325         1.1   mjacob 	if (error == 0)
    326        1.11  thorpej 		MCPCIA_SGTLB_INVALIDATE(ccp);
    327         1.1   mjacob 	return (error);
    328         1.1   mjacob }
    329         1.1   mjacob 
    330         1.1   mjacob /*
    331         1.1   mjacob  * Load a MCPCIA SGMAP-mapped DMA map with a uio.
    332         1.1   mjacob  */
    333         1.1   mjacob int
    334         1.1   mjacob mcpcia_bus_dmamap_load_uio_sgmap(t, map, uio, flags)
    335         1.1   mjacob 	bus_dma_tag_t t;
    336         1.1   mjacob 	bus_dmamap_t map;
    337         1.1   mjacob 	struct uio *uio;
    338         1.1   mjacob 	int flags;
    339         1.1   mjacob {
    340         1.1   mjacob 	int error;
    341         1.1   mjacob 	struct mcpcia_config *ccp = t->_cookie;
    342         1.1   mjacob 
    343         1.3  thorpej 	error = pci_sgmap_pte64_load_uio(t, map, uio, flags, t->_sgmap);
    344         1.1   mjacob 	if (error == 0)
    345        1.11  thorpej 		MCPCIA_SGTLB_INVALIDATE(ccp);
    346         1.1   mjacob 	return (error);
    347         1.1   mjacob }
    348         1.1   mjacob 
    349         1.1   mjacob /*
    350         1.1   mjacob  * Load a MCPCIA SGMAP-mapped DMA map with raw memory.
    351         1.1   mjacob  */
    352         1.1   mjacob int
    353         1.1   mjacob mcpcia_bus_dmamap_load_raw_sgmap(t, map, segs, nsegs, size, flags)
    354         1.1   mjacob 	bus_dma_tag_t t;
    355         1.1   mjacob 	bus_dmamap_t map;
    356         1.1   mjacob 	bus_dma_segment_t *segs;
    357         1.1   mjacob 	int nsegs;
    358         1.1   mjacob 	bus_size_t size;
    359         1.1   mjacob 	int flags;
    360         1.1   mjacob {
    361         1.1   mjacob 	int error;
    362         1.1   mjacob 	struct mcpcia_config *ccp = t->_cookie;
    363         1.1   mjacob 
    364         1.3  thorpej 	error = pci_sgmap_pte64_load_raw(t, map, segs, nsegs, size, flags,
    365         1.3  thorpej 	    t->_sgmap);
    366         1.1   mjacob 	if (error == 0)
    367        1.11  thorpej 		MCPCIA_SGTLB_INVALIDATE(ccp);
    368         1.1   mjacob 	return (error);
    369         1.1   mjacob }
    370         1.1   mjacob 
    371         1.1   mjacob /*
    372         1.1   mjacob  * Unload a MCPCIA DMA map.
    373         1.1   mjacob  */
    374         1.1   mjacob void
    375         1.1   mjacob mcpcia_bus_dmamap_unload_sgmap(t, map)
    376         1.1   mjacob 	bus_dma_tag_t t;
    377         1.1   mjacob 	bus_dmamap_t map;
    378         1.1   mjacob {
    379         1.1   mjacob 	struct mcpcia_config *ccp = t->_cookie;
    380         1.1   mjacob 
    381         1.1   mjacob 	/*
    382         1.1   mjacob 	 * Invalidate any SGMAP page table entries used by this mapping.
    383         1.1   mjacob 	 */
    384         1.3  thorpej 	pci_sgmap_pte64_unload(t, map, t->_sgmap);
    385        1.11  thorpej 	MCPCIA_SGTLB_INVALIDATE(ccp);
    386         1.1   mjacob 
    387         1.1   mjacob 	/*
    388         1.1   mjacob 	 * Do the generic bits of the unload.
    389         1.1   mjacob 	 */
    390         1.1   mjacob 	_bus_dmamap_unload(t, map);
    391         1.1   mjacob }
    392