blob: 2d631768494ecb7aa19685ac905b664aa29a7637 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_XSVC_H
#define _SYS_XSVC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/avl.h>
#include <sys/types.h>
/* xsvc ioctls */
#define XSVCIOC ('Q'<< 8)
#define XSVC_ALLOC_MEM (XSVCIOC | 130)
#define XSVC_FREE_MEM (XSVCIOC | 131)
#define XSVC_FLUSH_MEM (XSVCIOC | 132)
/* arg * struct for ioctls */
typedef struct _xsvc_mem_req {
int xsvc_mem_reqid; /* request ID */
uint64_t xsvc_mem_addr_lo; /* low DMA address range */
uint64_t xsvc_mem_addr_hi; /* high DMA address range */
uint64_t xsvc_mem_align; /* DMA address alignment */
int xsvc_mem_sgllen; /* s/g length */
size_t xsvc_mem_size; /* length of mem in bytes */
void *xsvc_sg_list; /* returned scatter gather list */
} xsvc_mem_req;
/* xsvc_sg_list format */
typedef struct _xsvc_mloc {
uint64_t mloc_addr;
size_t mloc_size;
} xsvc_mloc;
#ifdef _KERNEL
/* *** Driver Private Below *** */
/* arg * struct for ioctls from 32-bit app in 64-bit kernel */
#pragma pack(1)
typedef struct _xsvc_mem_req_32 {
int xsvc_mem_reqid; /* request ID */
uint64_t xsvc_mem_addr_lo; /* low DMA address range */
uint64_t xsvc_mem_addr_hi; /* high DMA address range */
uint64_t xsvc_mem_align; /* DMA address alignment */
int xsvc_mem_sgllen; /* s/g length */
uint32_t xsvc_mem_size; /* length of mem in bytes */
uint32_t xsvc_sg_list; /* returned scatter gather list */
} xsvc_mem_req_32;
#pragma pack()
/* xsvc_sg_list format */
#pragma pack(1)
typedef struct _xsvc_mloc_32 {
uint64_t mloc_addr;
uint32_t mloc_size;
} xsvc_mloc_32;
#pragma pack()
/* avl node */
typedef struct xsvc_mnode_s {
avl_node_t mn_link;
uint64_t mn_key;
struct xsvc_mem_s *mn_home;
} xsvc_mnode_t;
/* track memory allocs */
typedef struct xsvc_mem_s {
xsvc_mnode_t xm_mnode;
size_t xm_size;
caddr_t xm_addr;
size_t xm_real_length;
ddi_dma_handle_t xm_dma_handle;
ddi_acc_handle_t xm_mem_handle;
ddi_dma_attr_t xm_dma_attr;
ddi_device_acc_attr_t xm_device_attr;
uint_t xm_cookie_count;
ddi_dma_cookie_t xm_cookie;
} xsvc_mem_t;
/* list of memory allocs */
typedef struct xsvc_mlist_s {
kmutex_t ml_mutex;
avl_tree_t ml_avl;
} xsvc_mlist_t;
/* driver state */
typedef struct xsvc_state_s {
dev_info_t *xs_dip;
int xs_instance;
/*
* track total memory allocated, mutex only covers
* xs_currently_alloced
*/
kmutex_t xs_mutex;
uint64_t xs_currently_alloced;
kmutex_t xs_cookie_mutex;
xsvc_mlist_t xs_mlist;
} xsvc_state_t;
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_XSVC_H */
|