1*20906b23SVikram Hegde /* 2*20906b23SVikram Hegde * CDDL HEADER START 3*20906b23SVikram Hegde * 4*20906b23SVikram Hegde * The contents of this file are subject to the terms of the 5*20906b23SVikram Hegde * Common Development and Distribution License (the "License"). 6*20906b23SVikram Hegde * You may not use this file except in compliance with the License. 7*20906b23SVikram Hegde * 8*20906b23SVikram Hegde * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*20906b23SVikram Hegde * or http://www.opensolaris.org/os/licensing. 10*20906b23SVikram Hegde * See the License for the specific language governing permissions 11*20906b23SVikram Hegde * and limitations under the License. 12*20906b23SVikram Hegde * 13*20906b23SVikram Hegde * When distributing Covered Code, include this CDDL HEADER in each 14*20906b23SVikram Hegde * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*20906b23SVikram Hegde * If applicable, add the following below this CDDL HEADER, with the 16*20906b23SVikram Hegde * fields enclosed by brackets "[]" replaced with your own identifying 17*20906b23SVikram Hegde * information: Portions Copyright [yyyy] [name of copyright owner] 18*20906b23SVikram Hegde * 19*20906b23SVikram Hegde * CDDL HEADER END 20*20906b23SVikram Hegde */ 21*20906b23SVikram Hegde /* 22*20906b23SVikram Hegde * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23*20906b23SVikram Hegde * Use is subject to license terms. 24*20906b23SVikram Hegde */ 25*20906b23SVikram Hegde 26*20906b23SVikram Hegde #ifndef _SYS_IOMMULIB_H 27*20906b23SVikram Hegde #define _SYS_IOMMULIB_H 28*20906b23SVikram Hegde 29*20906b23SVikram Hegde #pragma ident "@(#)iommulib.h 1.3 08/08/31 SMI" 30*20906b23SVikram Hegde 31*20906b23SVikram Hegde #ifdef __cplusplus 32*20906b23SVikram Hegde extern "C" { 33*20906b23SVikram Hegde #endif 34*20906b23SVikram Hegde 35*20906b23SVikram Hegde #include <sys/ddi_impldefs.h> 36*20906b23SVikram Hegde 37*20906b23SVikram Hegde #ifdef _KERNEL 38*20906b23SVikram Hegde 39*20906b23SVikram Hegde typedef enum { 40*20906b23SVikram Hegde INVALID_VENDOR = 0, 41*20906b23SVikram Hegde AMD_IOMMU, 42*20906b23SVikram Hegde INTEL_IOMMU 43*20906b23SVikram Hegde } iommulib_vendor_t; 44*20906b23SVikram Hegde 45*20906b23SVikram Hegde typedef enum { 46*20906b23SVikram Hegde IOMMU_OPS_VERSION_INVALID = 0, 47*20906b23SVikram Hegde IOMMU_OPS_VERSION_1 = 1 48*20906b23SVikram Hegde } iommulib_opsversion_t; 49*20906b23SVikram Hegde 50*20906b23SVikram Hegde #define IOMMU_OPS_VERSION IOMMU_OPS_VERSION_1 51*20906b23SVikram Hegde 52*20906b23SVikram Hegde typedef struct iommulib_ops { 53*20906b23SVikram Hegde iommulib_opsversion_t ilops_vers; 54*20906b23SVikram Hegde iommulib_vendor_t ilops_vendor; 55*20906b23SVikram Hegde char *ilops_id; 56*20906b23SVikram Hegde void *ilops_data; 57*20906b23SVikram Hegde 58*20906b23SVikram Hegde int (*ilops_probe)(dev_info_t *rdip); 59*20906b23SVikram Hegde 60*20906b23SVikram Hegde int (*ilops_dma_allochdl)(iommulib_handle_t handle, 61*20906b23SVikram Hegde dev_info_t *dip, dev_info_t *rdip, ddi_dma_attr_t *attr, 62*20906b23SVikram Hegde int (*waitfp)(caddr_t), caddr_t arg, ddi_dma_handle_t *dma_handlep); 63*20906b23SVikram Hegde 64*20906b23SVikram Hegde int (*ilops_dma_freehdl)(iommulib_handle_t handle, 65*20906b23SVikram Hegde dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t dma_handle); 66*20906b23SVikram Hegde 67*20906b23SVikram Hegde int (*ilops_dma_bindhdl)(iommulib_handle_t handle, dev_info_t *dip, 68*20906b23SVikram Hegde dev_info_t *rdip, ddi_dma_handle_t dma_handle, 69*20906b23SVikram Hegde struct ddi_dma_req *dmareq, ddi_dma_cookie_t *cookiep, 70*20906b23SVikram Hegde uint_t *ccountp); 71*20906b23SVikram Hegde 72*20906b23SVikram Hegde int (*ilops_dma_unbindhdl)(iommulib_handle_t handle, 73*20906b23SVikram Hegde dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t dma_handle); 74*20906b23SVikram Hegde 75*20906b23SVikram Hegde int (*ilops_dma_sync)(iommulib_handle_t handle, dev_info_t *dip, 76*20906b23SVikram Hegde dev_info_t *rdip, ddi_dma_handle_t dma_handle, off_t off, 77*20906b23SVikram Hegde size_t len, uint_t cache_flags); 78*20906b23SVikram Hegde 79*20906b23SVikram Hegde int (*ilops_dma_win)(iommulib_handle_t handle, dev_info_t *dip, 80*20906b23SVikram Hegde dev_info_t *rdip, ddi_dma_handle_t dma_handle, uint_t win, 81*20906b23SVikram Hegde off_t *offp, size_t *lenp, ddi_dma_cookie_t *cookiep, 82*20906b23SVikram Hegde uint_t *ccountp); 83*20906b23SVikram Hegde 84*20906b23SVikram Hegde 85*20906b23SVikram Hegde /* Obsolete DMA routines */ 86*20906b23SVikram Hegde 87*20906b23SVikram Hegde int (*ilops_dma_map)(iommulib_handle_t handle, dev_info_t *dip, 88*20906b23SVikram Hegde dev_info_t *rdip, struct ddi_dma_req *dmareq, 89*20906b23SVikram Hegde ddi_dma_handle_t *dma_handle); 90*20906b23SVikram Hegde 91*20906b23SVikram Hegde int (*ilops_dma_mctl)(iommulib_handle_t handle, dev_info_t *dip, 92*20906b23SVikram Hegde dev_info_t *rdip, ddi_dma_handle_t dma_handle, 93*20906b23SVikram Hegde enum ddi_dma_ctlops request, off_t *offp, size_t *lenp, 94*20906b23SVikram Hegde caddr_t *objpp, uint_t cache_flags); 95*20906b23SVikram Hegde 96*20906b23SVikram Hegde } iommulib_ops_t; 97*20906b23SVikram Hegde 98*20906b23SVikram Hegde #define IOMMU_USED(dip) (DEVI(dip)->devi_iommulib_handle != NULL) 99*20906b23SVikram Hegde 100*20906b23SVikram Hegde typedef enum { 101*20906b23SVikram Hegde IOMMU_NEXOPS_VERSION_INVALID = 0, 102*20906b23SVikram Hegde IOMMU_NEXOPS_VERSION_1 = 1 103*20906b23SVikram Hegde } iommulib_nexops_version_t; 104*20906b23SVikram Hegde 105*20906b23SVikram Hegde #define IOMMU_NEXOPS_VERSION IOMMU_NEXOPS_VERSION_1 106*20906b23SVikram Hegde 107*20906b23SVikram Hegde typedef struct iommulib_nexops { 108*20906b23SVikram Hegde iommulib_nexops_version_t nops_vers; 109*20906b23SVikram Hegde char *nops_id; 110*20906b23SVikram Hegde void *nops_data; 111*20906b23SVikram Hegde 112*20906b23SVikram Hegde int (*nops_dma_allochdl)(dev_info_t *dip, dev_info_t *rdip, 113*20906b23SVikram Hegde ddi_dma_attr_t *attr, int (*waitfp)(caddr_t), caddr_t arg, 114*20906b23SVikram Hegde ddi_dma_handle_t *handlep); 115*20906b23SVikram Hegde 116*20906b23SVikram Hegde int (*nops_dma_freehdl)(dev_info_t *dip, dev_info_t *rdip, 117*20906b23SVikram Hegde ddi_dma_handle_t handle); 118*20906b23SVikram Hegde 119*20906b23SVikram Hegde int (*nops_dma_bindhdl)(dev_info_t *dip, dev_info_t *rdip, 120*20906b23SVikram Hegde ddi_dma_handle_t handle, struct ddi_dma_req *dmareq, 121*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 122*20906b23SVikram Hegde 123*20906b23SVikram Hegde int (*nops_dma_unbindhdl)(dev_info_t *dip, dev_info_t *rdip, 124*20906b23SVikram Hegde ddi_dma_handle_t handle); 125*20906b23SVikram Hegde 126*20906b23SVikram Hegde void (*nops_dma_reset_cookies)(dev_info_t *dip, 127*20906b23SVikram Hegde ddi_dma_handle_t handle); 128*20906b23SVikram Hegde 129*20906b23SVikram Hegde int (*nops_dma_get_cookies)(dev_info_t *dip, ddi_dma_handle_t handle, 130*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 131*20906b23SVikram Hegde 132*20906b23SVikram Hegde int (*nops_dma_sync)(dev_info_t *dip, dev_info_t *rdip, 133*20906b23SVikram Hegde ddi_dma_handle_t handle, off_t off, size_t len, uint_t cache_flags); 134*20906b23SVikram Hegde 135*20906b23SVikram Hegde int (*nops_dma_win)(dev_info_t *dip, dev_info_t *rdip, 136*20906b23SVikram Hegde ddi_dma_handle_t handle, uint_t win, off_t *offp, size_t *lenp, 137*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 138*20906b23SVikram Hegde 139*20906b23SVikram Hegde int (*nops_dma_map)(dev_info_t *dip, dev_info_t *rdip, 140*20906b23SVikram Hegde struct ddi_dma_req *dmareq, ddi_dma_handle_t *handlep); 141*20906b23SVikram Hegde 142*20906b23SVikram Hegde int (*nops_dma_mctl)(dev_info_t *dip, dev_info_t *rdip, 143*20906b23SVikram Hegde ddi_dma_handle_t handle, enum ddi_dma_ctlops request, off_t *offp, 144*20906b23SVikram Hegde size_t *lenp, caddr_t *objpp, uint_t cache_flags); 145*20906b23SVikram Hegde } iommulib_nexops_t; 146*20906b23SVikram Hegde 147*20906b23SVikram Hegde struct iommulib_nex; 148*20906b23SVikram Hegde typedef struct iommulib_nex *iommulib_nexhandle_t; 149*20906b23SVikram Hegde 150*20906b23SVikram Hegde /* 151*20906b23SVikram Hegde * Interfaces for nexus drivers - typically rootnex 152*20906b23SVikram Hegde */ 153*20906b23SVikram Hegde 154*20906b23SVikram Hegde int iommulib_nexus_register(dev_info_t *dip, iommulib_nexops_t *nexops, 155*20906b23SVikram Hegde iommulib_nexhandle_t *handle); 156*20906b23SVikram Hegde 157*20906b23SVikram Hegde int iommulib_nexus_unregister(iommulib_nexhandle_t handle); 158*20906b23SVikram Hegde 159*20906b23SVikram Hegde int iommulib_nex_open(dev_info_t *rdip, uint_t *errorp); 160*20906b23SVikram Hegde void iommulib_nex_close(dev_info_t *rdip); 161*20906b23SVikram Hegde 162*20906b23SVikram Hegde int iommulib_nexdma_allochdl(dev_info_t *dip, dev_info_t *rdip, 163*20906b23SVikram Hegde ddi_dma_attr_t *attr, int (*waitfp)(caddr_t), 164*20906b23SVikram Hegde caddr_t arg, ddi_dma_handle_t *dma_handlep); 165*20906b23SVikram Hegde 166*20906b23SVikram Hegde int iommulib_nexdma_freehdl(dev_info_t *dip, dev_info_t *rdip, 167*20906b23SVikram Hegde ddi_dma_handle_t dma_handle); 168*20906b23SVikram Hegde 169*20906b23SVikram Hegde int iommulib_nexdma_bindhdl(dev_info_t *dip, dev_info_t *rdip, 170*20906b23SVikram Hegde ddi_dma_handle_t dma_handle, struct ddi_dma_req *dmareq, 171*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 172*20906b23SVikram Hegde 173*20906b23SVikram Hegde int iommulib_nexdma_unbindhdl(dev_info_t *dip, dev_info_t *rdip, 174*20906b23SVikram Hegde ddi_dma_handle_t dma_handle); 175*20906b23SVikram Hegde 176*20906b23SVikram Hegde int iommulib_nexdma_sync(dev_info_t *dip, dev_info_t *rdip, 177*20906b23SVikram Hegde ddi_dma_handle_t dma_handle, off_t off, size_t len, 178*20906b23SVikram Hegde uint_t cache_flags); 179*20906b23SVikram Hegde 180*20906b23SVikram Hegde int iommulib_nexdma_win(dev_info_t *dip, dev_info_t *rdip, 181*20906b23SVikram Hegde ddi_dma_handle_t dma_handle, uint_t win, off_t *offp, size_t *lenp, 182*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 183*20906b23SVikram Hegde 184*20906b23SVikram Hegde int iommulib_nexdma_map(dev_info_t *dip, dev_info_t *rdip, 185*20906b23SVikram Hegde struct ddi_dma_req *dmareq, ddi_dma_handle_t *dma_handle); 186*20906b23SVikram Hegde 187*20906b23SVikram Hegde int iommulib_nexdma_mctl(dev_info_t *dip, dev_info_t *rdip, 188*20906b23SVikram Hegde ddi_dma_handle_t dma_handle, enum ddi_dma_ctlops request, 189*20906b23SVikram Hegde off_t *offp, size_t *lenp, caddr_t *objpp, uint_t cache_flags); 190*20906b23SVikram Hegde 191*20906b23SVikram Hegde /* 192*20906b23SVikram Hegde * Interfaces for IOMMU drivers provided by IOMMULIB 193*20906b23SVikram Hegde */ 194*20906b23SVikram Hegde 195*20906b23SVikram Hegde int iommulib_iommu_register(dev_info_t *dip, iommulib_ops_t *ops, 196*20906b23SVikram Hegde iommulib_handle_t *handle); 197*20906b23SVikram Hegde 198*20906b23SVikram Hegde int iommulib_iommu_unregister(iommulib_handle_t handle); 199*20906b23SVikram Hegde 200*20906b23SVikram Hegde int iommulib_iommu_getunitid(iommulib_handle_t handle, uint64_t *unitidp); 201*20906b23SVikram Hegde 202*20906b23SVikram Hegde dev_info_t *iommulib_iommu_getdip(iommulib_handle_t handle); 203*20906b23SVikram Hegde 204*20906b23SVikram Hegde iommulib_ops_t *iommulib_iommu_getops(iommulib_handle_t handle); 205*20906b23SVikram Hegde 206*20906b23SVikram Hegde void *iommulib_iommu_getdata(iommulib_handle_t handle); 207*20906b23SVikram Hegde 208*20906b23SVikram Hegde 209*20906b23SVikram Hegde /* Interfaces for IOMMU drivers provided by NEXUS drivers (typically rootnex) */ 210*20906b23SVikram Hegde 211*20906b23SVikram Hegde int iommulib_iommu_dma_allochdl(dev_info_t *dip, dev_info_t *rdip, 212*20906b23SVikram Hegde ddi_dma_attr_t *attr, int (*waitfp)(caddr_t), caddr_t arg, 213*20906b23SVikram Hegde ddi_dma_handle_t *handlep); 214*20906b23SVikram Hegde 215*20906b23SVikram Hegde int iommulib_iommu_dma_freehdl(dev_info_t *dip, dev_info_t *rdip, 216*20906b23SVikram Hegde ddi_dma_handle_t handle); 217*20906b23SVikram Hegde 218*20906b23SVikram Hegde int iommulib_iommu_dma_bindhdl(dev_info_t *dip, dev_info_t *rdip, 219*20906b23SVikram Hegde ddi_dma_handle_t handle, struct ddi_dma_req *dmareq, 220*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 221*20906b23SVikram Hegde 222*20906b23SVikram Hegde int iommulib_iommu_dma_unbindhdl(dev_info_t *dip, dev_info_t *rdip, 223*20906b23SVikram Hegde ddi_dma_handle_t handle); 224*20906b23SVikram Hegde 225*20906b23SVikram Hegde void iommulib_iommu_dma_reset_cookies(dev_info_t *dip, ddi_dma_handle_t handle); 226*20906b23SVikram Hegde 227*20906b23SVikram Hegde int iommulib_iommu_dma_get_cookies(dev_info_t *dip, ddi_dma_handle_t handle, 228*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 229*20906b23SVikram Hegde 230*20906b23SVikram Hegde int iommulib_iommu_dma_sync(dev_info_t *dip, dev_info_t *rdip, 231*20906b23SVikram Hegde ddi_dma_handle_t handle, off_t off, size_t len, uint_t cache_flags); 232*20906b23SVikram Hegde 233*20906b23SVikram Hegde int iommulib_iommu_dma_win(dev_info_t *dip, dev_info_t *rdip, 234*20906b23SVikram Hegde ddi_dma_handle_t handle, uint_t win, off_t *offp, size_t *lenp, 235*20906b23SVikram Hegde ddi_dma_cookie_t *cookiep, uint_t *ccountp); 236*20906b23SVikram Hegde 237*20906b23SVikram Hegde int iommulib_iommu_dma_map(dev_info_t *dip, dev_info_t *rdip, 238*20906b23SVikram Hegde struct ddi_dma_req *dmareq, ddi_dma_handle_t *handlep); 239*20906b23SVikram Hegde 240*20906b23SVikram Hegde int iommulib_iommu_dma_mctl(dev_info_t *dip, dev_info_t *rdip, 241*20906b23SVikram Hegde ddi_dma_handle_t handle, enum ddi_dma_ctlops request, off_t *offp, 242*20906b23SVikram Hegde size_t *lenp, caddr_t *objpp, uint_t cache_flags); 243*20906b23SVikram Hegde 244*20906b23SVikram Hegde #endif /* _KERNEL */ 245*20906b23SVikram Hegde 246*20906b23SVikram Hegde #ifdef __cplusplus 247*20906b23SVikram Hegde } 248*20906b23SVikram Hegde #endif 249*20906b23SVikram Hegde 250*20906b23SVikram Hegde #endif /* _SYS_IOMMULIB_H */ 251