xref: /onnv-gate/usr/src/uts/intel/ia32/os/ddi_i86.c (revision 11236:1127b4f9e96b)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
51106Smrj  * Common Development and Distribution License (the "License").
61106Smrj  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
211106Smrj 
220Sstevel@tonic-gate /*
23*11236SStephen.Hanson@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
240Sstevel@tonic-gate  * Use is subject to license terms.
250Sstevel@tonic-gate  */
260Sstevel@tonic-gate 
270Sstevel@tonic-gate #include <sys/conf.h>
280Sstevel@tonic-gate #include <sys/kmem.h>
290Sstevel@tonic-gate #include <sys/ddi_impldefs.h>
300Sstevel@tonic-gate #include <sys/ddi.h>
310Sstevel@tonic-gate #include <sys/sunddi.h>
320Sstevel@tonic-gate #include <sys/ddifm.h>
331865Sdilpreet #include <sys/fm/io/ddi.h>
34*11236SStephen.Hanson@Sun.COM #include <sys/fm/protocol.h>
351865Sdilpreet #include <sys/ontrap.h>
360Sstevel@tonic-gate 
370Sstevel@tonic-gate 
380Sstevel@tonic-gate /*
390Sstevel@tonic-gate  * DDI DMA Engine functions for x86.
400Sstevel@tonic-gate  * These functions are more naturally generic, but do not apply to SPARC.
410Sstevel@tonic-gate  */
420Sstevel@tonic-gate 
430Sstevel@tonic-gate int
ddi_dmae_alloc(dev_info_t * dip,int chnl,int (* dmae_waitfp)(),caddr_t arg)440Sstevel@tonic-gate ddi_dmae_alloc(dev_info_t *dip, int chnl, int (*dmae_waitfp)(), caddr_t arg)
450Sstevel@tonic-gate {
460Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_ACQUIRE,
470Sstevel@tonic-gate 	    (off_t *)dmae_waitfp, (size_t *)arg,
480Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
490Sstevel@tonic-gate }
500Sstevel@tonic-gate 
510Sstevel@tonic-gate int
ddi_dmae_release(dev_info_t * dip,int chnl)520Sstevel@tonic-gate ddi_dmae_release(dev_info_t *dip, int chnl)
530Sstevel@tonic-gate {
540Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_FREE, 0, 0,
550Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
560Sstevel@tonic-gate }
570Sstevel@tonic-gate 
580Sstevel@tonic-gate int
ddi_dmae_getlim(dev_info_t * dip,ddi_dma_lim_t * limitsp)590Sstevel@tonic-gate ddi_dmae_getlim(dev_info_t *dip, ddi_dma_lim_t *limitsp)
600Sstevel@tonic-gate {
610Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETLIM, 0, 0,
620Sstevel@tonic-gate 	    (caddr_t *)limitsp, 0));
630Sstevel@tonic-gate }
640Sstevel@tonic-gate 
650Sstevel@tonic-gate int
ddi_dmae_getattr(dev_info_t * dip,ddi_dma_attr_t * attrp)660Sstevel@tonic-gate ddi_dmae_getattr(dev_info_t *dip, ddi_dma_attr_t *attrp)
670Sstevel@tonic-gate {
680Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETATTR, 0, 0,
690Sstevel@tonic-gate 	    (caddr_t *)attrp, 0));
700Sstevel@tonic-gate }
710Sstevel@tonic-gate 
720Sstevel@tonic-gate int
ddi_dmae_1stparty(dev_info_t * dip,int chnl)730Sstevel@tonic-gate ddi_dmae_1stparty(dev_info_t *dip, int chnl)
740Sstevel@tonic-gate {
750Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_1STPTY, 0, 0,
760Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
770Sstevel@tonic-gate }
780Sstevel@tonic-gate 
790Sstevel@tonic-gate int
ddi_dmae_prog(dev_info_t * dip,struct ddi_dmae_req * dmaereqp,ddi_dma_cookie_t * cookiep,int chnl)800Sstevel@tonic-gate ddi_dmae_prog(dev_info_t *dip, struct ddi_dmae_req *dmaereqp,
810Sstevel@tonic-gate 	ddi_dma_cookie_t *cookiep, int chnl)
820Sstevel@tonic-gate {
830Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_PROG, (off_t *)dmaereqp,
840Sstevel@tonic-gate 	    (size_t *)cookiep, (caddr_t *)(uintptr_t)chnl, 0));
850Sstevel@tonic-gate }
860Sstevel@tonic-gate 
870Sstevel@tonic-gate int
ddi_dmae_swsetup(dev_info_t * dip,struct ddi_dmae_req * dmaereqp,ddi_dma_cookie_t * cookiep,int chnl)880Sstevel@tonic-gate ddi_dmae_swsetup(dev_info_t *dip, struct ddi_dmae_req *dmaereqp,
890Sstevel@tonic-gate 	ddi_dma_cookie_t *cookiep, int chnl)
900Sstevel@tonic-gate {
910Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_SWSETUP, (off_t *)dmaereqp,
920Sstevel@tonic-gate 	    (size_t *)cookiep, (caddr_t *)(uintptr_t)chnl, 0));
930Sstevel@tonic-gate }
940Sstevel@tonic-gate 
950Sstevel@tonic-gate int
ddi_dmae_swstart(dev_info_t * dip,int chnl)960Sstevel@tonic-gate ddi_dmae_swstart(dev_info_t *dip, int chnl)
970Sstevel@tonic-gate {
980Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_SWSTART, 0, 0,
990Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1000Sstevel@tonic-gate }
1010Sstevel@tonic-gate 
1020Sstevel@tonic-gate int
ddi_dmae_stop(dev_info_t * dip,int chnl)1030Sstevel@tonic-gate ddi_dmae_stop(dev_info_t *dip, int chnl)
1040Sstevel@tonic-gate {
1050Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_STOP, 0, 0,
1060Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1070Sstevel@tonic-gate }
1080Sstevel@tonic-gate 
1090Sstevel@tonic-gate int
ddi_dmae_enable(dev_info_t * dip,int chnl)1100Sstevel@tonic-gate ddi_dmae_enable(dev_info_t *dip, int chnl)
1110Sstevel@tonic-gate {
1120Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_ENABLE, 0, 0,
1130Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1140Sstevel@tonic-gate }
1150Sstevel@tonic-gate 
1160Sstevel@tonic-gate int
ddi_dmae_disable(dev_info_t * dip,int chnl)1170Sstevel@tonic-gate ddi_dmae_disable(dev_info_t *dip, int chnl)
1180Sstevel@tonic-gate {
1190Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_DISABLE, 0, 0,
1200Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1210Sstevel@tonic-gate }
1220Sstevel@tonic-gate 
1230Sstevel@tonic-gate int
ddi_dmae_getcnt(dev_info_t * dip,int chnl,int * countp)1240Sstevel@tonic-gate ddi_dmae_getcnt(dev_info_t *dip, int chnl, int *countp)
1250Sstevel@tonic-gate {
1260Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETCNT, 0, (size_t *)countp,
1270Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1280Sstevel@tonic-gate }
1290Sstevel@tonic-gate 
1300Sstevel@tonic-gate /*
1310Sstevel@tonic-gate  * implementation specific access handle and routines:
1320Sstevel@tonic-gate  */
1330Sstevel@tonic-gate 
1340Sstevel@tonic-gate static uintptr_t impl_acc_hdl_id = 0;
1350Sstevel@tonic-gate 
1360Sstevel@tonic-gate /*
1370Sstevel@tonic-gate  * access handle allocator
1380Sstevel@tonic-gate  */
1390Sstevel@tonic-gate ddi_acc_hdl_t *
impl_acc_hdl_get(ddi_acc_handle_t hdl)1400Sstevel@tonic-gate impl_acc_hdl_get(ddi_acc_handle_t hdl)
1410Sstevel@tonic-gate {
1420Sstevel@tonic-gate 	/*
1430Sstevel@tonic-gate 	 * recast to ddi_acc_hdl_t instead of
1440Sstevel@tonic-gate 	 * casting to ddi_acc_impl_t and then return the ah_platform_private
1450Sstevel@tonic-gate 	 *
1460Sstevel@tonic-gate 	 * this optimization based on the ddi_acc_hdl_t is the
1470Sstevel@tonic-gate 	 * first member of the ddi_acc_impl_t.
1480Sstevel@tonic-gate 	 */
1490Sstevel@tonic-gate 	return ((ddi_acc_hdl_t *)hdl);
1500Sstevel@tonic-gate }
1510Sstevel@tonic-gate 
1520Sstevel@tonic-gate ddi_acc_handle_t
impl_acc_hdl_alloc(int (* waitfp)(caddr_t),caddr_t arg)1530Sstevel@tonic-gate impl_acc_hdl_alloc(int (*waitfp)(caddr_t), caddr_t arg)
1540Sstevel@tonic-gate {
1550Sstevel@tonic-gate 	ddi_acc_impl_t *hp;
1561865Sdilpreet 	on_trap_data_t *otp;
1570Sstevel@tonic-gate 	int sleepflag;
1580Sstevel@tonic-gate 
1590Sstevel@tonic-gate 	sleepflag = ((waitfp == (int (*)())KM_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
1600Sstevel@tonic-gate 	/*
1611865Sdilpreet 	 * Allocate and initialize the data access handle and error status.
1620Sstevel@tonic-gate 	 */
1631865Sdilpreet 	if ((hp = kmem_zalloc(sizeof (ddi_acc_impl_t), sleepflag)) == NULL)
1641865Sdilpreet 		goto fail;
1651865Sdilpreet 	if ((hp->ahi_err = (ndi_err_t *)kmem_zalloc(
1661865Sdilpreet 	    sizeof (ndi_err_t), sleepflag)) == NULL) {
1671865Sdilpreet 		kmem_free(hp, sizeof (ddi_acc_impl_t));
1681865Sdilpreet 		goto fail;
1690Sstevel@tonic-gate 	}
1701865Sdilpreet 	if ((otp = (on_trap_data_t *)kmem_zalloc(
1711865Sdilpreet 	    sizeof (on_trap_data_t), sleepflag)) == NULL) {
1721865Sdilpreet 		kmem_free(hp->ahi_err, sizeof (ndi_err_t));
1731865Sdilpreet 		kmem_free(hp, sizeof (ddi_acc_impl_t));
1741865Sdilpreet 		goto fail;
1751865Sdilpreet 	}
1761865Sdilpreet 	hp->ahi_err->err_ontrap = otp;
1770Sstevel@tonic-gate 	hp->ahi_common.ah_platform_private = (void *)hp;
1781865Sdilpreet 
1790Sstevel@tonic-gate 	return ((ddi_acc_handle_t)hp);
1801865Sdilpreet fail:
1811865Sdilpreet 	if ((waitfp != (int (*)())KM_SLEEP) &&
1821865Sdilpreet 	    (waitfp != (int (*)())KM_NOSLEEP))
1831865Sdilpreet 		ddi_set_callback(waitfp, arg, &impl_acc_hdl_id);
1841865Sdilpreet 	return (NULL);
1850Sstevel@tonic-gate }
1860Sstevel@tonic-gate 
1870Sstevel@tonic-gate void
impl_acc_hdl_free(ddi_acc_handle_t handle)1880Sstevel@tonic-gate impl_acc_hdl_free(ddi_acc_handle_t handle)
1890Sstevel@tonic-gate {
1900Sstevel@tonic-gate 	ddi_acc_impl_t *hp;
1910Sstevel@tonic-gate 
1921865Sdilpreet 	/*
1931865Sdilpreet 	 * The supplied (ddi_acc_handle_t) is actually a (ddi_acc_impl_t *),
1941865Sdilpreet 	 * because that's what we allocated in impl_acc_hdl_alloc() above.
1951865Sdilpreet 	 */
1960Sstevel@tonic-gate 	hp = (ddi_acc_impl_t *)handle;
1970Sstevel@tonic-gate 	if (hp) {
1981865Sdilpreet 		kmem_free(hp->ahi_err->err_ontrap, sizeof (on_trap_data_t));
1991865Sdilpreet 		kmem_free(hp->ahi_err, sizeof (ndi_err_t));
2001865Sdilpreet 		kmem_free(hp, sizeof (ddi_acc_impl_t));
2010Sstevel@tonic-gate 		if (impl_acc_hdl_id)
2020Sstevel@tonic-gate 			ddi_run_callback(&impl_acc_hdl_id);
2030Sstevel@tonic-gate 	}
2040Sstevel@tonic-gate }
2050Sstevel@tonic-gate 
2061865Sdilpreet /*
2071865Sdilpreet  * Function used to check if a given access handle owns the failing address.
2081865Sdilpreet  * Called by ndi_fmc_error, when we detect a PIO error.
2091865Sdilpreet  */
2101865Sdilpreet /* ARGSUSED */
2111865Sdilpreet static int
impl_acc_check(dev_info_t * dip,const void * handle,const void * addr,const void * not_used)2121865Sdilpreet impl_acc_check(dev_info_t *dip, const void *handle, const void *addr,
2131865Sdilpreet     const void *not_used)
2141865Sdilpreet {
2151865Sdilpreet 	pfn_t pfn, fault_pfn;
2161865Sdilpreet 	ddi_acc_hdl_t *hp;
2171865Sdilpreet 
2181865Sdilpreet 	hp = impl_acc_hdl_get((ddi_acc_handle_t)handle);
2191865Sdilpreet 
2201865Sdilpreet 	ASSERT(hp);
2211865Sdilpreet 
2221865Sdilpreet 	if (addr != NULL) {
2231865Sdilpreet 		pfn = hp->ah_pfn;
2241865Sdilpreet 		fault_pfn = mmu_btop(*(uint64_t *)addr);
2251865Sdilpreet 		if (fault_pfn >= pfn && fault_pfn < (pfn + hp->ah_pnum))
2261865Sdilpreet 			return (DDI_FM_NONFATAL);
2271865Sdilpreet 	}
2281865Sdilpreet 	return (DDI_FM_UNKNOWN);
2291865Sdilpreet }
2301865Sdilpreet 
2310Sstevel@tonic-gate void
impl_acc_err_init(ddi_acc_hdl_t * handlep)2320Sstevel@tonic-gate impl_acc_err_init(ddi_acc_hdl_t *handlep)
2330Sstevel@tonic-gate {
2341865Sdilpreet 	int fmcap;
2351865Sdilpreet 	ndi_err_t *errp;
2361865Sdilpreet 	on_trap_data_t *otp;
2371865Sdilpreet 	ddi_acc_impl_t *hp = (ddi_acc_impl_t *)handlep;
2381865Sdilpreet 
2391865Sdilpreet 	fmcap = ddi_fm_capable(handlep->ah_dip);
2401865Sdilpreet 
2411865Sdilpreet 	if (handlep->ah_acc.devacc_attr_version < DDI_DEVICE_ATTR_V1 ||
2421865Sdilpreet 	    !DDI_FM_ACC_ERR_CAP(fmcap)) {
2431865Sdilpreet 		handlep->ah_acc.devacc_attr_access = DDI_DEFAULT_ACC;
244*11236SStephen.Hanson@Sun.COM 	} else if (handlep->ah_acc.devacc_attr_access == DDI_FLAGERR_ACC &&
245*11236SStephen.Hanson@Sun.COM 	    hp->ahi_scan == NULL) {
246*11236SStephen.Hanson@Sun.COM 		handlep->ah_acc.devacc_attr_access = DDI_DEFAULT_ACC;
2471865Sdilpreet 	} else if (DDI_FM_ACC_ERR_CAP(fmcap)) {
2481865Sdilpreet 		if (handlep->ah_acc.devacc_attr_access == DDI_DEFAULT_ACC) {
249*11236SStephen.Hanson@Sun.COM 			if (handlep->ah_xfermodes)
250*11236SStephen.Hanson@Sun.COM 				return;
2511865Sdilpreet 			i_ddi_drv_ereport_post(handlep->ah_dip, DVR_EFMCAP,
2521865Sdilpreet 			    NULL, DDI_NOSLEEP);
2531865Sdilpreet 		} else {
2541865Sdilpreet 			errp = hp->ahi_err;
2551865Sdilpreet 			otp = (on_trap_data_t *)errp->err_ontrap;
2561865Sdilpreet 			otp->ot_handle = (void *)(hp);
2571865Sdilpreet 			otp->ot_prot = OT_DATA_ACCESS;
2581865Sdilpreet 			errp->err_status = DDI_FM_OK;
2591865Sdilpreet 			errp->err_expected = DDI_FM_ERR_UNEXPECTED;
2601865Sdilpreet 			errp->err_cf = impl_acc_check;
2611865Sdilpreet 		}
2621865Sdilpreet 	}
2631865Sdilpreet }
2641865Sdilpreet 
2651865Sdilpreet /* ARGSUSED */
2661865Sdilpreet int
impl_dma_check(dev_info_t * dip,const void * handle,const void * pci_hdl,const void * not_used)2671865Sdilpreet impl_dma_check(dev_info_t *dip, const void *handle, const void *pci_hdl,
2681865Sdilpreet     const void *not_used)
2691865Sdilpreet {
2701865Sdilpreet 	return (DDI_FM_UNKNOWN);
2710Sstevel@tonic-gate }
2720Sstevel@tonic-gate 
2730Sstevel@tonic-gate void
impl_acc_hdl_init(ddi_acc_hdl_t * handlep)2740Sstevel@tonic-gate impl_acc_hdl_init(ddi_acc_hdl_t *handlep)
2750Sstevel@tonic-gate {
2760Sstevel@tonic-gate 	ddi_acc_impl_t *hp;
2771865Sdilpreet 	int fmcap;
2781865Sdilpreet 	int devacc_attr_access;
2790Sstevel@tonic-gate 
2800Sstevel@tonic-gate 	if (!handlep)
2810Sstevel@tonic-gate 		return;
2821865Sdilpreet 	fmcap = ddi_fm_capable(handlep->ah_dip);
2831865Sdilpreet 	if (handlep->ah_acc.devacc_attr_version < DDI_DEVICE_ATTR_V1 ||
2841865Sdilpreet 	    !DDI_FM_ACC_ERR_CAP(fmcap))
2851865Sdilpreet 		devacc_attr_access = DDI_DEFAULT_ACC;
2861865Sdilpreet 	else
2871865Sdilpreet 		devacc_attr_access = handlep->ah_acc.devacc_attr_access;
2880Sstevel@tonic-gate 
2891865Sdilpreet 	hp = (ddi_acc_impl_t *)handlep->ah_platform_private;
290*11236SStephen.Hanson@Sun.COM 
291*11236SStephen.Hanson@Sun.COM 	/*
292*11236SStephen.Hanson@Sun.COM 	 * Can only do FLAGERR if scan callback is set up. This should
293*11236SStephen.Hanson@Sun.COM 	 * also guarantee that the peekpoke_mutex and err_mutex are defined.
294*11236SStephen.Hanson@Sun.COM 	 */
295*11236SStephen.Hanson@Sun.COM 	if (devacc_attr_access == DDI_FLAGERR_ACC && hp->ahi_scan == NULL)
296*11236SStephen.Hanson@Sun.COM 		devacc_attr_access = DDI_DEFAULT_ACC;
297*11236SStephen.Hanson@Sun.COM 
2981865Sdilpreet 	switch (devacc_attr_access) {
2991865Sdilpreet 	case DDI_CAUTIOUS_ACC:
3001865Sdilpreet 		hp->ahi_get8 = i_ddi_caut_get8;
3011865Sdilpreet 		hp->ahi_put8 = i_ddi_caut_put8;
3021865Sdilpreet 		hp->ahi_rep_get8 = i_ddi_caut_rep_get8;
3031865Sdilpreet 		hp->ahi_rep_put8 = i_ddi_caut_rep_put8;
3041865Sdilpreet 		hp->ahi_get16 = i_ddi_caut_get16;
3051865Sdilpreet 		hp->ahi_get32 = i_ddi_caut_get32;
3061865Sdilpreet 		hp->ahi_put16 = i_ddi_caut_put16;
3071865Sdilpreet 		hp->ahi_put32 = i_ddi_caut_put32;
3081865Sdilpreet 		hp->ahi_rep_get16 = i_ddi_caut_rep_get16;
3091865Sdilpreet 		hp->ahi_rep_get32 = i_ddi_caut_rep_get32;
3101865Sdilpreet 		hp->ahi_rep_put16 = i_ddi_caut_rep_put16;
3111865Sdilpreet 		hp->ahi_rep_put32 = i_ddi_caut_rep_put32;
3121865Sdilpreet 		hp->ahi_get64 = i_ddi_caut_get64;
3131865Sdilpreet 		hp->ahi_put64 = i_ddi_caut_put64;
3141865Sdilpreet 		hp->ahi_rep_get64 = i_ddi_caut_rep_get64;
3151865Sdilpreet 		hp->ahi_rep_put64 = i_ddi_caut_rep_put64;
3161865Sdilpreet 		break;
317*11236SStephen.Hanson@Sun.COM 	case DDI_FLAGERR_ACC:
318*11236SStephen.Hanson@Sun.COM 		if (hp->ahi_acc_attr & DDI_ACCATTR_IO_SPACE) {
319*11236SStephen.Hanson@Sun.COM 			hp->ahi_get8 = i_ddi_prot_io_get8;
320*11236SStephen.Hanson@Sun.COM 			hp->ahi_put8 = i_ddi_prot_io_put8;
321*11236SStephen.Hanson@Sun.COM 			hp->ahi_rep_get8 = i_ddi_prot_io_rep_get8;
322*11236SStephen.Hanson@Sun.COM 			hp->ahi_rep_put8 = i_ddi_prot_io_rep_put8;
323*11236SStephen.Hanson@Sun.COM 
324*11236SStephen.Hanson@Sun.COM 			/* temporary set these 64 functions to no-ops */
325*11236SStephen.Hanson@Sun.COM 			hp->ahi_get64 = i_ddi_io_get64;
326*11236SStephen.Hanson@Sun.COM 			hp->ahi_put64 = i_ddi_io_put64;
327*11236SStephen.Hanson@Sun.COM 			hp->ahi_rep_get64 = i_ddi_io_rep_get64;
328*11236SStephen.Hanson@Sun.COM 			hp->ahi_rep_put64 = i_ddi_io_rep_put64;
329*11236SStephen.Hanson@Sun.COM 
330*11236SStephen.Hanson@Sun.COM 			/*
331*11236SStephen.Hanson@Sun.COM 			 * check for BIG endian access
332*11236SStephen.Hanson@Sun.COM 			 */
333*11236SStephen.Hanson@Sun.COM 			if (handlep->ah_acc.devacc_attr_endian_flags ==
334*11236SStephen.Hanson@Sun.COM 			    DDI_STRUCTURE_BE_ACC) {
335*11236SStephen.Hanson@Sun.COM 				hp->ahi_get16 = i_ddi_prot_io_swap_get16;
336*11236SStephen.Hanson@Sun.COM 				hp->ahi_get32 = i_ddi_prot_io_swap_get32;
337*11236SStephen.Hanson@Sun.COM 				hp->ahi_put16 = i_ddi_prot_io_swap_put16;
338*11236SStephen.Hanson@Sun.COM 				hp->ahi_put32 = i_ddi_prot_io_swap_put32;
339*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get16 =
340*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_io_swap_rep_get16;
341*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get32 =
342*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_io_swap_rep_get32;
343*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put16 =
344*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_io_swap_rep_put16;
345*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put32 =
346*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_io_swap_rep_put32;
347*11236SStephen.Hanson@Sun.COM 			} else {
348*11236SStephen.Hanson@Sun.COM 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
349*11236SStephen.Hanson@Sun.COM 				hp->ahi_get16 = i_ddi_prot_io_get16;
350*11236SStephen.Hanson@Sun.COM 				hp->ahi_get32 = i_ddi_prot_io_get32;
351*11236SStephen.Hanson@Sun.COM 				hp->ahi_put16 = i_ddi_prot_io_put16;
352*11236SStephen.Hanson@Sun.COM 				hp->ahi_put32 = i_ddi_prot_io_put32;
353*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get16 = i_ddi_prot_io_rep_get16;
354*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get32 = i_ddi_prot_io_rep_get32;
355*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put16 = i_ddi_prot_io_rep_put16;
356*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put32 = i_ddi_prot_io_rep_put32;
357*11236SStephen.Hanson@Sun.COM 			}
358*11236SStephen.Hanson@Sun.COM 
359*11236SStephen.Hanson@Sun.COM 		} else if (hp->ahi_acc_attr & DDI_ACCATTR_CPU_VADDR) {
360*11236SStephen.Hanson@Sun.COM 
361*11236SStephen.Hanson@Sun.COM 			hp->ahi_get8 = i_ddi_prot_vaddr_get8;
362*11236SStephen.Hanson@Sun.COM 			hp->ahi_put8 = i_ddi_prot_vaddr_put8;
363*11236SStephen.Hanson@Sun.COM 			hp->ahi_rep_get8 = i_ddi_prot_vaddr_rep_get8;
364*11236SStephen.Hanson@Sun.COM 			hp->ahi_rep_put8 = i_ddi_prot_vaddr_rep_put8;
365*11236SStephen.Hanson@Sun.COM 
366*11236SStephen.Hanson@Sun.COM 			/*
367*11236SStephen.Hanson@Sun.COM 			 * check for BIG endian access
368*11236SStephen.Hanson@Sun.COM 			 */
369*11236SStephen.Hanson@Sun.COM 			if (handlep->ah_acc.devacc_attr_endian_flags ==
370*11236SStephen.Hanson@Sun.COM 			    DDI_STRUCTURE_BE_ACC) {
371*11236SStephen.Hanson@Sun.COM 
372*11236SStephen.Hanson@Sun.COM 				hp->ahi_get16 = i_ddi_prot_vaddr_swap_get16;
373*11236SStephen.Hanson@Sun.COM 				hp->ahi_get32 = i_ddi_prot_vaddr_swap_get32;
374*11236SStephen.Hanson@Sun.COM 				hp->ahi_get64 = i_ddi_prot_vaddr_swap_get64;
375*11236SStephen.Hanson@Sun.COM 				hp->ahi_put16 = i_ddi_prot_vaddr_swap_put16;
376*11236SStephen.Hanson@Sun.COM 				hp->ahi_put32 = i_ddi_prot_vaddr_swap_put32;
377*11236SStephen.Hanson@Sun.COM 				hp->ahi_put64 = i_ddi_prot_vaddr_swap_put64;
378*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get16 =
379*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_vaddr_swap_rep_get16;
380*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get32 =
381*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_vaddr_swap_rep_get32;
382*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get64 =
383*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_vaddr_swap_rep_get64;
384*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put16 =
385*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_vaddr_swap_rep_put16;
386*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put32 =
387*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_vaddr_swap_rep_put32;
388*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put64 =
389*11236SStephen.Hanson@Sun.COM 				    i_ddi_prot_vaddr_swap_rep_put64;
390*11236SStephen.Hanson@Sun.COM 			} else {
391*11236SStephen.Hanson@Sun.COM 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
392*11236SStephen.Hanson@Sun.COM 				hp->ahi_get16 = i_ddi_prot_vaddr_get16;
393*11236SStephen.Hanson@Sun.COM 				hp->ahi_get32 = i_ddi_prot_vaddr_get32;
394*11236SStephen.Hanson@Sun.COM 				hp->ahi_get64 = i_ddi_prot_vaddr_get64;
395*11236SStephen.Hanson@Sun.COM 				hp->ahi_put16 = i_ddi_prot_vaddr_put16;
396*11236SStephen.Hanson@Sun.COM 				hp->ahi_put32 = i_ddi_prot_vaddr_put32;
397*11236SStephen.Hanson@Sun.COM 				hp->ahi_put64 = i_ddi_prot_vaddr_put64;
398*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get16 = i_ddi_prot_vaddr_rep_get16;
399*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get32 = i_ddi_prot_vaddr_rep_get32;
400*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_get64 = i_ddi_prot_vaddr_rep_get64;
401*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put16 = i_ddi_prot_vaddr_rep_put16;
402*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put32 = i_ddi_prot_vaddr_rep_put32;
403*11236SStephen.Hanson@Sun.COM 				hp->ahi_rep_put64 = i_ddi_prot_vaddr_rep_put64;
404*11236SStephen.Hanson@Sun.COM 			}
405*11236SStephen.Hanson@Sun.COM 		}
406*11236SStephen.Hanson@Sun.COM 		break;
4071865Sdilpreet 	case DDI_DEFAULT_ACC:
4081865Sdilpreet 		if (hp->ahi_acc_attr & DDI_ACCATTR_IO_SPACE) {
4091865Sdilpreet 			hp->ahi_get8 = i_ddi_io_get8;
4101865Sdilpreet 			hp->ahi_put8 = i_ddi_io_put8;
4111865Sdilpreet 			hp->ahi_rep_get8 = i_ddi_io_rep_get8;
4121865Sdilpreet 			hp->ahi_rep_put8 = i_ddi_io_rep_put8;
4131865Sdilpreet 
4141865Sdilpreet 			/* temporary set these 64 functions to no-ops */
4151865Sdilpreet 			hp->ahi_get64 = i_ddi_io_get64;
4161865Sdilpreet 			hp->ahi_put64 = i_ddi_io_put64;
4171865Sdilpreet 			hp->ahi_rep_get64 = i_ddi_io_rep_get64;
4181865Sdilpreet 			hp->ahi_rep_put64 = i_ddi_io_rep_put64;
4190Sstevel@tonic-gate 
4201865Sdilpreet 			/*
4211865Sdilpreet 			 * check for BIG endian access
4221865Sdilpreet 			 */
4231865Sdilpreet 			if (handlep->ah_acc.devacc_attr_endian_flags ==
424*11236SStephen.Hanson@Sun.COM 			    DDI_STRUCTURE_BE_ACC) {
4251865Sdilpreet 				hp->ahi_get16 = i_ddi_io_swap_get16;
4261865Sdilpreet 				hp->ahi_get32 = i_ddi_io_swap_get32;
4271865Sdilpreet 				hp->ahi_put16 = i_ddi_io_swap_put16;
4281865Sdilpreet 				hp->ahi_put32 = i_ddi_io_swap_put32;
4291865Sdilpreet 				hp->ahi_rep_get16 = i_ddi_io_swap_rep_get16;
4301865Sdilpreet 				hp->ahi_rep_get32 = i_ddi_io_swap_rep_get32;
4311865Sdilpreet 				hp->ahi_rep_put16 = i_ddi_io_swap_rep_put16;
4321865Sdilpreet 				hp->ahi_rep_put32 = i_ddi_io_swap_rep_put32;
4331865Sdilpreet 			} else {
4341865Sdilpreet 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
4351865Sdilpreet 				hp->ahi_get16 = i_ddi_io_get16;
4361865Sdilpreet 				hp->ahi_get32 = i_ddi_io_get32;
4371865Sdilpreet 				hp->ahi_put16 = i_ddi_io_put16;
4381865Sdilpreet 				hp->ahi_put32 = i_ddi_io_put32;
4391865Sdilpreet 				hp->ahi_rep_get16 = i_ddi_io_rep_get16;
4401865Sdilpreet 				hp->ahi_rep_get32 = i_ddi_io_rep_get32;
4411865Sdilpreet 				hp->ahi_rep_put16 = i_ddi_io_rep_put16;
4421865Sdilpreet 				hp->ahi_rep_put32 = i_ddi_io_rep_put32;
4431865Sdilpreet 			}
4440Sstevel@tonic-gate 
4451865Sdilpreet 		} else if (hp->ahi_acc_attr & DDI_ACCATTR_CPU_VADDR) {
4460Sstevel@tonic-gate 
4471865Sdilpreet 			hp->ahi_get8 = i_ddi_vaddr_get8;
4481865Sdilpreet 			hp->ahi_put8 = i_ddi_vaddr_put8;
4491865Sdilpreet 			hp->ahi_rep_get8 = i_ddi_vaddr_rep_get8;
4501865Sdilpreet 			hp->ahi_rep_put8 = i_ddi_vaddr_rep_put8;
4510Sstevel@tonic-gate 
4521865Sdilpreet 			/*
4531865Sdilpreet 			 * check for BIG endian access
4541865Sdilpreet 			 */
4551865Sdilpreet 			if (handlep->ah_acc.devacc_attr_endian_flags ==
456*11236SStephen.Hanson@Sun.COM 			    DDI_STRUCTURE_BE_ACC) {
4571865Sdilpreet 
4581865Sdilpreet 				hp->ahi_get16 = i_ddi_vaddr_swap_get16;
4591865Sdilpreet 				hp->ahi_get32 = i_ddi_vaddr_swap_get32;
4601865Sdilpreet 				hp->ahi_get64 = i_ddi_vaddr_swap_get64;
4611865Sdilpreet 				hp->ahi_put16 = i_ddi_vaddr_swap_put16;
4621865Sdilpreet 				hp->ahi_put32 = i_ddi_vaddr_swap_put32;
4631865Sdilpreet 				hp->ahi_put64 = i_ddi_vaddr_swap_put64;
4641865Sdilpreet 				hp->ahi_rep_get16 = i_ddi_vaddr_swap_rep_get16;
4651865Sdilpreet 				hp->ahi_rep_get32 = i_ddi_vaddr_swap_rep_get32;
4661865Sdilpreet 				hp->ahi_rep_get64 = i_ddi_vaddr_swap_rep_get64;
4671865Sdilpreet 				hp->ahi_rep_put16 = i_ddi_vaddr_swap_rep_put16;
4681865Sdilpreet 				hp->ahi_rep_put32 = i_ddi_vaddr_swap_rep_put32;
4691865Sdilpreet 				hp->ahi_rep_put64 = i_ddi_vaddr_swap_rep_put64;
4701865Sdilpreet 			} else {
4711865Sdilpreet 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
4721865Sdilpreet 				hp->ahi_get16 = i_ddi_vaddr_get16;
4731865Sdilpreet 				hp->ahi_get32 = i_ddi_vaddr_get32;
4741865Sdilpreet 				hp->ahi_get64 = i_ddi_vaddr_get64;
4751865Sdilpreet 				hp->ahi_put16 = i_ddi_vaddr_put16;
4761865Sdilpreet 				hp->ahi_put32 = i_ddi_vaddr_put32;
4771865Sdilpreet 				hp->ahi_put64 = i_ddi_vaddr_put64;
4781865Sdilpreet 				hp->ahi_rep_get16 = i_ddi_vaddr_rep_get16;
4791865Sdilpreet 				hp->ahi_rep_get32 = i_ddi_vaddr_rep_get32;
4801865Sdilpreet 				hp->ahi_rep_get64 = i_ddi_vaddr_rep_get64;
4811865Sdilpreet 				hp->ahi_rep_put16 = i_ddi_vaddr_rep_put16;
4821865Sdilpreet 				hp->ahi_rep_put32 = i_ddi_vaddr_rep_put32;
4831865Sdilpreet 				hp->ahi_rep_put64 = i_ddi_vaddr_rep_put64;
4841865Sdilpreet 			}
4850Sstevel@tonic-gate 		}
4861865Sdilpreet 		break;
4870Sstevel@tonic-gate 	}
4880Sstevel@tonic-gate 	hp->ahi_fault_check = i_ddi_acc_fault_check;
4890Sstevel@tonic-gate 	hp->ahi_fault_notify = i_ddi_acc_fault_notify;
4900Sstevel@tonic-gate 	hp->ahi_fault = 0;
4910Sstevel@tonic-gate 	impl_acc_err_init(handlep);
4920Sstevel@tonic-gate }
4930Sstevel@tonic-gate 
4940Sstevel@tonic-gate /*
4950Sstevel@tonic-gate  * The followings are low-level routines for data access.
4960Sstevel@tonic-gate  *
4970Sstevel@tonic-gate  * All of these routines should be implemented in assembly. Those
4980Sstevel@tonic-gate  * that have been rewritten be found in ~ml/ddi_i86_asm.s
4990Sstevel@tonic-gate  */
5000Sstevel@tonic-gate 
5010Sstevel@tonic-gate /*ARGSUSED*/
5020Sstevel@tonic-gate uint16_t
i_ddi_vaddr_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)5030Sstevel@tonic-gate i_ddi_vaddr_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
5040Sstevel@tonic-gate {
5050Sstevel@tonic-gate 	return (ddi_swap16(*addr));
5060Sstevel@tonic-gate }
5070Sstevel@tonic-gate 
5080Sstevel@tonic-gate /*ARGSUSED*/
5090Sstevel@tonic-gate uint16_t
i_ddi_io_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)5100Sstevel@tonic-gate i_ddi_io_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
5110Sstevel@tonic-gate {
5120Sstevel@tonic-gate 	return (ddi_swap16(inw((uintptr_t)addr)));
5130Sstevel@tonic-gate }
5140Sstevel@tonic-gate 
5150Sstevel@tonic-gate /*ARGSUSED*/
5160Sstevel@tonic-gate uint32_t
i_ddi_vaddr_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)5170Sstevel@tonic-gate i_ddi_vaddr_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
5180Sstevel@tonic-gate {
5190Sstevel@tonic-gate 	return (ddi_swap32(*addr));
5200Sstevel@tonic-gate }
5210Sstevel@tonic-gate 
5220Sstevel@tonic-gate /*ARGSUSED*/
5230Sstevel@tonic-gate uint32_t
i_ddi_io_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)5240Sstevel@tonic-gate i_ddi_io_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
5250Sstevel@tonic-gate {
5260Sstevel@tonic-gate 	return (ddi_swap32(inl((uintptr_t)addr)));
5270Sstevel@tonic-gate }
5280Sstevel@tonic-gate 
5290Sstevel@tonic-gate /*ARGSUSED*/
5300Sstevel@tonic-gate uint64_t
i_ddi_vaddr_swap_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)5310Sstevel@tonic-gate i_ddi_vaddr_swap_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
5320Sstevel@tonic-gate {
5330Sstevel@tonic-gate 	return (ddi_swap64(*addr));
5340Sstevel@tonic-gate }
5350Sstevel@tonic-gate 
5360Sstevel@tonic-gate /*ARGSUSED*/
5370Sstevel@tonic-gate void
i_ddi_vaddr_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)5380Sstevel@tonic-gate i_ddi_vaddr_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
5390Sstevel@tonic-gate {
5400Sstevel@tonic-gate 	*addr = ddi_swap16(value);
5410Sstevel@tonic-gate }
5420Sstevel@tonic-gate 
5430Sstevel@tonic-gate /*ARGSUSED*/
5440Sstevel@tonic-gate void
i_ddi_io_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)5450Sstevel@tonic-gate i_ddi_io_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
5460Sstevel@tonic-gate {
5470Sstevel@tonic-gate 	outw((uintptr_t)addr, ddi_swap16(value));
5480Sstevel@tonic-gate }
5490Sstevel@tonic-gate 
5500Sstevel@tonic-gate /*ARGSUSED*/
5510Sstevel@tonic-gate void
i_ddi_vaddr_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)5520Sstevel@tonic-gate i_ddi_vaddr_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
5530Sstevel@tonic-gate {
5540Sstevel@tonic-gate 	*addr = ddi_swap32(value);
5550Sstevel@tonic-gate }
5560Sstevel@tonic-gate 
5570Sstevel@tonic-gate /*ARGSUSED*/
5580Sstevel@tonic-gate void
i_ddi_io_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)5590Sstevel@tonic-gate i_ddi_io_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
5600Sstevel@tonic-gate {
5610Sstevel@tonic-gate 	outl((uintptr_t)addr, ddi_swap32(value));
5620Sstevel@tonic-gate }
5630Sstevel@tonic-gate 
5640Sstevel@tonic-gate /*ARGSUSED*/
5650Sstevel@tonic-gate void
i_ddi_vaddr_swap_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)5660Sstevel@tonic-gate i_ddi_vaddr_swap_put64(ddi_acc_impl_t *hdlp, uint64_t *addr, uint64_t value)
5670Sstevel@tonic-gate {
5680Sstevel@tonic-gate 	*addr = ddi_swap64(value);
5690Sstevel@tonic-gate }
5700Sstevel@tonic-gate 
5710Sstevel@tonic-gate /*ARGSUSED*/
5720Sstevel@tonic-gate void
i_ddi_vaddr_rep_get8(ddi_acc_impl_t * hdlp,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount,uint_t flags)5730Sstevel@tonic-gate i_ddi_vaddr_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
5740Sstevel@tonic-gate 	uint8_t *dev_addr, size_t repcount, uint_t flags)
5750Sstevel@tonic-gate {
5760Sstevel@tonic-gate 	uint8_t	*h, *d;
5770Sstevel@tonic-gate 
5780Sstevel@tonic-gate 	h = host_addr;
5790Sstevel@tonic-gate 	d = dev_addr;
5800Sstevel@tonic-gate 
5810Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
5820Sstevel@tonic-gate 		for (; repcount; repcount--)
5830Sstevel@tonic-gate 			*h++ = *d++;
5840Sstevel@tonic-gate 	else
5850Sstevel@tonic-gate 		for (; repcount; repcount--)
5860Sstevel@tonic-gate 			*h++ = *d;
5870Sstevel@tonic-gate }
5880Sstevel@tonic-gate 
5890Sstevel@tonic-gate /*ARGSUSED*/
5900Sstevel@tonic-gate void
i_ddi_vaddr_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)5910Sstevel@tonic-gate i_ddi_vaddr_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
5920Sstevel@tonic-gate 	uint16_t *dev_addr, size_t repcount, uint_t flags)
5930Sstevel@tonic-gate {
5940Sstevel@tonic-gate 	uint16_t *h, *d;
5950Sstevel@tonic-gate 
5960Sstevel@tonic-gate 	h = host_addr;
5970Sstevel@tonic-gate 	d = dev_addr;
5980Sstevel@tonic-gate 
5990Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6000Sstevel@tonic-gate 		for (; repcount; repcount--)
6010Sstevel@tonic-gate 			*h++ = *d++;
6020Sstevel@tonic-gate 	else
6030Sstevel@tonic-gate 		for (; repcount; repcount--)
6040Sstevel@tonic-gate 			*h++ = *d;
6050Sstevel@tonic-gate }
6060Sstevel@tonic-gate 
6070Sstevel@tonic-gate /*ARGSUSED*/
6080Sstevel@tonic-gate void
i_ddi_vaddr_swap_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)6090Sstevel@tonic-gate i_ddi_vaddr_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
6100Sstevel@tonic-gate 	uint16_t *dev_addr, size_t repcount, uint_t flags)
6110Sstevel@tonic-gate {
6120Sstevel@tonic-gate 	uint16_t *h, *d;
6130Sstevel@tonic-gate 
6140Sstevel@tonic-gate 	h = host_addr;
6150Sstevel@tonic-gate 	d = dev_addr;
6160Sstevel@tonic-gate 
6170Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6180Sstevel@tonic-gate 		for (; repcount; repcount--)
6190Sstevel@tonic-gate 			*h++ = ddi_swap16(*d++);
6200Sstevel@tonic-gate 	else
6210Sstevel@tonic-gate 		for (; repcount; repcount--)
6220Sstevel@tonic-gate 			*h++ = ddi_swap16(*d);
6230Sstevel@tonic-gate }
6240Sstevel@tonic-gate 
6250Sstevel@tonic-gate /*ARGSUSED*/
6260Sstevel@tonic-gate void
i_ddi_io_swap_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)6270Sstevel@tonic-gate i_ddi_io_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
6280Sstevel@tonic-gate 	uint16_t *dev_addr, size_t repcount, uint_t flags)
6290Sstevel@tonic-gate {
6300Sstevel@tonic-gate 	uint16_t *h;
6310Sstevel@tonic-gate 	uintptr_t port;
6320Sstevel@tonic-gate 
6330Sstevel@tonic-gate 	h = host_addr;
6340Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
6350Sstevel@tonic-gate 
6360Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6370Sstevel@tonic-gate 		for (; repcount; repcount--, port += 2)
6380Sstevel@tonic-gate 			*h++ = ddi_swap16(inw(port));
6390Sstevel@tonic-gate 	else
6400Sstevel@tonic-gate 		for (; repcount; repcount--)
6410Sstevel@tonic-gate 			*h++ = ddi_swap16(inw(port));
6420Sstevel@tonic-gate }
6430Sstevel@tonic-gate 
6440Sstevel@tonic-gate /*ARGSUSED*/
6450Sstevel@tonic-gate void
i_ddi_vaddr_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)6460Sstevel@tonic-gate i_ddi_vaddr_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
6470Sstevel@tonic-gate 	uint32_t *dev_addr, size_t repcount, uint_t flags)
6480Sstevel@tonic-gate {
6490Sstevel@tonic-gate 	uint32_t *h, *d;
6500Sstevel@tonic-gate 
6510Sstevel@tonic-gate 	h = host_addr;
6520Sstevel@tonic-gate 	d = dev_addr;
6530Sstevel@tonic-gate 
6540Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6550Sstevel@tonic-gate 		for (; repcount; repcount--)
6560Sstevel@tonic-gate 			*h++ = *d++;
6570Sstevel@tonic-gate 	else
6580Sstevel@tonic-gate 		for (; repcount; repcount--)
6590Sstevel@tonic-gate 			*h++ = *d;
6600Sstevel@tonic-gate }
6610Sstevel@tonic-gate 
6620Sstevel@tonic-gate /*ARGSUSED*/
6630Sstevel@tonic-gate void
i_ddi_vaddr_swap_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)6640Sstevel@tonic-gate i_ddi_vaddr_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
6650Sstevel@tonic-gate 	uint32_t *dev_addr, size_t repcount, uint_t flags)
6660Sstevel@tonic-gate {
6670Sstevel@tonic-gate 	uint32_t *h, *d;
6680Sstevel@tonic-gate 
6690Sstevel@tonic-gate 	h = host_addr;
6700Sstevel@tonic-gate 	d = dev_addr;
6710Sstevel@tonic-gate 
6720Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6730Sstevel@tonic-gate 		for (; repcount; repcount--)
6740Sstevel@tonic-gate 			*h++ = ddi_swap32(*d++);
6750Sstevel@tonic-gate 	else
6760Sstevel@tonic-gate 		for (; repcount; repcount--)
6770Sstevel@tonic-gate 			*h++ = ddi_swap32(*d);
6780Sstevel@tonic-gate }
6790Sstevel@tonic-gate 
6800Sstevel@tonic-gate /*ARGSUSED*/
6810Sstevel@tonic-gate void
i_ddi_io_swap_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)6820Sstevel@tonic-gate i_ddi_io_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
6830Sstevel@tonic-gate 	uint32_t *dev_addr, size_t repcount, uint_t flags)
6840Sstevel@tonic-gate {
6850Sstevel@tonic-gate 	uint32_t *h;
6860Sstevel@tonic-gate 	uintptr_t port;
6870Sstevel@tonic-gate 
6880Sstevel@tonic-gate 	h = host_addr;
6890Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
6900Sstevel@tonic-gate 
6910Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6920Sstevel@tonic-gate 		for (; repcount; repcount--, port += 4)
6930Sstevel@tonic-gate 			*h++ = ddi_swap32(inl(port));
6940Sstevel@tonic-gate 	else
6950Sstevel@tonic-gate 		for (; repcount; repcount--)
6960Sstevel@tonic-gate 			*h++ = ddi_swap32(inl(port));
6970Sstevel@tonic-gate }
6980Sstevel@tonic-gate 
6990Sstevel@tonic-gate /*ARGSUSED*/
7000Sstevel@tonic-gate void
i_ddi_vaddr_rep_get64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)7010Sstevel@tonic-gate i_ddi_vaddr_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
7020Sstevel@tonic-gate 	uint64_t *dev_addr, size_t repcount, uint_t flags)
7030Sstevel@tonic-gate {
7040Sstevel@tonic-gate 	uint64_t *h, *d;
7050Sstevel@tonic-gate 
7060Sstevel@tonic-gate 	h = host_addr;
7070Sstevel@tonic-gate 	d = dev_addr;
7080Sstevel@tonic-gate 
7090Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7100Sstevel@tonic-gate 		for (; repcount; repcount--)
7110Sstevel@tonic-gate 			*h++ = *d++;
7120Sstevel@tonic-gate 	else
7130Sstevel@tonic-gate 		for (; repcount; repcount--)
7140Sstevel@tonic-gate 			*h++ = *d;
7150Sstevel@tonic-gate }
7160Sstevel@tonic-gate 
7170Sstevel@tonic-gate /*ARGSUSED*/
7180Sstevel@tonic-gate void
i_ddi_vaddr_swap_rep_get64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)7190Sstevel@tonic-gate i_ddi_vaddr_swap_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
7200Sstevel@tonic-gate 	uint64_t *dev_addr, size_t repcount, uint_t flags)
7210Sstevel@tonic-gate {
7220Sstevel@tonic-gate 	uint64_t *h, *d;
7230Sstevel@tonic-gate 
7240Sstevel@tonic-gate 	h = host_addr;
7250Sstevel@tonic-gate 	d = dev_addr;
7260Sstevel@tonic-gate 
7270Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7280Sstevel@tonic-gate 		for (; repcount; repcount--)
7290Sstevel@tonic-gate 			*h++ = ddi_swap64(*d++);
7300Sstevel@tonic-gate 	else
7310Sstevel@tonic-gate 		for (; repcount; repcount--)
7320Sstevel@tonic-gate 			*h++ = ddi_swap64(*d);
7330Sstevel@tonic-gate }
7340Sstevel@tonic-gate 
7350Sstevel@tonic-gate /*ARGSUSED*/
7360Sstevel@tonic-gate void
i_ddi_vaddr_rep_put8(ddi_acc_impl_t * hdlp,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount,uint_t flags)7370Sstevel@tonic-gate i_ddi_vaddr_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
7380Sstevel@tonic-gate 	uint8_t *dev_addr, size_t repcount, uint_t flags)
7390Sstevel@tonic-gate {
7400Sstevel@tonic-gate 	uint8_t	*h, *d;
7410Sstevel@tonic-gate 
7420Sstevel@tonic-gate 	h = host_addr;
7430Sstevel@tonic-gate 	d = dev_addr;
7440Sstevel@tonic-gate 
7450Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7460Sstevel@tonic-gate 		for (; repcount; repcount--)
7470Sstevel@tonic-gate 			*d++ = *h++;
7480Sstevel@tonic-gate 	else
7490Sstevel@tonic-gate 		for (; repcount; repcount--)
7500Sstevel@tonic-gate 			*d = *h++;
7510Sstevel@tonic-gate }
7520Sstevel@tonic-gate 
7530Sstevel@tonic-gate /*ARGSUSED*/
7540Sstevel@tonic-gate void
i_ddi_vaddr_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)7550Sstevel@tonic-gate i_ddi_vaddr_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
7560Sstevel@tonic-gate 	uint16_t *dev_addr, size_t repcount, uint_t flags)
7570Sstevel@tonic-gate {
7580Sstevel@tonic-gate 	uint16_t *h, *d;
7590Sstevel@tonic-gate 
7600Sstevel@tonic-gate 	h = host_addr;
7610Sstevel@tonic-gate 	d = dev_addr;
7620Sstevel@tonic-gate 
7630Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7640Sstevel@tonic-gate 		for (; repcount; repcount--)
7650Sstevel@tonic-gate 			*d++ = *h++;
7660Sstevel@tonic-gate 	else
7670Sstevel@tonic-gate 		for (; repcount; repcount--)
7680Sstevel@tonic-gate 			*d = *h++;
7690Sstevel@tonic-gate }
7700Sstevel@tonic-gate 
7710Sstevel@tonic-gate /*ARGSUSED*/
7720Sstevel@tonic-gate void
i_ddi_vaddr_swap_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)7730Sstevel@tonic-gate i_ddi_vaddr_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
7740Sstevel@tonic-gate 	uint16_t *dev_addr, size_t repcount, uint_t flags)
7750Sstevel@tonic-gate {
7760Sstevel@tonic-gate 	uint16_t *h, *d;
7770Sstevel@tonic-gate 
7780Sstevel@tonic-gate 	h = host_addr;
7790Sstevel@tonic-gate 	d = dev_addr;
7800Sstevel@tonic-gate 
7810Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7820Sstevel@tonic-gate 		for (; repcount; repcount--)
7830Sstevel@tonic-gate 			*d++ = ddi_swap16(*h++);
7840Sstevel@tonic-gate 	else
7850Sstevel@tonic-gate 		for (; repcount; repcount--)
7860Sstevel@tonic-gate 			*d = ddi_swap16(*h++);
7870Sstevel@tonic-gate }
7880Sstevel@tonic-gate 
7890Sstevel@tonic-gate /*ARGSUSED*/
7900Sstevel@tonic-gate void
i_ddi_io_swap_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)7910Sstevel@tonic-gate i_ddi_io_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
7920Sstevel@tonic-gate 	uint16_t *dev_addr, size_t repcount, uint_t flags)
7930Sstevel@tonic-gate {
7940Sstevel@tonic-gate 	uint16_t *h;
7950Sstevel@tonic-gate 	uintptr_t port;
7960Sstevel@tonic-gate 
7970Sstevel@tonic-gate 	h = host_addr;
7980Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
7990Sstevel@tonic-gate 
8000Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8010Sstevel@tonic-gate 		for (; repcount; repcount--, port += 2)
8020Sstevel@tonic-gate 			outw(port, ddi_swap16(*h++));
8030Sstevel@tonic-gate 	else
8040Sstevel@tonic-gate 		for (; repcount; repcount--)
8050Sstevel@tonic-gate 			outw(port, ddi_swap16(*h++));
8060Sstevel@tonic-gate }
8070Sstevel@tonic-gate 
8080Sstevel@tonic-gate /*ARGSUSED*/
8090Sstevel@tonic-gate void
i_ddi_vaddr_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)8100Sstevel@tonic-gate i_ddi_vaddr_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
8110Sstevel@tonic-gate 	uint32_t *dev_addr, size_t repcount, uint_t flags)
8120Sstevel@tonic-gate {
8130Sstevel@tonic-gate 	uint32_t *h, *d;
8140Sstevel@tonic-gate 
8150Sstevel@tonic-gate 	h = host_addr;
8160Sstevel@tonic-gate 	d = dev_addr;
8170Sstevel@tonic-gate 
8180Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8190Sstevel@tonic-gate 		for (; repcount; repcount--)
8200Sstevel@tonic-gate 			*d++ = *h++;
8210Sstevel@tonic-gate 	else
8220Sstevel@tonic-gate 		for (; repcount; repcount--)
8230Sstevel@tonic-gate 			*d = *h++;
8240Sstevel@tonic-gate }
8250Sstevel@tonic-gate 
8260Sstevel@tonic-gate /*ARGSUSED*/
8270Sstevel@tonic-gate void
i_ddi_vaddr_swap_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)8280Sstevel@tonic-gate i_ddi_vaddr_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
8290Sstevel@tonic-gate 	uint32_t *dev_addr, size_t repcount, uint_t flags)
8300Sstevel@tonic-gate {
8310Sstevel@tonic-gate 	uint32_t *h, *d;
8320Sstevel@tonic-gate 
8330Sstevel@tonic-gate 	h = host_addr;
8340Sstevel@tonic-gate 	d = dev_addr;
8350Sstevel@tonic-gate 
8360Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8370Sstevel@tonic-gate 		for (; repcount; repcount--)
8380Sstevel@tonic-gate 			*d++ = ddi_swap32(*h++);
8390Sstevel@tonic-gate 	else
8400Sstevel@tonic-gate 		for (; repcount; repcount--)
8410Sstevel@tonic-gate 			*d = ddi_swap32(*h++);
8420Sstevel@tonic-gate }
8430Sstevel@tonic-gate 
8440Sstevel@tonic-gate /*ARGSUSED*/
8450Sstevel@tonic-gate void
i_ddi_io_swap_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)8460Sstevel@tonic-gate i_ddi_io_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
8470Sstevel@tonic-gate 	uint32_t *dev_addr, size_t repcount, uint_t flags)
8480Sstevel@tonic-gate {
8490Sstevel@tonic-gate 	uint32_t *h;
8500Sstevel@tonic-gate 	uintptr_t port;
8510Sstevel@tonic-gate 
8520Sstevel@tonic-gate 	h = host_addr;
8530Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
8540Sstevel@tonic-gate 
8550Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8560Sstevel@tonic-gate 		for (; repcount; repcount--, port += 4)
8570Sstevel@tonic-gate 			outl(port, ddi_swap32(*h++));
8580Sstevel@tonic-gate 	else
8590Sstevel@tonic-gate 		for (; repcount; repcount--)
8600Sstevel@tonic-gate 			outl(port, ddi_swap32(*h++));
8610Sstevel@tonic-gate }
8620Sstevel@tonic-gate 
8630Sstevel@tonic-gate /*ARGSUSED*/
8640Sstevel@tonic-gate void
i_ddi_vaddr_rep_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)8650Sstevel@tonic-gate i_ddi_vaddr_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
8660Sstevel@tonic-gate 	uint64_t *dev_addr, size_t repcount, uint_t flags)
8670Sstevel@tonic-gate {
8680Sstevel@tonic-gate 	uint64_t *h, *d;
8690Sstevel@tonic-gate 
8700Sstevel@tonic-gate 	h = host_addr;
8710Sstevel@tonic-gate 	d = dev_addr;
8720Sstevel@tonic-gate 
8730Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8740Sstevel@tonic-gate 		for (; repcount; repcount--)
8750Sstevel@tonic-gate 			*d++ = *h++;
8760Sstevel@tonic-gate 	else
8770Sstevel@tonic-gate 		for (; repcount; repcount--)
8780Sstevel@tonic-gate 			*d = *h++;
8790Sstevel@tonic-gate }
8800Sstevel@tonic-gate 
8810Sstevel@tonic-gate /*ARGSUSED*/
8820Sstevel@tonic-gate void
i_ddi_vaddr_swap_rep_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)8830Sstevel@tonic-gate i_ddi_vaddr_swap_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
8840Sstevel@tonic-gate 	uint64_t *dev_addr, size_t repcount, uint_t flags)
8850Sstevel@tonic-gate {
8860Sstevel@tonic-gate 	uint64_t *h, *d;
8870Sstevel@tonic-gate 
8880Sstevel@tonic-gate 	h = host_addr;
8890Sstevel@tonic-gate 	d = dev_addr;
8900Sstevel@tonic-gate 
8910Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8920Sstevel@tonic-gate 		for (; repcount; repcount--)
8930Sstevel@tonic-gate 			*d++ = ddi_swap64(*h++);
8940Sstevel@tonic-gate 	else
8950Sstevel@tonic-gate 		for (; repcount; repcount--)
8960Sstevel@tonic-gate 			*d = ddi_swap64(*h++);
8970Sstevel@tonic-gate }
8980Sstevel@tonic-gate 
8990Sstevel@tonic-gate /*ARGSUSED*/
9000Sstevel@tonic-gate uint64_t
i_ddi_io_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)9010Sstevel@tonic-gate i_ddi_io_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
9020Sstevel@tonic-gate {
9030Sstevel@tonic-gate 	panic("ddi_get64 from i/o space");
9040Sstevel@tonic-gate 	/*NOTREACHED*/
9050Sstevel@tonic-gate 	return (0);
9060Sstevel@tonic-gate }
9070Sstevel@tonic-gate 
9080Sstevel@tonic-gate /*ARGSUSED*/
9090Sstevel@tonic-gate void
i_ddi_io_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t value)9100Sstevel@tonic-gate i_ddi_io_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr, uint64_t value)
9110Sstevel@tonic-gate {
9120Sstevel@tonic-gate 	panic("ddi_put64 to i/o space");
9130Sstevel@tonic-gate 	/*NOTREACHED*/
9140Sstevel@tonic-gate }
9150Sstevel@tonic-gate 
9160Sstevel@tonic-gate void
do_scan(ddi_acc_impl_t * hdlp)917*11236SStephen.Hanson@Sun.COM do_scan(ddi_acc_impl_t *hdlp)
918*11236SStephen.Hanson@Sun.COM {
919*11236SStephen.Hanson@Sun.COM 	ddi_fm_error_t de;
920*11236SStephen.Hanson@Sun.COM 	ndi_err_t *errp = (ndi_err_t *)hdlp->ahi_err;
921*11236SStephen.Hanson@Sun.COM 
922*11236SStephen.Hanson@Sun.COM 	bzero(&de, sizeof (ddi_fm_error_t));
923*11236SStephen.Hanson@Sun.COM 	de.fme_version = DDI_FME_VERSION;
924*11236SStephen.Hanson@Sun.COM 	de.fme_ena = fm_ena_generate(0, FM_ENA_FMT1);
925*11236SStephen.Hanson@Sun.COM 	de.fme_flag = DDI_FM_ERR_UNEXPECTED;
926*11236SStephen.Hanson@Sun.COM 
927*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_err_mutexp);
928*11236SStephen.Hanson@Sun.COM 	hdlp->ahi_scan(hdlp->ahi_scan_dip, &de);
929*11236SStephen.Hanson@Sun.COM 	if (de.fme_status != DDI_FM_OK) {
930*11236SStephen.Hanson@Sun.COM 		errp->err_ena = de.fme_ena;
931*11236SStephen.Hanson@Sun.COM 		errp->err_expected = de.fme_flag;
932*11236SStephen.Hanson@Sun.COM 		errp->err_status = DDI_FM_NONFATAL;
933*11236SStephen.Hanson@Sun.COM 	}
934*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_err_mutexp);
935*11236SStephen.Hanson@Sun.COM }
936*11236SStephen.Hanson@Sun.COM 
937*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
938*11236SStephen.Hanson@Sun.COM uint8_t
i_ddi_prot_vaddr_get8(ddi_acc_impl_t * hdlp,uint8_t * addr)939*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
940*11236SStephen.Hanson@Sun.COM {
941*11236SStephen.Hanson@Sun.COM 	uint8_t val;
942*11236SStephen.Hanson@Sun.COM 
943*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
944*11236SStephen.Hanson@Sun.COM 	val = *addr;
945*11236SStephen.Hanson@Sun.COM 	if (val == 0xff)
946*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
947*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
948*11236SStephen.Hanson@Sun.COM 
949*11236SStephen.Hanson@Sun.COM 	return (val);
950*11236SStephen.Hanson@Sun.COM }
951*11236SStephen.Hanson@Sun.COM 
952*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
953*11236SStephen.Hanson@Sun.COM uint16_t
i_ddi_prot_vaddr_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)954*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
955*11236SStephen.Hanson@Sun.COM {
956*11236SStephen.Hanson@Sun.COM 	uint16_t val;
957*11236SStephen.Hanson@Sun.COM 
958*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
959*11236SStephen.Hanson@Sun.COM 	val = *addr;
960*11236SStephen.Hanson@Sun.COM 	if (val == 0xffff)
961*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
962*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
963*11236SStephen.Hanson@Sun.COM 
964*11236SStephen.Hanson@Sun.COM 	return (val);
965*11236SStephen.Hanson@Sun.COM }
966*11236SStephen.Hanson@Sun.COM 
967*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
968*11236SStephen.Hanson@Sun.COM uint32_t
i_ddi_prot_vaddr_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)969*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
970*11236SStephen.Hanson@Sun.COM {
971*11236SStephen.Hanson@Sun.COM 	uint32_t val;
972*11236SStephen.Hanson@Sun.COM 
973*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
974*11236SStephen.Hanson@Sun.COM 	val = *addr;
975*11236SStephen.Hanson@Sun.COM 	if (val == 0xffffffff)
976*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
977*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
978*11236SStephen.Hanson@Sun.COM 
979*11236SStephen.Hanson@Sun.COM 	return (val);
980*11236SStephen.Hanson@Sun.COM }
981*11236SStephen.Hanson@Sun.COM 
982*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
983*11236SStephen.Hanson@Sun.COM uint64_t
i_ddi_prot_vaddr_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)984*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
985*11236SStephen.Hanson@Sun.COM {
986*11236SStephen.Hanson@Sun.COM 	uint64_t val;
987*11236SStephen.Hanson@Sun.COM 
988*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
989*11236SStephen.Hanson@Sun.COM 	val = *addr;
990*11236SStephen.Hanson@Sun.COM 	if (val == 0xffffffffffffffff)
991*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
992*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
993*11236SStephen.Hanson@Sun.COM 
994*11236SStephen.Hanson@Sun.COM 	return (val);
995*11236SStephen.Hanson@Sun.COM }
996*11236SStephen.Hanson@Sun.COM 
997*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
998*11236SStephen.Hanson@Sun.COM uint8_t
i_ddi_prot_io_get8(ddi_acc_impl_t * hdlp,uint8_t * addr)999*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
1000*11236SStephen.Hanson@Sun.COM {
1001*11236SStephen.Hanson@Sun.COM 	uint8_t val;
1002*11236SStephen.Hanson@Sun.COM 
1003*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1004*11236SStephen.Hanson@Sun.COM 	val = inb((uintptr_t)addr);
1005*11236SStephen.Hanson@Sun.COM 	if (val == 0xff)
1006*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1007*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1008*11236SStephen.Hanson@Sun.COM 
1009*11236SStephen.Hanson@Sun.COM 	return (val);
1010*11236SStephen.Hanson@Sun.COM }
1011*11236SStephen.Hanson@Sun.COM 
1012*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1013*11236SStephen.Hanson@Sun.COM uint16_t
i_ddi_prot_io_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1014*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1015*11236SStephen.Hanson@Sun.COM {
1016*11236SStephen.Hanson@Sun.COM 	uint16_t val;
1017*11236SStephen.Hanson@Sun.COM 
1018*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1019*11236SStephen.Hanson@Sun.COM 	val = inw((uintptr_t)addr);
1020*11236SStephen.Hanson@Sun.COM 	if (val == 0xffff)
1021*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1022*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1023*11236SStephen.Hanson@Sun.COM 
1024*11236SStephen.Hanson@Sun.COM 	return (val);
1025*11236SStephen.Hanson@Sun.COM }
1026*11236SStephen.Hanson@Sun.COM 
1027*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1028*11236SStephen.Hanson@Sun.COM uint32_t
i_ddi_prot_io_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1029*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1030*11236SStephen.Hanson@Sun.COM {
1031*11236SStephen.Hanson@Sun.COM 	uint32_t val;
1032*11236SStephen.Hanson@Sun.COM 
1033*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1034*11236SStephen.Hanson@Sun.COM 	val = inl((uintptr_t)addr);
1035*11236SStephen.Hanson@Sun.COM 	if (val == 0xffffffff)
1036*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1037*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1038*11236SStephen.Hanson@Sun.COM 
1039*11236SStephen.Hanson@Sun.COM 	return (val);
1040*11236SStephen.Hanson@Sun.COM }
1041*11236SStephen.Hanson@Sun.COM 
1042*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1043*11236SStephen.Hanson@Sun.COM uint16_t
i_ddi_prot_vaddr_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1044*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1045*11236SStephen.Hanson@Sun.COM {
1046*11236SStephen.Hanson@Sun.COM 	uint16_t val;
1047*11236SStephen.Hanson@Sun.COM 
1048*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1049*11236SStephen.Hanson@Sun.COM 	val = ddi_swap16(*addr);
1050*11236SStephen.Hanson@Sun.COM 	if (val == 0xffff)
1051*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1052*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1053*11236SStephen.Hanson@Sun.COM 
1054*11236SStephen.Hanson@Sun.COM 	return (val);
1055*11236SStephen.Hanson@Sun.COM }
1056*11236SStephen.Hanson@Sun.COM 
1057*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1058*11236SStephen.Hanson@Sun.COM uint16_t
i_ddi_prot_io_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1059*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1060*11236SStephen.Hanson@Sun.COM {
1061*11236SStephen.Hanson@Sun.COM 	uint16_t val;
1062*11236SStephen.Hanson@Sun.COM 
1063*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1064*11236SStephen.Hanson@Sun.COM 	val = ddi_swap16(inw((uintptr_t)addr));
1065*11236SStephen.Hanson@Sun.COM 	if (val == 0xffff)
1066*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1067*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1068*11236SStephen.Hanson@Sun.COM 
1069*11236SStephen.Hanson@Sun.COM 	return (val);
1070*11236SStephen.Hanson@Sun.COM }
1071*11236SStephen.Hanson@Sun.COM 
1072*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1073*11236SStephen.Hanson@Sun.COM uint32_t
i_ddi_prot_vaddr_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1074*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1075*11236SStephen.Hanson@Sun.COM {
1076*11236SStephen.Hanson@Sun.COM 	uint32_t val;
1077*11236SStephen.Hanson@Sun.COM 
1078*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1079*11236SStephen.Hanson@Sun.COM 	val = ddi_swap32(*addr);
1080*11236SStephen.Hanson@Sun.COM 	if (val == 0xffffffff)
1081*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1082*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1083*11236SStephen.Hanson@Sun.COM 
1084*11236SStephen.Hanson@Sun.COM 	return (val);
1085*11236SStephen.Hanson@Sun.COM }
1086*11236SStephen.Hanson@Sun.COM 
1087*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1088*11236SStephen.Hanson@Sun.COM uint32_t
i_ddi_prot_io_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1089*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1090*11236SStephen.Hanson@Sun.COM {
1091*11236SStephen.Hanson@Sun.COM 	uint32_t val;
1092*11236SStephen.Hanson@Sun.COM 
1093*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1094*11236SStephen.Hanson@Sun.COM 	val = ddi_swap32(inl((uintptr_t)addr));
1095*11236SStephen.Hanson@Sun.COM 	if (val == 0xffffffff)
1096*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1097*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1098*11236SStephen.Hanson@Sun.COM 
1099*11236SStephen.Hanson@Sun.COM 	return (val);
1100*11236SStephen.Hanson@Sun.COM }
1101*11236SStephen.Hanson@Sun.COM 
1102*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1103*11236SStephen.Hanson@Sun.COM uint64_t
i_ddi_prot_vaddr_swap_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)1104*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
1105*11236SStephen.Hanson@Sun.COM {
1106*11236SStephen.Hanson@Sun.COM 	uint64_t val;
1107*11236SStephen.Hanson@Sun.COM 
1108*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1109*11236SStephen.Hanson@Sun.COM 	val = ddi_swap64(*addr);
1110*11236SStephen.Hanson@Sun.COM 	if (val == 0xffffffffffffffff)
1111*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1112*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1113*11236SStephen.Hanson@Sun.COM 
1114*11236SStephen.Hanson@Sun.COM 	return (val);
1115*11236SStephen.Hanson@Sun.COM }
1116*11236SStephen.Hanson@Sun.COM 
1117*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1118*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_put8(ddi_acc_impl_t * hdlp,uint8_t * addr,uint8_t value)1119*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1120*11236SStephen.Hanson@Sun.COM {
1121*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1122*11236SStephen.Hanson@Sun.COM 	*addr = value;
1123*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1124*11236SStephen.Hanson@Sun.COM }
1125*11236SStephen.Hanson@Sun.COM 
1126*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1127*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_put8(ddi_acc_impl_t * hdlp,uint8_t * addr,uint8_t value)1128*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1129*11236SStephen.Hanson@Sun.COM {
1130*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1131*11236SStephen.Hanson@Sun.COM 	outb((uintptr_t)addr, value);
1132*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1133*11236SStephen.Hanson@Sun.COM }
1134*11236SStephen.Hanson@Sun.COM 
1135*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1136*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1137*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1138*11236SStephen.Hanson@Sun.COM {
1139*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1140*11236SStephen.Hanson@Sun.COM 	*addr = value;
1141*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1142*11236SStephen.Hanson@Sun.COM }
1143*11236SStephen.Hanson@Sun.COM 
1144*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1145*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1146*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1147*11236SStephen.Hanson@Sun.COM {
1148*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1149*11236SStephen.Hanson@Sun.COM 	outw((uintptr_t)addr, value);
1150*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1151*11236SStephen.Hanson@Sun.COM }
1152*11236SStephen.Hanson@Sun.COM 
1153*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1154*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1155*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr,
1156*11236SStephen.Hanson@Sun.COM     uint32_t value)
1157*11236SStephen.Hanson@Sun.COM {
1158*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1159*11236SStephen.Hanson@Sun.COM 	*addr = value;
1160*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1161*11236SStephen.Hanson@Sun.COM }
1162*11236SStephen.Hanson@Sun.COM 
1163*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1164*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1165*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1166*11236SStephen.Hanson@Sun.COM {
1167*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1168*11236SStephen.Hanson@Sun.COM 	outl((uintptr_t)addr, value);
1169*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1170*11236SStephen.Hanson@Sun.COM }
1171*11236SStephen.Hanson@Sun.COM 
1172*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1173*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)1174*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_put64(ddi_acc_impl_t *hdlp, uint64_t *addr,
1175*11236SStephen.Hanson@Sun.COM     uint64_t value)
1176*11236SStephen.Hanson@Sun.COM {
1177*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1178*11236SStephen.Hanson@Sun.COM 	*addr = value;
1179*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1180*11236SStephen.Hanson@Sun.COM }
1181*11236SStephen.Hanson@Sun.COM 
1182*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1183*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1184*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr,
1185*11236SStephen.Hanson@Sun.COM     uint16_t value)
1186*11236SStephen.Hanson@Sun.COM {
1187*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1188*11236SStephen.Hanson@Sun.COM 	*addr = ddi_swap16(value);
1189*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1190*11236SStephen.Hanson@Sun.COM }
1191*11236SStephen.Hanson@Sun.COM 
1192*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1193*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1194*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1195*11236SStephen.Hanson@Sun.COM {
1196*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1197*11236SStephen.Hanson@Sun.COM 	outw((uintptr_t)addr, ddi_swap16(value));
1198*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1199*11236SStephen.Hanson@Sun.COM }
1200*11236SStephen.Hanson@Sun.COM 
1201*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1202*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1203*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr,
1204*11236SStephen.Hanson@Sun.COM     uint32_t value)
1205*11236SStephen.Hanson@Sun.COM {
1206*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1207*11236SStephen.Hanson@Sun.COM 	*addr = ddi_swap32(value);
1208*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1209*11236SStephen.Hanson@Sun.COM }
1210*11236SStephen.Hanson@Sun.COM 
1211*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1212*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1213*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1214*11236SStephen.Hanson@Sun.COM {
1215*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1216*11236SStephen.Hanson@Sun.COM 	outl((uintptr_t)addr, ddi_swap32(value));
1217*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1218*11236SStephen.Hanson@Sun.COM }
1219*11236SStephen.Hanson@Sun.COM 
1220*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1221*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)1222*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_put64(ddi_acc_impl_t *hdlp, uint64_t *addr,
1223*11236SStephen.Hanson@Sun.COM     uint64_t value)
1224*11236SStephen.Hanson@Sun.COM {
1225*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1226*11236SStephen.Hanson@Sun.COM 	*addr = ddi_swap64(value);
1227*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1228*11236SStephen.Hanson@Sun.COM }
1229*11236SStephen.Hanson@Sun.COM 
1230*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1231*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_rep_get8(ddi_acc_impl_t * hdlp,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount,uint_t flags)1232*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1233*11236SStephen.Hanson@Sun.COM 	uint8_t *dev_addr, size_t repcount, uint_t flags)
1234*11236SStephen.Hanson@Sun.COM {
1235*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1236*11236SStephen.Hanson@Sun.COM 	uint8_t	*h;
1237*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1238*11236SStephen.Hanson@Sun.COM 
1239*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1240*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1241*11236SStephen.Hanson@Sun.COM 
1242*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1243*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1244*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port++)
1245*11236SStephen.Hanson@Sun.COM 			if ((*h++ = inb(port)) == 0xff)
1246*11236SStephen.Hanson@Sun.COM 				fail = 1;
1247*11236SStephen.Hanson@Sun.COM 	} else {
1248*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1249*11236SStephen.Hanson@Sun.COM 			if ((*h++ = inb(port)) == 0xff)
1250*11236SStephen.Hanson@Sun.COM 				fail = 1;
1251*11236SStephen.Hanson@Sun.COM 	}
1252*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1253*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1254*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1255*11236SStephen.Hanson@Sun.COM }
1256*11236SStephen.Hanson@Sun.COM 
1257*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1258*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1259*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1260*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1261*11236SStephen.Hanson@Sun.COM {
1262*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1263*11236SStephen.Hanson@Sun.COM 	uint16_t *h;
1264*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1265*11236SStephen.Hanson@Sun.COM 
1266*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1267*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1268*11236SStephen.Hanson@Sun.COM 
1269*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1270*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1271*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 2)
1272*11236SStephen.Hanson@Sun.COM 			if ((*h++ = inw(port)) == 0xffff)
1273*11236SStephen.Hanson@Sun.COM 				fail = 1;
1274*11236SStephen.Hanson@Sun.COM 	} else {
1275*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1276*11236SStephen.Hanson@Sun.COM 			if ((*h++ = inw(port)) == 0xffff)
1277*11236SStephen.Hanson@Sun.COM 				fail = 1;
1278*11236SStephen.Hanson@Sun.COM 	}
1279*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1280*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1281*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1282*11236SStephen.Hanson@Sun.COM }
1283*11236SStephen.Hanson@Sun.COM 
1284*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1285*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1286*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1287*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1288*11236SStephen.Hanson@Sun.COM {
1289*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1290*11236SStephen.Hanson@Sun.COM 	uint32_t *h;
1291*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1292*11236SStephen.Hanson@Sun.COM 
1293*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1294*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1295*11236SStephen.Hanson@Sun.COM 
1296*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1297*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1298*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 4)
1299*11236SStephen.Hanson@Sun.COM 			if ((*h++ = inl(port)) == 0xffffffff)
1300*11236SStephen.Hanson@Sun.COM 				fail = 1;
1301*11236SStephen.Hanson@Sun.COM 	} else {
1302*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1303*11236SStephen.Hanson@Sun.COM 			if ((*h++ = inl(port)) == 0xffffffff)
1304*11236SStephen.Hanson@Sun.COM 				fail = 1;
1305*11236SStephen.Hanson@Sun.COM 	}
1306*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1307*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1308*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1309*11236SStephen.Hanson@Sun.COM }
1310*11236SStephen.Hanson@Sun.COM 
1311*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1312*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_get8(ddi_acc_impl_t * hdlp,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount,uint_t flags)1313*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1314*11236SStephen.Hanson@Sun.COM 	uint8_t *dev_addr, size_t repcount, uint_t flags)
1315*11236SStephen.Hanson@Sun.COM {
1316*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1317*11236SStephen.Hanson@Sun.COM 	uint8_t	*h, *d;
1318*11236SStephen.Hanson@Sun.COM 
1319*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1320*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1321*11236SStephen.Hanson@Sun.COM 
1322*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1323*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1324*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1325*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d++) == 0xff)
1326*11236SStephen.Hanson@Sun.COM 				fail = 1;
1327*11236SStephen.Hanson@Sun.COM 	} else {
1328*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1329*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d) == 0xff)
1330*11236SStephen.Hanson@Sun.COM 				fail = 1;
1331*11236SStephen.Hanson@Sun.COM 	}
1332*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1333*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1334*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1335*11236SStephen.Hanson@Sun.COM }
1336*11236SStephen.Hanson@Sun.COM 
1337*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1338*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1339*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1340*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1341*11236SStephen.Hanson@Sun.COM {
1342*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1343*11236SStephen.Hanson@Sun.COM 	uint16_t *h, *d;
1344*11236SStephen.Hanson@Sun.COM 
1345*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1346*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1347*11236SStephen.Hanson@Sun.COM 
1348*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1349*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1350*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1351*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d++) == 0xffff)
1352*11236SStephen.Hanson@Sun.COM 				fail = 1;
1353*11236SStephen.Hanson@Sun.COM 	} else {
1354*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1355*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d) == 0xffff)
1356*11236SStephen.Hanson@Sun.COM 				fail = 1;
1357*11236SStephen.Hanson@Sun.COM 	}
1358*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1359*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1360*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1361*11236SStephen.Hanson@Sun.COM }
1362*11236SStephen.Hanson@Sun.COM 
1363*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1364*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1365*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1366*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1367*11236SStephen.Hanson@Sun.COM {
1368*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1369*11236SStephen.Hanson@Sun.COM 	uint16_t *h, *d;
1370*11236SStephen.Hanson@Sun.COM 
1371*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1372*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1373*11236SStephen.Hanson@Sun.COM 
1374*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1375*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1376*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1377*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap16(*d++)) == 0xffff)
1378*11236SStephen.Hanson@Sun.COM 				fail = 1;
1379*11236SStephen.Hanson@Sun.COM 	} else {
1380*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1381*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap16(*d)) == 0xffff)
1382*11236SStephen.Hanson@Sun.COM 				fail = 1;
1383*11236SStephen.Hanson@Sun.COM 	}
1384*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1385*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1386*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1387*11236SStephen.Hanson@Sun.COM }
1388*11236SStephen.Hanson@Sun.COM 
1389*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1390*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_swap_rep_get16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1391*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1392*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1393*11236SStephen.Hanson@Sun.COM {
1394*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1395*11236SStephen.Hanson@Sun.COM 	uint16_t *h;
1396*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1397*11236SStephen.Hanson@Sun.COM 
1398*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1399*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1400*11236SStephen.Hanson@Sun.COM 
1401*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1402*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1403*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 2)
1404*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap16(inw(port))) == 0xffff)
1405*11236SStephen.Hanson@Sun.COM 				fail = 1;
1406*11236SStephen.Hanson@Sun.COM 	} else {
1407*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1408*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap16(inw(port))) == 0xffff)
1409*11236SStephen.Hanson@Sun.COM 				fail = 1;
1410*11236SStephen.Hanson@Sun.COM 	}
1411*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1412*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1413*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1414*11236SStephen.Hanson@Sun.COM }
1415*11236SStephen.Hanson@Sun.COM 
1416*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1417*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1418*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1419*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1420*11236SStephen.Hanson@Sun.COM {
1421*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1422*11236SStephen.Hanson@Sun.COM 	uint32_t *h, *d;
1423*11236SStephen.Hanson@Sun.COM 
1424*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1425*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1426*11236SStephen.Hanson@Sun.COM 
1427*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1428*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1429*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1430*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d++) == 0xffffffff)
1431*11236SStephen.Hanson@Sun.COM 				fail = 1;
1432*11236SStephen.Hanson@Sun.COM 	} else {
1433*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1434*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d) == 0xffffffff)
1435*11236SStephen.Hanson@Sun.COM 				fail = 1;
1436*11236SStephen.Hanson@Sun.COM 	}
1437*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1438*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1439*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1440*11236SStephen.Hanson@Sun.COM }
1441*11236SStephen.Hanson@Sun.COM 
1442*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1443*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1444*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1445*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1446*11236SStephen.Hanson@Sun.COM {
1447*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1448*11236SStephen.Hanson@Sun.COM 	uint32_t *h, *d;
1449*11236SStephen.Hanson@Sun.COM 
1450*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1451*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1452*11236SStephen.Hanson@Sun.COM 
1453*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1454*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1455*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1456*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap32(*d++)) == 0xffffffff)
1457*11236SStephen.Hanson@Sun.COM 				fail = 1;
1458*11236SStephen.Hanson@Sun.COM 	} else {
1459*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1460*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap32(*d)) == 0xffffffff)
1461*11236SStephen.Hanson@Sun.COM 				fail = 1;
1462*11236SStephen.Hanson@Sun.COM 	}
1463*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1464*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1465*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1466*11236SStephen.Hanson@Sun.COM }
1467*11236SStephen.Hanson@Sun.COM 
1468*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1469*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_swap_rep_get32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1470*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1471*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1472*11236SStephen.Hanson@Sun.COM {
1473*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1474*11236SStephen.Hanson@Sun.COM 	uint32_t *h;
1475*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1476*11236SStephen.Hanson@Sun.COM 
1477*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1478*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1479*11236SStephen.Hanson@Sun.COM 
1480*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1481*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1482*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 4)
1483*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap32(inl(port))) == 0xffffffff)
1484*11236SStephen.Hanson@Sun.COM 				fail = 1;
1485*11236SStephen.Hanson@Sun.COM 	} else {
1486*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1487*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap32(inl(port))) == 0xffffffff)
1488*11236SStephen.Hanson@Sun.COM 				fail = 1;
1489*11236SStephen.Hanson@Sun.COM 	}
1490*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1491*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1492*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1493*11236SStephen.Hanson@Sun.COM }
1494*11236SStephen.Hanson@Sun.COM 
1495*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1496*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_get64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)1497*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1498*11236SStephen.Hanson@Sun.COM 	uint64_t *dev_addr, size_t repcount, uint_t flags)
1499*11236SStephen.Hanson@Sun.COM {
1500*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1501*11236SStephen.Hanson@Sun.COM 	uint64_t *h, *d;
1502*11236SStephen.Hanson@Sun.COM 
1503*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1504*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1505*11236SStephen.Hanson@Sun.COM 
1506*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1507*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1508*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1509*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d++) == 0xffffffffffffffff)
1510*11236SStephen.Hanson@Sun.COM 				fail = 1;
1511*11236SStephen.Hanson@Sun.COM 	} else {
1512*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1513*11236SStephen.Hanson@Sun.COM 			if ((*h++ = *d) == 0xffffffffffffffff)
1514*11236SStephen.Hanson@Sun.COM 				fail = 1;
1515*11236SStephen.Hanson@Sun.COM 	}
1516*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1517*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1518*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1519*11236SStephen.Hanson@Sun.COM }
1520*11236SStephen.Hanson@Sun.COM 
1521*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1522*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_rep_get64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)1523*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1524*11236SStephen.Hanson@Sun.COM 	uint64_t *dev_addr, size_t repcount, uint_t flags)
1525*11236SStephen.Hanson@Sun.COM {
1526*11236SStephen.Hanson@Sun.COM 	int fail = 0;
1527*11236SStephen.Hanson@Sun.COM 	uint64_t *h, *d;
1528*11236SStephen.Hanson@Sun.COM 
1529*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1530*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1531*11236SStephen.Hanson@Sun.COM 
1532*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1533*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR) {
1534*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1535*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap64(*d++)) == 0xffffffffffffffff)
1536*11236SStephen.Hanson@Sun.COM 				fail = 1;
1537*11236SStephen.Hanson@Sun.COM 	} else {
1538*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1539*11236SStephen.Hanson@Sun.COM 			if ((*h++ = ddi_swap64(*d)) == 0xffffffffffffffff)
1540*11236SStephen.Hanson@Sun.COM 				fail = 1;
1541*11236SStephen.Hanson@Sun.COM 	}
1542*11236SStephen.Hanson@Sun.COM 	if (fail == 1)
1543*11236SStephen.Hanson@Sun.COM 		do_scan(hdlp);
1544*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1545*11236SStephen.Hanson@Sun.COM }
1546*11236SStephen.Hanson@Sun.COM 
1547*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1548*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_put8(ddi_acc_impl_t * hdlp,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount,uint_t flags)1549*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1550*11236SStephen.Hanson@Sun.COM 	uint8_t *dev_addr, size_t repcount, uint_t flags)
1551*11236SStephen.Hanson@Sun.COM {
1552*11236SStephen.Hanson@Sun.COM 	uint8_t	*h, *d;
1553*11236SStephen.Hanson@Sun.COM 
1554*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1555*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1556*11236SStephen.Hanson@Sun.COM 
1557*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1558*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1559*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1560*11236SStephen.Hanson@Sun.COM 			*d++ = *h++;
1561*11236SStephen.Hanson@Sun.COM 	else
1562*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1563*11236SStephen.Hanson@Sun.COM 			*d = *h++;
1564*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1565*11236SStephen.Hanson@Sun.COM }
1566*11236SStephen.Hanson@Sun.COM 
1567*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1568*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_rep_put8(ddi_acc_impl_t * hdlp,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount,uint_t flags)1569*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1570*11236SStephen.Hanson@Sun.COM 	uint8_t *dev_addr, size_t repcount, uint_t flags)
1571*11236SStephen.Hanson@Sun.COM {
1572*11236SStephen.Hanson@Sun.COM 	uint8_t	*h;
1573*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1574*11236SStephen.Hanson@Sun.COM 
1575*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1576*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1577*11236SStephen.Hanson@Sun.COM 
1578*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1579*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1580*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port++)
1581*11236SStephen.Hanson@Sun.COM 			outb(port, *h++);
1582*11236SStephen.Hanson@Sun.COM 	else
1583*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1584*11236SStephen.Hanson@Sun.COM 			outb(port, *h++);
1585*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1586*11236SStephen.Hanson@Sun.COM }
1587*11236SStephen.Hanson@Sun.COM 
1588*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1589*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1590*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1591*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1592*11236SStephen.Hanson@Sun.COM {
1593*11236SStephen.Hanson@Sun.COM 	uint16_t *h, *d;
1594*11236SStephen.Hanson@Sun.COM 
1595*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1596*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1597*11236SStephen.Hanson@Sun.COM 
1598*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1599*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1600*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1601*11236SStephen.Hanson@Sun.COM 			*d++ = *h++;
1602*11236SStephen.Hanson@Sun.COM 	else
1603*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1604*11236SStephen.Hanson@Sun.COM 			*d = *h++;
1605*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1606*11236SStephen.Hanson@Sun.COM }
1607*11236SStephen.Hanson@Sun.COM 
1608*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1609*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1610*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1611*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1612*11236SStephen.Hanson@Sun.COM {
1613*11236SStephen.Hanson@Sun.COM 	uint16_t *h;
1614*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1615*11236SStephen.Hanson@Sun.COM 
1616*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1617*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1618*11236SStephen.Hanson@Sun.COM 
1619*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1620*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1621*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 2)
1622*11236SStephen.Hanson@Sun.COM 			outw(port, *h++);
1623*11236SStephen.Hanson@Sun.COM 	else
1624*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1625*11236SStephen.Hanson@Sun.COM 			outw(port, *h++);
1626*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1627*11236SStephen.Hanson@Sun.COM }
1628*11236SStephen.Hanson@Sun.COM 
1629*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1630*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1631*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1632*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1633*11236SStephen.Hanson@Sun.COM {
1634*11236SStephen.Hanson@Sun.COM 	uint16_t *h, *d;
1635*11236SStephen.Hanson@Sun.COM 
1636*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1637*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1638*11236SStephen.Hanson@Sun.COM 
1639*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1640*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1641*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1642*11236SStephen.Hanson@Sun.COM 			*d++ = ddi_swap16(*h++);
1643*11236SStephen.Hanson@Sun.COM 	else
1644*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1645*11236SStephen.Hanson@Sun.COM 			*d = ddi_swap16(*h++);
1646*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1647*11236SStephen.Hanson@Sun.COM }
1648*11236SStephen.Hanson@Sun.COM 
1649*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1650*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_swap_rep_put16(ddi_acc_impl_t * hdlp,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount,uint_t flags)1651*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1652*11236SStephen.Hanson@Sun.COM 	uint16_t *dev_addr, size_t repcount, uint_t flags)
1653*11236SStephen.Hanson@Sun.COM {
1654*11236SStephen.Hanson@Sun.COM 	uint16_t *h;
1655*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1656*11236SStephen.Hanson@Sun.COM 
1657*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1658*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1659*11236SStephen.Hanson@Sun.COM 
1660*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1661*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1662*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 2)
1663*11236SStephen.Hanson@Sun.COM 			outw(port, ddi_swap16(*h++));
1664*11236SStephen.Hanson@Sun.COM 	else
1665*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1666*11236SStephen.Hanson@Sun.COM 			outw(port, ddi_swap16(*h++));
1667*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1668*11236SStephen.Hanson@Sun.COM }
1669*11236SStephen.Hanson@Sun.COM 
1670*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1671*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1672*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1673*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1674*11236SStephen.Hanson@Sun.COM {
1675*11236SStephen.Hanson@Sun.COM 	uint32_t *h, *d;
1676*11236SStephen.Hanson@Sun.COM 
1677*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1678*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1679*11236SStephen.Hanson@Sun.COM 
1680*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1681*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1682*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1683*11236SStephen.Hanson@Sun.COM 			*d++ = *h++;
1684*11236SStephen.Hanson@Sun.COM 	else
1685*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1686*11236SStephen.Hanson@Sun.COM 			*d = *h++;
1687*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1688*11236SStephen.Hanson@Sun.COM }
1689*11236SStephen.Hanson@Sun.COM 
1690*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1691*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1692*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1693*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1694*11236SStephen.Hanson@Sun.COM {
1695*11236SStephen.Hanson@Sun.COM 	uint32_t *h;
1696*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1697*11236SStephen.Hanson@Sun.COM 
1698*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1699*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1700*11236SStephen.Hanson@Sun.COM 
1701*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1702*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1703*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 4)
1704*11236SStephen.Hanson@Sun.COM 			outl(port, *h++);
1705*11236SStephen.Hanson@Sun.COM 	else
1706*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1707*11236SStephen.Hanson@Sun.COM 			outl(port, *h++);
1708*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1709*11236SStephen.Hanson@Sun.COM }
1710*11236SStephen.Hanson@Sun.COM 
1711*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1712*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1713*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1714*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1715*11236SStephen.Hanson@Sun.COM {
1716*11236SStephen.Hanson@Sun.COM 	uint32_t *h, *d;
1717*11236SStephen.Hanson@Sun.COM 
1718*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1719*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1720*11236SStephen.Hanson@Sun.COM 
1721*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1722*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1723*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1724*11236SStephen.Hanson@Sun.COM 			*d++ = ddi_swap32(*h++);
1725*11236SStephen.Hanson@Sun.COM 	else
1726*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1727*11236SStephen.Hanson@Sun.COM 			*d = ddi_swap32(*h++);
1728*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1729*11236SStephen.Hanson@Sun.COM }
1730*11236SStephen.Hanson@Sun.COM 
1731*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1732*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_io_swap_rep_put32(ddi_acc_impl_t * hdlp,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount,uint_t flags)1733*11236SStephen.Hanson@Sun.COM i_ddi_prot_io_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1734*11236SStephen.Hanson@Sun.COM 	uint32_t *dev_addr, size_t repcount, uint_t flags)
1735*11236SStephen.Hanson@Sun.COM {
1736*11236SStephen.Hanson@Sun.COM 	uint32_t *h;
1737*11236SStephen.Hanson@Sun.COM 	uintptr_t port;
1738*11236SStephen.Hanson@Sun.COM 
1739*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1740*11236SStephen.Hanson@Sun.COM 	port = (uintptr_t)dev_addr;
1741*11236SStephen.Hanson@Sun.COM 
1742*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1743*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1744*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--, port += 4)
1745*11236SStephen.Hanson@Sun.COM 			outl(port, ddi_swap32(*h++));
1746*11236SStephen.Hanson@Sun.COM 	else
1747*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1748*11236SStephen.Hanson@Sun.COM 			outl(port, ddi_swap32(*h++));
1749*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1750*11236SStephen.Hanson@Sun.COM }
1751*11236SStephen.Hanson@Sun.COM 
1752*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1753*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_rep_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)1754*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1755*11236SStephen.Hanson@Sun.COM 	uint64_t *dev_addr, size_t repcount, uint_t flags)
1756*11236SStephen.Hanson@Sun.COM {
1757*11236SStephen.Hanson@Sun.COM 	uint64_t *h, *d;
1758*11236SStephen.Hanson@Sun.COM 
1759*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1760*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1761*11236SStephen.Hanson@Sun.COM 
1762*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1763*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1764*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1765*11236SStephen.Hanson@Sun.COM 			*d++ = *h++;
1766*11236SStephen.Hanson@Sun.COM 	else
1767*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1768*11236SStephen.Hanson@Sun.COM 			*d = *h++;
1769*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1770*11236SStephen.Hanson@Sun.COM }
1771*11236SStephen.Hanson@Sun.COM 
1772*11236SStephen.Hanson@Sun.COM /*ARGSUSED*/
1773*11236SStephen.Hanson@Sun.COM void
i_ddi_prot_vaddr_swap_rep_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)1774*11236SStephen.Hanson@Sun.COM i_ddi_prot_vaddr_swap_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1775*11236SStephen.Hanson@Sun.COM 	uint64_t *dev_addr, size_t repcount, uint_t flags)
1776*11236SStephen.Hanson@Sun.COM {
1777*11236SStephen.Hanson@Sun.COM 	uint64_t *h, *d;
1778*11236SStephen.Hanson@Sun.COM 
1779*11236SStephen.Hanson@Sun.COM 	h = host_addr;
1780*11236SStephen.Hanson@Sun.COM 	d = dev_addr;
1781*11236SStephen.Hanson@Sun.COM 
1782*11236SStephen.Hanson@Sun.COM 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1783*11236SStephen.Hanson@Sun.COM 	if (flags == DDI_DEV_AUTOINCR)
1784*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1785*11236SStephen.Hanson@Sun.COM 			*d++ = ddi_swap64(*h++);
1786*11236SStephen.Hanson@Sun.COM 	else
1787*11236SStephen.Hanson@Sun.COM 		for (; repcount; repcount--)
1788*11236SStephen.Hanson@Sun.COM 			*d = ddi_swap64(*h++);
1789*11236SStephen.Hanson@Sun.COM 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1790*11236SStephen.Hanson@Sun.COM }
1791*11236SStephen.Hanson@Sun.COM 
1792*11236SStephen.Hanson@Sun.COM void
ddi_io_rep_get8(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)17930Sstevel@tonic-gate ddi_io_rep_get8(ddi_acc_handle_t handle,
17940Sstevel@tonic-gate 	uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
17950Sstevel@tonic-gate {
17960Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_get8)
1797*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1798*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
17990Sstevel@tonic-gate }
18000Sstevel@tonic-gate 
18010Sstevel@tonic-gate void
ddi_io_rep_get16(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)18020Sstevel@tonic-gate ddi_io_rep_get16(ddi_acc_handle_t handle,
18030Sstevel@tonic-gate 	uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
18040Sstevel@tonic-gate {
18050Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_get16)
1806*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1807*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18080Sstevel@tonic-gate }
18090Sstevel@tonic-gate 
18100Sstevel@tonic-gate void
ddi_io_rep_get32(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)18110Sstevel@tonic-gate ddi_io_rep_get32(ddi_acc_handle_t handle,
18120Sstevel@tonic-gate 	uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
18130Sstevel@tonic-gate {
18140Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_get32)
1815*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1816*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18170Sstevel@tonic-gate }
18180Sstevel@tonic-gate 
18190Sstevel@tonic-gate /*ARGSUSED*/
18200Sstevel@tonic-gate void
i_ddi_io_rep_get64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)18210Sstevel@tonic-gate i_ddi_io_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
18220Sstevel@tonic-gate 	uint64_t *dev_addr, size_t repcount, uint_t flags)
18230Sstevel@tonic-gate {
18240Sstevel@tonic-gate 	cmn_err(CE_PANIC, "ddi_rep_get64 from i/o space");
18250Sstevel@tonic-gate }
18260Sstevel@tonic-gate 
18270Sstevel@tonic-gate void
ddi_io_rep_put8(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)18280Sstevel@tonic-gate ddi_io_rep_put8(ddi_acc_handle_t handle,
18290Sstevel@tonic-gate 	uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
18300Sstevel@tonic-gate {
18310Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_put8)
1832*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1833*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18340Sstevel@tonic-gate }
18350Sstevel@tonic-gate 
18360Sstevel@tonic-gate void
ddi_io_rep_put16(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)18370Sstevel@tonic-gate ddi_io_rep_put16(ddi_acc_handle_t handle,
18380Sstevel@tonic-gate 	uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
18390Sstevel@tonic-gate {
18400Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_put16)
1841*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1842*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18430Sstevel@tonic-gate }
18440Sstevel@tonic-gate 
18450Sstevel@tonic-gate void
ddi_io_rep_put32(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)18460Sstevel@tonic-gate ddi_io_rep_put32(ddi_acc_handle_t handle,
18470Sstevel@tonic-gate 	uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
18480Sstevel@tonic-gate {
18490Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_put32)
1850*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1851*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18520Sstevel@tonic-gate }
18530Sstevel@tonic-gate 
18540Sstevel@tonic-gate /*ARGSUSED*/
18550Sstevel@tonic-gate void
i_ddi_io_rep_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t * dev_addr,size_t repcount,uint_t flags)18560Sstevel@tonic-gate i_ddi_io_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
18570Sstevel@tonic-gate 	uint64_t *dev_addr, size_t repcount, uint_t flags)
18580Sstevel@tonic-gate {
18590Sstevel@tonic-gate 	cmn_err(CE_PANIC, "ddi_rep_put64 to i/o space");
18600Sstevel@tonic-gate }
18610Sstevel@tonic-gate 
18620Sstevel@tonic-gate /*
18631106Smrj  * We need to separate the old interfaces from the new ones and leave them
18641106Smrj  * in here for a while. Previous versions of the OS defined the new interfaces
18651106Smrj  * to the old interfaces. This way we can fix things up so that we can
18661106Smrj  * eventually remove these interfaces.
18671106Smrj  * e.g. A 3rd party module/driver using ddi_io_rep_get8 and built against S10
18681106Smrj  * or earlier will actually have a reference to ddi_io_rep_getb in the binary.
18691106Smrj  */
18701106Smrj #ifdef _ILP32
18711106Smrj void
ddi_io_rep_getb(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)18721106Smrj ddi_io_rep_getb(ddi_acc_handle_t handle,
18731106Smrj 	uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
18741106Smrj {
18751106Smrj 	(((ddi_acc_impl_t *)handle)->ahi_rep_get8)
1876*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1877*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18781106Smrj }
18791106Smrj 
18801106Smrj void
ddi_io_rep_getw(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)18811106Smrj ddi_io_rep_getw(ddi_acc_handle_t handle,
18821106Smrj 	uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
18831106Smrj {
18841106Smrj 	(((ddi_acc_impl_t *)handle)->ahi_rep_get16)
1885*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1886*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18871106Smrj }
18881106Smrj 
18891106Smrj void
ddi_io_rep_getl(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)18901106Smrj ddi_io_rep_getl(ddi_acc_handle_t handle,
18911106Smrj 	uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
18921106Smrj {
18931106Smrj 	(((ddi_acc_impl_t *)handle)->ahi_rep_get32)
1894*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1895*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
18961106Smrj }
18971106Smrj 
18981106Smrj void
ddi_io_rep_putb(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)18991106Smrj ddi_io_rep_putb(ddi_acc_handle_t handle,
19001106Smrj 	uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
19011106Smrj {
19021106Smrj 	(((ddi_acc_impl_t *)handle)->ahi_rep_put8)
1903*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1904*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
19051106Smrj }
19061106Smrj 
19071106Smrj void
ddi_io_rep_putw(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)19081106Smrj ddi_io_rep_putw(ddi_acc_handle_t handle,
19091106Smrj 	uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
19101106Smrj {
19111106Smrj 	(((ddi_acc_impl_t *)handle)->ahi_rep_put16)
1912*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1913*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
19141106Smrj }
19151106Smrj 
19161106Smrj void
ddi_io_rep_putl(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)19171106Smrj ddi_io_rep_putl(ddi_acc_handle_t handle,
19181106Smrj 	uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
19191106Smrj {
19201106Smrj 	(((ddi_acc_impl_t *)handle)->ahi_rep_put32)
1921*11236SStephen.Hanson@Sun.COM 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1922*11236SStephen.Hanson@Sun.COM 	    repcount, DDI_DEV_NO_AUTOINCR);
19231106Smrj }
19241106Smrj #endif /* _ILP32 */
19251106Smrj 
19261106Smrj /*
19270Sstevel@tonic-gate  * These next two functions could be translated into assembler someday
19280Sstevel@tonic-gate  */
19290Sstevel@tonic-gate int
ddi_check_acc_handle(ddi_acc_handle_t handle)19300Sstevel@tonic-gate ddi_check_acc_handle(ddi_acc_handle_t handle)
19310Sstevel@tonic-gate {
19320Sstevel@tonic-gate 	ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
19330Sstevel@tonic-gate 	return (((*hdlp->ahi_fault_check)(hdlp) == DDI_SUCCESS) ? DDI_SUCCESS :
19340Sstevel@tonic-gate 	    DDI_FAILURE);
19350Sstevel@tonic-gate }
19360Sstevel@tonic-gate 
19370Sstevel@tonic-gate int
i_ddi_acc_fault_check(ddi_acc_impl_t * hdlp)19380Sstevel@tonic-gate i_ddi_acc_fault_check(ddi_acc_impl_t *hdlp)
19390Sstevel@tonic-gate {
19400Sstevel@tonic-gate 	/* Default version, just returns flag value */
19410Sstevel@tonic-gate 	return (hdlp->ahi_fault);
19420Sstevel@tonic-gate }
19430Sstevel@tonic-gate 
19440Sstevel@tonic-gate /*ARGSUSED*/
19450Sstevel@tonic-gate void
i_ddi_acc_fault_notify(ddi_acc_impl_t * hdlp)19460Sstevel@tonic-gate i_ddi_acc_fault_notify(ddi_acc_impl_t *hdlp)
19470Sstevel@tonic-gate {
19480Sstevel@tonic-gate 	/* Default version, does nothing for now */
19490Sstevel@tonic-gate }
19500Sstevel@tonic-gate 
19510Sstevel@tonic-gate void
i_ddi_acc_set_fault(ddi_acc_handle_t handle)19520Sstevel@tonic-gate i_ddi_acc_set_fault(ddi_acc_handle_t handle)
19530Sstevel@tonic-gate {
19540Sstevel@tonic-gate 	ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
19550Sstevel@tonic-gate 
19560Sstevel@tonic-gate 	if (!hdlp->ahi_fault) {
19570Sstevel@tonic-gate 		hdlp->ahi_fault = 1;
19580Sstevel@tonic-gate 		(*hdlp->ahi_fault_notify)(hdlp);
19590Sstevel@tonic-gate 	}
19600Sstevel@tonic-gate }
19610Sstevel@tonic-gate 
19620Sstevel@tonic-gate void
i_ddi_acc_clr_fault(ddi_acc_handle_t handle)19630Sstevel@tonic-gate i_ddi_acc_clr_fault(ddi_acc_handle_t handle)
19640Sstevel@tonic-gate {
19650Sstevel@tonic-gate 	ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
19660Sstevel@tonic-gate 
19670Sstevel@tonic-gate 	if (hdlp->ahi_fault) {
19680Sstevel@tonic-gate 		hdlp->ahi_fault = 0;
19690Sstevel@tonic-gate 		(*hdlp->ahi_fault_notify)(hdlp);
19700Sstevel@tonic-gate 	}
19710Sstevel@tonic-gate }
1972