Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/uapi/drm/ethosu_accel.h
38186 views
1
/* SPDX-License-Identifier: MIT */
2
/* Copyright (C) 2025 Arm, Ltd. */
3
#ifndef _ETHOSU_DRM_H_
4
#define _ETHOSU_DRM_H_
5
6
#include "drm.h"
7
8
#if defined(__cplusplus)
9
extern "C" {
10
#endif
11
12
/**
13
* DOC: IOCTL IDs
14
*
15
* enum drm_ethosu_ioctl_id - IOCTL IDs
16
*
17
* Place new ioctls at the end, don't re-order, don't replace or remove entries.
18
*
19
* These IDs are not meant to be used directly. Use the DRM_IOCTL_ETHOSU_xxx
20
* definitions instead.
21
*/
22
enum drm_ethosu_ioctl_id {
23
/** @DRM_ETHOSU_DEV_QUERY: Query device information. */
24
DRM_ETHOSU_DEV_QUERY = 0,
25
26
/** @DRM_ETHOSU_BO_CREATE: Create a buffer object. */
27
DRM_ETHOSU_BO_CREATE,
28
29
/** @DRM_ETHOSU_BO_WAIT: Wait on a buffer object's fence. */
30
DRM_ETHOSU_BO_WAIT,
31
32
/**
33
* @DRM_ETHOSU_BO_MMAP_OFFSET: Get the file offset to pass to
34
* mmap to map a GEM object.
35
*/
36
DRM_ETHOSU_BO_MMAP_OFFSET,
37
38
/**
39
* @DRM_ETHOSU_CMDSTREAM_BO_CREATE: Create a command stream buffer
40
* object.
41
*/
42
DRM_ETHOSU_CMDSTREAM_BO_CREATE,
43
44
/** @DRM_ETHOSU_SUBMIT: Submit a job and BOs to run. */
45
DRM_ETHOSU_SUBMIT,
46
};
47
48
/**
49
* DOC: IOCTL arguments
50
*/
51
52
/**
53
* enum drm_ethosu_dev_query_type - Query type
54
*
55
* Place new types at the end, don't re-order, don't remove or replace.
56
*/
57
enum drm_ethosu_dev_query_type {
58
/** @DRM_ETHOSU_DEV_QUERY_NPU_INFO: Query NPU information. */
59
DRM_ETHOSU_DEV_QUERY_NPU_INFO = 0,
60
};
61
62
/**
63
* struct drm_ethosu_gpu_info - NPU information
64
*
65
* Structure grouping all queryable information relating to the NPU.
66
*/
67
struct drm_ethosu_npu_info {
68
/** @id : NPU ID. */
69
__u32 id;
70
#define DRM_ETHOSU_ARCH_MAJOR(x) ((x) >> 28)
71
#define DRM_ETHOSU_ARCH_MINOR(x) (((x) >> 20) & 0xff)
72
#define DRM_ETHOSU_ARCH_PATCH(x) (((x) >> 16) & 0xf)
73
#define DRM_ETHOSU_PRODUCT_MAJOR(x) (((x) >> 12) & 0xf)
74
#define DRM_ETHOSU_VERSION_MAJOR(x) (((x) >> 8) & 0xf)
75
#define DRM_ETHOSU_VERSION_MINOR(x) (((x) >> 4) & 0xff)
76
#define DRM_ETHOSU_VERSION_STATUS(x) ((x) & 0xf)
77
78
/** @gpu_rev: GPU revision. */
79
__u32 config;
80
81
__u32 sram_size;
82
};
83
84
/**
85
* struct drm_ethosu_dev_query - Arguments passed to DRM_ETHOSU_IOCTL_DEV_QUERY
86
*/
87
struct drm_ethosu_dev_query {
88
/** @type: the query type (see drm_ethosu_dev_query_type). */
89
__u32 type;
90
91
/**
92
* @size: size of the type being queried.
93
*
94
* If pointer is NULL, size is updated by the driver to provide the
95
* output structure size. If pointer is not NULL, the driver will
96
* only copy min(size, actual_structure_size) bytes to the pointer,
97
* and update the size accordingly. This allows us to extend query
98
* types without breaking userspace.
99
*/
100
__u32 size;
101
102
/**
103
* @pointer: user pointer to a query type struct.
104
*
105
* Pointer can be NULL, in which case, nothing is copied, but the
106
* actual structure size is returned. If not NULL, it must point to
107
* a location that's large enough to hold size bytes.
108
*/
109
__u64 pointer;
110
};
111
112
/**
113
* enum drm_ethosu_bo_flags - Buffer object flags, passed at creation time.
114
*/
115
enum drm_ethosu_bo_flags {
116
/**
117
* @DRM_ETHOSU_BO_NO_MMAP: The buffer object will never be CPU-mapped
118
* in userspace.
119
*/
120
DRM_ETHOSU_BO_NO_MMAP = (1 << 0),
121
};
122
123
/**
124
* struct drm_ethosu_bo_create - Arguments passed to DRM_IOCTL_ETHOSU_BO_CREATE.
125
*/
126
struct drm_ethosu_bo_create {
127
/**
128
* @size: Requested size for the object
129
*
130
* The (page-aligned) allocated size for the object will be returned.
131
*/
132
__u64 size;
133
134
/**
135
* @flags: Flags. Must be a combination of drm_ethosu_bo_flags flags.
136
*/
137
__u32 flags;
138
139
/**
140
* @handle: Returned handle for the object.
141
*
142
* Object handles are nonzero.
143
*/
144
__u32 handle;
145
};
146
147
/**
148
* struct drm_ethosu_bo_mmap_offset - Arguments passed to DRM_IOCTL_ETHOSU_BO_MMAP_OFFSET.
149
*/
150
struct drm_ethosu_bo_mmap_offset {
151
/** @handle: Handle of the object we want an mmap offset for. */
152
__u32 handle;
153
154
/** @pad: MBZ. */
155
__u32 pad;
156
157
/** @offset: The fake offset to use for subsequent mmap calls. */
158
__u64 offset;
159
};
160
161
/**
162
* struct drm_ethosu_wait_bo - ioctl argument for waiting for
163
* completion of the last DRM_ETHOSU_SUBMIT on a BO.
164
*
165
* This is useful for cases where multiple processes might be
166
* rendering to a BO and you want to wait for all rendering to be
167
* completed.
168
*/
169
struct drm_ethosu_bo_wait {
170
__u32 handle;
171
__u32 pad;
172
__s64 timeout_ns; /* absolute */
173
};
174
175
struct drm_ethosu_cmdstream_bo_create {
176
/* Size of the data argument. */
177
__u32 size;
178
179
/* Flags, currently must be 0. */
180
__u32 flags;
181
182
/* Pointer to the data. */
183
__u64 data;
184
185
/** Returned GEM handle for the BO. */
186
__u32 handle;
187
188
/* Pad, must be 0. */
189
__u32 pad;
190
};
191
192
/**
193
* struct drm_ethosu_job - A job to be run on the NPU
194
*
195
* The kernel will schedule the execution of this job taking into account its
196
* dependencies with other jobs. All tasks in the same job will be executed
197
* sequentially on the same core, to benefit from memory residency in SRAM.
198
*/
199
struct drm_ethosu_job {
200
/** Input: BO handle for cmdstream. */
201
__u32 cmd_bo;
202
203
/** Input: Amount of SRAM to use. */
204
__u32 sram_size;
205
206
#define ETHOSU_MAX_REGIONS 8
207
/** Input: Array of BO handles for each region. */
208
__u32 region_bo_handles[ETHOSU_MAX_REGIONS];
209
};
210
211
/**
212
* struct drm_ethosu_submit - ioctl argument for submitting commands to the NPU.
213
*
214
* The kernel will schedule the execution of these jobs in dependency order.
215
*/
216
struct drm_ethosu_submit {
217
/** Input: Pointer to an array of struct drm_ethosu_job. */
218
__u64 jobs;
219
220
/** Input: Number of jobs passed in. */
221
__u32 job_count;
222
223
/** Reserved, must be zero. */
224
__u32 pad;
225
};
226
227
/**
228
* DRM_IOCTL_ETHOSU() - Build a ethosu IOCTL number
229
* @__access: Access type. Must be R, W or RW.
230
* @__id: One of the DRM_ETHOSU_xxx id.
231
* @__type: Suffix of the type being passed to the IOCTL.
232
*
233
* Don't use this macro directly, use the DRM_IOCTL_ETHOSU_xxx
234
* values instead.
235
*
236
* Return: An IOCTL number to be passed to ioctl() from userspace.
237
*/
238
#define DRM_IOCTL_ETHOSU(__access, __id, __type) \
239
DRM_IO ## __access(DRM_COMMAND_BASE + DRM_ETHOSU_ ## __id, \
240
struct drm_ethosu_ ## __type)
241
242
enum {
243
DRM_IOCTL_ETHOSU_DEV_QUERY =
244
DRM_IOCTL_ETHOSU(WR, DEV_QUERY, dev_query),
245
DRM_IOCTL_ETHOSU_BO_CREATE =
246
DRM_IOCTL_ETHOSU(WR, BO_CREATE, bo_create),
247
DRM_IOCTL_ETHOSU_BO_WAIT =
248
DRM_IOCTL_ETHOSU(WR, BO_WAIT, bo_wait),
249
DRM_IOCTL_ETHOSU_BO_MMAP_OFFSET =
250
DRM_IOCTL_ETHOSU(WR, BO_MMAP_OFFSET, bo_mmap_offset),
251
DRM_IOCTL_ETHOSU_CMDSTREAM_BO_CREATE =
252
DRM_IOCTL_ETHOSU(WR, CMDSTREAM_BO_CREATE, cmdstream_bo_create),
253
DRM_IOCTL_ETHOSU_SUBMIT =
254
DRM_IOCTL_ETHOSU(WR, SUBMIT, submit),
255
};
256
257
#if defined(__cplusplus)
258
}
259
#endif
260
261
#endif /* _ETHOSU_DRM_H_ */
262
263