summaryrefslogtreecommitdiff
path: root/usr/src/uts/i86pc/sys/xsvc.h
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 */