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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
|
/*
* Tegra PVA Driver ioctls
*
* Copyright (c) 2016-2019, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __LINUX_NVHOST_PVA_IOCTL_H
#define __LINUX_NVHOST_PVA_IOCTL_H
#include <linux/ioctl.h>
#include <linux/types.h>
#include "nvdev_fence.h"
#if !defined(__KERNEL__)
#define __user
#endif
#define NVHOST_PVA_IOCTL_MAGIC 'P'
/**
* struct pva_characteristics_req - Request filling of characteristics struct
*
* @characteristics: pointer to be filled with characteristics
* @characteristics_size: size in bytes
* @characteristics_filled: reserved(set to zero)
*
*/
struct pva_characteristics_req {
__u64 characteristics;
__u64 characteristics_size;
__u64 characteristics_filled;
};
/**
* struct pva_characteristics - the information of the pva cluster
*
* @num_vpu: number of vpu per pva
* @vpu_generation: vpu hardware generation
* @num_queues: number of queues per pva
* @submit_mode: PVA submission mode
* @pva_r5_revision: PVA R5 firmware revision
* @pva_compat_version: Earliest version supporting the firmware
* @pva_revision: PVA revision
* @pva_built_on: Firmware build information
*
*/
struct pva_characteristics {
__u8 num_vpu;
__u8 vpu_generation;
__u8 num_queues;
#define PVA_CHARACTERISTCS_IOCTL_SUBMIT_MODE_MAILBOX 0
#define PVA_CHARACTERISTCS_IOCTL_SUBMIT_MODE_MMIO_CCQ 1
#define PVA_CHARACTERISTCS_IOCTL_SUBMIT_MODE_CHANNEL_CCQ 2
__u8 submit_mode;
__u32 pva_r5_version;
__u32 pva_compat_version;
__u32 pva_revision;
__u32 pva_built_on;
};
/**
* struct pva_pin_unpin_args - buffer handles to pin or unpin
*
* @buffers: Pointer to the table of u32
* @num_buffers: elements in the buffer table
* @reserved: reserved
*
* Used to deliver information about the buffer handles that should be
* be pinned into (or unpinned from) the PVA address space.
*
*/
struct pva_pin_unpin_args {
__u64 buffers;
__u32 num_buffers;
__u32 reserved;
};
#define PVA_MAX_PIN_BUFFERS 64
/**
* struct pva_memory_handle - A handle to PVA pointer
*
* @handle: Handle to a dmabuf that holds the data
* @offset: An offset within the buffer to the data within the buffer
*/
struct pva_memory_handle {
__u32 handle;
__u32 offset;
};
/**
* struct pva_ioctl_status_handle - A handle to a status structure
*
* @handle: Handle to a dmabuf that holds the status buffer
* @offset: An offset within the buffer to the status structure.
*/
struct pva_status_handle {
__u32 handle;
__u32 offset;
};
/**
* struct pva_ioctl_surface - The surface descriptor
*
* @format: Surface pixel format
* @surface_handle: Memory handle that holds the surface
* @surface_offset: Offset within the surface memory buffer to the surface
* @roi_handle: Memory handle that holds the ROI
* @roi_offset: Offset within the ROI memory buffer to the ROI
* @surface_stride: Offset between planes in bytes
* @line_stride: Offset between two consequent lines in bytes.
* @depth: Number of planes in the surface
* @width: Width of the surface
* @height: Height of the surface
* @layout: Surface layout (pitch linear, block linear)
* @block_height_log2: Block height
*
* This structure defines a list of surfaces to be delivered for
* PVA.
*/
struct pva_surface {
__u64 format;
__u32 surface_handle;
__u32 surface_offset;
__u32 roi_handle;
__u32 roi_offset;
__u32 surface_stride;
__u32 line_stride;
__u32 depth;
__u32 width;
__u32 height;
__u16 layout;
__u16 block_height_log2;
};
/**
* struct pva_ioct_task_parameter - Parameter structure for a task
*
* @handle: Memory handle including the parameter array. This field shall be
* used in cases where the UMD prepares the data in advance to a
* shared buffer or the input data is prepared by the upstream engine.
* @offset: Offset within the memory handle to the parameter array
*
* The parameter descriptor defines a single parameter array that is
* received. The handle and offset is translated into IOVA by the kernel
* driver and delivered to PVA.
*/
struct pva_task_parameter {
__u32 handle;
__u32 offset;
};
/**
* struct pva_ioctl_fence structure for passing fence information
*
* NOTE: this will be removed soon, please use generic fence type
* from nvdev_fence.h
*/
struct pva_fence {
__u32 type;
#define PVA_FENCE_TYPE_SYNCPT 0
#define PVA_FENCE_TYPE_SYNC_FD 1
#define PVA_FENCE_TYPE_SEMAPHORE 2
#define PVA_FENCE_TYPE_SEMAPHORE_TS 3
__u32 syncpoint_index;
__u32 syncpoint_value;
__u32 sync_fd;
__u32 semaphore_handle;
__u32 semaphore_offset;
__u32 semaphore_value;
};
/**
* PVA extended fence
*
* @param type fence type
* @param fence nvdev_fence
* @param ts_buf_handle Handle of timestamp buffer
*/
struct nvpva_fence {
__u32 type;
#define PVA_FENCE_PRE 1U
#define PVA_FENCE_SOT_V 2U
#define PVA_FENCE_SOT_R 3U
#define PVA_FENCE_EOT_V 4U
#define PVA_FENCE_EOT_R 5U
#define PVA_FENCE_POST 6U
struct pva_memory_handle ts_buf_ptr;
struct nvdev_fence fence;
};
#define PVA_MAX_TASKS 1
#define PVA_MAX_PREFENCES 8
#define PVA_MAX_POSTFENCES 8
#define PVA_MAX_FENCE_TYPES 7
#define PVA_MAX_FENCES_PER_TYPE 8
#define PVA_MAX_INPUT_STATUS 8
#define PVA_MAX_OUTPUT_STATUS 8
#define PVA_MAX_INPUT_SURFACES 8
#define PVA_MAX_OUTPUT_SURFACES 8
#define PVA_MAX_POINTERS 128
#define PVA_MAX_PRIMARY_PAYLOAD_SIZE 4096
/**
* struct pva_ioctl_submit_task - Describe a task for PVA
*
* @num_prefences: Number of pre-fences in this task
* @num_postfences: Number of post-fences in this task
* @num_input_surfaces: Number of input surfaces
* @num_output_surfaces: Number of output surfaces
* @num_input_task_status: Number of input task status structures
* @num_output_task_status: Number of output task status structures
* @reserved: Reserved for future usage.
* @timeout: Latest Unix time when the task must complete. 0 if disabled.
* @prefences: Pointer to pre-fence structures
* @postfences: Pointer to post-fence structures
* @input_surfaces: Pointer to input surfaces
* @input_scalars: Information for input scalars
* @output_surfaces: Pointer to output surfaces
* @output_scalars: Information for output scalars
* @input_task_status: Pointer to input status structure
* @output_task_status: Pointer to output status structure
*
* This structure is used for delivering information that is required to
* finish a single task on PVA.
*
*/
struct pva_ioctl_submit_task {
__u8 num_prefences;
__u8 redserved1;
__u8 num_input_surfaces;
__u8 num_output_surfaces;
__u8 num_input_task_status;
__u8 num_output_task_status;
__u16 num_pointers;
__u64 pointers;
__u32 primary_payload_size;
__u32 operation;
__u64 timeout;
__u64 prefences;
__u8 reserved2[8];
__u64 input_surfaces;
struct pva_task_parameter input_scalars;
__u64 primary_payload;
__u8 reserved3[8];
__u64 output_surfaces;
struct pva_task_parameter output_scalars;
__u64 num_pva_ts_buffers;
__u64 num_pvafences;
__u64 pvafences;
__u64 input_task_status;
__u64 output_task_status;
};
/**
* struct pva_submit_args - submit tasks to PVA
*
* @tasks: Pointer to a list of tasks structures
* @flags: Flags for the given tasks
* @num_tasks: Number of tasks in the list
* @version: Version of the task structure.
*
* This ioctl is used for submitting tasks to PVA. The given structures
* are modified to include information about post-fences.
*
*/
struct pva_ioctl_submit_args {
__u64 tasks;
__u16 flags;
__u16 num_tasks;
__u32 version;
};
/**
* struct pva_ioctl_queue_attr - set queue attributes
*
* @attr_id: Attribute id which defines the attribute to be set
* @reserved: reserved
* @attr_val: The value to be set for the attribute
*
* This ioctl is used for setting attributes for a queue with id queue_id
* on the R5.
*
*/
struct pva_ioctl_queue_attr {
__u16 id;
__u16 reserved;
__u32 val;
};
/**
* struct pva_ioctl_vpu_func_table - ioctl vpu function table entries
*
* @addr: Userspace address space to which the function table needs to be copied
* @entries: The number of entries in the vpu table
* @size: Size of the user buffer passed/ Size of the function table
*
* This ioctl is used to fetch the VPU function table available on a PVA, which
* is copied to user space buffer starting at "addr" with size "size". Once the
* function table is copied the the number of entries is updated along with the
* size of the vpu function table.
*
*/
struct pva_ioctl_vpu_func_table {
__u64 addr;
__u32 entries;
__u32 size;
};
/**
* enum pva_clk_type - Clock type identifier while setting the frequency.
*
* PVA KMD supports three request types: Minimum, bandwidth and bandwidth
* (kHz). All bandwidth requests are summed up and treated as one of the
* minimum frequency requests. KMD then takes the maximum over all minimum
* requests and tries to set the frequency to PVA.
*/
enum pva_clk_type {
PVA_CLOCK = 0,
PVA_BW = 1,
PVA_BW_KHZ = 3,
};
/**
* struct pva_ioctl_rate - Requesting PVA frequency update
*
* @param rate: Requested rate
* @param type: Type of the request according to pva_clk_type
* @param reserved: Reserved for future usage. Must be 0.
*/
struct pva_ioctl_rate {
__u64 rate;
__u32 type;
__u32 reserved;
};
#define PVA_IOCTL_CHARACTERISTICS \
_IOWR(NVHOST_PVA_IOCTL_MAGIC, 1, struct pva_characteristics_req)
#define PVA_IOCTL_PIN \
_IOW(NVHOST_PVA_IOCTL_MAGIC, 2, struct pva_pin_unpin_args)
#define PVA_IOCTL_UNPIN \
_IOW(NVHOST_PVA_IOCTL_MAGIC, 3, struct pva_pin_unpin_args)
#define PVA_IOCTL_SUBMIT \
_IOW(NVHOST_PVA_IOCTL_MAGIC, 4, struct pva_ioctl_submit_args)
#define PVA_IOCTL_SET_QUEUE_ATTRIBUTES \
_IOW(NVHOST_PVA_IOCTL_MAGIC, 5, struct pva_ioctl_queue_attr)
#define PVA_IOCTL_COPY_VPU_FUNCTION_TABLE \
_IOWR(NVHOST_PVA_IOCTL_MAGIC, 6, struct pva_ioctl_vpu_func_table)
#define PVA_IOCTL_SET_RATE \
_IOWR(NVHOST_PVA_IOCTL_MAGIC, 7, struct pva_ioctl_rate)
#define PVA_IOCTL_GET_RATE \
_IOWR(NVHOST_PVA_IOCTL_MAGIC, 8, struct pva_ioctl_rate)
#define NVHOST_PVA_IOCTL_LAST _IOC_NR(PVA_IOCTL_GET_RATE)
#define NVHOST_PVA_IOCTL_MAX_ARG_SIZE sizeof(struct pva_characteristics_req)
#endif /* __LINUX_NVHOST_PVA_IOCTL_H */
|