xref: /illumos-gate/usr/src/uts/intel/os/ddi_i86.c (revision f0089e39)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
54ab75253Smrj  * Common Development and Distribution License (the "License").
64ab75253Smrj  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
214ab75253Smrj 
227c478bd9Sstevel@tonic-gate /*
23837c1ac4SStephen Hanson  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
26b89e420aSGarrett D'Amore /*
27b89e420aSGarrett D'Amore  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
28b89e420aSGarrett D'Amore  */
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #include <sys/conf.h>
317c478bd9Sstevel@tonic-gate #include <sys/kmem.h>
327c478bd9Sstevel@tonic-gate #include <sys/ddi_impldefs.h>
337c478bd9Sstevel@tonic-gate #include <sys/ddi.h>
347c478bd9Sstevel@tonic-gate #include <sys/sunddi.h>
357c478bd9Sstevel@tonic-gate #include <sys/ddifm.h>
3600d0963fSdilpreet #include <sys/fm/io/ddi.h>
37837c1ac4SStephen Hanson #include <sys/fm/protocol.h>
3800d0963fSdilpreet #include <sys/ontrap.h>
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate 
417c478bd9Sstevel@tonic-gate /*
427c478bd9Sstevel@tonic-gate  * DDI DMA Engine functions for x86.
437c478bd9Sstevel@tonic-gate  * These functions are more naturally generic, but do not apply to SPARC.
447c478bd9Sstevel@tonic-gate  */
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate int
ddi_dmae_alloc(dev_info_t * dip,int chnl,int (* dmae_waitfp)(),caddr_t arg)477c478bd9Sstevel@tonic-gate ddi_dmae_alloc(dev_info_t *dip, int chnl, int (*dmae_waitfp)(), caddr_t arg)
487c478bd9Sstevel@tonic-gate {
497c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_ACQUIRE,
507c478bd9Sstevel@tonic-gate 	    (off_t *)dmae_waitfp, (size_t *)arg,
517c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
527c478bd9Sstevel@tonic-gate }
537c478bd9Sstevel@tonic-gate 
547c478bd9Sstevel@tonic-gate int
ddi_dmae_release(dev_info_t * dip,int chnl)557c478bd9Sstevel@tonic-gate ddi_dmae_release(dev_info_t *dip, int chnl)
567c478bd9Sstevel@tonic-gate {
577c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_FREE, 0, 0,
587c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
597c478bd9Sstevel@tonic-gate }
607c478bd9Sstevel@tonic-gate 
617c478bd9Sstevel@tonic-gate int
ddi_dmae_getattr(dev_info_t * dip,ddi_dma_attr_t * attrp)627c478bd9Sstevel@tonic-gate ddi_dmae_getattr(dev_info_t *dip, ddi_dma_attr_t *attrp)
637c478bd9Sstevel@tonic-gate {
647c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETATTR, 0, 0,
657c478bd9Sstevel@tonic-gate 	    (caddr_t *)attrp, 0));
667c478bd9Sstevel@tonic-gate }
677c478bd9Sstevel@tonic-gate 
687c478bd9Sstevel@tonic-gate int
ddi_dmae_1stparty(dev_info_t * dip,int chnl)697c478bd9Sstevel@tonic-gate ddi_dmae_1stparty(dev_info_t *dip, int chnl)
707c478bd9Sstevel@tonic-gate {
717c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_1STPTY, 0, 0,
727c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
737c478bd9Sstevel@tonic-gate }
747c478bd9Sstevel@tonic-gate 
757c478bd9Sstevel@tonic-gate int
ddi_dmae_prog(dev_info_t * dip,struct ddi_dmae_req * dmaereqp,ddi_dma_cookie_t * cookiep,int chnl)767c478bd9Sstevel@tonic-gate ddi_dmae_prog(dev_info_t *dip, struct ddi_dmae_req *dmaereqp,
7786ef0a63SRichard Lowe     ddi_dma_cookie_t *cookiep, int chnl)
787c478bd9Sstevel@tonic-gate {
797c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_PROG, (off_t *)dmaereqp,
807c478bd9Sstevel@tonic-gate 	    (size_t *)cookiep, (caddr_t *)(uintptr_t)chnl, 0));
817c478bd9Sstevel@tonic-gate }
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate int
ddi_dmae_swsetup(dev_info_t * dip,struct ddi_dmae_req * dmaereqp,ddi_dma_cookie_t * cookiep,int chnl)847c478bd9Sstevel@tonic-gate ddi_dmae_swsetup(dev_info_t *dip, struct ddi_dmae_req *dmaereqp,
8586ef0a63SRichard Lowe     ddi_dma_cookie_t *cookiep, int chnl)
867c478bd9Sstevel@tonic-gate {
877c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_SWSETUP, (off_t *)dmaereqp,
887c478bd9Sstevel@tonic-gate 	    (size_t *)cookiep, (caddr_t *)(uintptr_t)chnl, 0));
897c478bd9Sstevel@tonic-gate }
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate int
ddi_dmae_swstart(dev_info_t * dip,int chnl)927c478bd9Sstevel@tonic-gate ddi_dmae_swstart(dev_info_t *dip, int chnl)
937c478bd9Sstevel@tonic-gate {
947c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_SWSTART, 0, 0,
957c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
967c478bd9Sstevel@tonic-gate }
977c478bd9Sstevel@tonic-gate 
987c478bd9Sstevel@tonic-gate int
ddi_dmae_stop(dev_info_t * dip,int chnl)997c478bd9Sstevel@tonic-gate ddi_dmae_stop(dev_info_t *dip, int chnl)
1007c478bd9Sstevel@tonic-gate {
1017c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_STOP, 0, 0,
1027c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1037c478bd9Sstevel@tonic-gate }
1047c478bd9Sstevel@tonic-gate 
1057c478bd9Sstevel@tonic-gate int
ddi_dmae_enable(dev_info_t * dip,int chnl)1067c478bd9Sstevel@tonic-gate ddi_dmae_enable(dev_info_t *dip, int chnl)
1077c478bd9Sstevel@tonic-gate {
1087c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_ENABLE, 0, 0,
1097c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1107c478bd9Sstevel@tonic-gate }
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate int
ddi_dmae_disable(dev_info_t * dip,int chnl)1137c478bd9Sstevel@tonic-gate ddi_dmae_disable(dev_info_t *dip, int chnl)
1147c478bd9Sstevel@tonic-gate {
1157c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_DISABLE, 0, 0,
1167c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1177c478bd9Sstevel@tonic-gate }
1187c478bd9Sstevel@tonic-gate 
1197c478bd9Sstevel@tonic-gate int
ddi_dmae_getcnt(dev_info_t * dip,int chnl,int * countp)1207c478bd9Sstevel@tonic-gate ddi_dmae_getcnt(dev_info_t *dip, int chnl, int *countp)
1217c478bd9Sstevel@tonic-gate {
1227c478bd9Sstevel@tonic-gate 	return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETCNT, 0, (size_t *)countp,
1237c478bd9Sstevel@tonic-gate 	    (caddr_t *)(uintptr_t)chnl, 0));
1247c478bd9Sstevel@tonic-gate }
1257c478bd9Sstevel@tonic-gate 
1267c478bd9Sstevel@tonic-gate /*
1277c478bd9Sstevel@tonic-gate  * implementation specific access handle and routines:
1287c478bd9Sstevel@tonic-gate  */
1297c478bd9Sstevel@tonic-gate 
1307c478bd9Sstevel@tonic-gate static uintptr_t impl_acc_hdl_id = 0;
1317c478bd9Sstevel@tonic-gate 
1327c478bd9Sstevel@tonic-gate /*
1337c478bd9Sstevel@tonic-gate  * access handle allocator
1347c478bd9Sstevel@tonic-gate  */
1357c478bd9Sstevel@tonic-gate ddi_acc_hdl_t *
impl_acc_hdl_get(ddi_acc_handle_t hdl)1367c478bd9Sstevel@tonic-gate impl_acc_hdl_get(ddi_acc_handle_t hdl)
1377c478bd9Sstevel@tonic-gate {
1387c478bd9Sstevel@tonic-gate 	/*
1397c478bd9Sstevel@tonic-gate 	 * recast to ddi_acc_hdl_t instead of
1407c478bd9Sstevel@tonic-gate 	 * casting to ddi_acc_impl_t and then return the ah_platform_private
1417c478bd9Sstevel@tonic-gate 	 *
1427c478bd9Sstevel@tonic-gate 	 * this optimization based on the ddi_acc_hdl_t is the
1437c478bd9Sstevel@tonic-gate 	 * first member of the ddi_acc_impl_t.
1447c478bd9Sstevel@tonic-gate 	 */
1457c478bd9Sstevel@tonic-gate 	return ((ddi_acc_hdl_t *)hdl);
1467c478bd9Sstevel@tonic-gate }
1477c478bd9Sstevel@tonic-gate 
1487c478bd9Sstevel@tonic-gate ddi_acc_handle_t
impl_acc_hdl_alloc(int (* waitfp)(caddr_t),caddr_t arg)1497c478bd9Sstevel@tonic-gate impl_acc_hdl_alloc(int (*waitfp)(caddr_t), caddr_t arg)
1507c478bd9Sstevel@tonic-gate {
1517c478bd9Sstevel@tonic-gate 	ddi_acc_impl_t *hp;
15200d0963fSdilpreet 	on_trap_data_t *otp;
1537c478bd9Sstevel@tonic-gate 	int sleepflag;
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate 	sleepflag = ((waitfp == (int (*)())KM_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
1567c478bd9Sstevel@tonic-gate 	/*
15700d0963fSdilpreet 	 * Allocate and initialize the data access handle and error status.
1587c478bd9Sstevel@tonic-gate 	 */
15900d0963fSdilpreet 	if ((hp = kmem_zalloc(sizeof (ddi_acc_impl_t), sleepflag)) == NULL)
16000d0963fSdilpreet 		goto fail;
16100d0963fSdilpreet 	if ((hp->ahi_err = (ndi_err_t *)kmem_zalloc(
16200d0963fSdilpreet 	    sizeof (ndi_err_t), sleepflag)) == NULL) {
16300d0963fSdilpreet 		kmem_free(hp, sizeof (ddi_acc_impl_t));
16400d0963fSdilpreet 		goto fail;
1657c478bd9Sstevel@tonic-gate 	}
16600d0963fSdilpreet 	if ((otp = (on_trap_data_t *)kmem_zalloc(
16700d0963fSdilpreet 	    sizeof (on_trap_data_t), sleepflag)) == NULL) {
16800d0963fSdilpreet 		kmem_free(hp->ahi_err, sizeof (ndi_err_t));
16900d0963fSdilpreet 		kmem_free(hp, sizeof (ddi_acc_impl_t));
17000d0963fSdilpreet 		goto fail;
17100d0963fSdilpreet 	}
17200d0963fSdilpreet 	hp->ahi_err->err_ontrap = otp;
1737c478bd9Sstevel@tonic-gate 	hp->ahi_common.ah_platform_private = (void *)hp;
17400d0963fSdilpreet 
1757c478bd9Sstevel@tonic-gate 	return ((ddi_acc_handle_t)hp);
17600d0963fSdilpreet fail:
17700d0963fSdilpreet 	if ((waitfp != (int (*)())KM_SLEEP) &&
17800d0963fSdilpreet 	    (waitfp != (int (*)())KM_NOSLEEP))
17900d0963fSdilpreet 		ddi_set_callback(waitfp, arg, &impl_acc_hdl_id);
18000d0963fSdilpreet 	return (NULL);
1817c478bd9Sstevel@tonic-gate }
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate void
impl_acc_hdl_free(ddi_acc_handle_t handle)1847c478bd9Sstevel@tonic-gate impl_acc_hdl_free(ddi_acc_handle_t handle)
1857c478bd9Sstevel@tonic-gate {
1867c478bd9Sstevel@tonic-gate 	ddi_acc_impl_t *hp;
1877c478bd9Sstevel@tonic-gate 
18800d0963fSdilpreet 	/*
18900d0963fSdilpreet 	 * The supplied (ddi_acc_handle_t) is actually a (ddi_acc_impl_t *),
19000d0963fSdilpreet 	 * because that's what we allocated in impl_acc_hdl_alloc() above.
19100d0963fSdilpreet 	 */
1927c478bd9Sstevel@tonic-gate 	hp = (ddi_acc_impl_t *)handle;
1937c478bd9Sstevel@tonic-gate 	if (hp) {
19400d0963fSdilpreet 		kmem_free(hp->ahi_err->err_ontrap, sizeof (on_trap_data_t));
19500d0963fSdilpreet 		kmem_free(hp->ahi_err, sizeof (ndi_err_t));
19600d0963fSdilpreet 		kmem_free(hp, sizeof (ddi_acc_impl_t));
1977c478bd9Sstevel@tonic-gate 		if (impl_acc_hdl_id)
1987c478bd9Sstevel@tonic-gate 			ddi_run_callback(&impl_acc_hdl_id);
1997c478bd9Sstevel@tonic-gate 	}
2007c478bd9Sstevel@tonic-gate }
2017c478bd9Sstevel@tonic-gate 
20200d0963fSdilpreet /*
20300d0963fSdilpreet  * Function used to check if a given access handle owns the failing address.
20400d0963fSdilpreet  * Called by ndi_fmc_error, when we detect a PIO error.
20500d0963fSdilpreet  */
20600d0963fSdilpreet /* ARGSUSED */
20700d0963fSdilpreet static int
impl_acc_check(dev_info_t * dip,const void * handle,const void * addr,const void * not_used)20800d0963fSdilpreet impl_acc_check(dev_info_t *dip, const void *handle, const void *addr,
20900d0963fSdilpreet     const void *not_used)
21000d0963fSdilpreet {
21100d0963fSdilpreet 	pfn_t pfn, fault_pfn;
21200d0963fSdilpreet 	ddi_acc_hdl_t *hp;
21300d0963fSdilpreet 
21400d0963fSdilpreet 	hp = impl_acc_hdl_get((ddi_acc_handle_t)handle);
21500d0963fSdilpreet 
21600d0963fSdilpreet 	ASSERT(hp);
21700d0963fSdilpreet 
21800d0963fSdilpreet 	if (addr != NULL) {
21900d0963fSdilpreet 		pfn = hp->ah_pfn;
22000d0963fSdilpreet 		fault_pfn = mmu_btop(*(uint64_t *)addr);
22100d0963fSdilpreet 		if (fault_pfn >= pfn && fault_pfn < (pfn + hp->ah_pnum))
22200d0963fSdilpreet 			return (DDI_FM_NONFATAL);
22300d0963fSdilpreet 	}
22400d0963fSdilpreet 	return (DDI_FM_UNKNOWN);
22500d0963fSdilpreet }
22600d0963fSdilpreet 
2277c478bd9Sstevel@tonic-gate void
impl_acc_err_init(ddi_acc_hdl_t * handlep)2287c478bd9Sstevel@tonic-gate impl_acc_err_init(ddi_acc_hdl_t *handlep)
2297c478bd9Sstevel@tonic-gate {
23000d0963fSdilpreet 	int fmcap;
23100d0963fSdilpreet 	ndi_err_t *errp;
23200d0963fSdilpreet 	on_trap_data_t *otp;
23300d0963fSdilpreet 	ddi_acc_impl_t *hp = (ddi_acc_impl_t *)handlep;
23400d0963fSdilpreet 
23500d0963fSdilpreet 	fmcap = ddi_fm_capable(handlep->ah_dip);
23600d0963fSdilpreet 
23700d0963fSdilpreet 	if (handlep->ah_acc.devacc_attr_version < DDI_DEVICE_ATTR_V1 ||
23800d0963fSdilpreet 	    !DDI_FM_ACC_ERR_CAP(fmcap)) {
23900d0963fSdilpreet 		handlep->ah_acc.devacc_attr_access = DDI_DEFAULT_ACC;
240837c1ac4SStephen Hanson 	} else if (handlep->ah_acc.devacc_attr_access == DDI_FLAGERR_ACC &&
241837c1ac4SStephen Hanson 	    hp->ahi_scan == NULL) {
242837c1ac4SStephen Hanson 		handlep->ah_acc.devacc_attr_access = DDI_DEFAULT_ACC;
24300d0963fSdilpreet 	} else if (DDI_FM_ACC_ERR_CAP(fmcap)) {
24400d0963fSdilpreet 		if (handlep->ah_acc.devacc_attr_access == DDI_DEFAULT_ACC) {
245837c1ac4SStephen Hanson 			if (handlep->ah_xfermodes)
246837c1ac4SStephen Hanson 				return;
24700d0963fSdilpreet 			i_ddi_drv_ereport_post(handlep->ah_dip, DVR_EFMCAP,
24800d0963fSdilpreet 			    NULL, DDI_NOSLEEP);
24900d0963fSdilpreet 		} else {
25000d0963fSdilpreet 			errp = hp->ahi_err;
25100d0963fSdilpreet 			otp = (on_trap_data_t *)errp->err_ontrap;
25200d0963fSdilpreet 			otp->ot_handle = (void *)(hp);
25300d0963fSdilpreet 			otp->ot_prot = OT_DATA_ACCESS;
25400d0963fSdilpreet 			errp->err_status = DDI_FM_OK;
25500d0963fSdilpreet 			errp->err_expected = DDI_FM_ERR_UNEXPECTED;
25600d0963fSdilpreet 			errp->err_cf = impl_acc_check;
25700d0963fSdilpreet 		}
25800d0963fSdilpreet 	}
25900d0963fSdilpreet }
26000d0963fSdilpreet 
26100d0963fSdilpreet /* ARGSUSED */
26200d0963fSdilpreet int
impl_dma_check(dev_info_t * dip,const void * handle,const void * pci_hdl,const void * not_used)26300d0963fSdilpreet impl_dma_check(dev_info_t *dip, const void *handle, const void *pci_hdl,
26400d0963fSdilpreet     const void *not_used)
26500d0963fSdilpreet {
26600d0963fSdilpreet 	return (DDI_FM_UNKNOWN);
2677c478bd9Sstevel@tonic-gate }
2687c478bd9Sstevel@tonic-gate 
2697c478bd9Sstevel@tonic-gate void
impl_acc_hdl_init(ddi_acc_hdl_t * handlep)2707c478bd9Sstevel@tonic-gate impl_acc_hdl_init(ddi_acc_hdl_t *handlep)
2717c478bd9Sstevel@tonic-gate {
2727c478bd9Sstevel@tonic-gate 	ddi_acc_impl_t *hp;
27300d0963fSdilpreet 	int fmcap;
27400d0963fSdilpreet 	int devacc_attr_access;
2757c478bd9Sstevel@tonic-gate 
2767c478bd9Sstevel@tonic-gate 	if (!handlep)
2777c478bd9Sstevel@tonic-gate 		return;
27800d0963fSdilpreet 	fmcap = ddi_fm_capable(handlep->ah_dip);
27900d0963fSdilpreet 	if (handlep->ah_acc.devacc_attr_version < DDI_DEVICE_ATTR_V1 ||
28000d0963fSdilpreet 	    !DDI_FM_ACC_ERR_CAP(fmcap))
28100d0963fSdilpreet 		devacc_attr_access = DDI_DEFAULT_ACC;
28200d0963fSdilpreet 	else
28300d0963fSdilpreet 		devacc_attr_access = handlep->ah_acc.devacc_attr_access;
2847c478bd9Sstevel@tonic-gate 
28500d0963fSdilpreet 	hp = (ddi_acc_impl_t *)handlep->ah_platform_private;
286837c1ac4SStephen Hanson 
287837c1ac4SStephen Hanson 	/*
288837c1ac4SStephen Hanson 	 * Can only do FLAGERR if scan callback is set up. This should
289837c1ac4SStephen Hanson 	 * also guarantee that the peekpoke_mutex and err_mutex are defined.
290837c1ac4SStephen Hanson 	 */
291837c1ac4SStephen Hanson 	if (devacc_attr_access == DDI_FLAGERR_ACC && hp->ahi_scan == NULL)
292837c1ac4SStephen Hanson 		devacc_attr_access = DDI_DEFAULT_ACC;
293837c1ac4SStephen Hanson 
29400d0963fSdilpreet 	switch (devacc_attr_access) {
29500d0963fSdilpreet 	case DDI_CAUTIOUS_ACC:
29600d0963fSdilpreet 		hp->ahi_get8 = i_ddi_caut_get8;
29700d0963fSdilpreet 		hp->ahi_put8 = i_ddi_caut_put8;
29800d0963fSdilpreet 		hp->ahi_rep_get8 = i_ddi_caut_rep_get8;
29900d0963fSdilpreet 		hp->ahi_rep_put8 = i_ddi_caut_rep_put8;
30000d0963fSdilpreet 		hp->ahi_get16 = i_ddi_caut_get16;
30100d0963fSdilpreet 		hp->ahi_get32 = i_ddi_caut_get32;
30200d0963fSdilpreet 		hp->ahi_put16 = i_ddi_caut_put16;
30300d0963fSdilpreet 		hp->ahi_put32 = i_ddi_caut_put32;
30400d0963fSdilpreet 		hp->ahi_rep_get16 = i_ddi_caut_rep_get16;
30500d0963fSdilpreet 		hp->ahi_rep_get32 = i_ddi_caut_rep_get32;
30600d0963fSdilpreet 		hp->ahi_rep_put16 = i_ddi_caut_rep_put16;
30700d0963fSdilpreet 		hp->ahi_rep_put32 = i_ddi_caut_rep_put32;
30800d0963fSdilpreet 		hp->ahi_get64 = i_ddi_caut_get64;
30900d0963fSdilpreet 		hp->ahi_put64 = i_ddi_caut_put64;
31000d0963fSdilpreet 		hp->ahi_rep_get64 = i_ddi_caut_rep_get64;
31100d0963fSdilpreet 		hp->ahi_rep_put64 = i_ddi_caut_rep_put64;
31200d0963fSdilpreet 		break;
313837c1ac4SStephen Hanson 	case DDI_FLAGERR_ACC:
314837c1ac4SStephen Hanson 		if (hp->ahi_acc_attr & DDI_ACCATTR_IO_SPACE) {
315837c1ac4SStephen Hanson 			hp->ahi_get8 = i_ddi_prot_io_get8;
316837c1ac4SStephen Hanson 			hp->ahi_put8 = i_ddi_prot_io_put8;
317837c1ac4SStephen Hanson 			hp->ahi_rep_get8 = i_ddi_prot_io_rep_get8;
318837c1ac4SStephen Hanson 			hp->ahi_rep_put8 = i_ddi_prot_io_rep_put8;
319837c1ac4SStephen Hanson 
320837c1ac4SStephen Hanson 			/* temporary set these 64 functions to no-ops */
321837c1ac4SStephen Hanson 			hp->ahi_get64 = i_ddi_io_get64;
322837c1ac4SStephen Hanson 			hp->ahi_put64 = i_ddi_io_put64;
323837c1ac4SStephen Hanson 			hp->ahi_rep_get64 = i_ddi_io_rep_get64;
324837c1ac4SStephen Hanson 			hp->ahi_rep_put64 = i_ddi_io_rep_put64;
325837c1ac4SStephen Hanson 
326837c1ac4SStephen Hanson 			/*
327837c1ac4SStephen Hanson 			 * check for BIG endian access
328837c1ac4SStephen Hanson 			 */
329837c1ac4SStephen Hanson 			if (handlep->ah_acc.devacc_attr_endian_flags ==
330837c1ac4SStephen Hanson 			    DDI_STRUCTURE_BE_ACC) {
331837c1ac4SStephen Hanson 				hp->ahi_get16 = i_ddi_prot_io_swap_get16;
332837c1ac4SStephen Hanson 				hp->ahi_get32 = i_ddi_prot_io_swap_get32;
333837c1ac4SStephen Hanson 				hp->ahi_put16 = i_ddi_prot_io_swap_put16;
334837c1ac4SStephen Hanson 				hp->ahi_put32 = i_ddi_prot_io_swap_put32;
335837c1ac4SStephen Hanson 				hp->ahi_rep_get16 =
336837c1ac4SStephen Hanson 				    i_ddi_prot_io_swap_rep_get16;
337837c1ac4SStephen Hanson 				hp->ahi_rep_get32 =
338837c1ac4SStephen Hanson 				    i_ddi_prot_io_swap_rep_get32;
339837c1ac4SStephen Hanson 				hp->ahi_rep_put16 =
340837c1ac4SStephen Hanson 				    i_ddi_prot_io_swap_rep_put16;
341837c1ac4SStephen Hanson 				hp->ahi_rep_put32 =
342837c1ac4SStephen Hanson 				    i_ddi_prot_io_swap_rep_put32;
343837c1ac4SStephen Hanson 			} else {
344837c1ac4SStephen Hanson 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
345837c1ac4SStephen Hanson 				hp->ahi_get16 = i_ddi_prot_io_get16;
346837c1ac4SStephen Hanson 				hp->ahi_get32 = i_ddi_prot_io_get32;
347837c1ac4SStephen Hanson 				hp->ahi_put16 = i_ddi_prot_io_put16;
348837c1ac4SStephen Hanson 				hp->ahi_put32 = i_ddi_prot_io_put32;
349837c1ac4SStephen Hanson 				hp->ahi_rep_get16 = i_ddi_prot_io_rep_get16;
350837c1ac4SStephen Hanson 				hp->ahi_rep_get32 = i_ddi_prot_io_rep_get32;
351837c1ac4SStephen Hanson 				hp->ahi_rep_put16 = i_ddi_prot_io_rep_put16;
352837c1ac4SStephen Hanson 				hp->ahi_rep_put32 = i_ddi_prot_io_rep_put32;
353837c1ac4SStephen Hanson 			}
354837c1ac4SStephen Hanson 
355837c1ac4SStephen Hanson 		} else if (hp->ahi_acc_attr & DDI_ACCATTR_CPU_VADDR) {
356837c1ac4SStephen Hanson 
357837c1ac4SStephen Hanson 			hp->ahi_get8 = i_ddi_prot_vaddr_get8;
358837c1ac4SStephen Hanson 			hp->ahi_put8 = i_ddi_prot_vaddr_put8;
359837c1ac4SStephen Hanson 			hp->ahi_rep_get8 = i_ddi_prot_vaddr_rep_get8;
360837c1ac4SStephen Hanson 			hp->ahi_rep_put8 = i_ddi_prot_vaddr_rep_put8;
361837c1ac4SStephen Hanson 
362837c1ac4SStephen Hanson 			/*
363837c1ac4SStephen Hanson 			 * check for BIG endian access
364837c1ac4SStephen Hanson 			 */
365837c1ac4SStephen Hanson 			if (handlep->ah_acc.devacc_attr_endian_flags ==
366837c1ac4SStephen Hanson 			    DDI_STRUCTURE_BE_ACC) {
367837c1ac4SStephen Hanson 
368837c1ac4SStephen Hanson 				hp->ahi_get16 = i_ddi_prot_vaddr_swap_get16;
369837c1ac4SStephen Hanson 				hp->ahi_get32 = i_ddi_prot_vaddr_swap_get32;
370837c1ac4SStephen Hanson 				hp->ahi_get64 = i_ddi_prot_vaddr_swap_get64;
371837c1ac4SStephen Hanson 				hp->ahi_put16 = i_ddi_prot_vaddr_swap_put16;
372837c1ac4SStephen Hanson 				hp->ahi_put32 = i_ddi_prot_vaddr_swap_put32;
373837c1ac4SStephen Hanson 				hp->ahi_put64 = i_ddi_prot_vaddr_swap_put64;
374837c1ac4SStephen Hanson 				hp->ahi_rep_get16 =
375837c1ac4SStephen Hanson 				    i_ddi_prot_vaddr_swap_rep_get16;
376837c1ac4SStephen Hanson 				hp->ahi_rep_get32 =
377837c1ac4SStephen Hanson 				    i_ddi_prot_vaddr_swap_rep_get32;
378837c1ac4SStephen Hanson 				hp->ahi_rep_get64 =
379837c1ac4SStephen Hanson 				    i_ddi_prot_vaddr_swap_rep_get64;
380837c1ac4SStephen Hanson 				hp->ahi_rep_put16 =
381837c1ac4SStephen Hanson 				    i_ddi_prot_vaddr_swap_rep_put16;
382837c1ac4SStephen Hanson 				hp->ahi_rep_put32 =
383837c1ac4SStephen Hanson 				    i_ddi_prot_vaddr_swap_rep_put32;
384837c1ac4SStephen Hanson 				hp->ahi_rep_put64 =
385837c1ac4SStephen Hanson 				    i_ddi_prot_vaddr_swap_rep_put64;
386837c1ac4SStephen Hanson 			} else {
387837c1ac4SStephen Hanson 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
388837c1ac4SStephen Hanson 				hp->ahi_get16 = i_ddi_prot_vaddr_get16;
389837c1ac4SStephen Hanson 				hp->ahi_get32 = i_ddi_prot_vaddr_get32;
390837c1ac4SStephen Hanson 				hp->ahi_get64 = i_ddi_prot_vaddr_get64;
391837c1ac4SStephen Hanson 				hp->ahi_put16 = i_ddi_prot_vaddr_put16;
392837c1ac4SStephen Hanson 				hp->ahi_put32 = i_ddi_prot_vaddr_put32;
393837c1ac4SStephen Hanson 				hp->ahi_put64 = i_ddi_prot_vaddr_put64;
394837c1ac4SStephen Hanson 				hp->ahi_rep_get16 = i_ddi_prot_vaddr_rep_get16;
395837c1ac4SStephen Hanson 				hp->ahi_rep_get32 = i_ddi_prot_vaddr_rep_get32;
396837c1ac4SStephen Hanson 				hp->ahi_rep_get64 = i_ddi_prot_vaddr_rep_get64;
397837c1ac4SStephen Hanson 				hp->ahi_rep_put16 = i_ddi_prot_vaddr_rep_put16;
398837c1ac4SStephen Hanson 				hp->ahi_rep_put32 = i_ddi_prot_vaddr_rep_put32;
399837c1ac4SStephen Hanson 				hp->ahi_rep_put64 = i_ddi_prot_vaddr_rep_put64;
400837c1ac4SStephen Hanson 			}
401837c1ac4SStephen Hanson 		}
402837c1ac4SStephen Hanson 		break;
40300d0963fSdilpreet 	case DDI_DEFAULT_ACC:
40400d0963fSdilpreet 		if (hp->ahi_acc_attr & DDI_ACCATTR_IO_SPACE) {
40500d0963fSdilpreet 			hp->ahi_get8 = i_ddi_io_get8;
40600d0963fSdilpreet 			hp->ahi_put8 = i_ddi_io_put8;
40700d0963fSdilpreet 			hp->ahi_rep_get8 = i_ddi_io_rep_get8;
40800d0963fSdilpreet 			hp->ahi_rep_put8 = i_ddi_io_rep_put8;
40900d0963fSdilpreet 
41000d0963fSdilpreet 			/* temporary set these 64 functions to no-ops */
41100d0963fSdilpreet 			hp->ahi_get64 = i_ddi_io_get64;
41200d0963fSdilpreet 			hp->ahi_put64 = i_ddi_io_put64;
41300d0963fSdilpreet 			hp->ahi_rep_get64 = i_ddi_io_rep_get64;
41400d0963fSdilpreet 			hp->ahi_rep_put64 = i_ddi_io_rep_put64;
41500d0963fSdilpreet 
41600d0963fSdilpreet 			/*
41700d0963fSdilpreet 			 * check for BIG endian access
41800d0963fSdilpreet 			 */
41900d0963fSdilpreet 			if (handlep->ah_acc.devacc_attr_endian_flags ==
420837c1ac4SStephen Hanson 			    DDI_STRUCTURE_BE_ACC) {
42100d0963fSdilpreet 				hp->ahi_get16 = i_ddi_io_swap_get16;
42200d0963fSdilpreet 				hp->ahi_get32 = i_ddi_io_swap_get32;
42300d0963fSdilpreet 				hp->ahi_put16 = i_ddi_io_swap_put16;
42400d0963fSdilpreet 				hp->ahi_put32 = i_ddi_io_swap_put32;
42500d0963fSdilpreet 				hp->ahi_rep_get16 = i_ddi_io_swap_rep_get16;
42600d0963fSdilpreet 				hp->ahi_rep_get32 = i_ddi_io_swap_rep_get32;
42700d0963fSdilpreet 				hp->ahi_rep_put16 = i_ddi_io_swap_rep_put16;
42800d0963fSdilpreet 				hp->ahi_rep_put32 = i_ddi_io_swap_rep_put32;
42900d0963fSdilpreet 			} else {
43000d0963fSdilpreet 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
43100d0963fSdilpreet 				hp->ahi_get16 = i_ddi_io_get16;
43200d0963fSdilpreet 				hp->ahi_get32 = i_ddi_io_get32;
43300d0963fSdilpreet 				hp->ahi_put16 = i_ddi_io_put16;
43400d0963fSdilpreet 				hp->ahi_put32 = i_ddi_io_put32;
43500d0963fSdilpreet 				hp->ahi_rep_get16 = i_ddi_io_rep_get16;
43600d0963fSdilpreet 				hp->ahi_rep_get32 = i_ddi_io_rep_get32;
43700d0963fSdilpreet 				hp->ahi_rep_put16 = i_ddi_io_rep_put16;
43800d0963fSdilpreet 				hp->ahi_rep_put32 = i_ddi_io_rep_put32;
43900d0963fSdilpreet 			}
44000d0963fSdilpreet 
44100d0963fSdilpreet 		} else if (hp->ahi_acc_attr & DDI_ACCATTR_CPU_VADDR) {
44200d0963fSdilpreet 
44300d0963fSdilpreet 			hp->ahi_get8 = i_ddi_vaddr_get8;
44400d0963fSdilpreet 			hp->ahi_put8 = i_ddi_vaddr_put8;
44500d0963fSdilpreet 			hp->ahi_rep_get8 = i_ddi_vaddr_rep_get8;
44600d0963fSdilpreet 			hp->ahi_rep_put8 = i_ddi_vaddr_rep_put8;
44700d0963fSdilpreet 
44800d0963fSdilpreet 			/*
44900d0963fSdilpreet 			 * check for BIG endian access
45000d0963fSdilpreet 			 */
45100d0963fSdilpreet 			if (handlep->ah_acc.devacc_attr_endian_flags ==
452837c1ac4SStephen Hanson 			    DDI_STRUCTURE_BE_ACC) {
45300d0963fSdilpreet 
45400d0963fSdilpreet 				hp->ahi_get16 = i_ddi_vaddr_swap_get16;
45500d0963fSdilpreet 				hp->ahi_get32 = i_ddi_vaddr_swap_get32;
45600d0963fSdilpreet 				hp->ahi_get64 = i_ddi_vaddr_swap_get64;
45700d0963fSdilpreet 				hp->ahi_put16 = i_ddi_vaddr_swap_put16;
45800d0963fSdilpreet 				hp->ahi_put32 = i_ddi_vaddr_swap_put32;
45900d0963fSdilpreet 				hp->ahi_put64 = i_ddi_vaddr_swap_put64;
46000d0963fSdilpreet 				hp->ahi_rep_get16 = i_ddi_vaddr_swap_rep_get16;
46100d0963fSdilpreet 				hp->ahi_rep_get32 = i_ddi_vaddr_swap_rep_get32;
46200d0963fSdilpreet 				hp->ahi_rep_get64 = i_ddi_vaddr_swap_rep_get64;
46300d0963fSdilpreet 				hp->ahi_rep_put16 = i_ddi_vaddr_swap_rep_put16;
46400d0963fSdilpreet 				hp->ahi_rep_put32 = i_ddi_vaddr_swap_rep_put32;
46500d0963fSdilpreet 				hp->ahi_rep_put64 = i_ddi_vaddr_swap_rep_put64;
46600d0963fSdilpreet 			} else {
46700d0963fSdilpreet 				hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
46800d0963fSdilpreet 				hp->ahi_get16 = i_ddi_vaddr_get16;
46900d0963fSdilpreet 				hp->ahi_get32 = i_ddi_vaddr_get32;
47000d0963fSdilpreet 				hp->ahi_get64 = i_ddi_vaddr_get64;
47100d0963fSdilpreet 				hp->ahi_put16 = i_ddi_vaddr_put16;
47200d0963fSdilpreet 				hp->ahi_put32 = i_ddi_vaddr_put32;
47300d0963fSdilpreet 				hp->ahi_put64 = i_ddi_vaddr_put64;
47400d0963fSdilpreet 				hp->ahi_rep_get16 = i_ddi_vaddr_rep_get16;
47500d0963fSdilpreet 				hp->ahi_rep_get32 = i_ddi_vaddr_rep_get32;
47600d0963fSdilpreet 				hp->ahi_rep_get64 = i_ddi_vaddr_rep_get64;
47700d0963fSdilpreet 				hp->ahi_rep_put16 = i_ddi_vaddr_rep_put16;
47800d0963fSdilpreet 				hp->ahi_rep_put32 = i_ddi_vaddr_rep_put32;
47900d0963fSdilpreet 				hp->ahi_rep_put64 = i_ddi_vaddr_rep_put64;
48000d0963fSdilpreet 			}
4817c478bd9Sstevel@tonic-gate 		}
48200d0963fSdilpreet 		break;
4837c478bd9Sstevel@tonic-gate 	}
4847c478bd9Sstevel@tonic-gate 	hp->ahi_fault_check = i_ddi_acc_fault_check;
4857c478bd9Sstevel@tonic-gate 	hp->ahi_fault_notify = i_ddi_acc_fault_notify;
4867c478bd9Sstevel@tonic-gate 	hp->ahi_fault = 0;
4877c478bd9Sstevel@tonic-gate 	impl_acc_err_init(handlep);
4887c478bd9Sstevel@tonic-gate }
4897c478bd9Sstevel@tonic-gate 
4907c478bd9Sstevel@tonic-gate /*
4917c478bd9Sstevel@tonic-gate  * The followings are low-level routines for data access.
4927c478bd9Sstevel@tonic-gate  *
4937c478bd9Sstevel@tonic-gate  * All of these routines should be implemented in assembly. Those
4947c478bd9Sstevel@tonic-gate  * that have been rewritten be found in ~ml/ddi_i86_asm.s
4957c478bd9Sstevel@tonic-gate  */
4967c478bd9Sstevel@tonic-gate 
4977c478bd9Sstevel@tonic-gate /*ARGSUSED*/
4987c478bd9Sstevel@tonic-gate uint16_t
i_ddi_vaddr_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)4997c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
5007c478bd9Sstevel@tonic-gate {
5017c478bd9Sstevel@tonic-gate 	return (ddi_swap16(*addr));
5027c478bd9Sstevel@tonic-gate }
5037c478bd9Sstevel@tonic-gate 
5047c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5057c478bd9Sstevel@tonic-gate uint16_t
i_ddi_io_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)5067c478bd9Sstevel@tonic-gate i_ddi_io_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
5077c478bd9Sstevel@tonic-gate {
5087c478bd9Sstevel@tonic-gate 	return (ddi_swap16(inw((uintptr_t)addr)));
5097c478bd9Sstevel@tonic-gate }
5107c478bd9Sstevel@tonic-gate 
5117c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5127c478bd9Sstevel@tonic-gate uint32_t
i_ddi_vaddr_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)5137c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
5147c478bd9Sstevel@tonic-gate {
5157c478bd9Sstevel@tonic-gate 	return (ddi_swap32(*addr));
5167c478bd9Sstevel@tonic-gate }
5177c478bd9Sstevel@tonic-gate 
5187c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5197c478bd9Sstevel@tonic-gate uint32_t
i_ddi_io_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)5207c478bd9Sstevel@tonic-gate i_ddi_io_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
5217c478bd9Sstevel@tonic-gate {
5227c478bd9Sstevel@tonic-gate 	return (ddi_swap32(inl((uintptr_t)addr)));
5237c478bd9Sstevel@tonic-gate }
5247c478bd9Sstevel@tonic-gate 
5257c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5267c478bd9Sstevel@tonic-gate uint64_t
i_ddi_vaddr_swap_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)5277c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
5287c478bd9Sstevel@tonic-gate {
5297c478bd9Sstevel@tonic-gate 	return (ddi_swap64(*addr));
5307c478bd9Sstevel@tonic-gate }
5317c478bd9Sstevel@tonic-gate 
5327c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5337c478bd9Sstevel@tonic-gate void
i_ddi_vaddr_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)5347c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
5357c478bd9Sstevel@tonic-gate {
5367c478bd9Sstevel@tonic-gate 	*addr = ddi_swap16(value);
5377c478bd9Sstevel@tonic-gate }
5387c478bd9Sstevel@tonic-gate 
5397c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5407c478bd9Sstevel@tonic-gate void
i_ddi_io_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)5417c478bd9Sstevel@tonic-gate i_ddi_io_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
5427c478bd9Sstevel@tonic-gate {
5437c478bd9Sstevel@tonic-gate 	outw((uintptr_t)addr, ddi_swap16(value));
5447c478bd9Sstevel@tonic-gate }
5457c478bd9Sstevel@tonic-gate 
5467c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5477c478bd9Sstevel@tonic-gate void
i_ddi_vaddr_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)5487c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
5497c478bd9Sstevel@tonic-gate {
5507c478bd9Sstevel@tonic-gate 	*addr = ddi_swap32(value);
5517c478bd9Sstevel@tonic-gate }
5527c478bd9Sstevel@tonic-gate 
5537c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5547c478bd9Sstevel@tonic-gate void
i_ddi_io_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)5557c478bd9Sstevel@tonic-gate i_ddi_io_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
5567c478bd9Sstevel@tonic-gate {
5577c478bd9Sstevel@tonic-gate 	outl((uintptr_t)addr, ddi_swap32(value));
5587c478bd9Sstevel@tonic-gate }
5597c478bd9Sstevel@tonic-gate 
5607c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5617c478bd9Sstevel@tonic-gate void
i_ddi_vaddr_swap_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)5627c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_put64(ddi_acc_impl_t *hdlp, uint64_t *addr, uint64_t value)
5637c478bd9Sstevel@tonic-gate {
5647c478bd9Sstevel@tonic-gate 	*addr = ddi_swap64(value);
5657c478bd9Sstevel@tonic-gate }
5667c478bd9Sstevel@tonic-gate 
5677c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5687c478bd9Sstevel@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)5697c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
57086ef0a63SRichard Lowe     uint8_t *dev_addr, size_t repcount, uint_t flags)
5717c478bd9Sstevel@tonic-gate {
5727c478bd9Sstevel@tonic-gate 	uint8_t	*h, *d;
5737c478bd9Sstevel@tonic-gate 
5747c478bd9Sstevel@tonic-gate 	h = host_addr;
5757c478bd9Sstevel@tonic-gate 	d = dev_addr;
5767c478bd9Sstevel@tonic-gate 
5777c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
5787c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
5797c478bd9Sstevel@tonic-gate 			*h++ = *d++;
5807c478bd9Sstevel@tonic-gate 	else
5817c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
5827c478bd9Sstevel@tonic-gate 			*h++ = *d;
5837c478bd9Sstevel@tonic-gate }
5847c478bd9Sstevel@tonic-gate 
5857c478bd9Sstevel@tonic-gate /*ARGSUSED*/
5867c478bd9Sstevel@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)5877c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
58886ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
5897c478bd9Sstevel@tonic-gate {
5907c478bd9Sstevel@tonic-gate 	uint16_t *h, *d;
5917c478bd9Sstevel@tonic-gate 
5927c478bd9Sstevel@tonic-gate 	h = host_addr;
5937c478bd9Sstevel@tonic-gate 	d = dev_addr;
5947c478bd9Sstevel@tonic-gate 
5957c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
5967c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
5977c478bd9Sstevel@tonic-gate 			*h++ = *d++;
5987c478bd9Sstevel@tonic-gate 	else
5997c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6007c478bd9Sstevel@tonic-gate 			*h++ = *d;
6017c478bd9Sstevel@tonic-gate }
6027c478bd9Sstevel@tonic-gate 
6037c478bd9Sstevel@tonic-gate /*ARGSUSED*/
6047c478bd9Sstevel@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)6057c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
60686ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
6077c478bd9Sstevel@tonic-gate {
6087c478bd9Sstevel@tonic-gate 	uint16_t *h, *d;
6097c478bd9Sstevel@tonic-gate 
6107c478bd9Sstevel@tonic-gate 	h = host_addr;
6117c478bd9Sstevel@tonic-gate 	d = dev_addr;
6127c478bd9Sstevel@tonic-gate 
6137c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6147c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6157c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap16(*d++);
6167c478bd9Sstevel@tonic-gate 	else
6177c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6187c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap16(*d);
6197c478bd9Sstevel@tonic-gate }
6207c478bd9Sstevel@tonic-gate 
6217c478bd9Sstevel@tonic-gate /*ARGSUSED*/
6227c478bd9Sstevel@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)6237c478bd9Sstevel@tonic-gate i_ddi_io_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
62486ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
6257c478bd9Sstevel@tonic-gate {
6267c478bd9Sstevel@tonic-gate 	uint16_t *h;
6277c478bd9Sstevel@tonic-gate 	uintptr_t port;
6287c478bd9Sstevel@tonic-gate 
6297c478bd9Sstevel@tonic-gate 	h = host_addr;
6307c478bd9Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
6317c478bd9Sstevel@tonic-gate 
6327c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6337c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--, port += 2)
6347c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap16(inw(port));
6357c478bd9Sstevel@tonic-gate 	else
6367c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6377c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap16(inw(port));
6387c478bd9Sstevel@tonic-gate }
6397c478bd9Sstevel@tonic-gate 
6407c478bd9Sstevel@tonic-gate /*ARGSUSED*/
6417c478bd9Sstevel@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)6427c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
64386ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
6447c478bd9Sstevel@tonic-gate {
6457c478bd9Sstevel@tonic-gate 	uint32_t *h, *d;
6467c478bd9Sstevel@tonic-gate 
6477c478bd9Sstevel@tonic-gate 	h = host_addr;
6487c478bd9Sstevel@tonic-gate 	d = dev_addr;
6497c478bd9Sstevel@tonic-gate 
6507c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6517c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6527c478bd9Sstevel@tonic-gate 			*h++ = *d++;
6537c478bd9Sstevel@tonic-gate 	else
6547c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6557c478bd9Sstevel@tonic-gate 			*h++ = *d;
6567c478bd9Sstevel@tonic-gate }
6577c478bd9Sstevel@tonic-gate 
6587c478bd9Sstevel@tonic-gate /*ARGSUSED*/
6597c478bd9Sstevel@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)6607c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
66186ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
6627c478bd9Sstevel@tonic-gate {
6637c478bd9Sstevel@tonic-gate 	uint32_t *h, *d;
6647c478bd9Sstevel@tonic-gate 
6657c478bd9Sstevel@tonic-gate 	h = host_addr;
6667c478bd9Sstevel@tonic-gate 	d = dev_addr;
6677c478bd9Sstevel@tonic-gate 
6687c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6697c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6707c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap32(*d++);
6717c478bd9Sstevel@tonic-gate 	else
6727c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6737c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap32(*d);
6747c478bd9Sstevel@tonic-gate }
6757c478bd9Sstevel@tonic-gate 
6767c478bd9Sstevel@tonic-gate /*ARGSUSED*/
6777c478bd9Sstevel@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)6787c478bd9Sstevel@tonic-gate i_ddi_io_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
67986ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
6807c478bd9Sstevel@tonic-gate {
6817c478bd9Sstevel@tonic-gate 	uint32_t *h;
6827c478bd9Sstevel@tonic-gate 	uintptr_t port;
6837c478bd9Sstevel@tonic-gate 
6847c478bd9Sstevel@tonic-gate 	h = host_addr;
6857c478bd9Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
6867c478bd9Sstevel@tonic-gate 
6877c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
6887c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--, port += 4)
6897c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap32(inl(port));
6907c478bd9Sstevel@tonic-gate 	else
6917c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
6927c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap32(inl(port));
6937c478bd9Sstevel@tonic-gate }
6947c478bd9Sstevel@tonic-gate 
6957c478bd9Sstevel@tonic-gate /*ARGSUSED*/
6967c478bd9Sstevel@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)6977c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
69886ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
6997c478bd9Sstevel@tonic-gate {
7007c478bd9Sstevel@tonic-gate 	uint64_t *h, *d;
7017c478bd9Sstevel@tonic-gate 
7027c478bd9Sstevel@tonic-gate 	h = host_addr;
7037c478bd9Sstevel@tonic-gate 	d = dev_addr;
7047c478bd9Sstevel@tonic-gate 
7057c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7067c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7077c478bd9Sstevel@tonic-gate 			*h++ = *d++;
7087c478bd9Sstevel@tonic-gate 	else
7097c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7107c478bd9Sstevel@tonic-gate 			*h++ = *d;
7117c478bd9Sstevel@tonic-gate }
7127c478bd9Sstevel@tonic-gate 
7137c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7147c478bd9Sstevel@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)7157c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
71686ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
7177c478bd9Sstevel@tonic-gate {
7187c478bd9Sstevel@tonic-gate 	uint64_t *h, *d;
7197c478bd9Sstevel@tonic-gate 
7207c478bd9Sstevel@tonic-gate 	h = host_addr;
7217c478bd9Sstevel@tonic-gate 	d = dev_addr;
7227c478bd9Sstevel@tonic-gate 
7237c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7247c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7257c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap64(*d++);
7267c478bd9Sstevel@tonic-gate 	else
7277c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7287c478bd9Sstevel@tonic-gate 			*h++ = ddi_swap64(*d);
7297c478bd9Sstevel@tonic-gate }
7307c478bd9Sstevel@tonic-gate 
7317c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7327c478bd9Sstevel@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)7337c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
73486ef0a63SRichard Lowe     uint8_t *dev_addr, size_t repcount, uint_t flags)
7357c478bd9Sstevel@tonic-gate {
7367c478bd9Sstevel@tonic-gate 	uint8_t	*h, *d;
7377c478bd9Sstevel@tonic-gate 
7387c478bd9Sstevel@tonic-gate 	h = host_addr;
7397c478bd9Sstevel@tonic-gate 	d = dev_addr;
7407c478bd9Sstevel@tonic-gate 
7417c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7427c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7437c478bd9Sstevel@tonic-gate 			*d++ = *h++;
7447c478bd9Sstevel@tonic-gate 	else
7457c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7467c478bd9Sstevel@tonic-gate 			*d = *h++;
7477c478bd9Sstevel@tonic-gate }
7487c478bd9Sstevel@tonic-gate 
7497c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7507c478bd9Sstevel@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)7517c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
75286ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
7537c478bd9Sstevel@tonic-gate {
7547c478bd9Sstevel@tonic-gate 	uint16_t *h, *d;
7557c478bd9Sstevel@tonic-gate 
7567c478bd9Sstevel@tonic-gate 	h = host_addr;
7577c478bd9Sstevel@tonic-gate 	d = dev_addr;
7587c478bd9Sstevel@tonic-gate 
7597c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7607c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7617c478bd9Sstevel@tonic-gate 			*d++ = *h++;
7627c478bd9Sstevel@tonic-gate 	else
7637c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7647c478bd9Sstevel@tonic-gate 			*d = *h++;
7657c478bd9Sstevel@tonic-gate }
7667c478bd9Sstevel@tonic-gate 
7677c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7687c478bd9Sstevel@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)7697c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
77086ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
7717c478bd9Sstevel@tonic-gate {
7727c478bd9Sstevel@tonic-gate 	uint16_t *h, *d;
7737c478bd9Sstevel@tonic-gate 
7747c478bd9Sstevel@tonic-gate 	h = host_addr;
7757c478bd9Sstevel@tonic-gate 	d = dev_addr;
7767c478bd9Sstevel@tonic-gate 
7777c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7787c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7797c478bd9Sstevel@tonic-gate 			*d++ = ddi_swap16(*h++);
7807c478bd9Sstevel@tonic-gate 	else
7817c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
7827c478bd9Sstevel@tonic-gate 			*d = ddi_swap16(*h++);
7837c478bd9Sstevel@tonic-gate }
7847c478bd9Sstevel@tonic-gate 
7857c478bd9Sstevel@tonic-gate /*ARGSUSED*/
7867c478bd9Sstevel@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)7877c478bd9Sstevel@tonic-gate i_ddi_io_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
78886ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
7897c478bd9Sstevel@tonic-gate {
7907c478bd9Sstevel@tonic-gate 	uint16_t *h;
7917c478bd9Sstevel@tonic-gate 	uintptr_t port;
7927c478bd9Sstevel@tonic-gate 
7937c478bd9Sstevel@tonic-gate 	h = host_addr;
7947c478bd9Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
7957c478bd9Sstevel@tonic-gate 
7967c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
7977c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--, port += 2)
7987c478bd9Sstevel@tonic-gate 			outw(port, ddi_swap16(*h++));
7997c478bd9Sstevel@tonic-gate 	else
8007c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8017c478bd9Sstevel@tonic-gate 			outw(port, ddi_swap16(*h++));
8027c478bd9Sstevel@tonic-gate }
8037c478bd9Sstevel@tonic-gate 
8047c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8057c478bd9Sstevel@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)8067c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
80786ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
8087c478bd9Sstevel@tonic-gate {
8097c478bd9Sstevel@tonic-gate 	uint32_t *h, *d;
8107c478bd9Sstevel@tonic-gate 
8117c478bd9Sstevel@tonic-gate 	h = host_addr;
8127c478bd9Sstevel@tonic-gate 	d = dev_addr;
8137c478bd9Sstevel@tonic-gate 
8147c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8157c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8167c478bd9Sstevel@tonic-gate 			*d++ = *h++;
8177c478bd9Sstevel@tonic-gate 	else
8187c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8197c478bd9Sstevel@tonic-gate 			*d = *h++;
8207c478bd9Sstevel@tonic-gate }
8217c478bd9Sstevel@tonic-gate 
8227c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8237c478bd9Sstevel@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)8247c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
82586ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
8267c478bd9Sstevel@tonic-gate {
8277c478bd9Sstevel@tonic-gate 	uint32_t *h, *d;
8287c478bd9Sstevel@tonic-gate 
8297c478bd9Sstevel@tonic-gate 	h = host_addr;
8307c478bd9Sstevel@tonic-gate 	d = dev_addr;
8317c478bd9Sstevel@tonic-gate 
8327c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8337c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8347c478bd9Sstevel@tonic-gate 			*d++ = ddi_swap32(*h++);
8357c478bd9Sstevel@tonic-gate 	else
8367c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8377c478bd9Sstevel@tonic-gate 			*d = ddi_swap32(*h++);
8387c478bd9Sstevel@tonic-gate }
8397c478bd9Sstevel@tonic-gate 
8407c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8417c478bd9Sstevel@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)8427c478bd9Sstevel@tonic-gate i_ddi_io_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
84386ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
8447c478bd9Sstevel@tonic-gate {
8457c478bd9Sstevel@tonic-gate 	uint32_t *h;
8467c478bd9Sstevel@tonic-gate 	uintptr_t port;
8477c478bd9Sstevel@tonic-gate 
8487c478bd9Sstevel@tonic-gate 	h = host_addr;
8497c478bd9Sstevel@tonic-gate 	port = (uintptr_t)dev_addr;
8507c478bd9Sstevel@tonic-gate 
8517c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8527c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--, port += 4)
8537c478bd9Sstevel@tonic-gate 			outl(port, ddi_swap32(*h++));
8547c478bd9Sstevel@tonic-gate 	else
8557c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8567c478bd9Sstevel@tonic-gate 			outl(port, ddi_swap32(*h++));
8577c478bd9Sstevel@tonic-gate }
8587c478bd9Sstevel@tonic-gate 
8597c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8607c478bd9Sstevel@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)8617c478bd9Sstevel@tonic-gate i_ddi_vaddr_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
86286ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
8637c478bd9Sstevel@tonic-gate {
8647c478bd9Sstevel@tonic-gate 	uint64_t *h, *d;
8657c478bd9Sstevel@tonic-gate 
8667c478bd9Sstevel@tonic-gate 	h = host_addr;
8677c478bd9Sstevel@tonic-gate 	d = dev_addr;
8687c478bd9Sstevel@tonic-gate 
8697c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8707c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8717c478bd9Sstevel@tonic-gate 			*d++ = *h++;
8727c478bd9Sstevel@tonic-gate 	else
8737c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8747c478bd9Sstevel@tonic-gate 			*d = *h++;
8757c478bd9Sstevel@tonic-gate }
8767c478bd9Sstevel@tonic-gate 
8777c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8787c478bd9Sstevel@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)8797c478bd9Sstevel@tonic-gate i_ddi_vaddr_swap_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
88086ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
8817c478bd9Sstevel@tonic-gate {
8827c478bd9Sstevel@tonic-gate 	uint64_t *h, *d;
8837c478bd9Sstevel@tonic-gate 
8847c478bd9Sstevel@tonic-gate 	h = host_addr;
8857c478bd9Sstevel@tonic-gate 	d = dev_addr;
8867c478bd9Sstevel@tonic-gate 
8877c478bd9Sstevel@tonic-gate 	if (flags == DDI_DEV_AUTOINCR)
8887c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8897c478bd9Sstevel@tonic-gate 			*d++ = ddi_swap64(*h++);
8907c478bd9Sstevel@tonic-gate 	else
8917c478bd9Sstevel@tonic-gate 		for (; repcount; repcount--)
8927c478bd9Sstevel@tonic-gate 			*d = ddi_swap64(*h++);
8937c478bd9Sstevel@tonic-gate }
8947c478bd9Sstevel@tonic-gate 
8957c478bd9Sstevel@tonic-gate /*ARGSUSED*/
8967c478bd9Sstevel@tonic-gate uint64_t
i_ddi_io_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)8977c478bd9Sstevel@tonic-gate i_ddi_io_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
8987c478bd9Sstevel@tonic-gate {
8997c478bd9Sstevel@tonic-gate 	panic("ddi_get64 from i/o space");
9007c478bd9Sstevel@tonic-gate 	/*NOTREACHED*/
9017c478bd9Sstevel@tonic-gate 	return (0);
9027c478bd9Sstevel@tonic-gate }
9037c478bd9Sstevel@tonic-gate 
9047c478bd9Sstevel@tonic-gate /*ARGSUSED*/
9057c478bd9Sstevel@tonic-gate void
i_ddi_io_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t value)9067c478bd9Sstevel@tonic-gate i_ddi_io_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr, uint64_t value)
9077c478bd9Sstevel@tonic-gate {
9087c478bd9Sstevel@tonic-gate 	panic("ddi_put64 to i/o space");
9097c478bd9Sstevel@tonic-gate 	/*NOTREACHED*/
9107c478bd9Sstevel@tonic-gate }
9117c478bd9Sstevel@tonic-gate 
912837c1ac4SStephen Hanson void
do_scan(ddi_acc_impl_t * hdlp)913837c1ac4SStephen Hanson do_scan(ddi_acc_impl_t *hdlp)
914837c1ac4SStephen Hanson {
915837c1ac4SStephen Hanson 	ddi_fm_error_t de;
916837c1ac4SStephen Hanson 	ndi_err_t *errp = (ndi_err_t *)hdlp->ahi_err;
917837c1ac4SStephen Hanson 
918837c1ac4SStephen Hanson 	bzero(&de, sizeof (ddi_fm_error_t));
919837c1ac4SStephen Hanson 	de.fme_version = DDI_FME_VERSION;
920837c1ac4SStephen Hanson 	de.fme_ena = fm_ena_generate(0, FM_ENA_FMT1);
921837c1ac4SStephen Hanson 	de.fme_flag = DDI_FM_ERR_UNEXPECTED;
922837c1ac4SStephen Hanson 
923837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_err_mutexp);
924837c1ac4SStephen Hanson 	hdlp->ahi_scan(hdlp->ahi_scan_dip, &de);
925837c1ac4SStephen Hanson 	if (de.fme_status != DDI_FM_OK) {
926837c1ac4SStephen Hanson 		errp->err_ena = de.fme_ena;
927837c1ac4SStephen Hanson 		errp->err_expected = de.fme_flag;
928837c1ac4SStephen Hanson 		errp->err_status = DDI_FM_NONFATAL;
929837c1ac4SStephen Hanson 	}
930837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_err_mutexp);
931837c1ac4SStephen Hanson }
932837c1ac4SStephen Hanson 
933837c1ac4SStephen Hanson /*ARGSUSED*/
934837c1ac4SStephen Hanson uint8_t
i_ddi_prot_vaddr_get8(ddi_acc_impl_t * hdlp,uint8_t * addr)935837c1ac4SStephen Hanson i_ddi_prot_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
936837c1ac4SStephen Hanson {
937837c1ac4SStephen Hanson 	uint8_t val;
938837c1ac4SStephen Hanson 
939837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
940837c1ac4SStephen Hanson 	val = *addr;
941837c1ac4SStephen Hanson 	if (val == 0xff)
942837c1ac4SStephen Hanson 		do_scan(hdlp);
943837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
944837c1ac4SStephen Hanson 
945837c1ac4SStephen Hanson 	return (val);
946837c1ac4SStephen Hanson }
947837c1ac4SStephen Hanson 
948837c1ac4SStephen Hanson /*ARGSUSED*/
949837c1ac4SStephen Hanson uint16_t
i_ddi_prot_vaddr_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)950837c1ac4SStephen Hanson i_ddi_prot_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
951837c1ac4SStephen Hanson {
952837c1ac4SStephen Hanson 	uint16_t val;
953837c1ac4SStephen Hanson 
954837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
955837c1ac4SStephen Hanson 	val = *addr;
956837c1ac4SStephen Hanson 	if (val == 0xffff)
957837c1ac4SStephen Hanson 		do_scan(hdlp);
958837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
959837c1ac4SStephen Hanson 
960837c1ac4SStephen Hanson 	return (val);
961837c1ac4SStephen Hanson }
962837c1ac4SStephen Hanson 
963837c1ac4SStephen Hanson /*ARGSUSED*/
964837c1ac4SStephen Hanson uint32_t
i_ddi_prot_vaddr_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)965837c1ac4SStephen Hanson i_ddi_prot_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
966837c1ac4SStephen Hanson {
967837c1ac4SStephen Hanson 	uint32_t val;
968837c1ac4SStephen Hanson 
969837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
970837c1ac4SStephen Hanson 	val = *addr;
971837c1ac4SStephen Hanson 	if (val == 0xffffffff)
972837c1ac4SStephen Hanson 		do_scan(hdlp);
973837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
974837c1ac4SStephen Hanson 
975837c1ac4SStephen Hanson 	return (val);
976837c1ac4SStephen Hanson }
977837c1ac4SStephen Hanson 
978837c1ac4SStephen Hanson /*ARGSUSED*/
979837c1ac4SStephen Hanson uint64_t
i_ddi_prot_vaddr_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)980837c1ac4SStephen Hanson i_ddi_prot_vaddr_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
981837c1ac4SStephen Hanson {
982837c1ac4SStephen Hanson 	uint64_t val;
983837c1ac4SStephen Hanson 
984837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
985837c1ac4SStephen Hanson 	val = *addr;
986837c1ac4SStephen Hanson 	if (val == 0xffffffffffffffff)
987837c1ac4SStephen Hanson 		do_scan(hdlp);
988837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
989837c1ac4SStephen Hanson 
990837c1ac4SStephen Hanson 	return (val);
991837c1ac4SStephen Hanson }
992837c1ac4SStephen Hanson 
993837c1ac4SStephen Hanson /*ARGSUSED*/
994837c1ac4SStephen Hanson uint8_t
i_ddi_prot_io_get8(ddi_acc_impl_t * hdlp,uint8_t * addr)995837c1ac4SStephen Hanson i_ddi_prot_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
996837c1ac4SStephen Hanson {
997837c1ac4SStephen Hanson 	uint8_t val;
998837c1ac4SStephen Hanson 
999837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1000837c1ac4SStephen Hanson 	val = inb((uintptr_t)addr);
1001837c1ac4SStephen Hanson 	if (val == 0xff)
1002837c1ac4SStephen Hanson 		do_scan(hdlp);
1003837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1004837c1ac4SStephen Hanson 
1005837c1ac4SStephen Hanson 	return (val);
1006837c1ac4SStephen Hanson }
1007837c1ac4SStephen Hanson 
1008837c1ac4SStephen Hanson /*ARGSUSED*/
1009837c1ac4SStephen Hanson uint16_t
i_ddi_prot_io_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1010837c1ac4SStephen Hanson i_ddi_prot_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1011837c1ac4SStephen Hanson {
1012837c1ac4SStephen Hanson 	uint16_t val;
1013837c1ac4SStephen Hanson 
1014837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1015837c1ac4SStephen Hanson 	val = inw((uintptr_t)addr);
1016837c1ac4SStephen Hanson 	if (val == 0xffff)
1017837c1ac4SStephen Hanson 		do_scan(hdlp);
1018837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1019837c1ac4SStephen Hanson 
1020837c1ac4SStephen Hanson 	return (val);
1021837c1ac4SStephen Hanson }
1022837c1ac4SStephen Hanson 
1023837c1ac4SStephen Hanson /*ARGSUSED*/
1024837c1ac4SStephen Hanson uint32_t
i_ddi_prot_io_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1025837c1ac4SStephen Hanson i_ddi_prot_io_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1026837c1ac4SStephen Hanson {
1027837c1ac4SStephen Hanson 	uint32_t val;
1028837c1ac4SStephen Hanson 
1029837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1030837c1ac4SStephen Hanson 	val = inl((uintptr_t)addr);
1031837c1ac4SStephen Hanson 	if (val == 0xffffffff)
1032837c1ac4SStephen Hanson 		do_scan(hdlp);
1033837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1034837c1ac4SStephen Hanson 
1035837c1ac4SStephen Hanson 	return (val);
1036837c1ac4SStephen Hanson }
1037837c1ac4SStephen Hanson 
1038837c1ac4SStephen Hanson /*ARGSUSED*/
1039837c1ac4SStephen Hanson uint16_t
i_ddi_prot_vaddr_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1040837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1041837c1ac4SStephen Hanson {
1042837c1ac4SStephen Hanson 	uint16_t val;
1043837c1ac4SStephen Hanson 
1044837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1045837c1ac4SStephen Hanson 	val = ddi_swap16(*addr);
1046837c1ac4SStephen Hanson 	if (val == 0xffff)
1047837c1ac4SStephen Hanson 		do_scan(hdlp);
1048837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1049837c1ac4SStephen Hanson 
1050837c1ac4SStephen Hanson 	return (val);
1051837c1ac4SStephen Hanson }
1052837c1ac4SStephen Hanson 
1053837c1ac4SStephen Hanson /*ARGSUSED*/
1054837c1ac4SStephen Hanson uint16_t
i_ddi_prot_io_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1055837c1ac4SStephen Hanson i_ddi_prot_io_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1056837c1ac4SStephen Hanson {
1057837c1ac4SStephen Hanson 	uint16_t val;
1058837c1ac4SStephen Hanson 
1059837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1060837c1ac4SStephen Hanson 	val = ddi_swap16(inw((uintptr_t)addr));
1061837c1ac4SStephen Hanson 	if (val == 0xffff)
1062837c1ac4SStephen Hanson 		do_scan(hdlp);
1063837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1064837c1ac4SStephen Hanson 
1065837c1ac4SStephen Hanson 	return (val);
1066837c1ac4SStephen Hanson }
1067837c1ac4SStephen Hanson 
1068837c1ac4SStephen Hanson /*ARGSUSED*/
1069837c1ac4SStephen Hanson uint32_t
i_ddi_prot_vaddr_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1070837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1071837c1ac4SStephen Hanson {
1072837c1ac4SStephen Hanson 	uint32_t val;
1073837c1ac4SStephen Hanson 
1074837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1075837c1ac4SStephen Hanson 	val = ddi_swap32(*addr);
1076837c1ac4SStephen Hanson 	if (val == 0xffffffff)
1077837c1ac4SStephen Hanson 		do_scan(hdlp);
1078837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1079837c1ac4SStephen Hanson 
1080837c1ac4SStephen Hanson 	return (val);
1081837c1ac4SStephen Hanson }
1082837c1ac4SStephen Hanson 
1083837c1ac4SStephen Hanson /*ARGSUSED*/
1084837c1ac4SStephen Hanson uint32_t
i_ddi_prot_io_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1085837c1ac4SStephen Hanson i_ddi_prot_io_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1086837c1ac4SStephen Hanson {
1087837c1ac4SStephen Hanson 	uint32_t val;
1088837c1ac4SStephen Hanson 
1089837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1090837c1ac4SStephen Hanson 	val = ddi_swap32(inl((uintptr_t)addr));
1091837c1ac4SStephen Hanson 	if (val == 0xffffffff)
1092837c1ac4SStephen Hanson 		do_scan(hdlp);
1093837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1094837c1ac4SStephen Hanson 
1095837c1ac4SStephen Hanson 	return (val);
1096837c1ac4SStephen Hanson }
1097837c1ac4SStephen Hanson 
1098837c1ac4SStephen Hanson /*ARGSUSED*/
1099837c1ac4SStephen Hanson uint64_t
i_ddi_prot_vaddr_swap_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)1100837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
1101837c1ac4SStephen Hanson {
1102837c1ac4SStephen Hanson 	uint64_t val;
1103837c1ac4SStephen Hanson 
1104837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1105837c1ac4SStephen Hanson 	val = ddi_swap64(*addr);
1106837c1ac4SStephen Hanson 	if (val == 0xffffffffffffffff)
1107837c1ac4SStephen Hanson 		do_scan(hdlp);
1108837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1109837c1ac4SStephen Hanson 
1110837c1ac4SStephen Hanson 	return (val);
1111837c1ac4SStephen Hanson }
1112837c1ac4SStephen Hanson 
1113837c1ac4SStephen Hanson /*ARGSUSED*/
1114837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_put8(ddi_acc_impl_t * hdlp,uint8_t * addr,uint8_t value)1115837c1ac4SStephen Hanson i_ddi_prot_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1116837c1ac4SStephen Hanson {
1117837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1118837c1ac4SStephen Hanson 	*addr = value;
1119837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1120837c1ac4SStephen Hanson }
1121837c1ac4SStephen Hanson 
1122837c1ac4SStephen Hanson /*ARGSUSED*/
1123837c1ac4SStephen Hanson void
i_ddi_prot_io_put8(ddi_acc_impl_t * hdlp,uint8_t * addr,uint8_t value)1124837c1ac4SStephen Hanson i_ddi_prot_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1125837c1ac4SStephen Hanson {
1126837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1127837c1ac4SStephen Hanson 	outb((uintptr_t)addr, value);
1128837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1129837c1ac4SStephen Hanson }
1130837c1ac4SStephen Hanson 
1131837c1ac4SStephen Hanson /*ARGSUSED*/
1132837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1133837c1ac4SStephen Hanson i_ddi_prot_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1134837c1ac4SStephen Hanson {
1135837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1136837c1ac4SStephen Hanson 	*addr = value;
1137837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1138837c1ac4SStephen Hanson }
1139837c1ac4SStephen Hanson 
1140837c1ac4SStephen Hanson /*ARGSUSED*/
1141837c1ac4SStephen Hanson void
i_ddi_prot_io_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1142837c1ac4SStephen Hanson i_ddi_prot_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1143837c1ac4SStephen Hanson {
1144837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1145837c1ac4SStephen Hanson 	outw((uintptr_t)addr, value);
1146837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1147837c1ac4SStephen Hanson }
1148837c1ac4SStephen Hanson 
1149837c1ac4SStephen Hanson /*ARGSUSED*/
1150837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1151837c1ac4SStephen Hanson i_ddi_prot_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr,
1152837c1ac4SStephen Hanson     uint32_t value)
1153837c1ac4SStephen Hanson {
1154837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1155837c1ac4SStephen Hanson 	*addr = value;
1156837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1157837c1ac4SStephen Hanson }
1158837c1ac4SStephen Hanson 
1159837c1ac4SStephen Hanson /*ARGSUSED*/
1160837c1ac4SStephen Hanson void
i_ddi_prot_io_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1161837c1ac4SStephen Hanson i_ddi_prot_io_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1162837c1ac4SStephen Hanson {
1163837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1164837c1ac4SStephen Hanson 	outl((uintptr_t)addr, value);
1165837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1166837c1ac4SStephen Hanson }
1167837c1ac4SStephen Hanson 
1168837c1ac4SStephen Hanson /*ARGSUSED*/
1169837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)1170837c1ac4SStephen Hanson i_ddi_prot_vaddr_put64(ddi_acc_impl_t *hdlp, uint64_t *addr,
1171837c1ac4SStephen Hanson     uint64_t value)
1172837c1ac4SStephen Hanson {
1173837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1174837c1ac4SStephen Hanson 	*addr = value;
1175837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1176837c1ac4SStephen Hanson }
1177837c1ac4SStephen Hanson 
1178837c1ac4SStephen Hanson /*ARGSUSED*/
1179837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1180837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr,
1181837c1ac4SStephen Hanson     uint16_t value)
1182837c1ac4SStephen Hanson {
1183837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1184837c1ac4SStephen Hanson 	*addr = ddi_swap16(value);
1185837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1186837c1ac4SStephen Hanson }
1187837c1ac4SStephen Hanson 
1188837c1ac4SStephen Hanson /*ARGSUSED*/
1189837c1ac4SStephen Hanson void
i_ddi_prot_io_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1190837c1ac4SStephen Hanson i_ddi_prot_io_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1191837c1ac4SStephen Hanson {
1192837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1193837c1ac4SStephen Hanson 	outw((uintptr_t)addr, ddi_swap16(value));
1194837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1195837c1ac4SStephen Hanson }
1196837c1ac4SStephen Hanson 
1197837c1ac4SStephen Hanson /*ARGSUSED*/
1198837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1199837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr,
1200837c1ac4SStephen Hanson     uint32_t value)
1201837c1ac4SStephen Hanson {
1202837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1203837c1ac4SStephen Hanson 	*addr = ddi_swap32(value);
1204837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1205837c1ac4SStephen Hanson }
1206837c1ac4SStephen Hanson 
1207837c1ac4SStephen Hanson /*ARGSUSED*/
1208837c1ac4SStephen Hanson void
i_ddi_prot_io_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1209837c1ac4SStephen Hanson i_ddi_prot_io_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1210837c1ac4SStephen Hanson {
1211837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1212837c1ac4SStephen Hanson 	outl((uintptr_t)addr, ddi_swap32(value));
1213837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1214837c1ac4SStephen Hanson }
1215837c1ac4SStephen Hanson 
1216837c1ac4SStephen Hanson /*ARGSUSED*/
1217837c1ac4SStephen Hanson void
i_ddi_prot_vaddr_swap_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)1218837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_put64(ddi_acc_impl_t *hdlp, uint64_t *addr,
1219837c1ac4SStephen Hanson     uint64_t value)
1220837c1ac4SStephen Hanson {
1221837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1222837c1ac4SStephen Hanson 	*addr = ddi_swap64(value);
1223837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1224837c1ac4SStephen Hanson }
1225837c1ac4SStephen Hanson 
1226837c1ac4SStephen Hanson /*ARGSUSED*/
1227837c1ac4SStephen Hanson 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)1228837c1ac4SStephen Hanson i_ddi_prot_io_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
122986ef0a63SRichard Lowe     uint8_t *dev_addr, size_t repcount, uint_t flags)
1230837c1ac4SStephen Hanson {
1231837c1ac4SStephen Hanson 	int fail = 0;
1232837c1ac4SStephen Hanson 	uint8_t	*h;
1233837c1ac4SStephen Hanson 	uintptr_t port;
1234837c1ac4SStephen Hanson 
1235837c1ac4SStephen Hanson 	h = host_addr;
1236837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1237837c1ac4SStephen Hanson 
1238837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1239837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1240837c1ac4SStephen Hanson 		for (; repcount; repcount--, port++)
1241837c1ac4SStephen Hanson 			if ((*h++ = inb(port)) == 0xff)
1242837c1ac4SStephen Hanson 				fail = 1;
1243837c1ac4SStephen Hanson 	} else {
1244837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1245837c1ac4SStephen Hanson 			if ((*h++ = inb(port)) == 0xff)
1246837c1ac4SStephen Hanson 				fail = 1;
1247837c1ac4SStephen Hanson 	}
1248837c1ac4SStephen Hanson 	if (fail == 1)
1249837c1ac4SStephen Hanson 		do_scan(hdlp);
1250837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1251837c1ac4SStephen Hanson }
1252837c1ac4SStephen Hanson 
1253837c1ac4SStephen Hanson /*ARGSUSED*/
1254837c1ac4SStephen Hanson 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)1255837c1ac4SStephen Hanson i_ddi_prot_io_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
125686ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1257837c1ac4SStephen Hanson {
1258837c1ac4SStephen Hanson 	int fail = 0;
1259837c1ac4SStephen Hanson 	uint16_t *h;
1260837c1ac4SStephen Hanson 	uintptr_t port;
1261837c1ac4SStephen Hanson 
1262837c1ac4SStephen Hanson 	h = host_addr;
1263837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1264837c1ac4SStephen Hanson 
1265837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1266837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1267837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 2)
1268837c1ac4SStephen Hanson 			if ((*h++ = inw(port)) == 0xffff)
1269837c1ac4SStephen Hanson 				fail = 1;
1270837c1ac4SStephen Hanson 	} else {
1271837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1272837c1ac4SStephen Hanson 			if ((*h++ = inw(port)) == 0xffff)
1273837c1ac4SStephen Hanson 				fail = 1;
1274837c1ac4SStephen Hanson 	}
1275837c1ac4SStephen Hanson 	if (fail == 1)
1276837c1ac4SStephen Hanson 		do_scan(hdlp);
1277837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1278837c1ac4SStephen Hanson }
1279837c1ac4SStephen Hanson 
1280837c1ac4SStephen Hanson /*ARGSUSED*/
1281837c1ac4SStephen Hanson 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)1282837c1ac4SStephen Hanson i_ddi_prot_io_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
128386ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1284837c1ac4SStephen Hanson {
1285837c1ac4SStephen Hanson 	int fail = 0;
1286837c1ac4SStephen Hanson 	uint32_t *h;
1287837c1ac4SStephen Hanson 	uintptr_t port;
1288837c1ac4SStephen Hanson 
1289837c1ac4SStephen Hanson 	h = host_addr;
1290837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1291837c1ac4SStephen Hanson 
1292837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1293837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1294837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 4)
1295837c1ac4SStephen Hanson 			if ((*h++ = inl(port)) == 0xffffffff)
1296837c1ac4SStephen Hanson 				fail = 1;
1297837c1ac4SStephen Hanson 	} else {
1298837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1299837c1ac4SStephen Hanson 			if ((*h++ = inl(port)) == 0xffffffff)
1300837c1ac4SStephen Hanson 				fail = 1;
1301837c1ac4SStephen Hanson 	}
1302837c1ac4SStephen Hanson 	if (fail == 1)
1303837c1ac4SStephen Hanson 		do_scan(hdlp);
1304837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1305837c1ac4SStephen Hanson }
1306837c1ac4SStephen Hanson 
1307837c1ac4SStephen Hanson /*ARGSUSED*/
1308837c1ac4SStephen Hanson 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)1309837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
131086ef0a63SRichard Lowe     uint8_t *dev_addr, size_t repcount, uint_t flags)
1311837c1ac4SStephen Hanson {
1312837c1ac4SStephen Hanson 	int fail = 0;
1313837c1ac4SStephen Hanson 	uint8_t	*h, *d;
1314837c1ac4SStephen Hanson 
1315837c1ac4SStephen Hanson 	h = host_addr;
1316837c1ac4SStephen Hanson 	d = dev_addr;
1317837c1ac4SStephen Hanson 
1318837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1319837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1320837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1321837c1ac4SStephen Hanson 			if ((*h++ = *d++) == 0xff)
1322837c1ac4SStephen Hanson 				fail = 1;
1323837c1ac4SStephen Hanson 	} else {
1324837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1325837c1ac4SStephen Hanson 			if ((*h++ = *d) == 0xff)
1326837c1ac4SStephen Hanson 				fail = 1;
1327837c1ac4SStephen Hanson 	}
1328837c1ac4SStephen Hanson 	if (fail == 1)
1329837c1ac4SStephen Hanson 		do_scan(hdlp);
1330837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1331837c1ac4SStephen Hanson }
1332837c1ac4SStephen Hanson 
1333837c1ac4SStephen Hanson /*ARGSUSED*/
1334837c1ac4SStephen Hanson 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)1335837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
133686ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1337837c1ac4SStephen Hanson {
1338837c1ac4SStephen Hanson 	int fail = 0;
1339837c1ac4SStephen Hanson 	uint16_t *h, *d;
1340837c1ac4SStephen Hanson 
1341837c1ac4SStephen Hanson 	h = host_addr;
1342837c1ac4SStephen Hanson 	d = dev_addr;
1343837c1ac4SStephen Hanson 
1344837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1345837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1346837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1347837c1ac4SStephen Hanson 			if ((*h++ = *d++) == 0xffff)
1348837c1ac4SStephen Hanson 				fail = 1;
1349837c1ac4SStephen Hanson 	} else {
1350837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1351837c1ac4SStephen Hanson 			if ((*h++ = *d) == 0xffff)
1352837c1ac4SStephen Hanson 				fail = 1;
1353837c1ac4SStephen Hanson 	}
1354837c1ac4SStephen Hanson 	if (fail == 1)
1355837c1ac4SStephen Hanson 		do_scan(hdlp);
1356837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1357837c1ac4SStephen Hanson }
1358837c1ac4SStephen Hanson 
1359837c1ac4SStephen Hanson /*ARGSUSED*/
1360837c1ac4SStephen Hanson 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)1361837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
136286ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1363837c1ac4SStephen Hanson {
1364837c1ac4SStephen Hanson 	int fail = 0;
1365837c1ac4SStephen Hanson 	uint16_t *h, *d;
1366837c1ac4SStephen Hanson 
1367837c1ac4SStephen Hanson 	h = host_addr;
1368837c1ac4SStephen Hanson 	d = dev_addr;
1369837c1ac4SStephen Hanson 
1370837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1371837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1372837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1373837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap16(*d++)) == 0xffff)
1374837c1ac4SStephen Hanson 				fail = 1;
1375837c1ac4SStephen Hanson 	} else {
1376837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1377837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap16(*d)) == 0xffff)
1378837c1ac4SStephen Hanson 				fail = 1;
1379837c1ac4SStephen Hanson 	}
1380837c1ac4SStephen Hanson 	if (fail == 1)
1381837c1ac4SStephen Hanson 		do_scan(hdlp);
1382837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1383837c1ac4SStephen Hanson }
1384837c1ac4SStephen Hanson 
1385837c1ac4SStephen Hanson /*ARGSUSED*/
1386837c1ac4SStephen Hanson 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)1387837c1ac4SStephen Hanson i_ddi_prot_io_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
138886ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1389837c1ac4SStephen Hanson {
1390837c1ac4SStephen Hanson 	int fail = 0;
1391837c1ac4SStephen Hanson 	uint16_t *h;
1392837c1ac4SStephen Hanson 	uintptr_t port;
1393837c1ac4SStephen Hanson 
1394837c1ac4SStephen Hanson 	h = host_addr;
1395837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1396837c1ac4SStephen Hanson 
1397837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1398837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1399837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 2)
1400837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap16(inw(port))) == 0xffff)
1401837c1ac4SStephen Hanson 				fail = 1;
1402837c1ac4SStephen Hanson 	} else {
1403837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1404837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap16(inw(port))) == 0xffff)
1405837c1ac4SStephen Hanson 				fail = 1;
1406837c1ac4SStephen Hanson 	}
1407837c1ac4SStephen Hanson 	if (fail == 1)
1408837c1ac4SStephen Hanson 		do_scan(hdlp);
1409837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1410837c1ac4SStephen Hanson }
1411837c1ac4SStephen Hanson 
1412837c1ac4SStephen Hanson /*ARGSUSED*/
1413837c1ac4SStephen Hanson 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)1414837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
141586ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1416837c1ac4SStephen Hanson {
1417837c1ac4SStephen Hanson 	int fail = 0;
1418837c1ac4SStephen Hanson 	uint32_t *h, *d;
1419837c1ac4SStephen Hanson 
1420837c1ac4SStephen Hanson 	h = host_addr;
1421837c1ac4SStephen Hanson 	d = dev_addr;
1422837c1ac4SStephen Hanson 
1423837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1424837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1425837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1426837c1ac4SStephen Hanson 			if ((*h++ = *d++) == 0xffffffff)
1427837c1ac4SStephen Hanson 				fail = 1;
1428837c1ac4SStephen Hanson 	} else {
1429837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1430837c1ac4SStephen Hanson 			if ((*h++ = *d) == 0xffffffff)
1431837c1ac4SStephen Hanson 				fail = 1;
1432837c1ac4SStephen Hanson 	}
1433837c1ac4SStephen Hanson 	if (fail == 1)
1434837c1ac4SStephen Hanson 		do_scan(hdlp);
1435837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1436837c1ac4SStephen Hanson }
1437837c1ac4SStephen Hanson 
1438837c1ac4SStephen Hanson /*ARGSUSED*/
1439837c1ac4SStephen Hanson 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)1440837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
144186ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1442837c1ac4SStephen Hanson {
1443837c1ac4SStephen Hanson 	int fail = 0;
1444837c1ac4SStephen Hanson 	uint32_t *h, *d;
1445837c1ac4SStephen Hanson 
1446837c1ac4SStephen Hanson 	h = host_addr;
1447837c1ac4SStephen Hanson 	d = dev_addr;
1448837c1ac4SStephen Hanson 
1449837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1450837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1451837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1452837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap32(*d++)) == 0xffffffff)
1453837c1ac4SStephen Hanson 				fail = 1;
1454837c1ac4SStephen Hanson 	} else {
1455837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1456837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap32(*d)) == 0xffffffff)
1457837c1ac4SStephen Hanson 				fail = 1;
1458837c1ac4SStephen Hanson 	}
1459837c1ac4SStephen Hanson 	if (fail == 1)
1460837c1ac4SStephen Hanson 		do_scan(hdlp);
1461837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1462837c1ac4SStephen Hanson }
1463837c1ac4SStephen Hanson 
1464837c1ac4SStephen Hanson /*ARGSUSED*/
1465837c1ac4SStephen Hanson 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)1466837c1ac4SStephen Hanson i_ddi_prot_io_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
146786ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1468837c1ac4SStephen Hanson {
1469837c1ac4SStephen Hanson 	int fail = 0;
1470837c1ac4SStephen Hanson 	uint32_t *h;
1471837c1ac4SStephen Hanson 	uintptr_t port;
1472837c1ac4SStephen Hanson 
1473837c1ac4SStephen Hanson 	h = host_addr;
1474837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1475837c1ac4SStephen Hanson 
1476837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1477837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1478837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 4)
1479837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap32(inl(port))) == 0xffffffff)
1480837c1ac4SStephen Hanson 				fail = 1;
1481837c1ac4SStephen Hanson 	} else {
1482837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1483837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap32(inl(port))) == 0xffffffff)
1484837c1ac4SStephen Hanson 				fail = 1;
1485837c1ac4SStephen Hanson 	}
1486837c1ac4SStephen Hanson 	if (fail == 1)
1487837c1ac4SStephen Hanson 		do_scan(hdlp);
1488837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1489837c1ac4SStephen Hanson }
1490837c1ac4SStephen Hanson 
1491837c1ac4SStephen Hanson /*ARGSUSED*/
1492837c1ac4SStephen Hanson 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)1493837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
149486ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
1495837c1ac4SStephen Hanson {
1496837c1ac4SStephen Hanson 	int fail = 0;
1497837c1ac4SStephen Hanson 	uint64_t *h, *d;
1498837c1ac4SStephen Hanson 
1499837c1ac4SStephen Hanson 	h = host_addr;
1500837c1ac4SStephen Hanson 	d = dev_addr;
1501837c1ac4SStephen Hanson 
1502837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1503837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1504837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1505837c1ac4SStephen Hanson 			if ((*h++ = *d++) == 0xffffffffffffffff)
1506837c1ac4SStephen Hanson 				fail = 1;
1507837c1ac4SStephen Hanson 	} else {
1508837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1509837c1ac4SStephen Hanson 			if ((*h++ = *d) == 0xffffffffffffffff)
1510837c1ac4SStephen Hanson 				fail = 1;
1511837c1ac4SStephen Hanson 	}
1512837c1ac4SStephen Hanson 	if (fail == 1)
1513837c1ac4SStephen Hanson 		do_scan(hdlp);
1514837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1515837c1ac4SStephen Hanson }
1516837c1ac4SStephen Hanson 
1517837c1ac4SStephen Hanson /*ARGSUSED*/
1518837c1ac4SStephen Hanson 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)1519837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
152086ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
1521837c1ac4SStephen Hanson {
1522837c1ac4SStephen Hanson 	int fail = 0;
1523837c1ac4SStephen Hanson 	uint64_t *h, *d;
1524837c1ac4SStephen Hanson 
1525837c1ac4SStephen Hanson 	h = host_addr;
1526837c1ac4SStephen Hanson 	d = dev_addr;
1527837c1ac4SStephen Hanson 
1528837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1529837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR) {
1530837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1531837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap64(*d++)) == 0xffffffffffffffff)
1532837c1ac4SStephen Hanson 				fail = 1;
1533837c1ac4SStephen Hanson 	} else {
1534837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1535837c1ac4SStephen Hanson 			if ((*h++ = ddi_swap64(*d)) == 0xffffffffffffffff)
1536837c1ac4SStephen Hanson 				fail = 1;
1537837c1ac4SStephen Hanson 	}
1538837c1ac4SStephen Hanson 	if (fail == 1)
1539837c1ac4SStephen Hanson 		do_scan(hdlp);
1540837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1541837c1ac4SStephen Hanson }
1542837c1ac4SStephen Hanson 
1543837c1ac4SStephen Hanson /*ARGSUSED*/
1544837c1ac4SStephen Hanson 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)1545837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
154686ef0a63SRichard Lowe     uint8_t *dev_addr, size_t repcount, uint_t flags)
1547837c1ac4SStephen Hanson {
1548837c1ac4SStephen Hanson 	uint8_t	*h, *d;
1549837c1ac4SStephen Hanson 
1550837c1ac4SStephen Hanson 	h = host_addr;
1551837c1ac4SStephen Hanson 	d = dev_addr;
1552837c1ac4SStephen Hanson 
1553837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1554837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1555837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1556837c1ac4SStephen Hanson 			*d++ = *h++;
1557837c1ac4SStephen Hanson 	else
1558837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1559837c1ac4SStephen Hanson 			*d = *h++;
1560837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1561837c1ac4SStephen Hanson }
1562837c1ac4SStephen Hanson 
1563837c1ac4SStephen Hanson /*ARGSUSED*/
1564837c1ac4SStephen Hanson 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)1565837c1ac4SStephen Hanson i_ddi_prot_io_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
156686ef0a63SRichard Lowe     uint8_t *dev_addr, size_t repcount, uint_t flags)
1567837c1ac4SStephen Hanson {
1568837c1ac4SStephen Hanson 	uint8_t	*h;
1569837c1ac4SStephen Hanson 	uintptr_t port;
1570837c1ac4SStephen Hanson 
1571837c1ac4SStephen Hanson 	h = host_addr;
1572837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1573837c1ac4SStephen Hanson 
1574837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1575837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1576837c1ac4SStephen Hanson 		for (; repcount; repcount--, port++)
1577837c1ac4SStephen Hanson 			outb(port, *h++);
1578837c1ac4SStephen Hanson 	else
1579837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1580837c1ac4SStephen Hanson 			outb(port, *h++);
1581837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1582837c1ac4SStephen Hanson }
1583837c1ac4SStephen Hanson 
1584837c1ac4SStephen Hanson /*ARGSUSED*/
1585837c1ac4SStephen Hanson 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)1586837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
158786ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1588837c1ac4SStephen Hanson {
1589837c1ac4SStephen Hanson 	uint16_t *h, *d;
1590837c1ac4SStephen Hanson 
1591837c1ac4SStephen Hanson 	h = host_addr;
1592837c1ac4SStephen Hanson 	d = dev_addr;
1593837c1ac4SStephen Hanson 
1594837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1595837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1596837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1597837c1ac4SStephen Hanson 			*d++ = *h++;
1598837c1ac4SStephen Hanson 	else
1599837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1600837c1ac4SStephen Hanson 			*d = *h++;
1601837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1602837c1ac4SStephen Hanson }
1603837c1ac4SStephen Hanson 
1604837c1ac4SStephen Hanson /*ARGSUSED*/
1605837c1ac4SStephen Hanson 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)1606837c1ac4SStephen Hanson i_ddi_prot_io_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
160786ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1608837c1ac4SStephen Hanson {
1609837c1ac4SStephen Hanson 	uint16_t *h;
1610837c1ac4SStephen Hanson 	uintptr_t port;
1611837c1ac4SStephen Hanson 
1612837c1ac4SStephen Hanson 	h = host_addr;
1613837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1614837c1ac4SStephen Hanson 
1615837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1616837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1617837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 2)
1618837c1ac4SStephen Hanson 			outw(port, *h++);
1619837c1ac4SStephen Hanson 	else
1620837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1621837c1ac4SStephen Hanson 			outw(port, *h++);
1622837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1623837c1ac4SStephen Hanson }
1624837c1ac4SStephen Hanson 
1625837c1ac4SStephen Hanson /*ARGSUSED*/
1626837c1ac4SStephen Hanson 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)1627837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
162886ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1629837c1ac4SStephen Hanson {
1630837c1ac4SStephen Hanson 	uint16_t *h, *d;
1631837c1ac4SStephen Hanson 
1632837c1ac4SStephen Hanson 	h = host_addr;
1633837c1ac4SStephen Hanson 	d = dev_addr;
1634837c1ac4SStephen Hanson 
1635837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1636837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1637837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1638837c1ac4SStephen Hanson 			*d++ = ddi_swap16(*h++);
1639837c1ac4SStephen Hanson 	else
1640837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1641837c1ac4SStephen Hanson 			*d = ddi_swap16(*h++);
1642837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1643837c1ac4SStephen Hanson }
1644837c1ac4SStephen Hanson 
1645837c1ac4SStephen Hanson /*ARGSUSED*/
1646837c1ac4SStephen Hanson 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)1647837c1ac4SStephen Hanson i_ddi_prot_io_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
164886ef0a63SRichard Lowe     uint16_t *dev_addr, size_t repcount, uint_t flags)
1649837c1ac4SStephen Hanson {
1650837c1ac4SStephen Hanson 	uint16_t *h;
1651837c1ac4SStephen Hanson 	uintptr_t port;
1652837c1ac4SStephen Hanson 
1653837c1ac4SStephen Hanson 	h = host_addr;
1654837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1655837c1ac4SStephen Hanson 
1656837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1657837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1658837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 2)
1659837c1ac4SStephen Hanson 			outw(port, ddi_swap16(*h++));
1660837c1ac4SStephen Hanson 	else
1661837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1662837c1ac4SStephen Hanson 			outw(port, ddi_swap16(*h++));
1663837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1664837c1ac4SStephen Hanson }
1665837c1ac4SStephen Hanson 
1666837c1ac4SStephen Hanson /*ARGSUSED*/
1667837c1ac4SStephen Hanson 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)1668837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
166986ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1670837c1ac4SStephen Hanson {
1671837c1ac4SStephen Hanson 	uint32_t *h, *d;
1672837c1ac4SStephen Hanson 
1673837c1ac4SStephen Hanson 	h = host_addr;
1674837c1ac4SStephen Hanson 	d = dev_addr;
1675837c1ac4SStephen Hanson 
1676837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1677837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1678837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1679837c1ac4SStephen Hanson 			*d++ = *h++;
1680837c1ac4SStephen Hanson 	else
1681837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1682837c1ac4SStephen Hanson 			*d = *h++;
1683837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1684837c1ac4SStephen Hanson }
1685837c1ac4SStephen Hanson 
1686837c1ac4SStephen Hanson /*ARGSUSED*/
1687837c1ac4SStephen Hanson 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)1688837c1ac4SStephen Hanson i_ddi_prot_io_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
168986ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1690837c1ac4SStephen Hanson {
1691837c1ac4SStephen Hanson 	uint32_t *h;
1692837c1ac4SStephen Hanson 	uintptr_t port;
1693837c1ac4SStephen Hanson 
1694837c1ac4SStephen Hanson 	h = host_addr;
1695837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1696837c1ac4SStephen Hanson 
1697837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1698837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1699837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 4)
1700837c1ac4SStephen Hanson 			outl(port, *h++);
1701837c1ac4SStephen Hanson 	else
1702837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1703837c1ac4SStephen Hanson 			outl(port, *h++);
1704837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1705837c1ac4SStephen Hanson }
1706837c1ac4SStephen Hanson 
1707837c1ac4SStephen Hanson /*ARGSUSED*/
1708837c1ac4SStephen Hanson 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)1709837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
171086ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1711837c1ac4SStephen Hanson {
1712837c1ac4SStephen Hanson 	uint32_t *h, *d;
1713837c1ac4SStephen Hanson 
1714837c1ac4SStephen Hanson 	h = host_addr;
1715837c1ac4SStephen Hanson 	d = dev_addr;
1716837c1ac4SStephen Hanson 
1717837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1718837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1719837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1720837c1ac4SStephen Hanson 			*d++ = ddi_swap32(*h++);
1721837c1ac4SStephen Hanson 	else
1722837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1723837c1ac4SStephen Hanson 			*d = ddi_swap32(*h++);
1724837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1725837c1ac4SStephen Hanson }
1726837c1ac4SStephen Hanson 
1727837c1ac4SStephen Hanson /*ARGSUSED*/
1728837c1ac4SStephen Hanson 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)1729837c1ac4SStephen Hanson i_ddi_prot_io_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
173086ef0a63SRichard Lowe     uint32_t *dev_addr, size_t repcount, uint_t flags)
1731837c1ac4SStephen Hanson {
1732837c1ac4SStephen Hanson 	uint32_t *h;
1733837c1ac4SStephen Hanson 	uintptr_t port;
1734837c1ac4SStephen Hanson 
1735837c1ac4SStephen Hanson 	h = host_addr;
1736837c1ac4SStephen Hanson 	port = (uintptr_t)dev_addr;
1737837c1ac4SStephen Hanson 
1738837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1739837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1740837c1ac4SStephen Hanson 		for (; repcount; repcount--, port += 4)
1741837c1ac4SStephen Hanson 			outl(port, ddi_swap32(*h++));
1742837c1ac4SStephen Hanson 	else
1743837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1744837c1ac4SStephen Hanson 			outl(port, ddi_swap32(*h++));
1745837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1746837c1ac4SStephen Hanson }
1747837c1ac4SStephen Hanson 
1748837c1ac4SStephen Hanson /*ARGSUSED*/
1749837c1ac4SStephen Hanson 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)1750837c1ac4SStephen Hanson i_ddi_prot_vaddr_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
175186ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
1752837c1ac4SStephen Hanson {
1753837c1ac4SStephen Hanson 	uint64_t *h, *d;
1754837c1ac4SStephen Hanson 
1755837c1ac4SStephen Hanson 	h = host_addr;
1756837c1ac4SStephen Hanson 	d = dev_addr;
1757837c1ac4SStephen Hanson 
1758837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1759837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1760837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1761837c1ac4SStephen Hanson 			*d++ = *h++;
1762837c1ac4SStephen Hanson 	else
1763837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1764837c1ac4SStephen Hanson 			*d = *h++;
1765837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1766837c1ac4SStephen Hanson }
1767837c1ac4SStephen Hanson 
1768837c1ac4SStephen Hanson /*ARGSUSED*/
1769837c1ac4SStephen Hanson 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)1770837c1ac4SStephen Hanson i_ddi_prot_vaddr_swap_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
177186ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
1772837c1ac4SStephen Hanson {
1773837c1ac4SStephen Hanson 	uint64_t *h, *d;
1774837c1ac4SStephen Hanson 
1775837c1ac4SStephen Hanson 	h = host_addr;
1776837c1ac4SStephen Hanson 	d = dev_addr;
1777837c1ac4SStephen Hanson 
1778837c1ac4SStephen Hanson 	mutex_enter(hdlp->ahi_peekpoke_mutexp);
1779837c1ac4SStephen Hanson 	if (flags == DDI_DEV_AUTOINCR)
1780837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1781837c1ac4SStephen Hanson 			*d++ = ddi_swap64(*h++);
1782837c1ac4SStephen Hanson 	else
1783837c1ac4SStephen Hanson 		for (; repcount; repcount--)
1784837c1ac4SStephen Hanson 			*d = ddi_swap64(*h++);
1785837c1ac4SStephen Hanson 	mutex_exit(hdlp->ahi_peekpoke_mutexp);
1786837c1ac4SStephen Hanson }
1787837c1ac4SStephen Hanson 
17887c478bd9Sstevel@tonic-gate void
ddi_io_rep_get8(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)17897c478bd9Sstevel@tonic-gate ddi_io_rep_get8(ddi_acc_handle_t handle,
179086ef0a63SRichard Lowe     uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
17917c478bd9Sstevel@tonic-gate {
17927c478bd9Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_get8)
1793837c1ac4SStephen Hanson 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1794837c1ac4SStephen Hanson 	    repcount, DDI_DEV_NO_AUTOINCR);
17957c478bd9Sstevel@tonic-gate }
17967c478bd9Sstevel@tonic-gate 
17977c478bd9Sstevel@tonic-gate void
ddi_io_rep_get16(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)17987c478bd9Sstevel@tonic-gate ddi_io_rep_get16(ddi_acc_handle_t handle,
179986ef0a63SRichard Lowe     uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
18007c478bd9Sstevel@tonic-gate {
18017c478bd9Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_get16)
1802837c1ac4SStephen Hanson 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1803837c1ac4SStephen Hanson 	    repcount, DDI_DEV_NO_AUTOINCR);
18047c478bd9Sstevel@tonic-gate }
18057c478bd9Sstevel@tonic-gate 
18067c478bd9Sstevel@tonic-gate void
ddi_io_rep_get32(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)18077c478bd9Sstevel@tonic-gate ddi_io_rep_get32(ddi_acc_handle_t handle,
180886ef0a63SRichard Lowe     uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
18097c478bd9Sstevel@tonic-gate {
18107c478bd9Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_get32)
1811837c1ac4SStephen Hanson 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1812837c1ac4SStephen Hanson 	    repcount, DDI_DEV_NO_AUTOINCR);
18137c478bd9Sstevel@tonic-gate }
18147c478bd9Sstevel@tonic-gate 
18157c478bd9Sstevel@tonic-gate /*ARGSUSED*/
18167c478bd9Sstevel@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)18177c478bd9Sstevel@tonic-gate i_ddi_io_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
181886ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
18197c478bd9Sstevel@tonic-gate {
18207c478bd9Sstevel@tonic-gate 	cmn_err(CE_PANIC, "ddi_rep_get64 from i/o space");
18217c478bd9Sstevel@tonic-gate }
18227c478bd9Sstevel@tonic-gate 
18237c478bd9Sstevel@tonic-gate void
ddi_io_rep_put8(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)18247c478bd9Sstevel@tonic-gate ddi_io_rep_put8(ddi_acc_handle_t handle,
182586ef0a63SRichard Lowe     uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
18267c478bd9Sstevel@tonic-gate {
18277c478bd9Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_put8)
1828837c1ac4SStephen Hanson 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1829837c1ac4SStephen Hanson 	    repcount, DDI_DEV_NO_AUTOINCR);
18307c478bd9Sstevel@tonic-gate }
18317c478bd9Sstevel@tonic-gate 
18327c478bd9Sstevel@tonic-gate void
ddi_io_rep_put16(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)18337c478bd9Sstevel@tonic-gate ddi_io_rep_put16(ddi_acc_handle_t handle,
183486ef0a63SRichard Lowe     uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
18357c478bd9Sstevel@tonic-gate {
18367c478bd9Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_put16)
1837837c1ac4SStephen Hanson 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1838837c1ac4SStephen Hanson 	    repcount, DDI_DEV_NO_AUTOINCR);
18397c478bd9Sstevel@tonic-gate }
18407c478bd9Sstevel@tonic-gate 
18417c478bd9Sstevel@tonic-gate void
ddi_io_rep_put32(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)18427c478bd9Sstevel@tonic-gate ddi_io_rep_put32(ddi_acc_handle_t handle,
184386ef0a63SRichard Lowe     uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
18447c478bd9Sstevel@tonic-gate {
18457c478bd9Sstevel@tonic-gate 	(((ddi_acc_impl_t *)handle)->ahi_rep_put32)
1846837c1ac4SStephen Hanson 	    ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1847837c1ac4SStephen Hanson 	    repcount, DDI_DEV_NO_AUTOINCR);
18487c478bd9Sstevel@tonic-gate }
18497c478bd9Sstevel@tonic-gate 
18507c478bd9Sstevel@tonic-gate /*ARGSUSED*/
18517c478bd9Sstevel@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)18527c478bd9Sstevel@tonic-gate i_ddi_io_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
185386ef0a63SRichard Lowe     uint64_t *dev_addr, size_t repcount, uint_t flags)
18547c478bd9Sstevel@tonic-gate {
18557c478bd9Sstevel@tonic-gate 	cmn_err(CE_PANIC, "ddi_rep_put64 to i/o space");
18567c478bd9Sstevel@tonic-gate }
18577c478bd9Sstevel@tonic-gate 
18587c478bd9Sstevel@tonic-gate /*
18597c478bd9Sstevel@tonic-gate  * These next two functions could be translated into assembler someday
18607c478bd9Sstevel@tonic-gate  */
18617c478bd9Sstevel@tonic-gate int
ddi_check_acc_handle(ddi_acc_handle_t handle)18627c478bd9Sstevel@tonic-gate ddi_check_acc_handle(ddi_acc_handle_t handle)
18637c478bd9Sstevel@tonic-gate {
18647c478bd9Sstevel@tonic-gate 	ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
18657c478bd9Sstevel@tonic-gate 	return (((*hdlp->ahi_fault_check)(hdlp) == DDI_SUCCESS) ? DDI_SUCCESS :
18667c478bd9Sstevel@tonic-gate 	    DDI_FAILURE);
18677c478bd9Sstevel@tonic-gate }
18687c478bd9Sstevel@tonic-gate 
18697c478bd9Sstevel@tonic-gate int
i_ddi_acc_fault_check(ddi_acc_impl_t * hdlp)18707c478bd9Sstevel@tonic-gate i_ddi_acc_fault_check(ddi_acc_impl_t *hdlp)
18717c478bd9Sstevel@tonic-gate {
18727c478bd9Sstevel@tonic-gate 	/* Default version, just returns flag value */
18737c478bd9Sstevel@tonic-gate 	return (hdlp->ahi_fault);
18747c478bd9Sstevel@tonic-gate }
18757c478bd9Sstevel@tonic-gate 
18767c478bd9Sstevel@tonic-gate /*ARGSUSED*/
18777c478bd9Sstevel@tonic-gate void
i_ddi_acc_fault_notify(ddi_acc_impl_t * hdlp)18787c478bd9Sstevel@tonic-gate i_ddi_acc_fault_notify(ddi_acc_impl_t *hdlp)
18797c478bd9Sstevel@tonic-gate {
18807c478bd9Sstevel@tonic-gate 	/* Default version, does nothing for now */
18817c478bd9Sstevel@tonic-gate }
18827c478bd9Sstevel@tonic-gate 
18837c478bd9Sstevel@tonic-gate void
i_ddi_acc_set_fault(ddi_acc_handle_t handle)18847c478bd9Sstevel@tonic-gate i_ddi_acc_set_fault(ddi_acc_handle_t handle)
18857c478bd9Sstevel@tonic-gate {
18867c478bd9Sstevel@tonic-gate 	ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
18877c478bd9Sstevel@tonic-gate 
18887c478bd9Sstevel@tonic-gate 	if (!hdlp->ahi_fault) {
18897c478bd9Sstevel@tonic-gate 		hdlp->ahi_fault = 1;
18907c478bd9Sstevel@tonic-gate 		(*hdlp->ahi_fault_notify)(hdlp);
18917c478bd9Sstevel@tonic-gate 	}
18927c478bd9Sstevel@tonic-gate }
18937c478bd9Sstevel@tonic-gate 
18947c478bd9Sstevel@tonic-gate void
i_ddi_acc_clr_fault(ddi_acc_handle_t handle)18957c478bd9Sstevel@tonic-gate i_ddi_acc_clr_fault(ddi_acc_handle_t handle)
18967c478bd9Sstevel@tonic-gate {
18977c478bd9Sstevel@tonic-gate 	ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
18987c478bd9Sstevel@tonic-gate 
18997c478bd9Sstevel@tonic-gate 	if (hdlp->ahi_fault) {
19007c478bd9Sstevel@tonic-gate 		hdlp->ahi_fault = 0;
19017c478bd9Sstevel@tonic-gate 		(*hdlp->ahi_fault_notify)(hdlp);
19027c478bd9Sstevel@tonic-gate 	}
19037c478bd9Sstevel@tonic-gate }
1904