1*f0089e39SRichard Lowe /*
2*f0089e39SRichard Lowe * CDDL HEADER START
3*f0089e39SRichard Lowe *
4*f0089e39SRichard Lowe * The contents of this file are subject to the terms of the
5*f0089e39SRichard Lowe * Common Development and Distribution License (the "License").
6*f0089e39SRichard Lowe * You may not use this file except in compliance with the License.
7*f0089e39SRichard Lowe *
8*f0089e39SRichard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*f0089e39SRichard Lowe * or http://www.opensolaris.org/os/licensing.
10*f0089e39SRichard Lowe * See the License for the specific language governing permissions
11*f0089e39SRichard Lowe * and limitations under the License.
12*f0089e39SRichard Lowe *
13*f0089e39SRichard Lowe * When distributing Covered Code, include this CDDL HEADER in each
14*f0089e39SRichard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*f0089e39SRichard Lowe * If applicable, add the following below this CDDL HEADER, with the
16*f0089e39SRichard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
17*f0089e39SRichard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
18*f0089e39SRichard Lowe *
19*f0089e39SRichard Lowe * CDDL HEADER END
20*f0089e39SRichard Lowe */
21*f0089e39SRichard Lowe
22*f0089e39SRichard Lowe /*
23*f0089e39SRichard Lowe * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24*f0089e39SRichard Lowe * Use is subject to license terms.
25*f0089e39SRichard Lowe */
26*f0089e39SRichard Lowe /*
27*f0089e39SRichard Lowe * Copyright 2014 Garrett D'Amore <garrett@damore.org>
28*f0089e39SRichard Lowe */
29*f0089e39SRichard Lowe
30*f0089e39SRichard Lowe #include <sys/conf.h>
31*f0089e39SRichard Lowe #include <sys/kmem.h>
32*f0089e39SRichard Lowe #include <sys/ddi_impldefs.h>
33*f0089e39SRichard Lowe #include <sys/ddi.h>
34*f0089e39SRichard Lowe #include <sys/sunddi.h>
35*f0089e39SRichard Lowe #include <sys/ddifm.h>
36*f0089e39SRichard Lowe #include <sys/fm/io/ddi.h>
37*f0089e39SRichard Lowe #include <sys/fm/protocol.h>
38*f0089e39SRichard Lowe #include <sys/ontrap.h>
39*f0089e39SRichard Lowe
40*f0089e39SRichard Lowe
41*f0089e39SRichard Lowe /*
42*f0089e39SRichard Lowe * DDI DMA Engine functions for x86.
43*f0089e39SRichard Lowe * These functions are more naturally generic, but do not apply to SPARC.
44*f0089e39SRichard Lowe */
45*f0089e39SRichard Lowe
46*f0089e39SRichard Lowe int
ddi_dmae_alloc(dev_info_t * dip,int chnl,int (* dmae_waitfp)(),caddr_t arg)47*f0089e39SRichard Lowe ddi_dmae_alloc(dev_info_t *dip, int chnl, int (*dmae_waitfp)(), caddr_t arg)
48*f0089e39SRichard Lowe {
49*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_ACQUIRE,
50*f0089e39SRichard Lowe (off_t *)dmae_waitfp, (size_t *)arg,
51*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
52*f0089e39SRichard Lowe }
53*f0089e39SRichard Lowe
54*f0089e39SRichard Lowe int
ddi_dmae_release(dev_info_t * dip,int chnl)55*f0089e39SRichard Lowe ddi_dmae_release(dev_info_t *dip, int chnl)
56*f0089e39SRichard Lowe {
57*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_FREE, 0, 0,
58*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
59*f0089e39SRichard Lowe }
60*f0089e39SRichard Lowe
61*f0089e39SRichard Lowe int
ddi_dmae_getattr(dev_info_t * dip,ddi_dma_attr_t * attrp)62*f0089e39SRichard Lowe ddi_dmae_getattr(dev_info_t *dip, ddi_dma_attr_t *attrp)
63*f0089e39SRichard Lowe {
64*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETATTR, 0, 0,
65*f0089e39SRichard Lowe (caddr_t *)attrp, 0));
66*f0089e39SRichard Lowe }
67*f0089e39SRichard Lowe
68*f0089e39SRichard Lowe int
ddi_dmae_1stparty(dev_info_t * dip,int chnl)69*f0089e39SRichard Lowe ddi_dmae_1stparty(dev_info_t *dip, int chnl)
70*f0089e39SRichard Lowe {
71*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_1STPTY, 0, 0,
72*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
73*f0089e39SRichard Lowe }
74*f0089e39SRichard Lowe
75*f0089e39SRichard Lowe int
ddi_dmae_prog(dev_info_t * dip,struct ddi_dmae_req * dmaereqp,ddi_dma_cookie_t * cookiep,int chnl)76*f0089e39SRichard Lowe ddi_dmae_prog(dev_info_t *dip, struct ddi_dmae_req *dmaereqp,
77*f0089e39SRichard Lowe ddi_dma_cookie_t *cookiep, int chnl)
78*f0089e39SRichard Lowe {
79*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_PROG, (off_t *)dmaereqp,
80*f0089e39SRichard Lowe (size_t *)cookiep, (caddr_t *)(uintptr_t)chnl, 0));
81*f0089e39SRichard Lowe }
82*f0089e39SRichard Lowe
83*f0089e39SRichard Lowe int
ddi_dmae_swsetup(dev_info_t * dip,struct ddi_dmae_req * dmaereqp,ddi_dma_cookie_t * cookiep,int chnl)84*f0089e39SRichard Lowe ddi_dmae_swsetup(dev_info_t *dip, struct ddi_dmae_req *dmaereqp,
85*f0089e39SRichard Lowe ddi_dma_cookie_t *cookiep, int chnl)
86*f0089e39SRichard Lowe {
87*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_SWSETUP, (off_t *)dmaereqp,
88*f0089e39SRichard Lowe (size_t *)cookiep, (caddr_t *)(uintptr_t)chnl, 0));
89*f0089e39SRichard Lowe }
90*f0089e39SRichard Lowe
91*f0089e39SRichard Lowe int
ddi_dmae_swstart(dev_info_t * dip,int chnl)92*f0089e39SRichard Lowe ddi_dmae_swstart(dev_info_t *dip, int chnl)
93*f0089e39SRichard Lowe {
94*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_SWSTART, 0, 0,
95*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
96*f0089e39SRichard Lowe }
97*f0089e39SRichard Lowe
98*f0089e39SRichard Lowe int
ddi_dmae_stop(dev_info_t * dip,int chnl)99*f0089e39SRichard Lowe ddi_dmae_stop(dev_info_t *dip, int chnl)
100*f0089e39SRichard Lowe {
101*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_STOP, 0, 0,
102*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
103*f0089e39SRichard Lowe }
104*f0089e39SRichard Lowe
105*f0089e39SRichard Lowe int
ddi_dmae_enable(dev_info_t * dip,int chnl)106*f0089e39SRichard Lowe ddi_dmae_enable(dev_info_t *dip, int chnl)
107*f0089e39SRichard Lowe {
108*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_ENABLE, 0, 0,
109*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
110*f0089e39SRichard Lowe }
111*f0089e39SRichard Lowe
112*f0089e39SRichard Lowe int
ddi_dmae_disable(dev_info_t * dip,int chnl)113*f0089e39SRichard Lowe ddi_dmae_disable(dev_info_t *dip, int chnl)
114*f0089e39SRichard Lowe {
115*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_DISABLE, 0, 0,
116*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
117*f0089e39SRichard Lowe }
118*f0089e39SRichard Lowe
119*f0089e39SRichard Lowe int
ddi_dmae_getcnt(dev_info_t * dip,int chnl,int * countp)120*f0089e39SRichard Lowe ddi_dmae_getcnt(dev_info_t *dip, int chnl, int *countp)
121*f0089e39SRichard Lowe {
122*f0089e39SRichard Lowe return (ddi_dma_mctl(dip, dip, 0, DDI_DMA_E_GETCNT, 0, (size_t *)countp,
123*f0089e39SRichard Lowe (caddr_t *)(uintptr_t)chnl, 0));
124*f0089e39SRichard Lowe }
125*f0089e39SRichard Lowe
126*f0089e39SRichard Lowe /*
127*f0089e39SRichard Lowe * implementation specific access handle and routines:
128*f0089e39SRichard Lowe */
129*f0089e39SRichard Lowe
130*f0089e39SRichard Lowe static uintptr_t impl_acc_hdl_id = 0;
131*f0089e39SRichard Lowe
132*f0089e39SRichard Lowe /*
133*f0089e39SRichard Lowe * access handle allocator
134*f0089e39SRichard Lowe */
135*f0089e39SRichard Lowe ddi_acc_hdl_t *
impl_acc_hdl_get(ddi_acc_handle_t hdl)136*f0089e39SRichard Lowe impl_acc_hdl_get(ddi_acc_handle_t hdl)
137*f0089e39SRichard Lowe {
138*f0089e39SRichard Lowe /*
139*f0089e39SRichard Lowe * recast to ddi_acc_hdl_t instead of
140*f0089e39SRichard Lowe * casting to ddi_acc_impl_t and then return the ah_platform_private
141*f0089e39SRichard Lowe *
142*f0089e39SRichard Lowe * this optimization based on the ddi_acc_hdl_t is the
143*f0089e39SRichard Lowe * first member of the ddi_acc_impl_t.
144*f0089e39SRichard Lowe */
145*f0089e39SRichard Lowe return ((ddi_acc_hdl_t *)hdl);
146*f0089e39SRichard Lowe }
147*f0089e39SRichard Lowe
148*f0089e39SRichard Lowe ddi_acc_handle_t
impl_acc_hdl_alloc(int (* waitfp)(caddr_t),caddr_t arg)149*f0089e39SRichard Lowe impl_acc_hdl_alloc(int (*waitfp)(caddr_t), caddr_t arg)
150*f0089e39SRichard Lowe {
151*f0089e39SRichard Lowe ddi_acc_impl_t *hp;
152*f0089e39SRichard Lowe on_trap_data_t *otp;
153*f0089e39SRichard Lowe int sleepflag;
154*f0089e39SRichard Lowe
155*f0089e39SRichard Lowe sleepflag = ((waitfp == (int (*)())KM_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
156*f0089e39SRichard Lowe /*
157*f0089e39SRichard Lowe * Allocate and initialize the data access handle and error status.
158*f0089e39SRichard Lowe */
159*f0089e39SRichard Lowe if ((hp = kmem_zalloc(sizeof (ddi_acc_impl_t), sleepflag)) == NULL)
160*f0089e39SRichard Lowe goto fail;
161*f0089e39SRichard Lowe if ((hp->ahi_err = (ndi_err_t *)kmem_zalloc(
162*f0089e39SRichard Lowe sizeof (ndi_err_t), sleepflag)) == NULL) {
163*f0089e39SRichard Lowe kmem_free(hp, sizeof (ddi_acc_impl_t));
164*f0089e39SRichard Lowe goto fail;
165*f0089e39SRichard Lowe }
166*f0089e39SRichard Lowe if ((otp = (on_trap_data_t *)kmem_zalloc(
167*f0089e39SRichard Lowe sizeof (on_trap_data_t), sleepflag)) == NULL) {
168*f0089e39SRichard Lowe kmem_free(hp->ahi_err, sizeof (ndi_err_t));
169*f0089e39SRichard Lowe kmem_free(hp, sizeof (ddi_acc_impl_t));
170*f0089e39SRichard Lowe goto fail;
171*f0089e39SRichard Lowe }
172*f0089e39SRichard Lowe hp->ahi_err->err_ontrap = otp;
173*f0089e39SRichard Lowe hp->ahi_common.ah_platform_private = (void *)hp;
174*f0089e39SRichard Lowe
175*f0089e39SRichard Lowe return ((ddi_acc_handle_t)hp);
176*f0089e39SRichard Lowe fail:
177*f0089e39SRichard Lowe if ((waitfp != (int (*)())KM_SLEEP) &&
178*f0089e39SRichard Lowe (waitfp != (int (*)())KM_NOSLEEP))
179*f0089e39SRichard Lowe ddi_set_callback(waitfp, arg, &impl_acc_hdl_id);
180*f0089e39SRichard Lowe return (NULL);
181*f0089e39SRichard Lowe }
182*f0089e39SRichard Lowe
183*f0089e39SRichard Lowe void
impl_acc_hdl_free(ddi_acc_handle_t handle)184*f0089e39SRichard Lowe impl_acc_hdl_free(ddi_acc_handle_t handle)
185*f0089e39SRichard Lowe {
186*f0089e39SRichard Lowe ddi_acc_impl_t *hp;
187*f0089e39SRichard Lowe
188*f0089e39SRichard Lowe /*
189*f0089e39SRichard Lowe * The supplied (ddi_acc_handle_t) is actually a (ddi_acc_impl_t *),
190*f0089e39SRichard Lowe * because that's what we allocated in impl_acc_hdl_alloc() above.
191*f0089e39SRichard Lowe */
192*f0089e39SRichard Lowe hp = (ddi_acc_impl_t *)handle;
193*f0089e39SRichard Lowe if (hp) {
194*f0089e39SRichard Lowe kmem_free(hp->ahi_err->err_ontrap, sizeof (on_trap_data_t));
195*f0089e39SRichard Lowe kmem_free(hp->ahi_err, sizeof (ndi_err_t));
196*f0089e39SRichard Lowe kmem_free(hp, sizeof (ddi_acc_impl_t));
197*f0089e39SRichard Lowe if (impl_acc_hdl_id)
198*f0089e39SRichard Lowe ddi_run_callback(&impl_acc_hdl_id);
199*f0089e39SRichard Lowe }
200*f0089e39SRichard Lowe }
201*f0089e39SRichard Lowe
202*f0089e39SRichard Lowe /*
203*f0089e39SRichard Lowe * Function used to check if a given access handle owns the failing address.
204*f0089e39SRichard Lowe * Called by ndi_fmc_error, when we detect a PIO error.
205*f0089e39SRichard Lowe */
206*f0089e39SRichard Lowe /* ARGSUSED */
207*f0089e39SRichard Lowe static int
impl_acc_check(dev_info_t * dip,const void * handle,const void * addr,const void * not_used)208*f0089e39SRichard Lowe impl_acc_check(dev_info_t *dip, const void *handle, const void *addr,
209*f0089e39SRichard Lowe const void *not_used)
210*f0089e39SRichard Lowe {
211*f0089e39SRichard Lowe pfn_t pfn, fault_pfn;
212*f0089e39SRichard Lowe ddi_acc_hdl_t *hp;
213*f0089e39SRichard Lowe
214*f0089e39SRichard Lowe hp = impl_acc_hdl_get((ddi_acc_handle_t)handle);
215*f0089e39SRichard Lowe
216*f0089e39SRichard Lowe ASSERT(hp);
217*f0089e39SRichard Lowe
218*f0089e39SRichard Lowe if (addr != NULL) {
219*f0089e39SRichard Lowe pfn = hp->ah_pfn;
220*f0089e39SRichard Lowe fault_pfn = mmu_btop(*(uint64_t *)addr);
221*f0089e39SRichard Lowe if (fault_pfn >= pfn && fault_pfn < (pfn + hp->ah_pnum))
222*f0089e39SRichard Lowe return (DDI_FM_NONFATAL);
223*f0089e39SRichard Lowe }
224*f0089e39SRichard Lowe return (DDI_FM_UNKNOWN);
225*f0089e39SRichard Lowe }
226*f0089e39SRichard Lowe
227*f0089e39SRichard Lowe void
impl_acc_err_init(ddi_acc_hdl_t * handlep)228*f0089e39SRichard Lowe impl_acc_err_init(ddi_acc_hdl_t *handlep)
229*f0089e39SRichard Lowe {
230*f0089e39SRichard Lowe int fmcap;
231*f0089e39SRichard Lowe ndi_err_t *errp;
232*f0089e39SRichard Lowe on_trap_data_t *otp;
233*f0089e39SRichard Lowe ddi_acc_impl_t *hp = (ddi_acc_impl_t *)handlep;
234*f0089e39SRichard Lowe
235*f0089e39SRichard Lowe fmcap = ddi_fm_capable(handlep->ah_dip);
236*f0089e39SRichard Lowe
237*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_version < DDI_DEVICE_ATTR_V1 ||
238*f0089e39SRichard Lowe !DDI_FM_ACC_ERR_CAP(fmcap)) {
239*f0089e39SRichard Lowe handlep->ah_acc.devacc_attr_access = DDI_DEFAULT_ACC;
240*f0089e39SRichard Lowe } else if (handlep->ah_acc.devacc_attr_access == DDI_FLAGERR_ACC &&
241*f0089e39SRichard Lowe hp->ahi_scan == NULL) {
242*f0089e39SRichard Lowe handlep->ah_acc.devacc_attr_access = DDI_DEFAULT_ACC;
243*f0089e39SRichard Lowe } else if (DDI_FM_ACC_ERR_CAP(fmcap)) {
244*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_access == DDI_DEFAULT_ACC) {
245*f0089e39SRichard Lowe if (handlep->ah_xfermodes)
246*f0089e39SRichard Lowe return;
247*f0089e39SRichard Lowe i_ddi_drv_ereport_post(handlep->ah_dip, DVR_EFMCAP,
248*f0089e39SRichard Lowe NULL, DDI_NOSLEEP);
249*f0089e39SRichard Lowe } else {
250*f0089e39SRichard Lowe errp = hp->ahi_err;
251*f0089e39SRichard Lowe otp = (on_trap_data_t *)errp->err_ontrap;
252*f0089e39SRichard Lowe otp->ot_handle = (void *)(hp);
253*f0089e39SRichard Lowe otp->ot_prot = OT_DATA_ACCESS;
254*f0089e39SRichard Lowe errp->err_status = DDI_FM_OK;
255*f0089e39SRichard Lowe errp->err_expected = DDI_FM_ERR_UNEXPECTED;
256*f0089e39SRichard Lowe errp->err_cf = impl_acc_check;
257*f0089e39SRichard Lowe }
258*f0089e39SRichard Lowe }
259*f0089e39SRichard Lowe }
260*f0089e39SRichard Lowe
261*f0089e39SRichard Lowe /* ARGSUSED */
262*f0089e39SRichard Lowe int
impl_dma_check(dev_info_t * dip,const void * handle,const void * pci_hdl,const void * not_used)263*f0089e39SRichard Lowe impl_dma_check(dev_info_t *dip, const void *handle, const void *pci_hdl,
264*f0089e39SRichard Lowe const void *not_used)
265*f0089e39SRichard Lowe {
266*f0089e39SRichard Lowe return (DDI_FM_UNKNOWN);
267*f0089e39SRichard Lowe }
268*f0089e39SRichard Lowe
269*f0089e39SRichard Lowe void
impl_acc_hdl_init(ddi_acc_hdl_t * handlep)270*f0089e39SRichard Lowe impl_acc_hdl_init(ddi_acc_hdl_t *handlep)
271*f0089e39SRichard Lowe {
272*f0089e39SRichard Lowe ddi_acc_impl_t *hp;
273*f0089e39SRichard Lowe int fmcap;
274*f0089e39SRichard Lowe int devacc_attr_access;
275*f0089e39SRichard Lowe
276*f0089e39SRichard Lowe if (!handlep)
277*f0089e39SRichard Lowe return;
278*f0089e39SRichard Lowe fmcap = ddi_fm_capable(handlep->ah_dip);
279*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_version < DDI_DEVICE_ATTR_V1 ||
280*f0089e39SRichard Lowe !DDI_FM_ACC_ERR_CAP(fmcap))
281*f0089e39SRichard Lowe devacc_attr_access = DDI_DEFAULT_ACC;
282*f0089e39SRichard Lowe else
283*f0089e39SRichard Lowe devacc_attr_access = handlep->ah_acc.devacc_attr_access;
284*f0089e39SRichard Lowe
285*f0089e39SRichard Lowe hp = (ddi_acc_impl_t *)handlep->ah_platform_private;
286*f0089e39SRichard Lowe
287*f0089e39SRichard Lowe /*
288*f0089e39SRichard Lowe * Can only do FLAGERR if scan callback is set up. This should
289*f0089e39SRichard Lowe * also guarantee that the peekpoke_mutex and err_mutex are defined.
290*f0089e39SRichard Lowe */
291*f0089e39SRichard Lowe if (devacc_attr_access == DDI_FLAGERR_ACC && hp->ahi_scan == NULL)
292*f0089e39SRichard Lowe devacc_attr_access = DDI_DEFAULT_ACC;
293*f0089e39SRichard Lowe
294*f0089e39SRichard Lowe switch (devacc_attr_access) {
295*f0089e39SRichard Lowe case DDI_CAUTIOUS_ACC:
296*f0089e39SRichard Lowe hp->ahi_get8 = i_ddi_caut_get8;
297*f0089e39SRichard Lowe hp->ahi_put8 = i_ddi_caut_put8;
298*f0089e39SRichard Lowe hp->ahi_rep_get8 = i_ddi_caut_rep_get8;
299*f0089e39SRichard Lowe hp->ahi_rep_put8 = i_ddi_caut_rep_put8;
300*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_caut_get16;
301*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_caut_get32;
302*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_caut_put16;
303*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_caut_put32;
304*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_caut_rep_get16;
305*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_caut_rep_get32;
306*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_caut_rep_put16;
307*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_caut_rep_put32;
308*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_caut_get64;
309*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_caut_put64;
310*f0089e39SRichard Lowe hp->ahi_rep_get64 = i_ddi_caut_rep_get64;
311*f0089e39SRichard Lowe hp->ahi_rep_put64 = i_ddi_caut_rep_put64;
312*f0089e39SRichard Lowe break;
313*f0089e39SRichard Lowe case DDI_FLAGERR_ACC:
314*f0089e39SRichard Lowe if (hp->ahi_acc_attr & DDI_ACCATTR_IO_SPACE) {
315*f0089e39SRichard Lowe hp->ahi_get8 = i_ddi_prot_io_get8;
316*f0089e39SRichard Lowe hp->ahi_put8 = i_ddi_prot_io_put8;
317*f0089e39SRichard Lowe hp->ahi_rep_get8 = i_ddi_prot_io_rep_get8;
318*f0089e39SRichard Lowe hp->ahi_rep_put8 = i_ddi_prot_io_rep_put8;
319*f0089e39SRichard Lowe
320*f0089e39SRichard Lowe /* temporary set these 64 functions to no-ops */
321*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_io_get64;
322*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_io_put64;
323*f0089e39SRichard Lowe hp->ahi_rep_get64 = i_ddi_io_rep_get64;
324*f0089e39SRichard Lowe hp->ahi_rep_put64 = i_ddi_io_rep_put64;
325*f0089e39SRichard Lowe
326*f0089e39SRichard Lowe /*
327*f0089e39SRichard Lowe * check for BIG endian access
328*f0089e39SRichard Lowe */
329*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_endian_flags ==
330*f0089e39SRichard Lowe DDI_STRUCTURE_BE_ACC) {
331*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_prot_io_swap_get16;
332*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_prot_io_swap_get32;
333*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_prot_io_swap_put16;
334*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_prot_io_swap_put32;
335*f0089e39SRichard Lowe hp->ahi_rep_get16 =
336*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_get16;
337*f0089e39SRichard Lowe hp->ahi_rep_get32 =
338*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_get32;
339*f0089e39SRichard Lowe hp->ahi_rep_put16 =
340*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_put16;
341*f0089e39SRichard Lowe hp->ahi_rep_put32 =
342*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_put32;
343*f0089e39SRichard Lowe } else {
344*f0089e39SRichard Lowe hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
345*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_prot_io_get16;
346*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_prot_io_get32;
347*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_prot_io_put16;
348*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_prot_io_put32;
349*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_prot_io_rep_get16;
350*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_prot_io_rep_get32;
351*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_prot_io_rep_put16;
352*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_prot_io_rep_put32;
353*f0089e39SRichard Lowe }
354*f0089e39SRichard Lowe
355*f0089e39SRichard Lowe } else if (hp->ahi_acc_attr & DDI_ACCATTR_CPU_VADDR) {
356*f0089e39SRichard Lowe
357*f0089e39SRichard Lowe hp->ahi_get8 = i_ddi_prot_vaddr_get8;
358*f0089e39SRichard Lowe hp->ahi_put8 = i_ddi_prot_vaddr_put8;
359*f0089e39SRichard Lowe hp->ahi_rep_get8 = i_ddi_prot_vaddr_rep_get8;
360*f0089e39SRichard Lowe hp->ahi_rep_put8 = i_ddi_prot_vaddr_rep_put8;
361*f0089e39SRichard Lowe
362*f0089e39SRichard Lowe /*
363*f0089e39SRichard Lowe * check for BIG endian access
364*f0089e39SRichard Lowe */
365*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_endian_flags ==
366*f0089e39SRichard Lowe DDI_STRUCTURE_BE_ACC) {
367*f0089e39SRichard Lowe
368*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_prot_vaddr_swap_get16;
369*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_prot_vaddr_swap_get32;
370*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_prot_vaddr_swap_get64;
371*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_prot_vaddr_swap_put16;
372*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_prot_vaddr_swap_put32;
373*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_prot_vaddr_swap_put64;
374*f0089e39SRichard Lowe hp->ahi_rep_get16 =
375*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_get16;
376*f0089e39SRichard Lowe hp->ahi_rep_get32 =
377*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_get32;
378*f0089e39SRichard Lowe hp->ahi_rep_get64 =
379*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_get64;
380*f0089e39SRichard Lowe hp->ahi_rep_put16 =
381*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_put16;
382*f0089e39SRichard Lowe hp->ahi_rep_put32 =
383*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_put32;
384*f0089e39SRichard Lowe hp->ahi_rep_put64 =
385*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_put64;
386*f0089e39SRichard Lowe } else {
387*f0089e39SRichard Lowe hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
388*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_prot_vaddr_get16;
389*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_prot_vaddr_get32;
390*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_prot_vaddr_get64;
391*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_prot_vaddr_put16;
392*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_prot_vaddr_put32;
393*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_prot_vaddr_put64;
394*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_prot_vaddr_rep_get16;
395*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_prot_vaddr_rep_get32;
396*f0089e39SRichard Lowe hp->ahi_rep_get64 = i_ddi_prot_vaddr_rep_get64;
397*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_prot_vaddr_rep_put16;
398*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_prot_vaddr_rep_put32;
399*f0089e39SRichard Lowe hp->ahi_rep_put64 = i_ddi_prot_vaddr_rep_put64;
400*f0089e39SRichard Lowe }
401*f0089e39SRichard Lowe }
402*f0089e39SRichard Lowe break;
403*f0089e39SRichard Lowe case DDI_DEFAULT_ACC:
404*f0089e39SRichard Lowe if (hp->ahi_acc_attr & DDI_ACCATTR_IO_SPACE) {
405*f0089e39SRichard Lowe hp->ahi_get8 = i_ddi_io_get8;
406*f0089e39SRichard Lowe hp->ahi_put8 = i_ddi_io_put8;
407*f0089e39SRichard Lowe hp->ahi_rep_get8 = i_ddi_io_rep_get8;
408*f0089e39SRichard Lowe hp->ahi_rep_put8 = i_ddi_io_rep_put8;
409*f0089e39SRichard Lowe
410*f0089e39SRichard Lowe /* temporary set these 64 functions to no-ops */
411*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_io_get64;
412*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_io_put64;
413*f0089e39SRichard Lowe hp->ahi_rep_get64 = i_ddi_io_rep_get64;
414*f0089e39SRichard Lowe hp->ahi_rep_put64 = i_ddi_io_rep_put64;
415*f0089e39SRichard Lowe
416*f0089e39SRichard Lowe /*
417*f0089e39SRichard Lowe * check for BIG endian access
418*f0089e39SRichard Lowe */
419*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_endian_flags ==
420*f0089e39SRichard Lowe DDI_STRUCTURE_BE_ACC) {
421*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_io_swap_get16;
422*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_io_swap_get32;
423*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_io_swap_put16;
424*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_io_swap_put32;
425*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_io_swap_rep_get16;
426*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_io_swap_rep_get32;
427*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_io_swap_rep_put16;
428*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_io_swap_rep_put32;
429*f0089e39SRichard Lowe } else {
430*f0089e39SRichard Lowe hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
431*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_io_get16;
432*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_io_get32;
433*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_io_put16;
434*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_io_put32;
435*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_io_rep_get16;
436*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_io_rep_get32;
437*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_io_rep_put16;
438*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_io_rep_put32;
439*f0089e39SRichard Lowe }
440*f0089e39SRichard Lowe
441*f0089e39SRichard Lowe } else if (hp->ahi_acc_attr & DDI_ACCATTR_CPU_VADDR) {
442*f0089e39SRichard Lowe
443*f0089e39SRichard Lowe hp->ahi_get8 = i_ddi_vaddr_get8;
444*f0089e39SRichard Lowe hp->ahi_put8 = i_ddi_vaddr_put8;
445*f0089e39SRichard Lowe hp->ahi_rep_get8 = i_ddi_vaddr_rep_get8;
446*f0089e39SRichard Lowe hp->ahi_rep_put8 = i_ddi_vaddr_rep_put8;
447*f0089e39SRichard Lowe
448*f0089e39SRichard Lowe /*
449*f0089e39SRichard Lowe * check for BIG endian access
450*f0089e39SRichard Lowe */
451*f0089e39SRichard Lowe if (handlep->ah_acc.devacc_attr_endian_flags ==
452*f0089e39SRichard Lowe DDI_STRUCTURE_BE_ACC) {
453*f0089e39SRichard Lowe
454*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_vaddr_swap_get16;
455*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_vaddr_swap_get32;
456*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_vaddr_swap_get64;
457*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_vaddr_swap_put16;
458*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_vaddr_swap_put32;
459*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_vaddr_swap_put64;
460*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_vaddr_swap_rep_get16;
461*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_vaddr_swap_rep_get32;
462*f0089e39SRichard Lowe hp->ahi_rep_get64 = i_ddi_vaddr_swap_rep_get64;
463*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_vaddr_swap_rep_put16;
464*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_vaddr_swap_rep_put32;
465*f0089e39SRichard Lowe hp->ahi_rep_put64 = i_ddi_vaddr_swap_rep_put64;
466*f0089e39SRichard Lowe } else {
467*f0089e39SRichard Lowe hp->ahi_acc_attr |= DDI_ACCATTR_DIRECT;
468*f0089e39SRichard Lowe hp->ahi_get16 = i_ddi_vaddr_get16;
469*f0089e39SRichard Lowe hp->ahi_get32 = i_ddi_vaddr_get32;
470*f0089e39SRichard Lowe hp->ahi_get64 = i_ddi_vaddr_get64;
471*f0089e39SRichard Lowe hp->ahi_put16 = i_ddi_vaddr_put16;
472*f0089e39SRichard Lowe hp->ahi_put32 = i_ddi_vaddr_put32;
473*f0089e39SRichard Lowe hp->ahi_put64 = i_ddi_vaddr_put64;
474*f0089e39SRichard Lowe hp->ahi_rep_get16 = i_ddi_vaddr_rep_get16;
475*f0089e39SRichard Lowe hp->ahi_rep_get32 = i_ddi_vaddr_rep_get32;
476*f0089e39SRichard Lowe hp->ahi_rep_get64 = i_ddi_vaddr_rep_get64;
477*f0089e39SRichard Lowe hp->ahi_rep_put16 = i_ddi_vaddr_rep_put16;
478*f0089e39SRichard Lowe hp->ahi_rep_put32 = i_ddi_vaddr_rep_put32;
479*f0089e39SRichard Lowe hp->ahi_rep_put64 = i_ddi_vaddr_rep_put64;
480*f0089e39SRichard Lowe }
481*f0089e39SRichard Lowe }
482*f0089e39SRichard Lowe break;
483*f0089e39SRichard Lowe }
484*f0089e39SRichard Lowe hp->ahi_fault_check = i_ddi_acc_fault_check;
485*f0089e39SRichard Lowe hp->ahi_fault_notify = i_ddi_acc_fault_notify;
486*f0089e39SRichard Lowe hp->ahi_fault = 0;
487*f0089e39SRichard Lowe impl_acc_err_init(handlep);
488*f0089e39SRichard Lowe }
489*f0089e39SRichard Lowe
490*f0089e39SRichard Lowe /*
491*f0089e39SRichard Lowe * The followings are low-level routines for data access.
492*f0089e39SRichard Lowe *
493*f0089e39SRichard Lowe * All of these routines should be implemented in assembly. Those
494*f0089e39SRichard Lowe * that have been rewritten be found in ~ml/ddi_i86_asm.s
495*f0089e39SRichard Lowe */
496*f0089e39SRichard Lowe
497*f0089e39SRichard Lowe /*ARGSUSED*/
498*f0089e39SRichard Lowe uint16_t
i_ddi_vaddr_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)499*f0089e39SRichard Lowe i_ddi_vaddr_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
500*f0089e39SRichard Lowe {
501*f0089e39SRichard Lowe return (ddi_swap16(*addr));
502*f0089e39SRichard Lowe }
503*f0089e39SRichard Lowe
504*f0089e39SRichard Lowe /*ARGSUSED*/
505*f0089e39SRichard Lowe uint16_t
i_ddi_io_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)506*f0089e39SRichard Lowe i_ddi_io_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
507*f0089e39SRichard Lowe {
508*f0089e39SRichard Lowe return (ddi_swap16(inw((uintptr_t)addr)));
509*f0089e39SRichard Lowe }
510*f0089e39SRichard Lowe
511*f0089e39SRichard Lowe /*ARGSUSED*/
512*f0089e39SRichard Lowe uint32_t
i_ddi_vaddr_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)513*f0089e39SRichard Lowe i_ddi_vaddr_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
514*f0089e39SRichard Lowe {
515*f0089e39SRichard Lowe return (ddi_swap32(*addr));
516*f0089e39SRichard Lowe }
517*f0089e39SRichard Lowe
518*f0089e39SRichard Lowe /*ARGSUSED*/
519*f0089e39SRichard Lowe uint32_t
i_ddi_io_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)520*f0089e39SRichard Lowe i_ddi_io_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
521*f0089e39SRichard Lowe {
522*f0089e39SRichard Lowe return (ddi_swap32(inl((uintptr_t)addr)));
523*f0089e39SRichard Lowe }
524*f0089e39SRichard Lowe
525*f0089e39SRichard Lowe /*ARGSUSED*/
526*f0089e39SRichard Lowe uint64_t
i_ddi_vaddr_swap_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)527*f0089e39SRichard Lowe i_ddi_vaddr_swap_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
528*f0089e39SRichard Lowe {
529*f0089e39SRichard Lowe return (ddi_swap64(*addr));
530*f0089e39SRichard Lowe }
531*f0089e39SRichard Lowe
532*f0089e39SRichard Lowe /*ARGSUSED*/
533*f0089e39SRichard Lowe void
i_ddi_vaddr_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)534*f0089e39SRichard Lowe i_ddi_vaddr_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
535*f0089e39SRichard Lowe {
536*f0089e39SRichard Lowe *addr = ddi_swap16(value);
537*f0089e39SRichard Lowe }
538*f0089e39SRichard Lowe
539*f0089e39SRichard Lowe /*ARGSUSED*/
540*f0089e39SRichard Lowe void
i_ddi_io_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)541*f0089e39SRichard Lowe i_ddi_io_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
542*f0089e39SRichard Lowe {
543*f0089e39SRichard Lowe outw((uintptr_t)addr, ddi_swap16(value));
544*f0089e39SRichard Lowe }
545*f0089e39SRichard Lowe
546*f0089e39SRichard Lowe /*ARGSUSED*/
547*f0089e39SRichard Lowe void
i_ddi_vaddr_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)548*f0089e39SRichard Lowe i_ddi_vaddr_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
549*f0089e39SRichard Lowe {
550*f0089e39SRichard Lowe *addr = ddi_swap32(value);
551*f0089e39SRichard Lowe }
552*f0089e39SRichard Lowe
553*f0089e39SRichard Lowe /*ARGSUSED*/
554*f0089e39SRichard Lowe void
i_ddi_io_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)555*f0089e39SRichard Lowe i_ddi_io_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
556*f0089e39SRichard Lowe {
557*f0089e39SRichard Lowe outl((uintptr_t)addr, ddi_swap32(value));
558*f0089e39SRichard Lowe }
559*f0089e39SRichard Lowe
560*f0089e39SRichard Lowe /*ARGSUSED*/
561*f0089e39SRichard Lowe void
i_ddi_vaddr_swap_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)562*f0089e39SRichard Lowe i_ddi_vaddr_swap_put64(ddi_acc_impl_t *hdlp, uint64_t *addr, uint64_t value)
563*f0089e39SRichard Lowe {
564*f0089e39SRichard Lowe *addr = ddi_swap64(value);
565*f0089e39SRichard Lowe }
566*f0089e39SRichard Lowe
567*f0089e39SRichard Lowe /*ARGSUSED*/
568*f0089e39SRichard Lowe 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)569*f0089e39SRichard Lowe i_ddi_vaddr_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
570*f0089e39SRichard Lowe uint8_t *dev_addr, size_t repcount, uint_t flags)
571*f0089e39SRichard Lowe {
572*f0089e39SRichard Lowe uint8_t *h, *d;
573*f0089e39SRichard Lowe
574*f0089e39SRichard Lowe h = host_addr;
575*f0089e39SRichard Lowe d = dev_addr;
576*f0089e39SRichard Lowe
577*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
578*f0089e39SRichard Lowe for (; repcount; repcount--)
579*f0089e39SRichard Lowe *h++ = *d++;
580*f0089e39SRichard Lowe else
581*f0089e39SRichard Lowe for (; repcount; repcount--)
582*f0089e39SRichard Lowe *h++ = *d;
583*f0089e39SRichard Lowe }
584*f0089e39SRichard Lowe
585*f0089e39SRichard Lowe /*ARGSUSED*/
586*f0089e39SRichard Lowe 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)587*f0089e39SRichard Lowe i_ddi_vaddr_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
588*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
589*f0089e39SRichard Lowe {
590*f0089e39SRichard Lowe uint16_t *h, *d;
591*f0089e39SRichard Lowe
592*f0089e39SRichard Lowe h = host_addr;
593*f0089e39SRichard Lowe d = dev_addr;
594*f0089e39SRichard Lowe
595*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
596*f0089e39SRichard Lowe for (; repcount; repcount--)
597*f0089e39SRichard Lowe *h++ = *d++;
598*f0089e39SRichard Lowe else
599*f0089e39SRichard Lowe for (; repcount; repcount--)
600*f0089e39SRichard Lowe *h++ = *d;
601*f0089e39SRichard Lowe }
602*f0089e39SRichard Lowe
603*f0089e39SRichard Lowe /*ARGSUSED*/
604*f0089e39SRichard Lowe 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)605*f0089e39SRichard Lowe i_ddi_vaddr_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
606*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
607*f0089e39SRichard Lowe {
608*f0089e39SRichard Lowe uint16_t *h, *d;
609*f0089e39SRichard Lowe
610*f0089e39SRichard Lowe h = host_addr;
611*f0089e39SRichard Lowe d = dev_addr;
612*f0089e39SRichard Lowe
613*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
614*f0089e39SRichard Lowe for (; repcount; repcount--)
615*f0089e39SRichard Lowe *h++ = ddi_swap16(*d++);
616*f0089e39SRichard Lowe else
617*f0089e39SRichard Lowe for (; repcount; repcount--)
618*f0089e39SRichard Lowe *h++ = ddi_swap16(*d);
619*f0089e39SRichard Lowe }
620*f0089e39SRichard Lowe
621*f0089e39SRichard Lowe /*ARGSUSED*/
622*f0089e39SRichard Lowe 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)623*f0089e39SRichard Lowe i_ddi_io_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
624*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
625*f0089e39SRichard Lowe {
626*f0089e39SRichard Lowe uint16_t *h;
627*f0089e39SRichard Lowe uintptr_t port;
628*f0089e39SRichard Lowe
629*f0089e39SRichard Lowe h = host_addr;
630*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
631*f0089e39SRichard Lowe
632*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
633*f0089e39SRichard Lowe for (; repcount; repcount--, port += 2)
634*f0089e39SRichard Lowe *h++ = ddi_swap16(inw(port));
635*f0089e39SRichard Lowe else
636*f0089e39SRichard Lowe for (; repcount; repcount--)
637*f0089e39SRichard Lowe *h++ = ddi_swap16(inw(port));
638*f0089e39SRichard Lowe }
639*f0089e39SRichard Lowe
640*f0089e39SRichard Lowe /*ARGSUSED*/
641*f0089e39SRichard Lowe 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)642*f0089e39SRichard Lowe i_ddi_vaddr_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
643*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
644*f0089e39SRichard Lowe {
645*f0089e39SRichard Lowe uint32_t *h, *d;
646*f0089e39SRichard Lowe
647*f0089e39SRichard Lowe h = host_addr;
648*f0089e39SRichard Lowe d = dev_addr;
649*f0089e39SRichard Lowe
650*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
651*f0089e39SRichard Lowe for (; repcount; repcount--)
652*f0089e39SRichard Lowe *h++ = *d++;
653*f0089e39SRichard Lowe else
654*f0089e39SRichard Lowe for (; repcount; repcount--)
655*f0089e39SRichard Lowe *h++ = *d;
656*f0089e39SRichard Lowe }
657*f0089e39SRichard Lowe
658*f0089e39SRichard Lowe /*ARGSUSED*/
659*f0089e39SRichard Lowe 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)660*f0089e39SRichard Lowe i_ddi_vaddr_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
661*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
662*f0089e39SRichard Lowe {
663*f0089e39SRichard Lowe uint32_t *h, *d;
664*f0089e39SRichard Lowe
665*f0089e39SRichard Lowe h = host_addr;
666*f0089e39SRichard Lowe d = dev_addr;
667*f0089e39SRichard Lowe
668*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
669*f0089e39SRichard Lowe for (; repcount; repcount--)
670*f0089e39SRichard Lowe *h++ = ddi_swap32(*d++);
671*f0089e39SRichard Lowe else
672*f0089e39SRichard Lowe for (; repcount; repcount--)
673*f0089e39SRichard Lowe *h++ = ddi_swap32(*d);
674*f0089e39SRichard Lowe }
675*f0089e39SRichard Lowe
676*f0089e39SRichard Lowe /*ARGSUSED*/
677*f0089e39SRichard Lowe 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)678*f0089e39SRichard Lowe i_ddi_io_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
679*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
680*f0089e39SRichard Lowe {
681*f0089e39SRichard Lowe uint32_t *h;
682*f0089e39SRichard Lowe uintptr_t port;
683*f0089e39SRichard Lowe
684*f0089e39SRichard Lowe h = host_addr;
685*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
686*f0089e39SRichard Lowe
687*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
688*f0089e39SRichard Lowe for (; repcount; repcount--, port += 4)
689*f0089e39SRichard Lowe *h++ = ddi_swap32(inl(port));
690*f0089e39SRichard Lowe else
691*f0089e39SRichard Lowe for (; repcount; repcount--)
692*f0089e39SRichard Lowe *h++ = ddi_swap32(inl(port));
693*f0089e39SRichard Lowe }
694*f0089e39SRichard Lowe
695*f0089e39SRichard Lowe /*ARGSUSED*/
696*f0089e39SRichard Lowe 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)697*f0089e39SRichard Lowe i_ddi_vaddr_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
698*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
699*f0089e39SRichard Lowe {
700*f0089e39SRichard Lowe uint64_t *h, *d;
701*f0089e39SRichard Lowe
702*f0089e39SRichard Lowe h = host_addr;
703*f0089e39SRichard Lowe d = dev_addr;
704*f0089e39SRichard Lowe
705*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
706*f0089e39SRichard Lowe for (; repcount; repcount--)
707*f0089e39SRichard Lowe *h++ = *d++;
708*f0089e39SRichard Lowe else
709*f0089e39SRichard Lowe for (; repcount; repcount--)
710*f0089e39SRichard Lowe *h++ = *d;
711*f0089e39SRichard Lowe }
712*f0089e39SRichard Lowe
713*f0089e39SRichard Lowe /*ARGSUSED*/
714*f0089e39SRichard Lowe 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)715*f0089e39SRichard Lowe i_ddi_vaddr_swap_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
716*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
717*f0089e39SRichard Lowe {
718*f0089e39SRichard Lowe uint64_t *h, *d;
719*f0089e39SRichard Lowe
720*f0089e39SRichard Lowe h = host_addr;
721*f0089e39SRichard Lowe d = dev_addr;
722*f0089e39SRichard Lowe
723*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
724*f0089e39SRichard Lowe for (; repcount; repcount--)
725*f0089e39SRichard Lowe *h++ = ddi_swap64(*d++);
726*f0089e39SRichard Lowe else
727*f0089e39SRichard Lowe for (; repcount; repcount--)
728*f0089e39SRichard Lowe *h++ = ddi_swap64(*d);
729*f0089e39SRichard Lowe }
730*f0089e39SRichard Lowe
731*f0089e39SRichard Lowe /*ARGSUSED*/
732*f0089e39SRichard Lowe 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)733*f0089e39SRichard Lowe i_ddi_vaddr_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
734*f0089e39SRichard Lowe uint8_t *dev_addr, size_t repcount, uint_t flags)
735*f0089e39SRichard Lowe {
736*f0089e39SRichard Lowe uint8_t *h, *d;
737*f0089e39SRichard Lowe
738*f0089e39SRichard Lowe h = host_addr;
739*f0089e39SRichard Lowe d = dev_addr;
740*f0089e39SRichard Lowe
741*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
742*f0089e39SRichard Lowe for (; repcount; repcount--)
743*f0089e39SRichard Lowe *d++ = *h++;
744*f0089e39SRichard Lowe else
745*f0089e39SRichard Lowe for (; repcount; repcount--)
746*f0089e39SRichard Lowe *d = *h++;
747*f0089e39SRichard Lowe }
748*f0089e39SRichard Lowe
749*f0089e39SRichard Lowe /*ARGSUSED*/
750*f0089e39SRichard Lowe 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)751*f0089e39SRichard Lowe i_ddi_vaddr_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
752*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
753*f0089e39SRichard Lowe {
754*f0089e39SRichard Lowe uint16_t *h, *d;
755*f0089e39SRichard Lowe
756*f0089e39SRichard Lowe h = host_addr;
757*f0089e39SRichard Lowe d = dev_addr;
758*f0089e39SRichard Lowe
759*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
760*f0089e39SRichard Lowe for (; repcount; repcount--)
761*f0089e39SRichard Lowe *d++ = *h++;
762*f0089e39SRichard Lowe else
763*f0089e39SRichard Lowe for (; repcount; repcount--)
764*f0089e39SRichard Lowe *d = *h++;
765*f0089e39SRichard Lowe }
766*f0089e39SRichard Lowe
767*f0089e39SRichard Lowe /*ARGSUSED*/
768*f0089e39SRichard Lowe 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)769*f0089e39SRichard Lowe i_ddi_vaddr_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
770*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
771*f0089e39SRichard Lowe {
772*f0089e39SRichard Lowe uint16_t *h, *d;
773*f0089e39SRichard Lowe
774*f0089e39SRichard Lowe h = host_addr;
775*f0089e39SRichard Lowe d = dev_addr;
776*f0089e39SRichard Lowe
777*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
778*f0089e39SRichard Lowe for (; repcount; repcount--)
779*f0089e39SRichard Lowe *d++ = ddi_swap16(*h++);
780*f0089e39SRichard Lowe else
781*f0089e39SRichard Lowe for (; repcount; repcount--)
782*f0089e39SRichard Lowe *d = ddi_swap16(*h++);
783*f0089e39SRichard Lowe }
784*f0089e39SRichard Lowe
785*f0089e39SRichard Lowe /*ARGSUSED*/
786*f0089e39SRichard Lowe 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)787*f0089e39SRichard Lowe i_ddi_io_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
788*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
789*f0089e39SRichard Lowe {
790*f0089e39SRichard Lowe uint16_t *h;
791*f0089e39SRichard Lowe uintptr_t port;
792*f0089e39SRichard Lowe
793*f0089e39SRichard Lowe h = host_addr;
794*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
795*f0089e39SRichard Lowe
796*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
797*f0089e39SRichard Lowe for (; repcount; repcount--, port += 2)
798*f0089e39SRichard Lowe outw(port, ddi_swap16(*h++));
799*f0089e39SRichard Lowe else
800*f0089e39SRichard Lowe for (; repcount; repcount--)
801*f0089e39SRichard Lowe outw(port, ddi_swap16(*h++));
802*f0089e39SRichard Lowe }
803*f0089e39SRichard Lowe
804*f0089e39SRichard Lowe /*ARGSUSED*/
805*f0089e39SRichard Lowe 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)806*f0089e39SRichard Lowe i_ddi_vaddr_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
807*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
808*f0089e39SRichard Lowe {
809*f0089e39SRichard Lowe uint32_t *h, *d;
810*f0089e39SRichard Lowe
811*f0089e39SRichard Lowe h = host_addr;
812*f0089e39SRichard Lowe d = dev_addr;
813*f0089e39SRichard Lowe
814*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
815*f0089e39SRichard Lowe for (; repcount; repcount--)
816*f0089e39SRichard Lowe *d++ = *h++;
817*f0089e39SRichard Lowe else
818*f0089e39SRichard Lowe for (; repcount; repcount--)
819*f0089e39SRichard Lowe *d = *h++;
820*f0089e39SRichard Lowe }
821*f0089e39SRichard Lowe
822*f0089e39SRichard Lowe /*ARGSUSED*/
823*f0089e39SRichard Lowe 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)824*f0089e39SRichard Lowe i_ddi_vaddr_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
825*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
826*f0089e39SRichard Lowe {
827*f0089e39SRichard Lowe uint32_t *h, *d;
828*f0089e39SRichard Lowe
829*f0089e39SRichard Lowe h = host_addr;
830*f0089e39SRichard Lowe d = dev_addr;
831*f0089e39SRichard Lowe
832*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
833*f0089e39SRichard Lowe for (; repcount; repcount--)
834*f0089e39SRichard Lowe *d++ = ddi_swap32(*h++);
835*f0089e39SRichard Lowe else
836*f0089e39SRichard Lowe for (; repcount; repcount--)
837*f0089e39SRichard Lowe *d = ddi_swap32(*h++);
838*f0089e39SRichard Lowe }
839*f0089e39SRichard Lowe
840*f0089e39SRichard Lowe /*ARGSUSED*/
841*f0089e39SRichard Lowe 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)842*f0089e39SRichard Lowe i_ddi_io_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
843*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
844*f0089e39SRichard Lowe {
845*f0089e39SRichard Lowe uint32_t *h;
846*f0089e39SRichard Lowe uintptr_t port;
847*f0089e39SRichard Lowe
848*f0089e39SRichard Lowe h = host_addr;
849*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
850*f0089e39SRichard Lowe
851*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
852*f0089e39SRichard Lowe for (; repcount; repcount--, port += 4)
853*f0089e39SRichard Lowe outl(port, ddi_swap32(*h++));
854*f0089e39SRichard Lowe else
855*f0089e39SRichard Lowe for (; repcount; repcount--)
856*f0089e39SRichard Lowe outl(port, ddi_swap32(*h++));
857*f0089e39SRichard Lowe }
858*f0089e39SRichard Lowe
859*f0089e39SRichard Lowe /*ARGSUSED*/
860*f0089e39SRichard Lowe 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)861*f0089e39SRichard Lowe i_ddi_vaddr_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
862*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
863*f0089e39SRichard Lowe {
864*f0089e39SRichard Lowe uint64_t *h, *d;
865*f0089e39SRichard Lowe
866*f0089e39SRichard Lowe h = host_addr;
867*f0089e39SRichard Lowe d = dev_addr;
868*f0089e39SRichard Lowe
869*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
870*f0089e39SRichard Lowe for (; repcount; repcount--)
871*f0089e39SRichard Lowe *d++ = *h++;
872*f0089e39SRichard Lowe else
873*f0089e39SRichard Lowe for (; repcount; repcount--)
874*f0089e39SRichard Lowe *d = *h++;
875*f0089e39SRichard Lowe }
876*f0089e39SRichard Lowe
877*f0089e39SRichard Lowe /*ARGSUSED*/
878*f0089e39SRichard Lowe 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)879*f0089e39SRichard Lowe i_ddi_vaddr_swap_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
880*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
881*f0089e39SRichard Lowe {
882*f0089e39SRichard Lowe uint64_t *h, *d;
883*f0089e39SRichard Lowe
884*f0089e39SRichard Lowe h = host_addr;
885*f0089e39SRichard Lowe d = dev_addr;
886*f0089e39SRichard Lowe
887*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
888*f0089e39SRichard Lowe for (; repcount; repcount--)
889*f0089e39SRichard Lowe *d++ = ddi_swap64(*h++);
890*f0089e39SRichard Lowe else
891*f0089e39SRichard Lowe for (; repcount; repcount--)
892*f0089e39SRichard Lowe *d = ddi_swap64(*h++);
893*f0089e39SRichard Lowe }
894*f0089e39SRichard Lowe
895*f0089e39SRichard Lowe /*ARGSUSED*/
896*f0089e39SRichard Lowe uint64_t
i_ddi_io_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)897*f0089e39SRichard Lowe i_ddi_io_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
898*f0089e39SRichard Lowe {
899*f0089e39SRichard Lowe panic("ddi_get64 from i/o space");
900*f0089e39SRichard Lowe /*NOTREACHED*/
901*f0089e39SRichard Lowe return (0);
902*f0089e39SRichard Lowe }
903*f0089e39SRichard Lowe
904*f0089e39SRichard Lowe /*ARGSUSED*/
905*f0089e39SRichard Lowe void
i_ddi_io_put64(ddi_acc_impl_t * hdlp,uint64_t * host_addr,uint64_t value)906*f0089e39SRichard Lowe i_ddi_io_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr, uint64_t value)
907*f0089e39SRichard Lowe {
908*f0089e39SRichard Lowe panic("ddi_put64 to i/o space");
909*f0089e39SRichard Lowe /*NOTREACHED*/
910*f0089e39SRichard Lowe }
911*f0089e39SRichard Lowe
912*f0089e39SRichard Lowe void
do_scan(ddi_acc_impl_t * hdlp)913*f0089e39SRichard Lowe do_scan(ddi_acc_impl_t *hdlp)
914*f0089e39SRichard Lowe {
915*f0089e39SRichard Lowe ddi_fm_error_t de;
916*f0089e39SRichard Lowe ndi_err_t *errp = (ndi_err_t *)hdlp->ahi_err;
917*f0089e39SRichard Lowe
918*f0089e39SRichard Lowe bzero(&de, sizeof (ddi_fm_error_t));
919*f0089e39SRichard Lowe de.fme_version = DDI_FME_VERSION;
920*f0089e39SRichard Lowe de.fme_ena = fm_ena_generate(0, FM_ENA_FMT1);
921*f0089e39SRichard Lowe de.fme_flag = DDI_FM_ERR_UNEXPECTED;
922*f0089e39SRichard Lowe
923*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_err_mutexp);
924*f0089e39SRichard Lowe hdlp->ahi_scan(hdlp->ahi_scan_dip, &de);
925*f0089e39SRichard Lowe if (de.fme_status != DDI_FM_OK) {
926*f0089e39SRichard Lowe errp->err_ena = de.fme_ena;
927*f0089e39SRichard Lowe errp->err_expected = de.fme_flag;
928*f0089e39SRichard Lowe errp->err_status = DDI_FM_NONFATAL;
929*f0089e39SRichard Lowe }
930*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_err_mutexp);
931*f0089e39SRichard Lowe }
932*f0089e39SRichard Lowe
933*f0089e39SRichard Lowe /*ARGSUSED*/
934*f0089e39SRichard Lowe uint8_t
i_ddi_prot_vaddr_get8(ddi_acc_impl_t * hdlp,uint8_t * addr)935*f0089e39SRichard Lowe i_ddi_prot_vaddr_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
936*f0089e39SRichard Lowe {
937*f0089e39SRichard Lowe uint8_t val;
938*f0089e39SRichard Lowe
939*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
940*f0089e39SRichard Lowe val = *addr;
941*f0089e39SRichard Lowe if (val == 0xff)
942*f0089e39SRichard Lowe do_scan(hdlp);
943*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
944*f0089e39SRichard Lowe
945*f0089e39SRichard Lowe return (val);
946*f0089e39SRichard Lowe }
947*f0089e39SRichard Lowe
948*f0089e39SRichard Lowe /*ARGSUSED*/
949*f0089e39SRichard Lowe uint16_t
i_ddi_prot_vaddr_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)950*f0089e39SRichard Lowe i_ddi_prot_vaddr_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
951*f0089e39SRichard Lowe {
952*f0089e39SRichard Lowe uint16_t val;
953*f0089e39SRichard Lowe
954*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
955*f0089e39SRichard Lowe val = *addr;
956*f0089e39SRichard Lowe if (val == 0xffff)
957*f0089e39SRichard Lowe do_scan(hdlp);
958*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
959*f0089e39SRichard Lowe
960*f0089e39SRichard Lowe return (val);
961*f0089e39SRichard Lowe }
962*f0089e39SRichard Lowe
963*f0089e39SRichard Lowe /*ARGSUSED*/
964*f0089e39SRichard Lowe uint32_t
i_ddi_prot_vaddr_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)965*f0089e39SRichard Lowe i_ddi_prot_vaddr_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
966*f0089e39SRichard Lowe {
967*f0089e39SRichard Lowe uint32_t val;
968*f0089e39SRichard Lowe
969*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
970*f0089e39SRichard Lowe val = *addr;
971*f0089e39SRichard Lowe if (val == 0xffffffff)
972*f0089e39SRichard Lowe do_scan(hdlp);
973*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
974*f0089e39SRichard Lowe
975*f0089e39SRichard Lowe return (val);
976*f0089e39SRichard Lowe }
977*f0089e39SRichard Lowe
978*f0089e39SRichard Lowe /*ARGSUSED*/
979*f0089e39SRichard Lowe uint64_t
i_ddi_prot_vaddr_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)980*f0089e39SRichard Lowe i_ddi_prot_vaddr_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
981*f0089e39SRichard Lowe {
982*f0089e39SRichard Lowe uint64_t val;
983*f0089e39SRichard Lowe
984*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
985*f0089e39SRichard Lowe val = *addr;
986*f0089e39SRichard Lowe if (val == 0xffffffffffffffff)
987*f0089e39SRichard Lowe do_scan(hdlp);
988*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
989*f0089e39SRichard Lowe
990*f0089e39SRichard Lowe return (val);
991*f0089e39SRichard Lowe }
992*f0089e39SRichard Lowe
993*f0089e39SRichard Lowe /*ARGSUSED*/
994*f0089e39SRichard Lowe uint8_t
i_ddi_prot_io_get8(ddi_acc_impl_t * hdlp,uint8_t * addr)995*f0089e39SRichard Lowe i_ddi_prot_io_get8(ddi_acc_impl_t *hdlp, uint8_t *addr)
996*f0089e39SRichard Lowe {
997*f0089e39SRichard Lowe uint8_t val;
998*f0089e39SRichard Lowe
999*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1000*f0089e39SRichard Lowe val = inb((uintptr_t)addr);
1001*f0089e39SRichard Lowe if (val == 0xff)
1002*f0089e39SRichard Lowe do_scan(hdlp);
1003*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1004*f0089e39SRichard Lowe
1005*f0089e39SRichard Lowe return (val);
1006*f0089e39SRichard Lowe }
1007*f0089e39SRichard Lowe
1008*f0089e39SRichard Lowe /*ARGSUSED*/
1009*f0089e39SRichard Lowe uint16_t
i_ddi_prot_io_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1010*f0089e39SRichard Lowe i_ddi_prot_io_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1011*f0089e39SRichard Lowe {
1012*f0089e39SRichard Lowe uint16_t val;
1013*f0089e39SRichard Lowe
1014*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1015*f0089e39SRichard Lowe val = inw((uintptr_t)addr);
1016*f0089e39SRichard Lowe if (val == 0xffff)
1017*f0089e39SRichard Lowe do_scan(hdlp);
1018*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1019*f0089e39SRichard Lowe
1020*f0089e39SRichard Lowe return (val);
1021*f0089e39SRichard Lowe }
1022*f0089e39SRichard Lowe
1023*f0089e39SRichard Lowe /*ARGSUSED*/
1024*f0089e39SRichard Lowe uint32_t
i_ddi_prot_io_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1025*f0089e39SRichard Lowe i_ddi_prot_io_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1026*f0089e39SRichard Lowe {
1027*f0089e39SRichard Lowe uint32_t val;
1028*f0089e39SRichard Lowe
1029*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1030*f0089e39SRichard Lowe val = inl((uintptr_t)addr);
1031*f0089e39SRichard Lowe if (val == 0xffffffff)
1032*f0089e39SRichard Lowe do_scan(hdlp);
1033*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1034*f0089e39SRichard Lowe
1035*f0089e39SRichard Lowe return (val);
1036*f0089e39SRichard Lowe }
1037*f0089e39SRichard Lowe
1038*f0089e39SRichard Lowe /*ARGSUSED*/
1039*f0089e39SRichard Lowe uint16_t
i_ddi_prot_vaddr_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1040*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1041*f0089e39SRichard Lowe {
1042*f0089e39SRichard Lowe uint16_t val;
1043*f0089e39SRichard Lowe
1044*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1045*f0089e39SRichard Lowe val = ddi_swap16(*addr);
1046*f0089e39SRichard Lowe if (val == 0xffff)
1047*f0089e39SRichard Lowe do_scan(hdlp);
1048*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1049*f0089e39SRichard Lowe
1050*f0089e39SRichard Lowe return (val);
1051*f0089e39SRichard Lowe }
1052*f0089e39SRichard Lowe
1053*f0089e39SRichard Lowe /*ARGSUSED*/
1054*f0089e39SRichard Lowe uint16_t
i_ddi_prot_io_swap_get16(ddi_acc_impl_t * hdlp,uint16_t * addr)1055*f0089e39SRichard Lowe i_ddi_prot_io_swap_get16(ddi_acc_impl_t *hdlp, uint16_t *addr)
1056*f0089e39SRichard Lowe {
1057*f0089e39SRichard Lowe uint16_t val;
1058*f0089e39SRichard Lowe
1059*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1060*f0089e39SRichard Lowe val = ddi_swap16(inw((uintptr_t)addr));
1061*f0089e39SRichard Lowe if (val == 0xffff)
1062*f0089e39SRichard Lowe do_scan(hdlp);
1063*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1064*f0089e39SRichard Lowe
1065*f0089e39SRichard Lowe return (val);
1066*f0089e39SRichard Lowe }
1067*f0089e39SRichard Lowe
1068*f0089e39SRichard Lowe /*ARGSUSED*/
1069*f0089e39SRichard Lowe uint32_t
i_ddi_prot_vaddr_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1070*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1071*f0089e39SRichard Lowe {
1072*f0089e39SRichard Lowe uint32_t val;
1073*f0089e39SRichard Lowe
1074*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1075*f0089e39SRichard Lowe val = ddi_swap32(*addr);
1076*f0089e39SRichard Lowe if (val == 0xffffffff)
1077*f0089e39SRichard Lowe do_scan(hdlp);
1078*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1079*f0089e39SRichard Lowe
1080*f0089e39SRichard Lowe return (val);
1081*f0089e39SRichard Lowe }
1082*f0089e39SRichard Lowe
1083*f0089e39SRichard Lowe /*ARGSUSED*/
1084*f0089e39SRichard Lowe uint32_t
i_ddi_prot_io_swap_get32(ddi_acc_impl_t * hdlp,uint32_t * addr)1085*f0089e39SRichard Lowe i_ddi_prot_io_swap_get32(ddi_acc_impl_t *hdlp, uint32_t *addr)
1086*f0089e39SRichard Lowe {
1087*f0089e39SRichard Lowe uint32_t val;
1088*f0089e39SRichard Lowe
1089*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1090*f0089e39SRichard Lowe val = ddi_swap32(inl((uintptr_t)addr));
1091*f0089e39SRichard Lowe if (val == 0xffffffff)
1092*f0089e39SRichard Lowe do_scan(hdlp);
1093*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1094*f0089e39SRichard Lowe
1095*f0089e39SRichard Lowe return (val);
1096*f0089e39SRichard Lowe }
1097*f0089e39SRichard Lowe
1098*f0089e39SRichard Lowe /*ARGSUSED*/
1099*f0089e39SRichard Lowe uint64_t
i_ddi_prot_vaddr_swap_get64(ddi_acc_impl_t * hdlp,uint64_t * addr)1100*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_get64(ddi_acc_impl_t *hdlp, uint64_t *addr)
1101*f0089e39SRichard Lowe {
1102*f0089e39SRichard Lowe uint64_t val;
1103*f0089e39SRichard Lowe
1104*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1105*f0089e39SRichard Lowe val = ddi_swap64(*addr);
1106*f0089e39SRichard Lowe if (val == 0xffffffffffffffff)
1107*f0089e39SRichard Lowe do_scan(hdlp);
1108*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1109*f0089e39SRichard Lowe
1110*f0089e39SRichard Lowe return (val);
1111*f0089e39SRichard Lowe }
1112*f0089e39SRichard Lowe
1113*f0089e39SRichard Lowe /*ARGSUSED*/
1114*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_put8(ddi_acc_impl_t * hdlp,uint8_t * addr,uint8_t value)1115*f0089e39SRichard Lowe i_ddi_prot_vaddr_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1116*f0089e39SRichard Lowe {
1117*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1118*f0089e39SRichard Lowe *addr = value;
1119*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1120*f0089e39SRichard Lowe }
1121*f0089e39SRichard Lowe
1122*f0089e39SRichard Lowe /*ARGSUSED*/
1123*f0089e39SRichard Lowe void
i_ddi_prot_io_put8(ddi_acc_impl_t * hdlp,uint8_t * addr,uint8_t value)1124*f0089e39SRichard Lowe i_ddi_prot_io_put8(ddi_acc_impl_t *hdlp, uint8_t *addr, uint8_t value)
1125*f0089e39SRichard Lowe {
1126*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1127*f0089e39SRichard Lowe outb((uintptr_t)addr, value);
1128*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1129*f0089e39SRichard Lowe }
1130*f0089e39SRichard Lowe
1131*f0089e39SRichard Lowe /*ARGSUSED*/
1132*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1133*f0089e39SRichard Lowe i_ddi_prot_vaddr_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1134*f0089e39SRichard Lowe {
1135*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1136*f0089e39SRichard Lowe *addr = value;
1137*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1138*f0089e39SRichard Lowe }
1139*f0089e39SRichard Lowe
1140*f0089e39SRichard Lowe /*ARGSUSED*/
1141*f0089e39SRichard Lowe void
i_ddi_prot_io_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1142*f0089e39SRichard Lowe i_ddi_prot_io_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1143*f0089e39SRichard Lowe {
1144*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1145*f0089e39SRichard Lowe outw((uintptr_t)addr, value);
1146*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1147*f0089e39SRichard Lowe }
1148*f0089e39SRichard Lowe
1149*f0089e39SRichard Lowe /*ARGSUSED*/
1150*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1151*f0089e39SRichard Lowe i_ddi_prot_vaddr_put32(ddi_acc_impl_t *hdlp, uint32_t *addr,
1152*f0089e39SRichard Lowe uint32_t value)
1153*f0089e39SRichard Lowe {
1154*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1155*f0089e39SRichard Lowe *addr = value;
1156*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1157*f0089e39SRichard Lowe }
1158*f0089e39SRichard Lowe
1159*f0089e39SRichard Lowe /*ARGSUSED*/
1160*f0089e39SRichard Lowe void
i_ddi_prot_io_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1161*f0089e39SRichard Lowe i_ddi_prot_io_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1162*f0089e39SRichard Lowe {
1163*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1164*f0089e39SRichard Lowe outl((uintptr_t)addr, value);
1165*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1166*f0089e39SRichard Lowe }
1167*f0089e39SRichard Lowe
1168*f0089e39SRichard Lowe /*ARGSUSED*/
1169*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)1170*f0089e39SRichard Lowe i_ddi_prot_vaddr_put64(ddi_acc_impl_t *hdlp, uint64_t *addr,
1171*f0089e39SRichard Lowe uint64_t value)
1172*f0089e39SRichard Lowe {
1173*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1174*f0089e39SRichard Lowe *addr = value;
1175*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1176*f0089e39SRichard Lowe }
1177*f0089e39SRichard Lowe
1178*f0089e39SRichard Lowe /*ARGSUSED*/
1179*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1180*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr,
1181*f0089e39SRichard Lowe uint16_t value)
1182*f0089e39SRichard Lowe {
1183*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1184*f0089e39SRichard Lowe *addr = ddi_swap16(value);
1185*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1186*f0089e39SRichard Lowe }
1187*f0089e39SRichard Lowe
1188*f0089e39SRichard Lowe /*ARGSUSED*/
1189*f0089e39SRichard Lowe void
i_ddi_prot_io_swap_put16(ddi_acc_impl_t * hdlp,uint16_t * addr,uint16_t value)1190*f0089e39SRichard Lowe i_ddi_prot_io_swap_put16(ddi_acc_impl_t *hdlp, uint16_t *addr, uint16_t value)
1191*f0089e39SRichard Lowe {
1192*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1193*f0089e39SRichard Lowe outw((uintptr_t)addr, ddi_swap16(value));
1194*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1195*f0089e39SRichard Lowe }
1196*f0089e39SRichard Lowe
1197*f0089e39SRichard Lowe /*ARGSUSED*/
1198*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1199*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr,
1200*f0089e39SRichard Lowe uint32_t value)
1201*f0089e39SRichard Lowe {
1202*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1203*f0089e39SRichard Lowe *addr = ddi_swap32(value);
1204*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1205*f0089e39SRichard Lowe }
1206*f0089e39SRichard Lowe
1207*f0089e39SRichard Lowe /*ARGSUSED*/
1208*f0089e39SRichard Lowe void
i_ddi_prot_io_swap_put32(ddi_acc_impl_t * hdlp,uint32_t * addr,uint32_t value)1209*f0089e39SRichard Lowe i_ddi_prot_io_swap_put32(ddi_acc_impl_t *hdlp, uint32_t *addr, uint32_t value)
1210*f0089e39SRichard Lowe {
1211*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1212*f0089e39SRichard Lowe outl((uintptr_t)addr, ddi_swap32(value));
1213*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1214*f0089e39SRichard Lowe }
1215*f0089e39SRichard Lowe
1216*f0089e39SRichard Lowe /*ARGSUSED*/
1217*f0089e39SRichard Lowe void
i_ddi_prot_vaddr_swap_put64(ddi_acc_impl_t * hdlp,uint64_t * addr,uint64_t value)1218*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_put64(ddi_acc_impl_t *hdlp, uint64_t *addr,
1219*f0089e39SRichard Lowe uint64_t value)
1220*f0089e39SRichard Lowe {
1221*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1222*f0089e39SRichard Lowe *addr = ddi_swap64(value);
1223*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1224*f0089e39SRichard Lowe }
1225*f0089e39SRichard Lowe
1226*f0089e39SRichard Lowe /*ARGSUSED*/
1227*f0089e39SRichard Lowe 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)1228*f0089e39SRichard Lowe i_ddi_prot_io_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1229*f0089e39SRichard Lowe uint8_t *dev_addr, size_t repcount, uint_t flags)
1230*f0089e39SRichard Lowe {
1231*f0089e39SRichard Lowe int fail = 0;
1232*f0089e39SRichard Lowe uint8_t *h;
1233*f0089e39SRichard Lowe uintptr_t port;
1234*f0089e39SRichard Lowe
1235*f0089e39SRichard Lowe h = host_addr;
1236*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1237*f0089e39SRichard Lowe
1238*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1239*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1240*f0089e39SRichard Lowe for (; repcount; repcount--, port++)
1241*f0089e39SRichard Lowe if ((*h++ = inb(port)) == 0xff)
1242*f0089e39SRichard Lowe fail = 1;
1243*f0089e39SRichard Lowe } else {
1244*f0089e39SRichard Lowe for (; repcount; repcount--)
1245*f0089e39SRichard Lowe if ((*h++ = inb(port)) == 0xff)
1246*f0089e39SRichard Lowe fail = 1;
1247*f0089e39SRichard Lowe }
1248*f0089e39SRichard Lowe if (fail == 1)
1249*f0089e39SRichard Lowe do_scan(hdlp);
1250*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1251*f0089e39SRichard Lowe }
1252*f0089e39SRichard Lowe
1253*f0089e39SRichard Lowe /*ARGSUSED*/
1254*f0089e39SRichard Lowe 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)1255*f0089e39SRichard Lowe i_ddi_prot_io_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1256*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1257*f0089e39SRichard Lowe {
1258*f0089e39SRichard Lowe int fail = 0;
1259*f0089e39SRichard Lowe uint16_t *h;
1260*f0089e39SRichard Lowe uintptr_t port;
1261*f0089e39SRichard Lowe
1262*f0089e39SRichard Lowe h = host_addr;
1263*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1264*f0089e39SRichard Lowe
1265*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1266*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1267*f0089e39SRichard Lowe for (; repcount; repcount--, port += 2)
1268*f0089e39SRichard Lowe if ((*h++ = inw(port)) == 0xffff)
1269*f0089e39SRichard Lowe fail = 1;
1270*f0089e39SRichard Lowe } else {
1271*f0089e39SRichard Lowe for (; repcount; repcount--)
1272*f0089e39SRichard Lowe if ((*h++ = inw(port)) == 0xffff)
1273*f0089e39SRichard Lowe fail = 1;
1274*f0089e39SRichard Lowe }
1275*f0089e39SRichard Lowe if (fail == 1)
1276*f0089e39SRichard Lowe do_scan(hdlp);
1277*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1278*f0089e39SRichard Lowe }
1279*f0089e39SRichard Lowe
1280*f0089e39SRichard Lowe /*ARGSUSED*/
1281*f0089e39SRichard Lowe 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)1282*f0089e39SRichard Lowe i_ddi_prot_io_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1283*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1284*f0089e39SRichard Lowe {
1285*f0089e39SRichard Lowe int fail = 0;
1286*f0089e39SRichard Lowe uint32_t *h;
1287*f0089e39SRichard Lowe uintptr_t port;
1288*f0089e39SRichard Lowe
1289*f0089e39SRichard Lowe h = host_addr;
1290*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1291*f0089e39SRichard Lowe
1292*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1293*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1294*f0089e39SRichard Lowe for (; repcount; repcount--, port += 4)
1295*f0089e39SRichard Lowe if ((*h++ = inl(port)) == 0xffffffff)
1296*f0089e39SRichard Lowe fail = 1;
1297*f0089e39SRichard Lowe } else {
1298*f0089e39SRichard Lowe for (; repcount; repcount--)
1299*f0089e39SRichard Lowe if ((*h++ = inl(port)) == 0xffffffff)
1300*f0089e39SRichard Lowe fail = 1;
1301*f0089e39SRichard Lowe }
1302*f0089e39SRichard Lowe if (fail == 1)
1303*f0089e39SRichard Lowe do_scan(hdlp);
1304*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1305*f0089e39SRichard Lowe }
1306*f0089e39SRichard Lowe
1307*f0089e39SRichard Lowe /*ARGSUSED*/
1308*f0089e39SRichard Lowe 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)1309*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_get8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1310*f0089e39SRichard Lowe uint8_t *dev_addr, size_t repcount, uint_t flags)
1311*f0089e39SRichard Lowe {
1312*f0089e39SRichard Lowe int fail = 0;
1313*f0089e39SRichard Lowe uint8_t *h, *d;
1314*f0089e39SRichard Lowe
1315*f0089e39SRichard Lowe h = host_addr;
1316*f0089e39SRichard Lowe d = dev_addr;
1317*f0089e39SRichard Lowe
1318*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1319*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1320*f0089e39SRichard Lowe for (; repcount; repcount--)
1321*f0089e39SRichard Lowe if ((*h++ = *d++) == 0xff)
1322*f0089e39SRichard Lowe fail = 1;
1323*f0089e39SRichard Lowe } else {
1324*f0089e39SRichard Lowe for (; repcount; repcount--)
1325*f0089e39SRichard Lowe if ((*h++ = *d) == 0xff)
1326*f0089e39SRichard Lowe fail = 1;
1327*f0089e39SRichard Lowe }
1328*f0089e39SRichard Lowe if (fail == 1)
1329*f0089e39SRichard Lowe do_scan(hdlp);
1330*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1331*f0089e39SRichard Lowe }
1332*f0089e39SRichard Lowe
1333*f0089e39SRichard Lowe /*ARGSUSED*/
1334*f0089e39SRichard Lowe 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)1335*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1336*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1337*f0089e39SRichard Lowe {
1338*f0089e39SRichard Lowe int fail = 0;
1339*f0089e39SRichard Lowe uint16_t *h, *d;
1340*f0089e39SRichard Lowe
1341*f0089e39SRichard Lowe h = host_addr;
1342*f0089e39SRichard Lowe d = dev_addr;
1343*f0089e39SRichard Lowe
1344*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1345*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1346*f0089e39SRichard Lowe for (; repcount; repcount--)
1347*f0089e39SRichard Lowe if ((*h++ = *d++) == 0xffff)
1348*f0089e39SRichard Lowe fail = 1;
1349*f0089e39SRichard Lowe } else {
1350*f0089e39SRichard Lowe for (; repcount; repcount--)
1351*f0089e39SRichard Lowe if ((*h++ = *d) == 0xffff)
1352*f0089e39SRichard Lowe fail = 1;
1353*f0089e39SRichard Lowe }
1354*f0089e39SRichard Lowe if (fail == 1)
1355*f0089e39SRichard Lowe do_scan(hdlp);
1356*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1357*f0089e39SRichard Lowe }
1358*f0089e39SRichard Lowe
1359*f0089e39SRichard Lowe /*ARGSUSED*/
1360*f0089e39SRichard Lowe 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)1361*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1362*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1363*f0089e39SRichard Lowe {
1364*f0089e39SRichard Lowe int fail = 0;
1365*f0089e39SRichard Lowe uint16_t *h, *d;
1366*f0089e39SRichard Lowe
1367*f0089e39SRichard Lowe h = host_addr;
1368*f0089e39SRichard Lowe d = dev_addr;
1369*f0089e39SRichard Lowe
1370*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1371*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1372*f0089e39SRichard Lowe for (; repcount; repcount--)
1373*f0089e39SRichard Lowe if ((*h++ = ddi_swap16(*d++)) == 0xffff)
1374*f0089e39SRichard Lowe fail = 1;
1375*f0089e39SRichard Lowe } else {
1376*f0089e39SRichard Lowe for (; repcount; repcount--)
1377*f0089e39SRichard Lowe if ((*h++ = ddi_swap16(*d)) == 0xffff)
1378*f0089e39SRichard Lowe fail = 1;
1379*f0089e39SRichard Lowe }
1380*f0089e39SRichard Lowe if (fail == 1)
1381*f0089e39SRichard Lowe do_scan(hdlp);
1382*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1383*f0089e39SRichard Lowe }
1384*f0089e39SRichard Lowe
1385*f0089e39SRichard Lowe /*ARGSUSED*/
1386*f0089e39SRichard Lowe 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)1387*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_get16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1388*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1389*f0089e39SRichard Lowe {
1390*f0089e39SRichard Lowe int fail = 0;
1391*f0089e39SRichard Lowe uint16_t *h;
1392*f0089e39SRichard Lowe uintptr_t port;
1393*f0089e39SRichard Lowe
1394*f0089e39SRichard Lowe h = host_addr;
1395*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1396*f0089e39SRichard Lowe
1397*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1398*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1399*f0089e39SRichard Lowe for (; repcount; repcount--, port += 2)
1400*f0089e39SRichard Lowe if ((*h++ = ddi_swap16(inw(port))) == 0xffff)
1401*f0089e39SRichard Lowe fail = 1;
1402*f0089e39SRichard Lowe } else {
1403*f0089e39SRichard Lowe for (; repcount; repcount--)
1404*f0089e39SRichard Lowe if ((*h++ = ddi_swap16(inw(port))) == 0xffff)
1405*f0089e39SRichard Lowe fail = 1;
1406*f0089e39SRichard Lowe }
1407*f0089e39SRichard Lowe if (fail == 1)
1408*f0089e39SRichard Lowe do_scan(hdlp);
1409*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1410*f0089e39SRichard Lowe }
1411*f0089e39SRichard Lowe
1412*f0089e39SRichard Lowe /*ARGSUSED*/
1413*f0089e39SRichard Lowe 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)1414*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1415*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1416*f0089e39SRichard Lowe {
1417*f0089e39SRichard Lowe int fail = 0;
1418*f0089e39SRichard Lowe uint32_t *h, *d;
1419*f0089e39SRichard Lowe
1420*f0089e39SRichard Lowe h = host_addr;
1421*f0089e39SRichard Lowe d = dev_addr;
1422*f0089e39SRichard Lowe
1423*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1424*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1425*f0089e39SRichard Lowe for (; repcount; repcount--)
1426*f0089e39SRichard Lowe if ((*h++ = *d++) == 0xffffffff)
1427*f0089e39SRichard Lowe fail = 1;
1428*f0089e39SRichard Lowe } else {
1429*f0089e39SRichard Lowe for (; repcount; repcount--)
1430*f0089e39SRichard Lowe if ((*h++ = *d) == 0xffffffff)
1431*f0089e39SRichard Lowe fail = 1;
1432*f0089e39SRichard Lowe }
1433*f0089e39SRichard Lowe if (fail == 1)
1434*f0089e39SRichard Lowe do_scan(hdlp);
1435*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1436*f0089e39SRichard Lowe }
1437*f0089e39SRichard Lowe
1438*f0089e39SRichard Lowe /*ARGSUSED*/
1439*f0089e39SRichard Lowe 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)1440*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1441*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1442*f0089e39SRichard Lowe {
1443*f0089e39SRichard Lowe int fail = 0;
1444*f0089e39SRichard Lowe uint32_t *h, *d;
1445*f0089e39SRichard Lowe
1446*f0089e39SRichard Lowe h = host_addr;
1447*f0089e39SRichard Lowe d = dev_addr;
1448*f0089e39SRichard Lowe
1449*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1450*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1451*f0089e39SRichard Lowe for (; repcount; repcount--)
1452*f0089e39SRichard Lowe if ((*h++ = ddi_swap32(*d++)) == 0xffffffff)
1453*f0089e39SRichard Lowe fail = 1;
1454*f0089e39SRichard Lowe } else {
1455*f0089e39SRichard Lowe for (; repcount; repcount--)
1456*f0089e39SRichard Lowe if ((*h++ = ddi_swap32(*d)) == 0xffffffff)
1457*f0089e39SRichard Lowe fail = 1;
1458*f0089e39SRichard Lowe }
1459*f0089e39SRichard Lowe if (fail == 1)
1460*f0089e39SRichard Lowe do_scan(hdlp);
1461*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1462*f0089e39SRichard Lowe }
1463*f0089e39SRichard Lowe
1464*f0089e39SRichard Lowe /*ARGSUSED*/
1465*f0089e39SRichard Lowe 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)1466*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_get32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1467*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1468*f0089e39SRichard Lowe {
1469*f0089e39SRichard Lowe int fail = 0;
1470*f0089e39SRichard Lowe uint32_t *h;
1471*f0089e39SRichard Lowe uintptr_t port;
1472*f0089e39SRichard Lowe
1473*f0089e39SRichard Lowe h = host_addr;
1474*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1475*f0089e39SRichard Lowe
1476*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1477*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1478*f0089e39SRichard Lowe for (; repcount; repcount--, port += 4)
1479*f0089e39SRichard Lowe if ((*h++ = ddi_swap32(inl(port))) == 0xffffffff)
1480*f0089e39SRichard Lowe fail = 1;
1481*f0089e39SRichard Lowe } else {
1482*f0089e39SRichard Lowe for (; repcount; repcount--)
1483*f0089e39SRichard Lowe if ((*h++ = ddi_swap32(inl(port))) == 0xffffffff)
1484*f0089e39SRichard Lowe fail = 1;
1485*f0089e39SRichard Lowe }
1486*f0089e39SRichard Lowe if (fail == 1)
1487*f0089e39SRichard Lowe do_scan(hdlp);
1488*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1489*f0089e39SRichard Lowe }
1490*f0089e39SRichard Lowe
1491*f0089e39SRichard Lowe /*ARGSUSED*/
1492*f0089e39SRichard Lowe 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)1493*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1494*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
1495*f0089e39SRichard Lowe {
1496*f0089e39SRichard Lowe int fail = 0;
1497*f0089e39SRichard Lowe uint64_t *h, *d;
1498*f0089e39SRichard Lowe
1499*f0089e39SRichard Lowe h = host_addr;
1500*f0089e39SRichard Lowe d = dev_addr;
1501*f0089e39SRichard Lowe
1502*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1503*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1504*f0089e39SRichard Lowe for (; repcount; repcount--)
1505*f0089e39SRichard Lowe if ((*h++ = *d++) == 0xffffffffffffffff)
1506*f0089e39SRichard Lowe fail = 1;
1507*f0089e39SRichard Lowe } else {
1508*f0089e39SRichard Lowe for (; repcount; repcount--)
1509*f0089e39SRichard Lowe if ((*h++ = *d) == 0xffffffffffffffff)
1510*f0089e39SRichard Lowe fail = 1;
1511*f0089e39SRichard Lowe }
1512*f0089e39SRichard Lowe if (fail == 1)
1513*f0089e39SRichard Lowe do_scan(hdlp);
1514*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1515*f0089e39SRichard Lowe }
1516*f0089e39SRichard Lowe
1517*f0089e39SRichard Lowe /*ARGSUSED*/
1518*f0089e39SRichard Lowe 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)1519*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1520*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
1521*f0089e39SRichard Lowe {
1522*f0089e39SRichard Lowe int fail = 0;
1523*f0089e39SRichard Lowe uint64_t *h, *d;
1524*f0089e39SRichard Lowe
1525*f0089e39SRichard Lowe h = host_addr;
1526*f0089e39SRichard Lowe d = dev_addr;
1527*f0089e39SRichard Lowe
1528*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1529*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR) {
1530*f0089e39SRichard Lowe for (; repcount; repcount--)
1531*f0089e39SRichard Lowe if ((*h++ = ddi_swap64(*d++)) == 0xffffffffffffffff)
1532*f0089e39SRichard Lowe fail = 1;
1533*f0089e39SRichard Lowe } else {
1534*f0089e39SRichard Lowe for (; repcount; repcount--)
1535*f0089e39SRichard Lowe if ((*h++ = ddi_swap64(*d)) == 0xffffffffffffffff)
1536*f0089e39SRichard Lowe fail = 1;
1537*f0089e39SRichard Lowe }
1538*f0089e39SRichard Lowe if (fail == 1)
1539*f0089e39SRichard Lowe do_scan(hdlp);
1540*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1541*f0089e39SRichard Lowe }
1542*f0089e39SRichard Lowe
1543*f0089e39SRichard Lowe /*ARGSUSED*/
1544*f0089e39SRichard Lowe 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)1545*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1546*f0089e39SRichard Lowe uint8_t *dev_addr, size_t repcount, uint_t flags)
1547*f0089e39SRichard Lowe {
1548*f0089e39SRichard Lowe uint8_t *h, *d;
1549*f0089e39SRichard Lowe
1550*f0089e39SRichard Lowe h = host_addr;
1551*f0089e39SRichard Lowe d = dev_addr;
1552*f0089e39SRichard Lowe
1553*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1554*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1555*f0089e39SRichard Lowe for (; repcount; repcount--)
1556*f0089e39SRichard Lowe *d++ = *h++;
1557*f0089e39SRichard Lowe else
1558*f0089e39SRichard Lowe for (; repcount; repcount--)
1559*f0089e39SRichard Lowe *d = *h++;
1560*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1561*f0089e39SRichard Lowe }
1562*f0089e39SRichard Lowe
1563*f0089e39SRichard Lowe /*ARGSUSED*/
1564*f0089e39SRichard Lowe 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)1565*f0089e39SRichard Lowe i_ddi_prot_io_rep_put8(ddi_acc_impl_t *hdlp, uint8_t *host_addr,
1566*f0089e39SRichard Lowe uint8_t *dev_addr, size_t repcount, uint_t flags)
1567*f0089e39SRichard Lowe {
1568*f0089e39SRichard Lowe uint8_t *h;
1569*f0089e39SRichard Lowe uintptr_t port;
1570*f0089e39SRichard Lowe
1571*f0089e39SRichard Lowe h = host_addr;
1572*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1573*f0089e39SRichard Lowe
1574*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1575*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1576*f0089e39SRichard Lowe for (; repcount; repcount--, port++)
1577*f0089e39SRichard Lowe outb(port, *h++);
1578*f0089e39SRichard Lowe else
1579*f0089e39SRichard Lowe for (; repcount; repcount--)
1580*f0089e39SRichard Lowe outb(port, *h++);
1581*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1582*f0089e39SRichard Lowe }
1583*f0089e39SRichard Lowe
1584*f0089e39SRichard Lowe /*ARGSUSED*/
1585*f0089e39SRichard Lowe 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)1586*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1587*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1588*f0089e39SRichard Lowe {
1589*f0089e39SRichard Lowe uint16_t *h, *d;
1590*f0089e39SRichard Lowe
1591*f0089e39SRichard Lowe h = host_addr;
1592*f0089e39SRichard Lowe d = dev_addr;
1593*f0089e39SRichard Lowe
1594*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1595*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1596*f0089e39SRichard Lowe for (; repcount; repcount--)
1597*f0089e39SRichard Lowe *d++ = *h++;
1598*f0089e39SRichard Lowe else
1599*f0089e39SRichard Lowe for (; repcount; repcount--)
1600*f0089e39SRichard Lowe *d = *h++;
1601*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1602*f0089e39SRichard Lowe }
1603*f0089e39SRichard Lowe
1604*f0089e39SRichard Lowe /*ARGSUSED*/
1605*f0089e39SRichard Lowe 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)1606*f0089e39SRichard Lowe i_ddi_prot_io_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1607*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1608*f0089e39SRichard Lowe {
1609*f0089e39SRichard Lowe uint16_t *h;
1610*f0089e39SRichard Lowe uintptr_t port;
1611*f0089e39SRichard Lowe
1612*f0089e39SRichard Lowe h = host_addr;
1613*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1614*f0089e39SRichard Lowe
1615*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1616*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1617*f0089e39SRichard Lowe for (; repcount; repcount--, port += 2)
1618*f0089e39SRichard Lowe outw(port, *h++);
1619*f0089e39SRichard Lowe else
1620*f0089e39SRichard Lowe for (; repcount; repcount--)
1621*f0089e39SRichard Lowe outw(port, *h++);
1622*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1623*f0089e39SRichard Lowe }
1624*f0089e39SRichard Lowe
1625*f0089e39SRichard Lowe /*ARGSUSED*/
1626*f0089e39SRichard Lowe 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)1627*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1628*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1629*f0089e39SRichard Lowe {
1630*f0089e39SRichard Lowe uint16_t *h, *d;
1631*f0089e39SRichard Lowe
1632*f0089e39SRichard Lowe h = host_addr;
1633*f0089e39SRichard Lowe d = dev_addr;
1634*f0089e39SRichard Lowe
1635*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1636*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1637*f0089e39SRichard Lowe for (; repcount; repcount--)
1638*f0089e39SRichard Lowe *d++ = ddi_swap16(*h++);
1639*f0089e39SRichard Lowe else
1640*f0089e39SRichard Lowe for (; repcount; repcount--)
1641*f0089e39SRichard Lowe *d = ddi_swap16(*h++);
1642*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1643*f0089e39SRichard Lowe }
1644*f0089e39SRichard Lowe
1645*f0089e39SRichard Lowe /*ARGSUSED*/
1646*f0089e39SRichard Lowe 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)1647*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_put16(ddi_acc_impl_t *hdlp, uint16_t *host_addr,
1648*f0089e39SRichard Lowe uint16_t *dev_addr, size_t repcount, uint_t flags)
1649*f0089e39SRichard Lowe {
1650*f0089e39SRichard Lowe uint16_t *h;
1651*f0089e39SRichard Lowe uintptr_t port;
1652*f0089e39SRichard Lowe
1653*f0089e39SRichard Lowe h = host_addr;
1654*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1655*f0089e39SRichard Lowe
1656*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1657*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1658*f0089e39SRichard Lowe for (; repcount; repcount--, port += 2)
1659*f0089e39SRichard Lowe outw(port, ddi_swap16(*h++));
1660*f0089e39SRichard Lowe else
1661*f0089e39SRichard Lowe for (; repcount; repcount--)
1662*f0089e39SRichard Lowe outw(port, ddi_swap16(*h++));
1663*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1664*f0089e39SRichard Lowe }
1665*f0089e39SRichard Lowe
1666*f0089e39SRichard Lowe /*ARGSUSED*/
1667*f0089e39SRichard Lowe 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)1668*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1669*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1670*f0089e39SRichard Lowe {
1671*f0089e39SRichard Lowe uint32_t *h, *d;
1672*f0089e39SRichard Lowe
1673*f0089e39SRichard Lowe h = host_addr;
1674*f0089e39SRichard Lowe d = dev_addr;
1675*f0089e39SRichard Lowe
1676*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1677*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1678*f0089e39SRichard Lowe for (; repcount; repcount--)
1679*f0089e39SRichard Lowe *d++ = *h++;
1680*f0089e39SRichard Lowe else
1681*f0089e39SRichard Lowe for (; repcount; repcount--)
1682*f0089e39SRichard Lowe *d = *h++;
1683*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1684*f0089e39SRichard Lowe }
1685*f0089e39SRichard Lowe
1686*f0089e39SRichard Lowe /*ARGSUSED*/
1687*f0089e39SRichard Lowe 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)1688*f0089e39SRichard Lowe i_ddi_prot_io_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1689*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1690*f0089e39SRichard Lowe {
1691*f0089e39SRichard Lowe uint32_t *h;
1692*f0089e39SRichard Lowe uintptr_t port;
1693*f0089e39SRichard Lowe
1694*f0089e39SRichard Lowe h = host_addr;
1695*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1696*f0089e39SRichard Lowe
1697*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1698*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1699*f0089e39SRichard Lowe for (; repcount; repcount--, port += 4)
1700*f0089e39SRichard Lowe outl(port, *h++);
1701*f0089e39SRichard Lowe else
1702*f0089e39SRichard Lowe for (; repcount; repcount--)
1703*f0089e39SRichard Lowe outl(port, *h++);
1704*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1705*f0089e39SRichard Lowe }
1706*f0089e39SRichard Lowe
1707*f0089e39SRichard Lowe /*ARGSUSED*/
1708*f0089e39SRichard Lowe 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)1709*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1710*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1711*f0089e39SRichard Lowe {
1712*f0089e39SRichard Lowe uint32_t *h, *d;
1713*f0089e39SRichard Lowe
1714*f0089e39SRichard Lowe h = host_addr;
1715*f0089e39SRichard Lowe d = dev_addr;
1716*f0089e39SRichard Lowe
1717*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1718*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1719*f0089e39SRichard Lowe for (; repcount; repcount--)
1720*f0089e39SRichard Lowe *d++ = ddi_swap32(*h++);
1721*f0089e39SRichard Lowe else
1722*f0089e39SRichard Lowe for (; repcount; repcount--)
1723*f0089e39SRichard Lowe *d = ddi_swap32(*h++);
1724*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1725*f0089e39SRichard Lowe }
1726*f0089e39SRichard Lowe
1727*f0089e39SRichard Lowe /*ARGSUSED*/
1728*f0089e39SRichard Lowe 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)1729*f0089e39SRichard Lowe i_ddi_prot_io_swap_rep_put32(ddi_acc_impl_t *hdlp, uint32_t *host_addr,
1730*f0089e39SRichard Lowe uint32_t *dev_addr, size_t repcount, uint_t flags)
1731*f0089e39SRichard Lowe {
1732*f0089e39SRichard Lowe uint32_t *h;
1733*f0089e39SRichard Lowe uintptr_t port;
1734*f0089e39SRichard Lowe
1735*f0089e39SRichard Lowe h = host_addr;
1736*f0089e39SRichard Lowe port = (uintptr_t)dev_addr;
1737*f0089e39SRichard Lowe
1738*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1739*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1740*f0089e39SRichard Lowe for (; repcount; repcount--, port += 4)
1741*f0089e39SRichard Lowe outl(port, ddi_swap32(*h++));
1742*f0089e39SRichard Lowe else
1743*f0089e39SRichard Lowe for (; repcount; repcount--)
1744*f0089e39SRichard Lowe outl(port, ddi_swap32(*h++));
1745*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1746*f0089e39SRichard Lowe }
1747*f0089e39SRichard Lowe
1748*f0089e39SRichard Lowe /*ARGSUSED*/
1749*f0089e39SRichard Lowe 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)1750*f0089e39SRichard Lowe i_ddi_prot_vaddr_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1751*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
1752*f0089e39SRichard Lowe {
1753*f0089e39SRichard Lowe uint64_t *h, *d;
1754*f0089e39SRichard Lowe
1755*f0089e39SRichard Lowe h = host_addr;
1756*f0089e39SRichard Lowe d = dev_addr;
1757*f0089e39SRichard Lowe
1758*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1759*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1760*f0089e39SRichard Lowe for (; repcount; repcount--)
1761*f0089e39SRichard Lowe *d++ = *h++;
1762*f0089e39SRichard Lowe else
1763*f0089e39SRichard Lowe for (; repcount; repcount--)
1764*f0089e39SRichard Lowe *d = *h++;
1765*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1766*f0089e39SRichard Lowe }
1767*f0089e39SRichard Lowe
1768*f0089e39SRichard Lowe /*ARGSUSED*/
1769*f0089e39SRichard Lowe 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)1770*f0089e39SRichard Lowe i_ddi_prot_vaddr_swap_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1771*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
1772*f0089e39SRichard Lowe {
1773*f0089e39SRichard Lowe uint64_t *h, *d;
1774*f0089e39SRichard Lowe
1775*f0089e39SRichard Lowe h = host_addr;
1776*f0089e39SRichard Lowe d = dev_addr;
1777*f0089e39SRichard Lowe
1778*f0089e39SRichard Lowe mutex_enter(hdlp->ahi_peekpoke_mutexp);
1779*f0089e39SRichard Lowe if (flags == DDI_DEV_AUTOINCR)
1780*f0089e39SRichard Lowe for (; repcount; repcount--)
1781*f0089e39SRichard Lowe *d++ = ddi_swap64(*h++);
1782*f0089e39SRichard Lowe else
1783*f0089e39SRichard Lowe for (; repcount; repcount--)
1784*f0089e39SRichard Lowe *d = ddi_swap64(*h++);
1785*f0089e39SRichard Lowe mutex_exit(hdlp->ahi_peekpoke_mutexp);
1786*f0089e39SRichard Lowe }
1787*f0089e39SRichard Lowe
1788*f0089e39SRichard Lowe void
ddi_io_rep_get8(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)1789*f0089e39SRichard Lowe ddi_io_rep_get8(ddi_acc_handle_t handle,
1790*f0089e39SRichard Lowe uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
1791*f0089e39SRichard Lowe {
1792*f0089e39SRichard Lowe (((ddi_acc_impl_t *)handle)->ahi_rep_get8)
1793*f0089e39SRichard Lowe ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1794*f0089e39SRichard Lowe repcount, DDI_DEV_NO_AUTOINCR);
1795*f0089e39SRichard Lowe }
1796*f0089e39SRichard Lowe
1797*f0089e39SRichard Lowe void
ddi_io_rep_get16(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)1798*f0089e39SRichard Lowe ddi_io_rep_get16(ddi_acc_handle_t handle,
1799*f0089e39SRichard Lowe uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
1800*f0089e39SRichard Lowe {
1801*f0089e39SRichard Lowe (((ddi_acc_impl_t *)handle)->ahi_rep_get16)
1802*f0089e39SRichard Lowe ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1803*f0089e39SRichard Lowe repcount, DDI_DEV_NO_AUTOINCR);
1804*f0089e39SRichard Lowe }
1805*f0089e39SRichard Lowe
1806*f0089e39SRichard Lowe void
ddi_io_rep_get32(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)1807*f0089e39SRichard Lowe ddi_io_rep_get32(ddi_acc_handle_t handle,
1808*f0089e39SRichard Lowe uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
1809*f0089e39SRichard Lowe {
1810*f0089e39SRichard Lowe (((ddi_acc_impl_t *)handle)->ahi_rep_get32)
1811*f0089e39SRichard Lowe ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1812*f0089e39SRichard Lowe repcount, DDI_DEV_NO_AUTOINCR);
1813*f0089e39SRichard Lowe }
1814*f0089e39SRichard Lowe
1815*f0089e39SRichard Lowe /*ARGSUSED*/
1816*f0089e39SRichard Lowe 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)1817*f0089e39SRichard Lowe i_ddi_io_rep_get64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1818*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
1819*f0089e39SRichard Lowe {
1820*f0089e39SRichard Lowe cmn_err(CE_PANIC, "ddi_rep_get64 from i/o space");
1821*f0089e39SRichard Lowe }
1822*f0089e39SRichard Lowe
1823*f0089e39SRichard Lowe void
ddi_io_rep_put8(ddi_acc_handle_t handle,uint8_t * host_addr,uint8_t * dev_addr,size_t repcount)1824*f0089e39SRichard Lowe ddi_io_rep_put8(ddi_acc_handle_t handle,
1825*f0089e39SRichard Lowe uint8_t *host_addr, uint8_t *dev_addr, size_t repcount)
1826*f0089e39SRichard Lowe {
1827*f0089e39SRichard Lowe (((ddi_acc_impl_t *)handle)->ahi_rep_put8)
1828*f0089e39SRichard Lowe ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1829*f0089e39SRichard Lowe repcount, DDI_DEV_NO_AUTOINCR);
1830*f0089e39SRichard Lowe }
1831*f0089e39SRichard Lowe
1832*f0089e39SRichard Lowe void
ddi_io_rep_put16(ddi_acc_handle_t handle,uint16_t * host_addr,uint16_t * dev_addr,size_t repcount)1833*f0089e39SRichard Lowe ddi_io_rep_put16(ddi_acc_handle_t handle,
1834*f0089e39SRichard Lowe uint16_t *host_addr, uint16_t *dev_addr, size_t repcount)
1835*f0089e39SRichard Lowe {
1836*f0089e39SRichard Lowe (((ddi_acc_impl_t *)handle)->ahi_rep_put16)
1837*f0089e39SRichard Lowe ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1838*f0089e39SRichard Lowe repcount, DDI_DEV_NO_AUTOINCR);
1839*f0089e39SRichard Lowe }
1840*f0089e39SRichard Lowe
1841*f0089e39SRichard Lowe void
ddi_io_rep_put32(ddi_acc_handle_t handle,uint32_t * host_addr,uint32_t * dev_addr,size_t repcount)1842*f0089e39SRichard Lowe ddi_io_rep_put32(ddi_acc_handle_t handle,
1843*f0089e39SRichard Lowe uint32_t *host_addr, uint32_t *dev_addr, size_t repcount)
1844*f0089e39SRichard Lowe {
1845*f0089e39SRichard Lowe (((ddi_acc_impl_t *)handle)->ahi_rep_put32)
1846*f0089e39SRichard Lowe ((ddi_acc_impl_t *)handle, host_addr, dev_addr,
1847*f0089e39SRichard Lowe repcount, DDI_DEV_NO_AUTOINCR);
1848*f0089e39SRichard Lowe }
1849*f0089e39SRichard Lowe
1850*f0089e39SRichard Lowe /*ARGSUSED*/
1851*f0089e39SRichard Lowe 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)1852*f0089e39SRichard Lowe i_ddi_io_rep_put64(ddi_acc_impl_t *hdlp, uint64_t *host_addr,
1853*f0089e39SRichard Lowe uint64_t *dev_addr, size_t repcount, uint_t flags)
1854*f0089e39SRichard Lowe {
1855*f0089e39SRichard Lowe cmn_err(CE_PANIC, "ddi_rep_put64 to i/o space");
1856*f0089e39SRichard Lowe }
1857*f0089e39SRichard Lowe
1858*f0089e39SRichard Lowe /*
1859*f0089e39SRichard Lowe * These next two functions could be translated into assembler someday
1860*f0089e39SRichard Lowe */
1861*f0089e39SRichard Lowe int
ddi_check_acc_handle(ddi_acc_handle_t handle)1862*f0089e39SRichard Lowe ddi_check_acc_handle(ddi_acc_handle_t handle)
1863*f0089e39SRichard Lowe {
1864*f0089e39SRichard Lowe ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
1865*f0089e39SRichard Lowe return (((*hdlp->ahi_fault_check)(hdlp) == DDI_SUCCESS) ? DDI_SUCCESS :
1866*f0089e39SRichard Lowe DDI_FAILURE);
1867*f0089e39SRichard Lowe }
1868*f0089e39SRichard Lowe
1869*f0089e39SRichard Lowe int
i_ddi_acc_fault_check(ddi_acc_impl_t * hdlp)1870*f0089e39SRichard Lowe i_ddi_acc_fault_check(ddi_acc_impl_t *hdlp)
1871*f0089e39SRichard Lowe {
1872*f0089e39SRichard Lowe /* Default version, just returns flag value */
1873*f0089e39SRichard Lowe return (hdlp->ahi_fault);
1874*f0089e39SRichard Lowe }
1875*f0089e39SRichard Lowe
1876*f0089e39SRichard Lowe /*ARGSUSED*/
1877*f0089e39SRichard Lowe void
i_ddi_acc_fault_notify(ddi_acc_impl_t * hdlp)1878*f0089e39SRichard Lowe i_ddi_acc_fault_notify(ddi_acc_impl_t *hdlp)
1879*f0089e39SRichard Lowe {
1880*f0089e39SRichard Lowe /* Default version, does nothing for now */
1881*f0089e39SRichard Lowe }
1882*f0089e39SRichard Lowe
1883*f0089e39SRichard Lowe void
i_ddi_acc_set_fault(ddi_acc_handle_t handle)1884*f0089e39SRichard Lowe i_ddi_acc_set_fault(ddi_acc_handle_t handle)
1885*f0089e39SRichard Lowe {
1886*f0089e39SRichard Lowe ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
1887*f0089e39SRichard Lowe
1888*f0089e39SRichard Lowe if (!hdlp->ahi_fault) {
1889*f0089e39SRichard Lowe hdlp->ahi_fault = 1;
1890*f0089e39SRichard Lowe (*hdlp->ahi_fault_notify)(hdlp);
1891*f0089e39SRichard Lowe }
1892*f0089e39SRichard Lowe }
1893*f0089e39SRichard Lowe
1894*f0089e39SRichard Lowe void
i_ddi_acc_clr_fault(ddi_acc_handle_t handle)1895*f0089e39SRichard Lowe i_ddi_acc_clr_fault(ddi_acc_handle_t handle)
1896*f0089e39SRichard Lowe {
1897*f0089e39SRichard Lowe ddi_acc_impl_t *hdlp = (ddi_acc_impl_t *)handle;
1898*f0089e39SRichard Lowe
1899*f0089e39SRichard Lowe if (hdlp->ahi_fault) {
1900*f0089e39SRichard Lowe hdlp->ahi_fault = 0;
1901*f0089e39SRichard Lowe (*hdlp->ahi_fault_notify)(hdlp);
1902*f0089e39SRichard Lowe }
1903*f0089e39SRichard Lowe }
1904