xref: /titanic_51/usr/src/uts/intel/sys/iommulib.h (revision 20906b23a341979b80c2e40ac68778cd082f5458)
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