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