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