Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/include/uapi/drm/i915_drm.h
26289 views
1
/*
2
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
3
* All Rights Reserved.
4
*
5
* Permission is hereby granted, free of charge, to any person obtaining a
6
* copy of this software and associated documentation files (the
7
* "Software"), to deal in the Software without restriction, including
8
* without limitation the rights to use, copy, modify, merge, publish,
9
* distribute, sub license, and/or sell copies of the Software, and to
10
* permit persons to whom the Software is furnished to do so, subject to
11
* the following conditions:
12
*
13
* The above copyright notice and this permission notice (including the
14
* next paragraph) shall be included in all copies or substantial portions
15
* of the Software.
16
*
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
21
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
*
25
*/
26
27
#ifndef _UAPI_I915_DRM_H_
28
#define _UAPI_I915_DRM_H_
29
30
#include "drm.h"
31
32
#if defined(__cplusplus)
33
extern "C" {
34
#endif
35
36
/* Please note that modifications to all structs defined here are
37
* subject to backwards-compatibility constraints.
38
*/
39
40
/**
41
* DOC: uevents generated by i915 on its device node
42
*
43
* I915_L3_PARITY_UEVENT - Generated when the driver receives a parity mismatch
44
* event from the GPU L3 cache. Additional information supplied is ROW,
45
* BANK, SUBBANK, SLICE of the affected cacheline. Userspace should keep
46
* track of these events, and if a specific cache-line seems to have a
47
* persistent error, remap it with the L3 remapping tool supplied in
48
* intel-gpu-tools. The value supplied with the event is always 1.
49
*
50
* I915_ERROR_UEVENT - Generated upon error detection, currently only via
51
* hangcheck. The error detection event is a good indicator of when things
52
* began to go badly. The value supplied with the event is a 1 upon error
53
* detection, and a 0 upon reset completion, signifying no more error
54
* exists. NOTE: Disabling hangcheck or reset via module parameter will
55
* cause the related events to not be seen.
56
*
57
* I915_RESET_UEVENT - Event is generated just before an attempt to reset the
58
* GPU. The value supplied with the event is always 1. NOTE: Disable
59
* reset via module parameter will cause this event to not be seen.
60
*/
61
#define I915_L3_PARITY_UEVENT "L3_PARITY_ERROR"
62
#define I915_ERROR_UEVENT "ERROR"
63
#define I915_RESET_UEVENT "RESET"
64
65
/**
66
* struct i915_user_extension - Base class for defining a chain of extensions
67
*
68
* Many interfaces need to grow over time. In most cases we can simply
69
* extend the struct and have userspace pass in more data. Another option,
70
* as demonstrated by Vulkan's approach to providing extensions for forward
71
* and backward compatibility, is to use a list of optional structs to
72
* provide those extra details.
73
*
74
* The key advantage to using an extension chain is that it allows us to
75
* redefine the interface more easily than an ever growing struct of
76
* increasing complexity, and for large parts of that interface to be
77
* entirely optional. The downside is more pointer chasing; chasing across
78
* the __user boundary with pointers encapsulated inside u64.
79
*
80
* Example chaining:
81
*
82
* .. code-block:: C
83
*
84
* struct i915_user_extension ext3 {
85
* .next_extension = 0, // end
86
* .name = ...,
87
* };
88
* struct i915_user_extension ext2 {
89
* .next_extension = (uintptr_t)&ext3,
90
* .name = ...,
91
* };
92
* struct i915_user_extension ext1 {
93
* .next_extension = (uintptr_t)&ext2,
94
* .name = ...,
95
* };
96
*
97
* Typically the struct i915_user_extension would be embedded in some uAPI
98
* struct, and in this case we would feed it the head of the chain(i.e ext1),
99
* which would then apply all of the above extensions.
100
*
101
*/
102
struct i915_user_extension {
103
/**
104
* @next_extension:
105
*
106
* Pointer to the next struct i915_user_extension, or zero if the end.
107
*/
108
__u64 next_extension;
109
/**
110
* @name: Name of the extension.
111
*
112
* Note that the name here is just some integer.
113
*
114
* Also note that the name space for this is not global for the whole
115
* driver, but rather its scope/meaning is limited to the specific piece
116
* of uAPI which has embedded the struct i915_user_extension.
117
*/
118
__u32 name;
119
/**
120
* @flags: MBZ
121
*
122
* All undefined bits must be zero.
123
*/
124
__u32 flags;
125
/**
126
* @rsvd: MBZ
127
*
128
* Reserved for future use; must be zero.
129
*/
130
__u32 rsvd[4];
131
};
132
133
/*
134
* MOCS indexes used for GPU surfaces, defining the cacheability of the
135
* surface data and the coherency for this data wrt. CPU vs. GPU accesses.
136
*/
137
enum i915_mocs_table_index {
138
/*
139
* Not cached anywhere, coherency between CPU and GPU accesses is
140
* guaranteed.
141
*/
142
I915_MOCS_UNCACHED,
143
/*
144
* Cacheability and coherency controlled by the kernel automatically
145
* based on the DRM_I915_GEM_SET_CACHING IOCTL setting and the current
146
* usage of the surface (used for display scanout or not).
147
*/
148
I915_MOCS_PTE,
149
/*
150
* Cached in all GPU caches available on the platform.
151
* Coherency between CPU and GPU accesses to the surface is not
152
* guaranteed without extra synchronization.
153
*/
154
I915_MOCS_CACHED,
155
};
156
157
/**
158
* enum drm_i915_gem_engine_class - uapi engine type enumeration
159
*
160
* Different engines serve different roles, and there may be more than one
161
* engine serving each role. This enum provides a classification of the role
162
* of the engine, which may be used when requesting operations to be performed
163
* on a certain subset of engines, or for providing information about that
164
* group.
165
*/
166
enum drm_i915_gem_engine_class {
167
/**
168
* @I915_ENGINE_CLASS_RENDER:
169
*
170
* Render engines support instructions used for 3D, Compute (GPGPU),
171
* and programmable media workloads. These instructions fetch data and
172
* dispatch individual work items to threads that operate in parallel.
173
* The threads run small programs (called "kernels" or "shaders") on
174
* the GPU's execution units (EUs).
175
*/
176
I915_ENGINE_CLASS_RENDER = 0,
177
178
/**
179
* @I915_ENGINE_CLASS_COPY:
180
*
181
* Copy engines (also referred to as "blitters") support instructions
182
* that move blocks of data from one location in memory to another,
183
* or that fill a specified location of memory with fixed data.
184
* Copy engines can perform pre-defined logical or bitwise operations
185
* on the source, destination, or pattern data.
186
*/
187
I915_ENGINE_CLASS_COPY = 1,
188
189
/**
190
* @I915_ENGINE_CLASS_VIDEO:
191
*
192
* Video engines (also referred to as "bit stream decode" (BSD) or
193
* "vdbox") support instructions that perform fixed-function media
194
* decode and encode.
195
*/
196
I915_ENGINE_CLASS_VIDEO = 2,
197
198
/**
199
* @I915_ENGINE_CLASS_VIDEO_ENHANCE:
200
*
201
* Video enhancement engines (also referred to as "vebox") support
202
* instructions related to image enhancement.
203
*/
204
I915_ENGINE_CLASS_VIDEO_ENHANCE = 3,
205
206
/**
207
* @I915_ENGINE_CLASS_COMPUTE:
208
*
209
* Compute engines support a subset of the instructions available
210
* on render engines: compute engines support Compute (GPGPU) and
211
* programmable media workloads, but do not support the 3D pipeline.
212
*/
213
I915_ENGINE_CLASS_COMPUTE = 4,
214
215
/* Values in this enum should be kept compact. */
216
217
/**
218
* @I915_ENGINE_CLASS_INVALID:
219
*
220
* Placeholder value to represent an invalid engine class assignment.
221
*/
222
I915_ENGINE_CLASS_INVALID = -1
223
};
224
225
/**
226
* struct i915_engine_class_instance - Engine class/instance identifier
227
*
228
* There may be more than one engine fulfilling any role within the system.
229
* Each engine of a class is given a unique instance number and therefore
230
* any engine can be specified by its class:instance tuplet. APIs that allow
231
* access to any engine in the system will use struct i915_engine_class_instance
232
* for this identification.
233
*/
234
struct i915_engine_class_instance {
235
/**
236
* @engine_class:
237
*
238
* Engine class from enum drm_i915_gem_engine_class
239
*/
240
__u16 engine_class;
241
#define I915_ENGINE_CLASS_INVALID_NONE -1
242
#define I915_ENGINE_CLASS_INVALID_VIRTUAL -2
243
244
/**
245
* @engine_instance:
246
*
247
* Engine instance.
248
*/
249
__u16 engine_instance;
250
};
251
252
/**
253
* DOC: perf_events exposed by i915 through /sys/bus/event_sources/drivers/i915
254
*
255
*/
256
257
enum drm_i915_pmu_engine_sample {
258
I915_SAMPLE_BUSY = 0,
259
I915_SAMPLE_WAIT = 1,
260
I915_SAMPLE_SEMA = 2
261
};
262
263
#define I915_PMU_SAMPLE_BITS (4)
264
#define I915_PMU_SAMPLE_MASK (0xf)
265
#define I915_PMU_SAMPLE_INSTANCE_BITS (8)
266
#define I915_PMU_CLASS_SHIFT \
267
(I915_PMU_SAMPLE_BITS + I915_PMU_SAMPLE_INSTANCE_BITS)
268
269
#define __I915_PMU_ENGINE(class, instance, sample) \
270
((class) << I915_PMU_CLASS_SHIFT | \
271
(instance) << I915_PMU_SAMPLE_BITS | \
272
(sample))
273
274
#define I915_PMU_ENGINE_BUSY(class, instance) \
275
__I915_PMU_ENGINE(class, instance, I915_SAMPLE_BUSY)
276
277
#define I915_PMU_ENGINE_WAIT(class, instance) \
278
__I915_PMU_ENGINE(class, instance, I915_SAMPLE_WAIT)
279
280
#define I915_PMU_ENGINE_SEMA(class, instance) \
281
__I915_PMU_ENGINE(class, instance, I915_SAMPLE_SEMA)
282
283
/*
284
* Top 4 bits of every non-engine counter are GT id.
285
*/
286
#define __I915_PMU_GT_SHIFT (60)
287
288
#define ___I915_PMU_OTHER(gt, x) \
289
(((__u64)__I915_PMU_ENGINE(0xff, 0xff, 0xf) + 1 + (x)) | \
290
((__u64)(gt) << __I915_PMU_GT_SHIFT))
291
292
#define __I915_PMU_OTHER(x) ___I915_PMU_OTHER(0, x)
293
294
#define I915_PMU_ACTUAL_FREQUENCY __I915_PMU_OTHER(0)
295
#define I915_PMU_REQUESTED_FREQUENCY __I915_PMU_OTHER(1)
296
#define I915_PMU_INTERRUPTS __I915_PMU_OTHER(2)
297
#define I915_PMU_RC6_RESIDENCY __I915_PMU_OTHER(3)
298
#define I915_PMU_SOFTWARE_GT_AWAKE_TIME __I915_PMU_OTHER(4)
299
300
#define I915_PMU_LAST /* Deprecated - do not use */ I915_PMU_RC6_RESIDENCY
301
302
#define __I915_PMU_ACTUAL_FREQUENCY(gt) ___I915_PMU_OTHER(gt, 0)
303
#define __I915_PMU_REQUESTED_FREQUENCY(gt) ___I915_PMU_OTHER(gt, 1)
304
#define __I915_PMU_INTERRUPTS(gt) ___I915_PMU_OTHER(gt, 2)
305
#define __I915_PMU_RC6_RESIDENCY(gt) ___I915_PMU_OTHER(gt, 3)
306
#define __I915_PMU_SOFTWARE_GT_AWAKE_TIME(gt) ___I915_PMU_OTHER(gt, 4)
307
308
/* Each region is a minimum of 16k, and there are at most 255 of them.
309
*/
310
#define I915_NR_TEX_REGIONS 255 /* table size 2k - maximum due to use
311
* of chars for next/prev indices */
312
#define I915_LOG_MIN_TEX_REGION_SIZE 14
313
314
typedef struct _drm_i915_init {
315
enum {
316
I915_INIT_DMA = 0x01,
317
I915_CLEANUP_DMA = 0x02,
318
I915_RESUME_DMA = 0x03
319
} func;
320
unsigned int mmio_offset;
321
int sarea_priv_offset;
322
unsigned int ring_start;
323
unsigned int ring_end;
324
unsigned int ring_size;
325
unsigned int front_offset;
326
unsigned int back_offset;
327
unsigned int depth_offset;
328
unsigned int w;
329
unsigned int h;
330
unsigned int pitch;
331
unsigned int pitch_bits;
332
unsigned int back_pitch;
333
unsigned int depth_pitch;
334
unsigned int cpp;
335
unsigned int chipset;
336
} drm_i915_init_t;
337
338
typedef struct _drm_i915_sarea {
339
struct drm_tex_region texList[I915_NR_TEX_REGIONS + 1];
340
int last_upload; /* last time texture was uploaded */
341
int last_enqueue; /* last time a buffer was enqueued */
342
int last_dispatch; /* age of the most recently dispatched buffer */
343
int ctxOwner; /* last context to upload state */
344
int texAge;
345
int pf_enabled; /* is pageflipping allowed? */
346
int pf_active;
347
int pf_current_page; /* which buffer is being displayed? */
348
int perf_boxes; /* performance boxes to be displayed */
349
int width, height; /* screen size in pixels */
350
351
drm_handle_t front_handle;
352
int front_offset;
353
int front_size;
354
355
drm_handle_t back_handle;
356
int back_offset;
357
int back_size;
358
359
drm_handle_t depth_handle;
360
int depth_offset;
361
int depth_size;
362
363
drm_handle_t tex_handle;
364
int tex_offset;
365
int tex_size;
366
int log_tex_granularity;
367
int pitch;
368
int rotation; /* 0, 90, 180 or 270 */
369
int rotated_offset;
370
int rotated_size;
371
int rotated_pitch;
372
int virtualX, virtualY;
373
374
unsigned int front_tiled;
375
unsigned int back_tiled;
376
unsigned int depth_tiled;
377
unsigned int rotated_tiled;
378
unsigned int rotated2_tiled;
379
380
int pipeA_x;
381
int pipeA_y;
382
int pipeA_w;
383
int pipeA_h;
384
int pipeB_x;
385
int pipeB_y;
386
int pipeB_w;
387
int pipeB_h;
388
389
/* fill out some space for old userspace triple buffer */
390
drm_handle_t unused_handle;
391
__u32 unused1, unused2, unused3;
392
393
/* buffer object handles for static buffers. May change
394
* over the lifetime of the client.
395
*/
396
__u32 front_bo_handle;
397
__u32 back_bo_handle;
398
__u32 unused_bo_handle;
399
__u32 depth_bo_handle;
400
401
} drm_i915_sarea_t;
402
403
/* due to userspace building against these headers we need some compat here */
404
#define planeA_x pipeA_x
405
#define planeA_y pipeA_y
406
#define planeA_w pipeA_w
407
#define planeA_h pipeA_h
408
#define planeB_x pipeB_x
409
#define planeB_y pipeB_y
410
#define planeB_w pipeB_w
411
#define planeB_h pipeB_h
412
413
/* Flags for perf_boxes
414
*/
415
#define I915_BOX_RING_EMPTY 0x1
416
#define I915_BOX_FLIP 0x2
417
#define I915_BOX_WAIT 0x4
418
#define I915_BOX_TEXTURE_LOAD 0x8
419
#define I915_BOX_LOST_CONTEXT 0x10
420
421
/*
422
* i915 specific ioctls.
423
*
424
* The device specific ioctl range is [DRM_COMMAND_BASE, DRM_COMMAND_END) ie
425
* [0x40, 0xa0) (a0 is excluded). The numbers below are defined as offset
426
* against DRM_COMMAND_BASE and should be between [0x0, 0x60).
427
*/
428
#define DRM_I915_INIT 0x00
429
#define DRM_I915_FLUSH 0x01
430
#define DRM_I915_FLIP 0x02
431
#define DRM_I915_BATCHBUFFER 0x03
432
#define DRM_I915_IRQ_EMIT 0x04
433
#define DRM_I915_IRQ_WAIT 0x05
434
#define DRM_I915_GETPARAM 0x06
435
#define DRM_I915_SETPARAM 0x07
436
#define DRM_I915_ALLOC 0x08
437
#define DRM_I915_FREE 0x09
438
#define DRM_I915_INIT_HEAP 0x0a
439
#define DRM_I915_CMDBUFFER 0x0b
440
#define DRM_I915_DESTROY_HEAP 0x0c
441
#define DRM_I915_SET_VBLANK_PIPE 0x0d
442
#define DRM_I915_GET_VBLANK_PIPE 0x0e
443
#define DRM_I915_VBLANK_SWAP 0x0f
444
#define DRM_I915_HWS_ADDR 0x11
445
#define DRM_I915_GEM_INIT 0x13
446
#define DRM_I915_GEM_EXECBUFFER 0x14
447
#define DRM_I915_GEM_PIN 0x15
448
#define DRM_I915_GEM_UNPIN 0x16
449
#define DRM_I915_GEM_BUSY 0x17
450
#define DRM_I915_GEM_THROTTLE 0x18
451
#define DRM_I915_GEM_ENTERVT 0x19
452
#define DRM_I915_GEM_LEAVEVT 0x1a
453
#define DRM_I915_GEM_CREATE 0x1b
454
#define DRM_I915_GEM_PREAD 0x1c
455
#define DRM_I915_GEM_PWRITE 0x1d
456
#define DRM_I915_GEM_MMAP 0x1e
457
#define DRM_I915_GEM_SET_DOMAIN 0x1f
458
#define DRM_I915_GEM_SW_FINISH 0x20
459
#define DRM_I915_GEM_SET_TILING 0x21
460
#define DRM_I915_GEM_GET_TILING 0x22
461
#define DRM_I915_GEM_GET_APERTURE 0x23
462
#define DRM_I915_GEM_MMAP_GTT 0x24
463
#define DRM_I915_GET_PIPE_FROM_CRTC_ID 0x25
464
#define DRM_I915_GEM_MADVISE 0x26
465
#define DRM_I915_OVERLAY_PUT_IMAGE 0x27
466
#define DRM_I915_OVERLAY_ATTRS 0x28
467
#define DRM_I915_GEM_EXECBUFFER2 0x29
468
#define DRM_I915_GEM_EXECBUFFER2_WR DRM_I915_GEM_EXECBUFFER2
469
#define DRM_I915_GET_SPRITE_COLORKEY 0x2a
470
#define DRM_I915_SET_SPRITE_COLORKEY 0x2b
471
#define DRM_I915_GEM_WAIT 0x2c
472
#define DRM_I915_GEM_CONTEXT_CREATE 0x2d
473
#define DRM_I915_GEM_CONTEXT_DESTROY 0x2e
474
#define DRM_I915_GEM_SET_CACHING 0x2f
475
#define DRM_I915_GEM_GET_CACHING 0x30
476
#define DRM_I915_REG_READ 0x31
477
#define DRM_I915_GET_RESET_STATS 0x32
478
#define DRM_I915_GEM_USERPTR 0x33
479
#define DRM_I915_GEM_CONTEXT_GETPARAM 0x34
480
#define DRM_I915_GEM_CONTEXT_SETPARAM 0x35
481
#define DRM_I915_PERF_OPEN 0x36
482
#define DRM_I915_PERF_ADD_CONFIG 0x37
483
#define DRM_I915_PERF_REMOVE_CONFIG 0x38
484
#define DRM_I915_QUERY 0x39
485
#define DRM_I915_GEM_VM_CREATE 0x3a
486
#define DRM_I915_GEM_VM_DESTROY 0x3b
487
#define DRM_I915_GEM_CREATE_EXT 0x3c
488
/* Must be kept compact -- no holes */
489
490
#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
491
#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
492
#define DRM_IOCTL_I915_FLIP DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLIP)
493
#define DRM_IOCTL_I915_BATCHBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, drm_i915_batchbuffer_t)
494
#define DRM_IOCTL_I915_IRQ_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, drm_i915_irq_emit_t)
495
#define DRM_IOCTL_I915_IRQ_WAIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_IRQ_WAIT, drm_i915_irq_wait_t)
496
#define DRM_IOCTL_I915_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, drm_i915_getparam_t)
497
#define DRM_IOCTL_I915_SETPARAM DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SETPARAM, drm_i915_setparam_t)
498
#define DRM_IOCTL_I915_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_ALLOC, drm_i915_mem_alloc_t)
499
#define DRM_IOCTL_I915_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_FREE, drm_i915_mem_free_t)
500
#define DRM_IOCTL_I915_INIT_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT_HEAP, drm_i915_mem_init_heap_t)
501
#define DRM_IOCTL_I915_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, drm_i915_cmdbuffer_t)
502
#define DRM_IOCTL_I915_DESTROY_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_I915_DESTROY_HEAP, drm_i915_mem_destroy_heap_t)
503
#define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW( DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t)
504
#define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR( DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t)
505
#define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t)
506
#define DRM_IOCTL_I915_HWS_ADDR DRM_IOW(DRM_COMMAND_BASE + DRM_I915_HWS_ADDR, struct drm_i915_gem_init)
507
#define DRM_IOCTL_I915_GEM_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_INIT, struct drm_i915_gem_init)
508
#define DRM_IOCTL_I915_GEM_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer)
509
#define DRM_IOCTL_I915_GEM_EXECBUFFER2 DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2, struct drm_i915_gem_execbuffer2)
510
#define DRM_IOCTL_I915_GEM_EXECBUFFER2_WR DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2_WR, struct drm_i915_gem_execbuffer2)
511
#define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin)
512
#define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin)
513
#define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy)
514
#define DRM_IOCTL_I915_GEM_SET_CACHING DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_SET_CACHING, struct drm_i915_gem_caching)
515
#define DRM_IOCTL_I915_GEM_GET_CACHING DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_GET_CACHING, struct drm_i915_gem_caching)
516
#define DRM_IOCTL_I915_GEM_THROTTLE DRM_IO ( DRM_COMMAND_BASE + DRM_I915_GEM_THROTTLE)
517
#define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT)
518
#define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT)
519
#define DRM_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create)
520
#define DRM_IOCTL_I915_GEM_CREATE_EXT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE_EXT, struct drm_i915_gem_create_ext)
521
#define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread)
522
#define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite)
523
#define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap)
524
#define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt)
525
#define DRM_IOCTL_I915_GEM_MMAP_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_offset)
526
#define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain)
527
#define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish)
528
#define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling)
529
#define DRM_IOCTL_I915_GEM_GET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling)
530
#define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture)
531
#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id)
532
#define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise)
533
#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_OVERLAY_PUT_IMAGE, struct drm_intel_overlay_put_image)
534
#define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs)
535
#define DRM_IOCTL_I915_SET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey)
536
#define DRM_IOCTL_I915_GET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey)
537
#define DRM_IOCTL_I915_GEM_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_WAIT, struct drm_i915_gem_wait)
538
#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct drm_i915_gem_context_create)
539
#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct drm_i915_gem_context_create_ext)
540
#define DRM_IOCTL_I915_GEM_CONTEXT_DESTROY DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_DESTROY, struct drm_i915_gem_context_destroy)
541
#define DRM_IOCTL_I915_REG_READ DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_REG_READ, struct drm_i915_reg_read)
542
#define DRM_IOCTL_I915_GET_RESET_STATS DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GET_RESET_STATS, struct drm_i915_reset_stats)
543
#define DRM_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_USERPTR, struct drm_i915_gem_userptr)
544
#define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param)
545
#define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param)
546
#define DRM_IOCTL_I915_PERF_OPEN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_PERF_OPEN, struct drm_i915_perf_open_param)
547
#define DRM_IOCTL_I915_PERF_ADD_CONFIG DRM_IOW(DRM_COMMAND_BASE + DRM_I915_PERF_ADD_CONFIG, struct drm_i915_perf_oa_config)
548
#define DRM_IOCTL_I915_PERF_REMOVE_CONFIG DRM_IOW(DRM_COMMAND_BASE + DRM_I915_PERF_REMOVE_CONFIG, __u64)
549
#define DRM_IOCTL_I915_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_QUERY, struct drm_i915_query)
550
#define DRM_IOCTL_I915_GEM_VM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_VM_CREATE, struct drm_i915_gem_vm_control)
551
#define DRM_IOCTL_I915_GEM_VM_DESTROY DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_VM_DESTROY, struct drm_i915_gem_vm_control)
552
553
/* Allow drivers to submit batchbuffers directly to hardware, relying
554
* on the security mechanisms provided by hardware.
555
*/
556
typedef struct drm_i915_batchbuffer {
557
int start; /* agp offset */
558
int used; /* nr bytes in use */
559
int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */
560
int DR4; /* window origin for GFX_OP_DRAWRECT_INFO */
561
int num_cliprects; /* mulitpass with multiple cliprects? */
562
struct drm_clip_rect __user *cliprects; /* pointer to userspace cliprects */
563
} drm_i915_batchbuffer_t;
564
565
/* As above, but pass a pointer to userspace buffer which can be
566
* validated by the kernel prior to sending to hardware.
567
*/
568
typedef struct _drm_i915_cmdbuffer {
569
char __user *buf; /* pointer to userspace command buffer */
570
int sz; /* nr bytes in buf */
571
int DR1; /* hw flags for GFX_OP_DRAWRECT_INFO */
572
int DR4; /* window origin for GFX_OP_DRAWRECT_INFO */
573
int num_cliprects; /* mulitpass with multiple cliprects? */
574
struct drm_clip_rect __user *cliprects; /* pointer to userspace cliprects */
575
} drm_i915_cmdbuffer_t;
576
577
/* Userspace can request & wait on irq's:
578
*/
579
typedef struct drm_i915_irq_emit {
580
int __user *irq_seq;
581
} drm_i915_irq_emit_t;
582
583
typedef struct drm_i915_irq_wait {
584
int irq_seq;
585
} drm_i915_irq_wait_t;
586
587
/*
588
* Different modes of per-process Graphics Translation Table,
589
* see I915_PARAM_HAS_ALIASING_PPGTT
590
*/
591
#define I915_GEM_PPGTT_NONE 0
592
#define I915_GEM_PPGTT_ALIASING 1
593
#define I915_GEM_PPGTT_FULL 2
594
595
/* Ioctl to query kernel params:
596
*/
597
#define I915_PARAM_IRQ_ACTIVE 1
598
#define I915_PARAM_ALLOW_BATCHBUFFER 2
599
#define I915_PARAM_LAST_DISPATCH 3
600
#define I915_PARAM_CHIPSET_ID 4
601
#define I915_PARAM_HAS_GEM 5
602
#define I915_PARAM_NUM_FENCES_AVAIL 6
603
#define I915_PARAM_HAS_OVERLAY 7
604
#define I915_PARAM_HAS_PAGEFLIPPING 8
605
#define I915_PARAM_HAS_EXECBUF2 9
606
#define I915_PARAM_HAS_BSD 10
607
#define I915_PARAM_HAS_BLT 11
608
#define I915_PARAM_HAS_RELAXED_FENCING 12
609
#define I915_PARAM_HAS_COHERENT_RINGS 13
610
#define I915_PARAM_HAS_EXEC_CONSTANTS 14
611
#define I915_PARAM_HAS_RELAXED_DELTA 15
612
#define I915_PARAM_HAS_GEN7_SOL_RESET 16
613
#define I915_PARAM_HAS_LLC 17
614
#define I915_PARAM_HAS_ALIASING_PPGTT 18
615
#define I915_PARAM_HAS_WAIT_TIMEOUT 19
616
#define I915_PARAM_HAS_SEMAPHORES 20
617
#define I915_PARAM_HAS_PRIME_VMAP_FLUSH 21
618
#define I915_PARAM_HAS_VEBOX 22
619
#define I915_PARAM_HAS_SECURE_BATCHES 23
620
#define I915_PARAM_HAS_PINNED_BATCHES 24
621
#define I915_PARAM_HAS_EXEC_NO_RELOC 25
622
#define I915_PARAM_HAS_EXEC_HANDLE_LUT 26
623
#define I915_PARAM_HAS_WT 27
624
#define I915_PARAM_CMD_PARSER_VERSION 28
625
#define I915_PARAM_HAS_COHERENT_PHYS_GTT 29
626
#define I915_PARAM_MMAP_VERSION 30
627
#define I915_PARAM_HAS_BSD2 31
628
#define I915_PARAM_REVISION 32
629
#define I915_PARAM_SUBSLICE_TOTAL 33
630
#define I915_PARAM_EU_TOTAL 34
631
#define I915_PARAM_HAS_GPU_RESET 35
632
#define I915_PARAM_HAS_RESOURCE_STREAMER 36
633
#define I915_PARAM_HAS_EXEC_SOFTPIN 37
634
#define I915_PARAM_HAS_POOLED_EU 38
635
#define I915_PARAM_MIN_EU_IN_POOL 39
636
#define I915_PARAM_MMAP_GTT_VERSION 40
637
638
/*
639
* Query whether DRM_I915_GEM_EXECBUFFER2 supports user defined execution
640
* priorities and the driver will attempt to execute batches in priority order.
641
* The param returns a capability bitmask, nonzero implies that the scheduler
642
* is enabled, with different features present according to the mask.
643
*
644
* The initial priority for each batch is supplied by the context and is
645
* controlled via I915_CONTEXT_PARAM_PRIORITY.
646
*/
647
#define I915_PARAM_HAS_SCHEDULER 41
648
#define I915_SCHEDULER_CAP_ENABLED (1ul << 0)
649
#define I915_SCHEDULER_CAP_PRIORITY (1ul << 1)
650
#define I915_SCHEDULER_CAP_PREEMPTION (1ul << 2)
651
#define I915_SCHEDULER_CAP_SEMAPHORES (1ul << 3)
652
#define I915_SCHEDULER_CAP_ENGINE_BUSY_STATS (1ul << 4)
653
/*
654
* Indicates the 2k user priority levels are statically mapped into 3 buckets as
655
* follows:
656
*
657
* -1k to -1 Low priority
658
* 0 Normal priority
659
* 1 to 1k Highest priority
660
*/
661
#define I915_SCHEDULER_CAP_STATIC_PRIORITY_MAP (1ul << 5)
662
663
/*
664
* Query the status of HuC load.
665
*
666
* The query can fail in the following scenarios with the listed error codes:
667
* -ENODEV if HuC is not present on this platform,
668
* -EOPNOTSUPP if HuC firmware usage is disabled,
669
* -ENOPKG if HuC firmware fetch failed,
670
* -ENOEXEC if HuC firmware is invalid or mismatched,
671
* -ENOMEM if i915 failed to prepare the FW objects for transfer to the uC,
672
* -EIO if the FW transfer or the FW authentication failed.
673
*
674
* If the IOCTL is successful, the returned parameter will be set to one of the
675
* following values:
676
* * 0 if HuC firmware load is not complete,
677
* * 1 if HuC firmware is loaded and fully authenticated,
678
* * 2 if HuC firmware is loaded and authenticated for clear media only
679
*/
680
#define I915_PARAM_HUC_STATUS 42
681
682
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports the ability to opt-out of
683
* synchronisation with implicit fencing on individual objects.
684
* See EXEC_OBJECT_ASYNC.
685
*/
686
#define I915_PARAM_HAS_EXEC_ASYNC 43
687
688
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports explicit fence support -
689
* both being able to pass in a sync_file fd to wait upon before executing,
690
* and being able to return a new sync_file fd that is signaled when the
691
* current request is complete. See I915_EXEC_FENCE_IN and I915_EXEC_FENCE_OUT.
692
*/
693
#define I915_PARAM_HAS_EXEC_FENCE 44
694
695
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports the ability to capture
696
* user-specified buffers for post-mortem debugging of GPU hangs. See
697
* EXEC_OBJECT_CAPTURE.
698
*/
699
#define I915_PARAM_HAS_EXEC_CAPTURE 45
700
701
#define I915_PARAM_SLICE_MASK 46
702
703
/* Assuming it's uniform for each slice, this queries the mask of subslices
704
* per-slice for this system.
705
*/
706
#define I915_PARAM_SUBSLICE_MASK 47
707
708
/*
709
* Query whether DRM_I915_GEM_EXECBUFFER2 supports supplying the batch buffer
710
* as the first execobject as opposed to the last. See I915_EXEC_BATCH_FIRST.
711
*/
712
#define I915_PARAM_HAS_EXEC_BATCH_FIRST 48
713
714
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports supplying an array of
715
* drm_i915_gem_exec_fence structures. See I915_EXEC_FENCE_ARRAY.
716
*/
717
#define I915_PARAM_HAS_EXEC_FENCE_ARRAY 49
718
719
/*
720
* Query whether every context (both per-file default and user created) is
721
* isolated (insofar as HW supports). If this parameter is not true, then
722
* freshly created contexts may inherit values from an existing context,
723
* rather than default HW values. If true, it also ensures (insofar as HW
724
* supports) that all state set by this context will not leak to any other
725
* context.
726
*
727
* As not every engine across every gen support contexts, the returned
728
* value reports the support of context isolation for individual engines by
729
* returning a bitmask of each engine class set to true if that class supports
730
* isolation.
731
*/
732
#define I915_PARAM_HAS_CONTEXT_ISOLATION 50
733
734
/* Frequency of the command streamer timestamps given by the *_TIMESTAMP
735
* registers. This used to be fixed per platform but from CNL onwards, this
736
* might vary depending on the parts.
737
*/
738
#define I915_PARAM_CS_TIMESTAMP_FREQUENCY 51
739
740
/*
741
* Once upon a time we supposed that writes through the GGTT would be
742
* immediately in physical memory (once flushed out of the CPU path). However,
743
* on a few different processors and chipsets, this is not necessarily the case
744
* as the writes appear to be buffered internally. Thus a read of the backing
745
* storage (physical memory) via a different path (with different physical tags
746
* to the indirect write via the GGTT) will see stale values from before
747
* the GGTT write. Inside the kernel, we can for the most part keep track of
748
* the different read/write domains in use (e.g. set-domain), but the assumption
749
* of coherency is baked into the ABI, hence reporting its true state in this
750
* parameter.
751
*
752
* Reports true when writes via mmap_gtt are immediately visible following an
753
* lfence to flush the WCB.
754
*
755
* Reports false when writes via mmap_gtt are indeterminately delayed in an in
756
* internal buffer and are _not_ immediately visible to third parties accessing
757
* directly via mmap_cpu/mmap_wc. Use of mmap_gtt as part of an IPC
758
* communications channel when reporting false is strongly disadvised.
759
*/
760
#define I915_PARAM_MMAP_GTT_COHERENT 52
761
762
/*
763
* Query whether DRM_I915_GEM_EXECBUFFER2 supports coordination of parallel
764
* execution through use of explicit fence support.
765
* See I915_EXEC_FENCE_OUT and I915_EXEC_FENCE_SUBMIT.
766
*/
767
#define I915_PARAM_HAS_EXEC_SUBMIT_FENCE 53
768
769
/*
770
* Revision of the i915-perf uAPI. The value returned helps determine what
771
* i915-perf features are available. See drm_i915_perf_property_id.
772
*/
773
#define I915_PARAM_PERF_REVISION 54
774
775
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports supplying an array of
776
* timeline syncobj through drm_i915_gem_execbuffer_ext_timeline_fences. See
777
* I915_EXEC_USE_EXTENSIONS.
778
*/
779
#define I915_PARAM_HAS_EXEC_TIMELINE_FENCES 55
780
781
/* Query if the kernel supports the I915_USERPTR_PROBE flag. */
782
#define I915_PARAM_HAS_USERPTR_PROBE 56
783
784
/*
785
* Frequency of the timestamps in OA reports. This used to be the same as the CS
786
* timestamp frequency, but differs on some platforms.
787
*/
788
#define I915_PARAM_OA_TIMESTAMP_FREQUENCY 57
789
790
/*
791
* Query the status of PXP support in i915.
792
*
793
* The query can fail in the following scenarios with the listed error codes:
794
* -ENODEV = PXP support is not available on the GPU device or in the
795
* kernel due to missing component drivers or kernel configs.
796
*
797
* If the IOCTL is successful, the returned parameter will be set to one of
798
* the following values:
799
* 1 = PXP feature is supported and is ready for use.
800
* 2 = PXP feature is supported but should be ready soon (pending
801
* initialization of non-i915 system dependencies).
802
*
803
* NOTE: When param is supported (positive return values), user space should
804
* still refer to the GEM PXP context-creation UAPI header specs to be
805
* aware of possible failure due to system state machine at the time.
806
*/
807
#define I915_PARAM_PXP_STATUS 58
808
809
/*
810
* Query if kernel allows marking a context to send a Freq hint to SLPC. This
811
* will enable use of the strategies allowed by the SLPC algorithm.
812
*/
813
#define I915_PARAM_HAS_CONTEXT_FREQ_HINT 59
814
815
/* Must be kept compact -- no holes and well documented */
816
817
/**
818
* struct drm_i915_getparam - Driver parameter query structure.
819
*/
820
struct drm_i915_getparam {
821
/** @param: Driver parameter to query. */
822
__s32 param;
823
824
/**
825
* @value: Address of memory where queried value should be put.
826
*
827
* WARNING: Using pointers instead of fixed-size u64 means we need to write
828
* compat32 code. Don't repeat this mistake.
829
*/
830
int __user *value;
831
};
832
833
/**
834
* typedef drm_i915_getparam_t - Driver parameter query structure.
835
* See struct drm_i915_getparam.
836
*/
837
typedef struct drm_i915_getparam drm_i915_getparam_t;
838
839
/* Ioctl to set kernel params:
840
*/
841
#define I915_SETPARAM_USE_MI_BATCHBUFFER_START 1
842
#define I915_SETPARAM_TEX_LRU_LOG_GRANULARITY 2
843
#define I915_SETPARAM_ALLOW_BATCHBUFFER 3
844
#define I915_SETPARAM_NUM_USED_FENCES 4
845
/* Must be kept compact -- no holes */
846
847
typedef struct drm_i915_setparam {
848
int param;
849
int value;
850
} drm_i915_setparam_t;
851
852
/* A memory manager for regions of shared memory:
853
*/
854
#define I915_MEM_REGION_AGP 1
855
856
typedef struct drm_i915_mem_alloc {
857
int region;
858
int alignment;
859
int size;
860
int __user *region_offset; /* offset from start of fb or agp */
861
} drm_i915_mem_alloc_t;
862
863
typedef struct drm_i915_mem_free {
864
int region;
865
int region_offset;
866
} drm_i915_mem_free_t;
867
868
typedef struct drm_i915_mem_init_heap {
869
int region;
870
int size;
871
int start;
872
} drm_i915_mem_init_heap_t;
873
874
/* Allow memory manager to be torn down and re-initialized (eg on
875
* rotate):
876
*/
877
typedef struct drm_i915_mem_destroy_heap {
878
int region;
879
} drm_i915_mem_destroy_heap_t;
880
881
/* Allow X server to configure which pipes to monitor for vblank signals
882
*/
883
#define DRM_I915_VBLANK_PIPE_A 1
884
#define DRM_I915_VBLANK_PIPE_B 2
885
886
typedef struct drm_i915_vblank_pipe {
887
int pipe;
888
} drm_i915_vblank_pipe_t;
889
890
/* Schedule buffer swap at given vertical blank:
891
*/
892
typedef struct drm_i915_vblank_swap {
893
drm_drawable_t drawable;
894
enum drm_vblank_seq_type seqtype;
895
unsigned int sequence;
896
} drm_i915_vblank_swap_t;
897
898
typedef struct drm_i915_hws_addr {
899
__u64 addr;
900
} drm_i915_hws_addr_t;
901
902
struct drm_i915_gem_init {
903
/**
904
* Beginning offset in the GTT to be managed by the DRM memory
905
* manager.
906
*/
907
__u64 gtt_start;
908
/**
909
* Ending offset in the GTT to be managed by the DRM memory
910
* manager.
911
*/
912
__u64 gtt_end;
913
};
914
915
struct drm_i915_gem_create {
916
/**
917
* Requested size for the object.
918
*
919
* The (page-aligned) allocated size for the object will be returned.
920
*/
921
__u64 size;
922
/**
923
* Returned handle for the object.
924
*
925
* Object handles are nonzero.
926
*/
927
__u32 handle;
928
__u32 pad;
929
};
930
931
struct drm_i915_gem_pread {
932
/** Handle for the object being read. */
933
__u32 handle;
934
__u32 pad;
935
/** Offset into the object to read from */
936
__u64 offset;
937
/** Length of data to read */
938
__u64 size;
939
/**
940
* Pointer to write the data into.
941
*
942
* This is a fixed-size type for 32/64 compatibility.
943
*/
944
__u64 data_ptr;
945
};
946
947
struct drm_i915_gem_pwrite {
948
/** Handle for the object being written to. */
949
__u32 handle;
950
__u32 pad;
951
/** Offset into the object to write to */
952
__u64 offset;
953
/** Length of data to write */
954
__u64 size;
955
/**
956
* Pointer to read the data from.
957
*
958
* This is a fixed-size type for 32/64 compatibility.
959
*/
960
__u64 data_ptr;
961
};
962
963
struct drm_i915_gem_mmap {
964
/** Handle for the object being mapped. */
965
__u32 handle;
966
__u32 pad;
967
/** Offset in the object to map. */
968
__u64 offset;
969
/**
970
* Length of data to map.
971
*
972
* The value will be page-aligned.
973
*/
974
__u64 size;
975
/**
976
* Returned pointer the data was mapped at.
977
*
978
* This is a fixed-size type for 32/64 compatibility.
979
*/
980
__u64 addr_ptr;
981
982
/**
983
* Flags for extended behaviour.
984
*
985
* Added in version 2.
986
*/
987
__u64 flags;
988
#define I915_MMAP_WC 0x1
989
};
990
991
struct drm_i915_gem_mmap_gtt {
992
/** Handle for the object being mapped. */
993
__u32 handle;
994
__u32 pad;
995
/**
996
* Fake offset to use for subsequent mmap call
997
*
998
* This is a fixed-size type for 32/64 compatibility.
999
*/
1000
__u64 offset;
1001
};
1002
1003
/**
1004
* struct drm_i915_gem_mmap_offset - Retrieve an offset so we can mmap this buffer object.
1005
*
1006
* This struct is passed as argument to the `DRM_IOCTL_I915_GEM_MMAP_OFFSET` ioctl,
1007
* and is used to retrieve the fake offset to mmap an object specified by &handle.
1008
*
1009
* The legacy way of using `DRM_IOCTL_I915_GEM_MMAP` is removed on gen12+.
1010
* `DRM_IOCTL_I915_GEM_MMAP_GTT` is an older supported alias to this struct, but will behave
1011
* as setting the &extensions to 0, and &flags to `I915_MMAP_OFFSET_GTT`.
1012
*/
1013
struct drm_i915_gem_mmap_offset {
1014
/** @handle: Handle for the object being mapped. */
1015
__u32 handle;
1016
/** @pad: Must be zero */
1017
__u32 pad;
1018
/**
1019
* @offset: The fake offset to use for subsequent mmap call
1020
*
1021
* This is a fixed-size type for 32/64 compatibility.
1022
*/
1023
__u64 offset;
1024
1025
/**
1026
* @flags: Flags for extended behaviour.
1027
*
1028
* It is mandatory that one of the `MMAP_OFFSET` types
1029
* should be included:
1030
*
1031
* - `I915_MMAP_OFFSET_GTT`: Use mmap with the object bound to GTT. (Write-Combined)
1032
* - `I915_MMAP_OFFSET_WC`: Use Write-Combined caching.
1033
* - `I915_MMAP_OFFSET_WB`: Use Write-Back caching.
1034
* - `I915_MMAP_OFFSET_FIXED`: Use object placement to determine caching.
1035
*
1036
* On devices with local memory `I915_MMAP_OFFSET_FIXED` is the only valid
1037
* type. On devices without local memory, this caching mode is invalid.
1038
*
1039
* As caching mode when specifying `I915_MMAP_OFFSET_FIXED`, WC or WB will
1040
* be used, depending on the object placement on creation. WB will be used
1041
* when the object can only exist in system memory, WC otherwise.
1042
*/
1043
__u64 flags;
1044
1045
#define I915_MMAP_OFFSET_GTT 0
1046
#define I915_MMAP_OFFSET_WC 1
1047
#define I915_MMAP_OFFSET_WB 2
1048
#define I915_MMAP_OFFSET_UC 3
1049
#define I915_MMAP_OFFSET_FIXED 4
1050
1051
/**
1052
* @extensions: Zero-terminated chain of extensions.
1053
*
1054
* No current extensions defined; mbz.
1055
*/
1056
__u64 extensions;
1057
};
1058
1059
/**
1060
* struct drm_i915_gem_set_domain - Adjust the objects write or read domain, in
1061
* preparation for accessing the pages via some CPU domain.
1062
*
1063
* Specifying a new write or read domain will flush the object out of the
1064
* previous domain(if required), before then updating the objects domain
1065
* tracking with the new domain.
1066
*
1067
* Note this might involve waiting for the object first if it is still active on
1068
* the GPU.
1069
*
1070
* Supported values for @read_domains and @write_domain:
1071
*
1072
* - I915_GEM_DOMAIN_WC: Uncached write-combined domain
1073
* - I915_GEM_DOMAIN_CPU: CPU cache domain
1074
* - I915_GEM_DOMAIN_GTT: Mappable aperture domain
1075
*
1076
* All other domains are rejected.
1077
*
1078
* Note that for discrete, starting from DG1, this is no longer supported, and
1079
* is instead rejected. On such platforms the CPU domain is effectively static,
1080
* where we also only support a single &drm_i915_gem_mmap_offset cache mode,
1081
* which can't be set explicitly and instead depends on the object placements,
1082
* as per the below.
1083
*
1084
* Implicit caching rules, starting from DG1:
1085
*
1086
* - If any of the object placements (see &drm_i915_gem_create_ext_memory_regions)
1087
* contain I915_MEMORY_CLASS_DEVICE then the object will be allocated and
1088
* mapped as write-combined only.
1089
*
1090
* - Everything else is always allocated and mapped as write-back, with the
1091
* guarantee that everything is also coherent with the GPU.
1092
*
1093
* Note that this is likely to change in the future again, where we might need
1094
* more flexibility on future devices, so making this all explicit as part of a
1095
* new &drm_i915_gem_create_ext extension is probable.
1096
*/
1097
struct drm_i915_gem_set_domain {
1098
/** @handle: Handle for the object. */
1099
__u32 handle;
1100
1101
/** @read_domains: New read domains. */
1102
__u32 read_domains;
1103
1104
/**
1105
* @write_domain: New write domain.
1106
*
1107
* Note that having something in the write domain implies it's in the
1108
* read domain, and only that read domain.
1109
*/
1110
__u32 write_domain;
1111
};
1112
1113
struct drm_i915_gem_sw_finish {
1114
/** Handle for the object */
1115
__u32 handle;
1116
};
1117
1118
struct drm_i915_gem_relocation_entry {
1119
/**
1120
* Handle of the buffer being pointed to by this relocation entry.
1121
*
1122
* It's appealing to make this be an index into the mm_validate_entry
1123
* list to refer to the buffer, but this allows the driver to create
1124
* a relocation list for state buffers and not re-write it per
1125
* exec using the buffer.
1126
*/
1127
__u32 target_handle;
1128
1129
/**
1130
* Value to be added to the offset of the target buffer to make up
1131
* the relocation entry.
1132
*/
1133
__u32 delta;
1134
1135
/** Offset in the buffer the relocation entry will be written into */
1136
__u64 offset;
1137
1138
/**
1139
* Offset value of the target buffer that the relocation entry was last
1140
* written as.
1141
*
1142
* If the buffer has the same offset as last time, we can skip syncing
1143
* and writing the relocation. This value is written back out by
1144
* the execbuffer ioctl when the relocation is written.
1145
*/
1146
__u64 presumed_offset;
1147
1148
/**
1149
* Target memory domains read by this operation.
1150
*/
1151
__u32 read_domains;
1152
1153
/**
1154
* Target memory domains written by this operation.
1155
*
1156
* Note that only one domain may be written by the whole
1157
* execbuffer operation, so that where there are conflicts,
1158
* the application will get -EINVAL back.
1159
*/
1160
__u32 write_domain;
1161
};
1162
1163
/** @{
1164
* Intel memory domains
1165
*
1166
* Most of these just align with the various caches in
1167
* the system and are used to flush and invalidate as
1168
* objects end up cached in different domains.
1169
*/
1170
/** CPU cache */
1171
#define I915_GEM_DOMAIN_CPU 0x00000001
1172
/** Render cache, used by 2D and 3D drawing */
1173
#define I915_GEM_DOMAIN_RENDER 0x00000002
1174
/** Sampler cache, used by texture engine */
1175
#define I915_GEM_DOMAIN_SAMPLER 0x00000004
1176
/** Command queue, used to load batch buffers */
1177
#define I915_GEM_DOMAIN_COMMAND 0x00000008
1178
/** Instruction cache, used by shader programs */
1179
#define I915_GEM_DOMAIN_INSTRUCTION 0x00000010
1180
/** Vertex address cache */
1181
#define I915_GEM_DOMAIN_VERTEX 0x00000020
1182
/** GTT domain - aperture and scanout */
1183
#define I915_GEM_DOMAIN_GTT 0x00000040
1184
/** WC domain - uncached access */
1185
#define I915_GEM_DOMAIN_WC 0x00000080
1186
/** @} */
1187
1188
struct drm_i915_gem_exec_object {
1189
/**
1190
* User's handle for a buffer to be bound into the GTT for this
1191
* operation.
1192
*/
1193
__u32 handle;
1194
1195
/** Number of relocations to be performed on this buffer */
1196
__u32 relocation_count;
1197
/**
1198
* Pointer to array of struct drm_i915_gem_relocation_entry containing
1199
* the relocations to be performed in this buffer.
1200
*/
1201
__u64 relocs_ptr;
1202
1203
/** Required alignment in graphics aperture */
1204
__u64 alignment;
1205
1206
/**
1207
* Returned value of the updated offset of the object, for future
1208
* presumed_offset writes.
1209
*/
1210
__u64 offset;
1211
};
1212
1213
/* DRM_IOCTL_I915_GEM_EXECBUFFER was removed in Linux 5.13 */
1214
struct drm_i915_gem_execbuffer {
1215
/**
1216
* List of buffers to be validated with their relocations to be
1217
* performend on them.
1218
*
1219
* This is a pointer to an array of struct drm_i915_gem_validate_entry.
1220
*
1221
* These buffers must be listed in an order such that all relocations
1222
* a buffer is performing refer to buffers that have already appeared
1223
* in the validate list.
1224
*/
1225
__u64 buffers_ptr;
1226
__u32 buffer_count;
1227
1228
/** Offset in the batchbuffer to start execution from. */
1229
__u32 batch_start_offset;
1230
/** Bytes used in batchbuffer from batch_start_offset */
1231
__u32 batch_len;
1232
__u32 DR1;
1233
__u32 DR4;
1234
__u32 num_cliprects;
1235
/** This is a struct drm_clip_rect *cliprects */
1236
__u64 cliprects_ptr;
1237
};
1238
1239
struct drm_i915_gem_exec_object2 {
1240
/**
1241
* User's handle for a buffer to be bound into the GTT for this
1242
* operation.
1243
*/
1244
__u32 handle;
1245
1246
/** Number of relocations to be performed on this buffer */
1247
__u32 relocation_count;
1248
/**
1249
* Pointer to array of struct drm_i915_gem_relocation_entry containing
1250
* the relocations to be performed in this buffer.
1251
*/
1252
__u64 relocs_ptr;
1253
1254
/** Required alignment in graphics aperture */
1255
__u64 alignment;
1256
1257
/**
1258
* When the EXEC_OBJECT_PINNED flag is specified this is populated by
1259
* the user with the GTT offset at which this object will be pinned.
1260
*
1261
* When the I915_EXEC_NO_RELOC flag is specified this must contain the
1262
* presumed_offset of the object.
1263
*
1264
* During execbuffer2 the kernel populates it with the value of the
1265
* current GTT offset of the object, for future presumed_offset writes.
1266
*
1267
* See struct drm_i915_gem_create_ext for the rules when dealing with
1268
* alignment restrictions with I915_MEMORY_CLASS_DEVICE, on devices with
1269
* minimum page sizes, like DG2.
1270
*/
1271
__u64 offset;
1272
1273
#define EXEC_OBJECT_NEEDS_FENCE (1<<0)
1274
#define EXEC_OBJECT_NEEDS_GTT (1<<1)
1275
#define EXEC_OBJECT_WRITE (1<<2)
1276
#define EXEC_OBJECT_SUPPORTS_48B_ADDRESS (1<<3)
1277
#define EXEC_OBJECT_PINNED (1<<4)
1278
#define EXEC_OBJECT_PAD_TO_SIZE (1<<5)
1279
/* The kernel implicitly tracks GPU activity on all GEM objects, and
1280
* synchronises operations with outstanding rendering. This includes
1281
* rendering on other devices if exported via dma-buf. However, sometimes
1282
* this tracking is too coarse and the user knows better. For example,
1283
* if the object is split into non-overlapping ranges shared between different
1284
* clients or engines (i.e. suballocating objects), the implicit tracking
1285
* by kernel assumes that each operation affects the whole object rather
1286
* than an individual range, causing needless synchronisation between clients.
1287
* The kernel will also forgo any CPU cache flushes prior to rendering from
1288
* the object as the client is expected to be also handling such domain
1289
* tracking.
1290
*
1291
* The kernel maintains the implicit tracking in order to manage resources
1292
* used by the GPU - this flag only disables the synchronisation prior to
1293
* rendering with this object in this execbuf.
1294
*
1295
* Opting out of implicit synhronisation requires the user to do its own
1296
* explicit tracking to avoid rendering corruption. See, for example,
1297
* I915_PARAM_HAS_EXEC_FENCE to order execbufs and execute them asynchronously.
1298
*/
1299
#define EXEC_OBJECT_ASYNC (1<<6)
1300
/* Request that the contents of this execobject be copied into the error
1301
* state upon a GPU hang involving this batch for post-mortem debugging.
1302
* These buffers are recorded in no particular order as "user" in
1303
* /sys/class/drm/cardN/error. Query I915_PARAM_HAS_EXEC_CAPTURE to see
1304
* if the kernel supports this flag.
1305
*/
1306
#define EXEC_OBJECT_CAPTURE (1<<7)
1307
/* All remaining bits are MBZ and RESERVED FOR FUTURE USE */
1308
#define __EXEC_OBJECT_UNKNOWN_FLAGS -(EXEC_OBJECT_CAPTURE<<1)
1309
__u64 flags;
1310
1311
union {
1312
__u64 rsvd1;
1313
__u64 pad_to_size;
1314
};
1315
__u64 rsvd2;
1316
};
1317
1318
/**
1319
* struct drm_i915_gem_exec_fence - An input or output fence for the execbuf
1320
* ioctl.
1321
*
1322
* The request will wait for input fence to signal before submission.
1323
*
1324
* The returned output fence will be signaled after the completion of the
1325
* request.
1326
*/
1327
struct drm_i915_gem_exec_fence {
1328
/** @handle: User's handle for a drm_syncobj to wait on or signal. */
1329
__u32 handle;
1330
1331
/**
1332
* @flags: Supported flags are:
1333
*
1334
* I915_EXEC_FENCE_WAIT:
1335
* Wait for the input fence before request submission.
1336
*
1337
* I915_EXEC_FENCE_SIGNAL:
1338
* Return request completion fence as output
1339
*/
1340
__u32 flags;
1341
#define I915_EXEC_FENCE_WAIT (1<<0)
1342
#define I915_EXEC_FENCE_SIGNAL (1<<1)
1343
#define __I915_EXEC_FENCE_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_SIGNAL << 1))
1344
};
1345
1346
/**
1347
* struct drm_i915_gem_execbuffer_ext_timeline_fences - Timeline fences
1348
* for execbuf ioctl.
1349
*
1350
* This structure describes an array of drm_syncobj and associated points for
1351
* timeline variants of drm_syncobj. It is invalid to append this structure to
1352
* the execbuf if I915_EXEC_FENCE_ARRAY is set.
1353
*/
1354
struct drm_i915_gem_execbuffer_ext_timeline_fences {
1355
#define DRM_I915_GEM_EXECBUFFER_EXT_TIMELINE_FENCES 0
1356
/** @base: Extension link. See struct i915_user_extension. */
1357
struct i915_user_extension base;
1358
1359
/**
1360
* @fence_count: Number of elements in the @handles_ptr & @value_ptr
1361
* arrays.
1362
*/
1363
__u64 fence_count;
1364
1365
/**
1366
* @handles_ptr: Pointer to an array of struct drm_i915_gem_exec_fence
1367
* of length @fence_count.
1368
*/
1369
__u64 handles_ptr;
1370
1371
/**
1372
* @values_ptr: Pointer to an array of u64 values of length
1373
* @fence_count.
1374
* Values must be 0 for a binary drm_syncobj. A Value of 0 for a
1375
* timeline drm_syncobj is invalid as it turns a drm_syncobj into a
1376
* binary one.
1377
*/
1378
__u64 values_ptr;
1379
};
1380
1381
/**
1382
* struct drm_i915_gem_execbuffer2 - Structure for DRM_I915_GEM_EXECBUFFER2
1383
* ioctl.
1384
*/
1385
struct drm_i915_gem_execbuffer2 {
1386
/** @buffers_ptr: Pointer to a list of gem_exec_object2 structs */
1387
__u64 buffers_ptr;
1388
1389
/** @buffer_count: Number of elements in @buffers_ptr array */
1390
__u32 buffer_count;
1391
1392
/**
1393
* @batch_start_offset: Offset in the batchbuffer to start execution
1394
* from.
1395
*/
1396
__u32 batch_start_offset;
1397
1398
/**
1399
* @batch_len: Length in bytes of the batch buffer, starting from the
1400
* @batch_start_offset. If 0, length is assumed to be the batch buffer
1401
* object size.
1402
*/
1403
__u32 batch_len;
1404
1405
/** @DR1: deprecated */
1406
__u32 DR1;
1407
1408
/** @DR4: deprecated */
1409
__u32 DR4;
1410
1411
/** @num_cliprects: See @cliprects_ptr */
1412
__u32 num_cliprects;
1413
1414
/**
1415
* @cliprects_ptr: Kernel clipping was a DRI1 misfeature.
1416
*
1417
* It is invalid to use this field if I915_EXEC_FENCE_ARRAY or
1418
* I915_EXEC_USE_EXTENSIONS flags are not set.
1419
*
1420
* If I915_EXEC_FENCE_ARRAY is set, then this is a pointer to an array
1421
* of &drm_i915_gem_exec_fence and @num_cliprects is the length of the
1422
* array.
1423
*
1424
* If I915_EXEC_USE_EXTENSIONS is set, then this is a pointer to a
1425
* single &i915_user_extension and num_cliprects is 0.
1426
*/
1427
__u64 cliprects_ptr;
1428
1429
/** @flags: Execbuf flags */
1430
__u64 flags;
1431
#define I915_EXEC_RING_MASK (0x3f)
1432
#define I915_EXEC_DEFAULT (0<<0)
1433
#define I915_EXEC_RENDER (1<<0)
1434
#define I915_EXEC_BSD (2<<0)
1435
#define I915_EXEC_BLT (3<<0)
1436
#define I915_EXEC_VEBOX (4<<0)
1437
1438
/* Used for switching the constants addressing mode on gen4+ RENDER ring.
1439
* Gen6+ only supports relative addressing to dynamic state (default) and
1440
* absolute addressing.
1441
*
1442
* These flags are ignored for the BSD and BLT rings.
1443
*/
1444
#define I915_EXEC_CONSTANTS_MASK (3<<6)
1445
#define I915_EXEC_CONSTANTS_REL_GENERAL (0<<6) /* default */
1446
#define I915_EXEC_CONSTANTS_ABSOLUTE (1<<6)
1447
#define I915_EXEC_CONSTANTS_REL_SURFACE (2<<6) /* gen4/5 only */
1448
1449
/** Resets the SO write offset registers for transform feedback on gen7. */
1450
#define I915_EXEC_GEN7_SOL_RESET (1<<8)
1451
1452
/** Request a privileged ("secure") batch buffer. Note only available for
1453
* DRM_ROOT_ONLY | DRM_MASTER processes.
1454
*/
1455
#define I915_EXEC_SECURE (1<<9)
1456
1457
/** Inform the kernel that the batch is and will always be pinned. This
1458
* negates the requirement for a workaround to be performed to avoid
1459
* an incoherent CS (such as can be found on 830/845). If this flag is
1460
* not passed, the kernel will endeavour to make sure the batch is
1461
* coherent with the CS before execution. If this flag is passed,
1462
* userspace assumes the responsibility for ensuring the same.
1463
*/
1464
#define I915_EXEC_IS_PINNED (1<<10)
1465
1466
/** Provide a hint to the kernel that the command stream and auxiliary
1467
* state buffers already holds the correct presumed addresses and so the
1468
* relocation process may be skipped if no buffers need to be moved in
1469
* preparation for the execbuffer.
1470
*/
1471
#define I915_EXEC_NO_RELOC (1<<11)
1472
1473
/** Use the reloc.handle as an index into the exec object array rather
1474
* than as the per-file handle.
1475
*/
1476
#define I915_EXEC_HANDLE_LUT (1<<12)
1477
1478
/** Used for switching BSD rings on the platforms with two BSD rings */
1479
#define I915_EXEC_BSD_SHIFT (13)
1480
#define I915_EXEC_BSD_MASK (3 << I915_EXEC_BSD_SHIFT)
1481
/* default ping-pong mode */
1482
#define I915_EXEC_BSD_DEFAULT (0 << I915_EXEC_BSD_SHIFT)
1483
#define I915_EXEC_BSD_RING1 (1 << I915_EXEC_BSD_SHIFT)
1484
#define I915_EXEC_BSD_RING2 (2 << I915_EXEC_BSD_SHIFT)
1485
1486
/** Tell the kernel that the batchbuffer is processed by
1487
* the resource streamer.
1488
*/
1489
#define I915_EXEC_RESOURCE_STREAMER (1<<15)
1490
1491
/* Setting I915_EXEC_FENCE_IN implies that lower_32_bits(rsvd2) represent
1492
* a sync_file fd to wait upon (in a nonblocking manner) prior to executing
1493
* the batch.
1494
*
1495
* Returns -EINVAL if the sync_file fd cannot be found.
1496
*/
1497
#define I915_EXEC_FENCE_IN (1<<16)
1498
1499
/* Setting I915_EXEC_FENCE_OUT causes the ioctl to return a sync_file fd
1500
* in the upper_32_bits(rsvd2) upon success. Ownership of the fd is given
1501
* to the caller, and it should be close() after use. (The fd is a regular
1502
* file descriptor and will be cleaned up on process termination. It holds
1503
* a reference to the request, but nothing else.)
1504
*
1505
* The sync_file fd can be combined with other sync_file and passed either
1506
* to execbuf using I915_EXEC_FENCE_IN, to atomic KMS ioctls (so that a flip
1507
* will only occur after this request completes), or to other devices.
1508
*
1509
* Using I915_EXEC_FENCE_OUT requires use of
1510
* DRM_IOCTL_I915_GEM_EXECBUFFER2_WR ioctl so that the result is written
1511
* back to userspace. Failure to do so will cause the out-fence to always
1512
* be reported as zero, and the real fence fd to be leaked.
1513
*/
1514
#define I915_EXEC_FENCE_OUT (1<<17)
1515
1516
/*
1517
* Traditionally the execbuf ioctl has only considered the final element in
1518
* the execobject[] to be the executable batch. Often though, the client
1519
* will known the batch object prior to construction and being able to place
1520
* it into the execobject[] array first can simplify the relocation tracking.
1521
* Setting I915_EXEC_BATCH_FIRST tells execbuf to use element 0 of the
1522
* execobject[] as the * batch instead (the default is to use the last
1523
* element).
1524
*/
1525
#define I915_EXEC_BATCH_FIRST (1<<18)
1526
1527
/* Setting I915_FENCE_ARRAY implies that num_cliprects and cliprects_ptr
1528
* define an array of i915_gem_exec_fence structures which specify a set of
1529
* dma fences to wait upon or signal.
1530
*/
1531
#define I915_EXEC_FENCE_ARRAY (1<<19)
1532
1533
/*
1534
* Setting I915_EXEC_FENCE_SUBMIT implies that lower_32_bits(rsvd2) represent
1535
* a sync_file fd to wait upon (in a nonblocking manner) prior to executing
1536
* the batch.
1537
*
1538
* Returns -EINVAL if the sync_file fd cannot be found.
1539
*/
1540
#define I915_EXEC_FENCE_SUBMIT (1 << 20)
1541
1542
/*
1543
* Setting I915_EXEC_USE_EXTENSIONS implies that
1544
* drm_i915_gem_execbuffer2.cliprects_ptr is treated as a pointer to an linked
1545
* list of i915_user_extension. Each i915_user_extension node is the base of a
1546
* larger structure. The list of supported structures are listed in the
1547
* drm_i915_gem_execbuffer_ext enum.
1548
*/
1549
#define I915_EXEC_USE_EXTENSIONS (1 << 21)
1550
#define __I915_EXEC_UNKNOWN_FLAGS (-(I915_EXEC_USE_EXTENSIONS << 1))
1551
1552
/** @rsvd1: Context id */
1553
__u64 rsvd1;
1554
1555
/**
1556
* @rsvd2: in and out sync_file file descriptors.
1557
*
1558
* When I915_EXEC_FENCE_IN or I915_EXEC_FENCE_SUBMIT flag is set, the
1559
* lower 32 bits of this field will have the in sync_file fd (input).
1560
*
1561
* When I915_EXEC_FENCE_OUT flag is set, the upper 32 bits of this
1562
* field will have the out sync_file fd (output).
1563
*/
1564
__u64 rsvd2;
1565
};
1566
1567
#define I915_EXEC_CONTEXT_ID_MASK (0xffffffff)
1568
#define i915_execbuffer2_set_context_id(eb2, context) \
1569
(eb2).rsvd1 = context & I915_EXEC_CONTEXT_ID_MASK
1570
#define i915_execbuffer2_get_context_id(eb2) \
1571
((eb2).rsvd1 & I915_EXEC_CONTEXT_ID_MASK)
1572
1573
struct drm_i915_gem_pin {
1574
/** Handle of the buffer to be pinned. */
1575
__u32 handle;
1576
__u32 pad;
1577
1578
/** alignment required within the aperture */
1579
__u64 alignment;
1580
1581
/** Returned GTT offset of the buffer. */
1582
__u64 offset;
1583
};
1584
1585
struct drm_i915_gem_unpin {
1586
/** Handle of the buffer to be unpinned. */
1587
__u32 handle;
1588
__u32 pad;
1589
};
1590
1591
struct drm_i915_gem_busy {
1592
/** Handle of the buffer to check for busy */
1593
__u32 handle;
1594
1595
/** Return busy status
1596
*
1597
* A return of 0 implies that the object is idle (after
1598
* having flushed any pending activity), and a non-zero return that
1599
* the object is still in-flight on the GPU. (The GPU has not yet
1600
* signaled completion for all pending requests that reference the
1601
* object.) An object is guaranteed to become idle eventually (so
1602
* long as no new GPU commands are executed upon it). Due to the
1603
* asynchronous nature of the hardware, an object reported
1604
* as busy may become idle before the ioctl is completed.
1605
*
1606
* Furthermore, if the object is busy, which engine is busy is only
1607
* provided as a guide and only indirectly by reporting its class
1608
* (there may be more than one engine in each class). There are race
1609
* conditions which prevent the report of which engines are busy from
1610
* being always accurate. However, the converse is not true. If the
1611
* object is idle, the result of the ioctl, that all engines are idle,
1612
* is accurate.
1613
*
1614
* The returned dword is split into two fields to indicate both
1615
* the engine classes on which the object is being read, and the
1616
* engine class on which it is currently being written (if any).
1617
*
1618
* The low word (bits 0:15) indicate if the object is being written
1619
* to by any engine (there can only be one, as the GEM implicit
1620
* synchronisation rules force writes to be serialised). Only the
1621
* engine class (offset by 1, I915_ENGINE_CLASS_RENDER is reported as
1622
* 1 not 0 etc) for the last write is reported.
1623
*
1624
* The high word (bits 16:31) are a bitmask of which engines classes
1625
* are currently reading from the object. Multiple engines may be
1626
* reading from the object simultaneously.
1627
*
1628
* The value of each engine class is the same as specified in the
1629
* I915_CONTEXT_PARAM_ENGINES context parameter and via perf, i.e.
1630
* I915_ENGINE_CLASS_RENDER, I915_ENGINE_CLASS_COPY, etc.
1631
* Some hardware may have parallel execution engines, e.g. multiple
1632
* media engines, which are mapped to the same class identifier and so
1633
* are not separately reported for busyness.
1634
*
1635
* Caveat emptor:
1636
* Only the boolean result of this query is reliable; that is whether
1637
* the object is idle or busy. The report of which engines are busy
1638
* should be only used as a heuristic.
1639
*/
1640
__u32 busy;
1641
};
1642
1643
/**
1644
* struct drm_i915_gem_caching - Set or get the caching for given object
1645
* handle.
1646
*
1647
* Allow userspace to control the GTT caching bits for a given object when the
1648
* object is later mapped through the ppGTT(or GGTT on older platforms lacking
1649
* ppGTT support, or if the object is used for scanout). Note that this might
1650
* require unbinding the object from the GTT first, if its current caching value
1651
* doesn't match.
1652
*
1653
* Note that this all changes on discrete platforms, starting from DG1, the
1654
* set/get caching is no longer supported, and is now rejected. Instead the CPU
1655
* caching attributes(WB vs WC) will become an immutable creation time property
1656
* for the object, along with the GTT caching level. For now we don't expose any
1657
* new uAPI for this, instead on DG1 this is all implicit, although this largely
1658
* shouldn't matter since DG1 is coherent by default(without any way of
1659
* controlling it).
1660
*
1661
* Implicit caching rules, starting from DG1:
1662
*
1663
* - If any of the object placements (see &drm_i915_gem_create_ext_memory_regions)
1664
* contain I915_MEMORY_CLASS_DEVICE then the object will be allocated and
1665
* mapped as write-combined only.
1666
*
1667
* - Everything else is always allocated and mapped as write-back, with the
1668
* guarantee that everything is also coherent with the GPU.
1669
*
1670
* Note that this is likely to change in the future again, where we might need
1671
* more flexibility on future devices, so making this all explicit as part of a
1672
* new &drm_i915_gem_create_ext extension is probable.
1673
*
1674
* Side note: Part of the reason for this is that changing the at-allocation-time CPU
1675
* caching attributes for the pages might be required(and is expensive) if we
1676
* need to then CPU map the pages later with different caching attributes. This
1677
* inconsistent caching behaviour, while supported on x86, is not universally
1678
* supported on other architectures. So for simplicity we opt for setting
1679
* everything at creation time, whilst also making it immutable, on discrete
1680
* platforms.
1681
*/
1682
struct drm_i915_gem_caching {
1683
/**
1684
* @handle: Handle of the buffer to set/get the caching level.
1685
*/
1686
__u32 handle;
1687
1688
/**
1689
* @caching: The GTT caching level to apply or possible return value.
1690
*
1691
* The supported @caching values:
1692
*
1693
* I915_CACHING_NONE:
1694
*
1695
* GPU access is not coherent with CPU caches. Default for machines
1696
* without an LLC. This means manual flushing might be needed, if we
1697
* want GPU access to be coherent.
1698
*
1699
* I915_CACHING_CACHED:
1700
*
1701
* GPU access is coherent with CPU caches and furthermore the data is
1702
* cached in last-level caches shared between CPU cores and the GPU GT.
1703
*
1704
* I915_CACHING_DISPLAY:
1705
*
1706
* Special GPU caching mode which is coherent with the scanout engines.
1707
* Transparently falls back to I915_CACHING_NONE on platforms where no
1708
* special cache mode (like write-through or gfdt flushing) is
1709
* available. The kernel automatically sets this mode when using a
1710
* buffer as a scanout target. Userspace can manually set this mode to
1711
* avoid a costly stall and clflush in the hotpath of drawing the first
1712
* frame.
1713
*/
1714
#define I915_CACHING_NONE 0
1715
#define I915_CACHING_CACHED 1
1716
#define I915_CACHING_DISPLAY 2
1717
__u32 caching;
1718
};
1719
1720
#define I915_TILING_NONE 0
1721
#define I915_TILING_X 1
1722
#define I915_TILING_Y 2
1723
/*
1724
* Do not add new tiling types here. The I915_TILING_* values are for
1725
* de-tiling fence registers that no longer exist on modern platforms. Although
1726
* the hardware may support new types of tiling in general (e.g., Tile4), we
1727
* do not need to add them to the uapi that is specific to now-defunct ioctls.
1728
*/
1729
#define I915_TILING_LAST I915_TILING_Y
1730
1731
#define I915_BIT_6_SWIZZLE_NONE 0
1732
#define I915_BIT_6_SWIZZLE_9 1
1733
#define I915_BIT_6_SWIZZLE_9_10 2
1734
#define I915_BIT_6_SWIZZLE_9_11 3
1735
#define I915_BIT_6_SWIZZLE_9_10_11 4
1736
/* Not seen by userland */
1737
#define I915_BIT_6_SWIZZLE_UNKNOWN 5
1738
/* Seen by userland. */
1739
#define I915_BIT_6_SWIZZLE_9_17 6
1740
#define I915_BIT_6_SWIZZLE_9_10_17 7
1741
1742
struct drm_i915_gem_set_tiling {
1743
/** Handle of the buffer to have its tiling state updated */
1744
__u32 handle;
1745
1746
/**
1747
* Tiling mode for the object (I915_TILING_NONE, I915_TILING_X,
1748
* I915_TILING_Y).
1749
*
1750
* This value is to be set on request, and will be updated by the
1751
* kernel on successful return with the actual chosen tiling layout.
1752
*
1753
* The tiling mode may be demoted to I915_TILING_NONE when the system
1754
* has bit 6 swizzling that can't be managed correctly by GEM.
1755
*
1756
* Buffer contents become undefined when changing tiling_mode.
1757
*/
1758
__u32 tiling_mode;
1759
1760
/**
1761
* Stride in bytes for the object when in I915_TILING_X or
1762
* I915_TILING_Y.
1763
*/
1764
__u32 stride;
1765
1766
/**
1767
* Returned address bit 6 swizzling required for CPU access through
1768
* mmap mapping.
1769
*/
1770
__u32 swizzle_mode;
1771
};
1772
1773
struct drm_i915_gem_get_tiling {
1774
/** Handle of the buffer to get tiling state for. */
1775
__u32 handle;
1776
1777
/**
1778
* Current tiling mode for the object (I915_TILING_NONE, I915_TILING_X,
1779
* I915_TILING_Y).
1780
*/
1781
__u32 tiling_mode;
1782
1783
/**
1784
* Returned address bit 6 swizzling required for CPU access through
1785
* mmap mapping.
1786
*/
1787
__u32 swizzle_mode;
1788
1789
/**
1790
* Returned address bit 6 swizzling required for CPU access through
1791
* mmap mapping whilst bound.
1792
*/
1793
__u32 phys_swizzle_mode;
1794
};
1795
1796
struct drm_i915_gem_get_aperture {
1797
/** Total size of the aperture used by i915_gem_execbuffer, in bytes */
1798
__u64 aper_size;
1799
1800
/**
1801
* Available space in the aperture used by i915_gem_execbuffer, in
1802
* bytes
1803
*/
1804
__u64 aper_available_size;
1805
};
1806
1807
struct drm_i915_get_pipe_from_crtc_id {
1808
/** ID of CRTC being requested **/
1809
__u32 crtc_id;
1810
1811
/** pipe of requested CRTC **/
1812
__u32 pipe;
1813
};
1814
1815
#define I915_MADV_WILLNEED 0
1816
#define I915_MADV_DONTNEED 1
1817
#define __I915_MADV_PURGED 2 /* internal state */
1818
1819
struct drm_i915_gem_madvise {
1820
/** Handle of the buffer to change the backing store advice */
1821
__u32 handle;
1822
1823
/* Advice: either the buffer will be needed again in the near future,
1824
* or won't be and could be discarded under memory pressure.
1825
*/
1826
__u32 madv;
1827
1828
/** Whether the backing store still exists. */
1829
__u32 retained;
1830
};
1831
1832
/* flags */
1833
#define I915_OVERLAY_TYPE_MASK 0xff
1834
#define I915_OVERLAY_YUV_PLANAR 0x01
1835
#define I915_OVERLAY_YUV_PACKED 0x02
1836
#define I915_OVERLAY_RGB 0x03
1837
1838
#define I915_OVERLAY_DEPTH_MASK 0xff00
1839
#define I915_OVERLAY_RGB24 0x1000
1840
#define I915_OVERLAY_RGB16 0x2000
1841
#define I915_OVERLAY_RGB15 0x3000
1842
#define I915_OVERLAY_YUV422 0x0100
1843
#define I915_OVERLAY_YUV411 0x0200
1844
#define I915_OVERLAY_YUV420 0x0300
1845
#define I915_OVERLAY_YUV410 0x0400
1846
1847
#define I915_OVERLAY_SWAP_MASK 0xff0000
1848
#define I915_OVERLAY_NO_SWAP 0x000000
1849
#define I915_OVERLAY_UV_SWAP 0x010000
1850
#define I915_OVERLAY_Y_SWAP 0x020000
1851
#define I915_OVERLAY_Y_AND_UV_SWAP 0x030000
1852
1853
#define I915_OVERLAY_FLAGS_MASK 0xff000000
1854
#define I915_OVERLAY_ENABLE 0x01000000
1855
1856
struct drm_intel_overlay_put_image {
1857
/* various flags and src format description */
1858
__u32 flags;
1859
/* source picture description */
1860
__u32 bo_handle;
1861
/* stride values and offsets are in bytes, buffer relative */
1862
__u16 stride_Y; /* stride for packed formats */
1863
__u16 stride_UV;
1864
__u32 offset_Y; /* offset for packet formats */
1865
__u32 offset_U;
1866
__u32 offset_V;
1867
/* in pixels */
1868
__u16 src_width;
1869
__u16 src_height;
1870
/* to compensate the scaling factors for partially covered surfaces */
1871
__u16 src_scan_width;
1872
__u16 src_scan_height;
1873
/* output crtc description */
1874
__u32 crtc_id;
1875
__u16 dst_x;
1876
__u16 dst_y;
1877
__u16 dst_width;
1878
__u16 dst_height;
1879
};
1880
1881
/* flags */
1882
#define I915_OVERLAY_UPDATE_ATTRS (1<<0)
1883
#define I915_OVERLAY_UPDATE_GAMMA (1<<1)
1884
#define I915_OVERLAY_DISABLE_DEST_COLORKEY (1<<2)
1885
struct drm_intel_overlay_attrs {
1886
__u32 flags;
1887
__u32 color_key;
1888
__s32 brightness;
1889
__u32 contrast;
1890
__u32 saturation;
1891
__u32 gamma0;
1892
__u32 gamma1;
1893
__u32 gamma2;
1894
__u32 gamma3;
1895
__u32 gamma4;
1896
__u32 gamma5;
1897
};
1898
1899
/*
1900
* Intel sprite handling
1901
*
1902
* Color keying works with a min/mask/max tuple. Both source and destination
1903
* color keying is allowed.
1904
*
1905
* Source keying:
1906
* Sprite pixels within the min & max values, masked against the color channels
1907
* specified in the mask field, will be transparent. All other pixels will
1908
* be displayed on top of the primary plane. For RGB surfaces, only the min
1909
* and mask fields will be used; ranged compares are not allowed.
1910
*
1911
* Destination keying:
1912
* Primary plane pixels that match the min value, masked against the color
1913
* channels specified in the mask field, will be replaced by corresponding
1914
* pixels from the sprite plane.
1915
*
1916
* Note that source & destination keying are exclusive; only one can be
1917
* active on a given plane.
1918
*/
1919
1920
#define I915_SET_COLORKEY_NONE (1<<0) /* Deprecated. Instead set
1921
* flags==0 to disable colorkeying.
1922
*/
1923
#define I915_SET_COLORKEY_DESTINATION (1<<1)
1924
#define I915_SET_COLORKEY_SOURCE (1<<2)
1925
struct drm_intel_sprite_colorkey {
1926
__u32 plane_id;
1927
__u32 min_value;
1928
__u32 channel_mask;
1929
__u32 max_value;
1930
__u32 flags;
1931
};
1932
1933
struct drm_i915_gem_wait {
1934
/** Handle of BO we shall wait on */
1935
__u32 bo_handle;
1936
__u32 flags;
1937
/** Number of nanoseconds to wait, Returns time remaining. */
1938
__s64 timeout_ns;
1939
};
1940
1941
struct drm_i915_gem_context_create {
1942
__u32 ctx_id; /* output: id of new context*/
1943
__u32 pad;
1944
};
1945
1946
/**
1947
* struct drm_i915_gem_context_create_ext - Structure for creating contexts.
1948
*/
1949
struct drm_i915_gem_context_create_ext {
1950
/** @ctx_id: Id of the created context (output) */
1951
__u32 ctx_id;
1952
1953
/**
1954
* @flags: Supported flags are:
1955
*
1956
* I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS:
1957
*
1958
* Extensions may be appended to this structure and driver must check
1959
* for those. See @extensions.
1960
*
1961
* I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE
1962
*
1963
* Created context will have single timeline.
1964
*/
1965
__u32 flags;
1966
#define I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS (1u << 0)
1967
#define I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE (1u << 1)
1968
#define I915_CONTEXT_CREATE_FLAGS_UNKNOWN \
1969
(-(I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE << 1))
1970
1971
/**
1972
* @extensions: Zero-terminated chain of extensions.
1973
*
1974
* I915_CONTEXT_CREATE_EXT_SETPARAM:
1975
* Context parameter to set or query during context creation.
1976
* See struct drm_i915_gem_context_create_ext_setparam.
1977
*
1978
* I915_CONTEXT_CREATE_EXT_CLONE:
1979
* This extension has been removed. On the off chance someone somewhere
1980
* has attempted to use it, never re-use this extension number.
1981
*/
1982
__u64 extensions;
1983
#define I915_CONTEXT_CREATE_EXT_SETPARAM 0
1984
#define I915_CONTEXT_CREATE_EXT_CLONE 1
1985
};
1986
1987
/**
1988
* struct drm_i915_gem_context_param - Context parameter to set or query.
1989
*/
1990
struct drm_i915_gem_context_param {
1991
/** @ctx_id: Context id */
1992
__u32 ctx_id;
1993
1994
/** @size: Size of the parameter @value */
1995
__u32 size;
1996
1997
/** @param: Parameter to set or query */
1998
__u64 param;
1999
#define I915_CONTEXT_PARAM_BAN_PERIOD 0x1
2000
/* I915_CONTEXT_PARAM_NO_ZEROMAP has been removed. On the off chance
2001
* someone somewhere has attempted to use it, never re-use this context
2002
* param number.
2003
*/
2004
#define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2
2005
#define I915_CONTEXT_PARAM_GTT_SIZE 0x3
2006
#define I915_CONTEXT_PARAM_NO_ERROR_CAPTURE 0x4
2007
#define I915_CONTEXT_PARAM_BANNABLE 0x5
2008
#define I915_CONTEXT_PARAM_PRIORITY 0x6
2009
#define I915_CONTEXT_MAX_USER_PRIORITY 1023 /* inclusive */
2010
#define I915_CONTEXT_DEFAULT_PRIORITY 0
2011
#define I915_CONTEXT_MIN_USER_PRIORITY -1023 /* inclusive */
2012
/*
2013
* When using the following param, value should be a pointer to
2014
* drm_i915_gem_context_param_sseu.
2015
*/
2016
#define I915_CONTEXT_PARAM_SSEU 0x7
2017
2018
/*
2019
* Not all clients may want to attempt automatic recover of a context after
2020
* a hang (for example, some clients may only submit very small incremental
2021
* batches relying on known logical state of previous batches which will never
2022
* recover correctly and each attempt will hang), and so would prefer that
2023
* the context is forever banned instead.
2024
*
2025
* If set to false (0), after a reset, subsequent (and in flight) rendering
2026
* from this context is discarded, and the client will need to create a new
2027
* context to use instead.
2028
*
2029
* If set to true (1), the kernel will automatically attempt to recover the
2030
* context by skipping the hanging batch and executing the next batch starting
2031
* from the default context state (discarding the incomplete logical context
2032
* state lost due to the reset).
2033
*
2034
* On creation, all new contexts are marked as recoverable.
2035
*/
2036
#define I915_CONTEXT_PARAM_RECOVERABLE 0x8
2037
2038
/*
2039
* The id of the associated virtual memory address space (ppGTT) of
2040
* this context. Can be retrieved and passed to another context
2041
* (on the same fd) for both to use the same ppGTT and so share
2042
* address layouts, and avoid reloading the page tables on context
2043
* switches between themselves.
2044
*
2045
* See DRM_I915_GEM_VM_CREATE and DRM_I915_GEM_VM_DESTROY.
2046
*/
2047
#define I915_CONTEXT_PARAM_VM 0x9
2048
2049
/*
2050
* I915_CONTEXT_PARAM_ENGINES:
2051
*
2052
* Bind this context to operate on this subset of available engines. Henceforth,
2053
* the I915_EXEC_RING selector for DRM_IOCTL_I915_GEM_EXECBUFFER2 operates as
2054
* an index into this array of engines; I915_EXEC_DEFAULT selecting engine[0]
2055
* and upwards. Slots 0...N are filled in using the specified (class, instance).
2056
* Use
2057
* engine_class: I915_ENGINE_CLASS_INVALID,
2058
* engine_instance: I915_ENGINE_CLASS_INVALID_NONE
2059
* to specify a gap in the array that can be filled in later, e.g. by a
2060
* virtual engine used for load balancing.
2061
*
2062
* Setting the number of engines bound to the context to 0, by passing a zero
2063
* sized argument, will revert back to default settings.
2064
*
2065
* See struct i915_context_param_engines.
2066
*
2067
* Extensions:
2068
* i915_context_engines_load_balance (I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE)
2069
* i915_context_engines_bond (I915_CONTEXT_ENGINES_EXT_BOND)
2070
* i915_context_engines_parallel_submit (I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT)
2071
*/
2072
#define I915_CONTEXT_PARAM_ENGINES 0xa
2073
2074
/*
2075
* I915_CONTEXT_PARAM_PERSISTENCE:
2076
*
2077
* Allow the context and active rendering to survive the process until
2078
* completion. Persistence allows fire-and-forget clients to queue up a
2079
* bunch of work, hand the output over to a display server and then quit.
2080
* If the context is marked as not persistent, upon closing (either via
2081
* an explicit DRM_I915_GEM_CONTEXT_DESTROY or implicitly from file closure
2082
* or process termination), the context and any outstanding requests will be
2083
* cancelled (and exported fences for cancelled requests marked as -EIO).
2084
*
2085
* By default, new contexts allow persistence.
2086
*/
2087
#define I915_CONTEXT_PARAM_PERSISTENCE 0xb
2088
2089
/* This API has been removed. On the off chance someone somewhere has
2090
* attempted to use it, never re-use this context param number.
2091
*/
2092
#define I915_CONTEXT_PARAM_RINGSIZE 0xc
2093
2094
/*
2095
* I915_CONTEXT_PARAM_PROTECTED_CONTENT:
2096
*
2097
* Mark that the context makes use of protected content, which will result
2098
* in the context being invalidated when the protected content session is.
2099
* Given that the protected content session is killed on suspend, the device
2100
* is kept awake for the lifetime of a protected context, so the user should
2101
* make sure to dispose of them once done.
2102
* This flag can only be set at context creation time and, when set to true,
2103
* must be preceded by an explicit setting of I915_CONTEXT_PARAM_RECOVERABLE
2104
* to false. This flag can't be set to true in conjunction with setting the
2105
* I915_CONTEXT_PARAM_BANNABLE flag to false. Creation example:
2106
*
2107
* .. code-block:: C
2108
*
2109
* struct drm_i915_gem_context_create_ext_setparam p_protected = {
2110
* .base = {
2111
* .name = I915_CONTEXT_CREATE_EXT_SETPARAM,
2112
* },
2113
* .param = {
2114
* .param = I915_CONTEXT_PARAM_PROTECTED_CONTENT,
2115
* .value = 1,
2116
* }
2117
* };
2118
* struct drm_i915_gem_context_create_ext_setparam p_norecover = {
2119
* .base = {
2120
* .name = I915_CONTEXT_CREATE_EXT_SETPARAM,
2121
* .next_extension = to_user_pointer(&p_protected),
2122
* },
2123
* .param = {
2124
* .param = I915_CONTEXT_PARAM_RECOVERABLE,
2125
* .value = 0,
2126
* }
2127
* };
2128
* struct drm_i915_gem_context_create_ext create = {
2129
* .flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
2130
* .extensions = to_user_pointer(&p_norecover);
2131
* };
2132
*
2133
* ctx_id = gem_context_create_ext(drm_fd, &create);
2134
*
2135
* In addition to the normal failure cases, setting this flag during context
2136
* creation can result in the following errors:
2137
*
2138
* -ENODEV: feature not available
2139
* -EPERM: trying to mark a recoverable or not bannable context as protected
2140
* -ENXIO: A dependency such as a component driver or firmware is not yet
2141
* loaded so user space may need to attempt again. Depending on the
2142
* device, this error may be reported if protected context creation is
2143
* attempted very early after kernel start because the internal timeout
2144
* waiting for such dependencies is not guaranteed to be larger than
2145
* required (numbers differ depending on system and kernel config):
2146
* - ADL/RPL: dependencies may take up to 3 seconds from kernel start
2147
* while context creation internal timeout is 250 milisecs
2148
* - MTL: dependencies may take up to 8 seconds from kernel start
2149
* while context creation internal timeout is 250 milisecs
2150
* NOTE: such dependencies happen once, so a subsequent call to create a
2151
* protected context after a prior successful call will not experience
2152
* such timeouts and will not return -ENXIO (unless the driver is reloaded,
2153
* or, depending on the device, resumes from a suspended state).
2154
* -EIO: The firmware did not succeed in creating the protected context.
2155
*/
2156
#define I915_CONTEXT_PARAM_PROTECTED_CONTENT 0xd
2157
2158
/*
2159
* I915_CONTEXT_PARAM_LOW_LATENCY:
2160
*
2161
* Mark this context as a low latency workload which requires aggressive GT
2162
* frequency scaling. Use I915_PARAM_HAS_CONTEXT_FREQ_HINT to check if the kernel
2163
* supports this per context flag.
2164
*/
2165
#define I915_CONTEXT_PARAM_LOW_LATENCY 0xe
2166
2167
/*
2168
* I915_CONTEXT_PARAM_CONTEXT_IMAGE:
2169
*
2170
* Allows userspace to provide own context images.
2171
*
2172
* Note that this is a debug API not available on production kernel builds.
2173
*/
2174
#define I915_CONTEXT_PARAM_CONTEXT_IMAGE 0xf
2175
/* Must be kept compact -- no holes and well documented */
2176
2177
/** @value: Context parameter value to be set or queried */
2178
__u64 value;
2179
};
2180
2181
/*
2182
* Context SSEU programming
2183
*
2184
* It may be necessary for either functional or performance reason to configure
2185
* a context to run with a reduced number of SSEU (where SSEU stands for Slice/
2186
* Sub-slice/EU).
2187
*
2188
* This is done by configuring SSEU configuration using the below
2189
* @struct drm_i915_gem_context_param_sseu for every supported engine which
2190
* userspace intends to use.
2191
*
2192
* Not all GPUs or engines support this functionality in which case an error
2193
* code -ENODEV will be returned.
2194
*
2195
* Also, flexibility of possible SSEU configuration permutations varies between
2196
* GPU generations and software imposed limitations. Requesting such a
2197
* combination will return an error code of -EINVAL.
2198
*
2199
* NOTE: When perf/OA is active the context's SSEU configuration is ignored in
2200
* favour of a single global setting.
2201
*/
2202
struct drm_i915_gem_context_param_sseu {
2203
/*
2204
* Engine class & instance to be configured or queried.
2205
*/
2206
struct i915_engine_class_instance engine;
2207
2208
/*
2209
* Unknown flags must be cleared to zero.
2210
*/
2211
__u32 flags;
2212
#define I915_CONTEXT_SSEU_FLAG_ENGINE_INDEX (1u << 0)
2213
2214
/*
2215
* Mask of slices to enable for the context. Valid values are a subset
2216
* of the bitmask value returned for I915_PARAM_SLICE_MASK.
2217
*/
2218
__u64 slice_mask;
2219
2220
/*
2221
* Mask of subslices to enable for the context. Valid values are a
2222
* subset of the bitmask value return by I915_PARAM_SUBSLICE_MASK.
2223
*/
2224
__u64 subslice_mask;
2225
2226
/*
2227
* Minimum/Maximum number of EUs to enable per subslice for the
2228
* context. min_eus_per_subslice must be inferior or equal to
2229
* max_eus_per_subslice.
2230
*/
2231
__u16 min_eus_per_subslice;
2232
__u16 max_eus_per_subslice;
2233
2234
/*
2235
* Unused for now. Must be cleared to zero.
2236
*/
2237
__u32 rsvd;
2238
};
2239
2240
/**
2241
* DOC: Virtual Engine uAPI
2242
*
2243
* Virtual engine is a concept where userspace is able to configure a set of
2244
* physical engines, submit a batch buffer, and let the driver execute it on any
2245
* engine from the set as it sees fit.
2246
*
2247
* This is primarily useful on parts which have multiple instances of a same
2248
* class engine, like for example GT3+ Skylake parts with their two VCS engines.
2249
*
2250
* For instance userspace can enumerate all engines of a certain class using the
2251
* previously described `Engine Discovery uAPI`_. After that userspace can
2252
* create a GEM context with a placeholder slot for the virtual engine (using
2253
* `I915_ENGINE_CLASS_INVALID` and `I915_ENGINE_CLASS_INVALID_NONE` for class
2254
* and instance respectively) and finally using the
2255
* `I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE` extension place a virtual engine in
2256
* the same reserved slot.
2257
*
2258
* Example of creating a virtual engine and submitting a batch buffer to it:
2259
*
2260
* .. code-block:: C
2261
*
2262
* I915_DEFINE_CONTEXT_ENGINES_LOAD_BALANCE(virtual, 2) = {
2263
* .base.name = I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE,
2264
* .engine_index = 0, // Place this virtual engine into engine map slot 0
2265
* .num_siblings = 2,
2266
* .engines = { { I915_ENGINE_CLASS_VIDEO, 0 },
2267
* { I915_ENGINE_CLASS_VIDEO, 1 }, },
2268
* };
2269
* I915_DEFINE_CONTEXT_PARAM_ENGINES(engines, 1) = {
2270
* .engines = { { I915_ENGINE_CLASS_INVALID,
2271
* I915_ENGINE_CLASS_INVALID_NONE } },
2272
* .extensions = to_user_pointer(&virtual), // Chains after load_balance extension
2273
* };
2274
* struct drm_i915_gem_context_create_ext_setparam p_engines = {
2275
* .base = {
2276
* .name = I915_CONTEXT_CREATE_EXT_SETPARAM,
2277
* },
2278
* .param = {
2279
* .param = I915_CONTEXT_PARAM_ENGINES,
2280
* .value = to_user_pointer(&engines),
2281
* .size = sizeof(engines),
2282
* },
2283
* };
2284
* struct drm_i915_gem_context_create_ext create = {
2285
* .flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
2286
* .extensions = to_user_pointer(&p_engines);
2287
* };
2288
*
2289
* ctx_id = gem_context_create_ext(drm_fd, &create);
2290
*
2291
* // Now we have created a GEM context with its engine map containing a
2292
* // single virtual engine. Submissions to this slot can go either to
2293
* // vcs0 or vcs1, depending on the load balancing algorithm used inside
2294
* // the driver. The load balancing is dynamic from one batch buffer to
2295
* // another and transparent to userspace.
2296
*
2297
* ...
2298
* execbuf.rsvd1 = ctx_id;
2299
* execbuf.flags = 0; // Submits to index 0 which is the virtual engine
2300
* gem_execbuf(drm_fd, &execbuf);
2301
*/
2302
2303
/*
2304
* i915_context_engines_load_balance:
2305
*
2306
* Enable load balancing across this set of engines.
2307
*
2308
* Into the I915_EXEC_DEFAULT slot [0], a virtual engine is created that when
2309
* used will proxy the execbuffer request onto one of the set of engines
2310
* in such a way as to distribute the load evenly across the set.
2311
*
2312
* The set of engines must be compatible (e.g. the same HW class) as they
2313
* will share the same logical GPU context and ring.
2314
*
2315
* To intermix rendering with the virtual engine and direct rendering onto
2316
* the backing engines (bypassing the load balancing proxy), the context must
2317
* be defined to use a single timeline for all engines.
2318
*/
2319
struct i915_context_engines_load_balance {
2320
struct i915_user_extension base;
2321
2322
__u16 engine_index;
2323
__u16 num_siblings;
2324
__u32 flags; /* all undefined flags must be zero */
2325
2326
__u64 mbz64; /* reserved for future use; must be zero */
2327
2328
struct i915_engine_class_instance engines[];
2329
} __attribute__((packed));
2330
2331
#define I915_DEFINE_CONTEXT_ENGINES_LOAD_BALANCE(name__, N__) struct { \
2332
struct i915_user_extension base; \
2333
__u16 engine_index; \
2334
__u16 num_siblings; \
2335
__u32 flags; \
2336
__u64 mbz64; \
2337
struct i915_engine_class_instance engines[N__]; \
2338
} __attribute__((packed)) name__
2339
2340
/*
2341
* i915_context_engines_bond:
2342
*
2343
* Constructed bonded pairs for execution within a virtual engine.
2344
*
2345
* All engines are equal, but some are more equal than others. Given
2346
* the distribution of resources in the HW, it may be preferable to run
2347
* a request on a given subset of engines in parallel to a request on a
2348
* specific engine. We enable this selection of engines within a virtual
2349
* engine by specifying bonding pairs, for any given master engine we will
2350
* only execute on one of the corresponding siblings within the virtual engine.
2351
*
2352
* To execute a request in parallel on the master engine and a sibling requires
2353
* coordination with a I915_EXEC_FENCE_SUBMIT.
2354
*/
2355
struct i915_context_engines_bond {
2356
struct i915_user_extension base;
2357
2358
struct i915_engine_class_instance master;
2359
2360
__u16 virtual_index; /* index of virtual engine in ctx->engines[] */
2361
__u16 num_bonds;
2362
2363
__u64 flags; /* all undefined flags must be zero */
2364
__u64 mbz64[4]; /* reserved for future use; must be zero */
2365
2366
struct i915_engine_class_instance engines[];
2367
} __attribute__((packed));
2368
2369
#define I915_DEFINE_CONTEXT_ENGINES_BOND(name__, N__) struct { \
2370
struct i915_user_extension base; \
2371
struct i915_engine_class_instance master; \
2372
__u16 virtual_index; \
2373
__u16 num_bonds; \
2374
__u64 flags; \
2375
__u64 mbz64[4]; \
2376
struct i915_engine_class_instance engines[N__]; \
2377
} __attribute__((packed)) name__
2378
2379
/**
2380
* struct i915_context_engines_parallel_submit - Configure engine for
2381
* parallel submission.
2382
*
2383
* Setup a slot in the context engine map to allow multiple BBs to be submitted
2384
* in a single execbuf IOCTL. Those BBs will then be scheduled to run on the GPU
2385
* in parallel. Multiple hardware contexts are created internally in the i915 to
2386
* run these BBs. Once a slot is configured for N BBs only N BBs can be
2387
* submitted in each execbuf IOCTL and this is implicit behavior e.g. The user
2388
* doesn't tell the execbuf IOCTL there are N BBs, the execbuf IOCTL knows how
2389
* many BBs there are based on the slot's configuration. The N BBs are the last
2390
* N buffer objects or first N if I915_EXEC_BATCH_FIRST is set.
2391
*
2392
* The default placement behavior is to create implicit bonds between each
2393
* context if each context maps to more than 1 physical engine (e.g. context is
2394
* a virtual engine). Also we only allow contexts of same engine class and these
2395
* contexts must be in logically contiguous order. Examples of the placement
2396
* behavior are described below. Lastly, the default is to not allow BBs to be
2397
* preempted mid-batch. Rather insert coordinated preemption points on all
2398
* hardware contexts between each set of BBs. Flags could be added in the future
2399
* to change both of these default behaviors.
2400
*
2401
* Returns -EINVAL if hardware context placement configuration is invalid or if
2402
* the placement configuration isn't supported on the platform / submission
2403
* interface.
2404
* Returns -ENODEV if extension isn't supported on the platform / submission
2405
* interface.
2406
*
2407
* .. code-block:: none
2408
*
2409
* Examples syntax:
2410
* CS[X] = generic engine of same class, logical instance X
2411
* INVALID = I915_ENGINE_CLASS_INVALID, I915_ENGINE_CLASS_INVALID_NONE
2412
*
2413
* Example 1 pseudo code:
2414
* set_engines(INVALID)
2415
* set_parallel(engine_index=0, width=2, num_siblings=1,
2416
* engines=CS[0],CS[1])
2417
*
2418
* Results in the following valid placement:
2419
* CS[0], CS[1]
2420
*
2421
* Example 2 pseudo code:
2422
* set_engines(INVALID)
2423
* set_parallel(engine_index=0, width=2, num_siblings=2,
2424
* engines=CS[0],CS[2],CS[1],CS[3])
2425
*
2426
* Results in the following valid placements:
2427
* CS[0], CS[1]
2428
* CS[2], CS[3]
2429
*
2430
* This can be thought of as two virtual engines, each containing two
2431
* engines thereby making a 2D array. However, there are bonds tying the
2432
* entries together and placing restrictions on how they can be scheduled.
2433
* Specifically, the scheduler can choose only vertical columns from the 2D
2434
* array. That is, CS[0] is bonded to CS[1] and CS[2] to CS[3]. So if the
2435
* scheduler wants to submit to CS[0], it must also choose CS[1] and vice
2436
* versa. Same for CS[2] requires also using CS[3].
2437
* VE[0] = CS[0], CS[2]
2438
* VE[1] = CS[1], CS[3]
2439
*
2440
* Example 3 pseudo code:
2441
* set_engines(INVALID)
2442
* set_parallel(engine_index=0, width=2, num_siblings=2,
2443
* engines=CS[0],CS[1],CS[1],CS[3])
2444
*
2445
* Results in the following valid and invalid placements:
2446
* CS[0], CS[1]
2447
* CS[1], CS[3] - Not logically contiguous, return -EINVAL
2448
*/
2449
struct i915_context_engines_parallel_submit {
2450
/**
2451
* @base: base user extension.
2452
*/
2453
struct i915_user_extension base;
2454
2455
/**
2456
* @engine_index: slot for parallel engine
2457
*/
2458
__u16 engine_index;
2459
2460
/**
2461
* @width: number of contexts per parallel engine or in other words the
2462
* number of batches in each submission
2463
*/
2464
__u16 width;
2465
2466
/**
2467
* @num_siblings: number of siblings per context or in other words the
2468
* number of possible placements for each submission
2469
*/
2470
__u16 num_siblings;
2471
2472
/**
2473
* @mbz16: reserved for future use; must be zero
2474
*/
2475
__u16 mbz16;
2476
2477
/**
2478
* @flags: all undefined flags must be zero, currently not defined flags
2479
*/
2480
__u64 flags;
2481
2482
/**
2483
* @mbz64: reserved for future use; must be zero
2484
*/
2485
__u64 mbz64[3];
2486
2487
/**
2488
* @engines: 2-d array of engine instances to configure parallel engine
2489
*
2490
* length = width (i) * num_siblings (j)
2491
* index = j + i * num_siblings
2492
*/
2493
struct i915_engine_class_instance engines[];
2494
2495
} __packed;
2496
2497
#define I915_DEFINE_CONTEXT_ENGINES_PARALLEL_SUBMIT(name__, N__) struct { \
2498
struct i915_user_extension base; \
2499
__u16 engine_index; \
2500
__u16 width; \
2501
__u16 num_siblings; \
2502
__u16 mbz16; \
2503
__u64 flags; \
2504
__u64 mbz64[3]; \
2505
struct i915_engine_class_instance engines[N__]; \
2506
} __attribute__((packed)) name__
2507
2508
/**
2509
* DOC: Context Engine Map uAPI
2510
*
2511
* Context engine map is a new way of addressing engines when submitting batch-
2512
* buffers, replacing the existing way of using identifiers like `I915_EXEC_BLT`
2513
* inside the flags field of `struct drm_i915_gem_execbuffer2`.
2514
*
2515
* To use it created GEM contexts need to be configured with a list of engines
2516
* the user is intending to submit to. This is accomplished using the
2517
* `I915_CONTEXT_PARAM_ENGINES` parameter and `struct
2518
* i915_context_param_engines`.
2519
*
2520
* For such contexts the `I915_EXEC_RING_MASK` field becomes an index into the
2521
* configured map.
2522
*
2523
* Example of creating such context and submitting against it:
2524
*
2525
* .. code-block:: C
2526
*
2527
* I915_DEFINE_CONTEXT_PARAM_ENGINES(engines, 2) = {
2528
* .engines = { { I915_ENGINE_CLASS_RENDER, 0 },
2529
* { I915_ENGINE_CLASS_COPY, 0 } }
2530
* };
2531
* struct drm_i915_gem_context_create_ext_setparam p_engines = {
2532
* .base = {
2533
* .name = I915_CONTEXT_CREATE_EXT_SETPARAM,
2534
* },
2535
* .param = {
2536
* .param = I915_CONTEXT_PARAM_ENGINES,
2537
* .value = to_user_pointer(&engines),
2538
* .size = sizeof(engines),
2539
* },
2540
* };
2541
* struct drm_i915_gem_context_create_ext create = {
2542
* .flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS,
2543
* .extensions = to_user_pointer(&p_engines);
2544
* };
2545
*
2546
* ctx_id = gem_context_create_ext(drm_fd, &create);
2547
*
2548
* // We have now created a GEM context with two engines in the map:
2549
* // Index 0 points to rcs0 while index 1 points to bcs0. Other engines
2550
* // will not be accessible from this context.
2551
*
2552
* ...
2553
* execbuf.rsvd1 = ctx_id;
2554
* execbuf.flags = 0; // Submits to index 0, which is rcs0 for this context
2555
* gem_execbuf(drm_fd, &execbuf);
2556
*
2557
* ...
2558
* execbuf.rsvd1 = ctx_id;
2559
* execbuf.flags = 1; // Submits to index 0, which is bcs0 for this context
2560
* gem_execbuf(drm_fd, &execbuf);
2561
*/
2562
2563
struct i915_context_param_engines {
2564
__u64 extensions; /* linked chain of extension blocks, 0 terminates */
2565
#define I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE 0 /* see i915_context_engines_load_balance */
2566
#define I915_CONTEXT_ENGINES_EXT_BOND 1 /* see i915_context_engines_bond */
2567
#define I915_CONTEXT_ENGINES_EXT_PARALLEL_SUBMIT 2 /* see i915_context_engines_parallel_submit */
2568
struct i915_engine_class_instance engines[];
2569
} __attribute__((packed));
2570
2571
#define I915_DEFINE_CONTEXT_PARAM_ENGINES(name__, N__) struct { \
2572
__u64 extensions; \
2573
struct i915_engine_class_instance engines[N__]; \
2574
} __attribute__((packed)) name__
2575
2576
struct i915_gem_context_param_context_image {
2577
/** @engine: Engine class & instance to be configured. */
2578
struct i915_engine_class_instance engine;
2579
2580
/** @flags: One of the supported flags or zero. */
2581
__u32 flags;
2582
#define I915_CONTEXT_IMAGE_FLAG_ENGINE_INDEX (1u << 0)
2583
2584
/** @size: Size of the image blob pointed to by @image. */
2585
__u32 size;
2586
2587
/** @mbz: Must be zero. */
2588
__u32 mbz;
2589
2590
/** @image: Userspace memory containing the context image. */
2591
__u64 image;
2592
} __attribute__((packed));
2593
2594
/**
2595
* struct drm_i915_gem_context_create_ext_setparam - Context parameter
2596
* to set or query during context creation.
2597
*/
2598
struct drm_i915_gem_context_create_ext_setparam {
2599
/** @base: Extension link. See struct i915_user_extension. */
2600
struct i915_user_extension base;
2601
2602
/**
2603
* @param: Context parameter to set or query.
2604
* See struct drm_i915_gem_context_param.
2605
*/
2606
struct drm_i915_gem_context_param param;
2607
};
2608
2609
struct drm_i915_gem_context_destroy {
2610
__u32 ctx_id;
2611
__u32 pad;
2612
};
2613
2614
/**
2615
* struct drm_i915_gem_vm_control - Structure to create or destroy VM.
2616
*
2617
* DRM_I915_GEM_VM_CREATE -
2618
*
2619
* Create a new virtual memory address space (ppGTT) for use within a context
2620
* on the same file. Extensions can be provided to configure exactly how the
2621
* address space is setup upon creation.
2622
*
2623
* The id of new VM (bound to the fd) for use with I915_CONTEXT_PARAM_VM is
2624
* returned in the outparam @id.
2625
*
2626
* An extension chain maybe provided, starting with @extensions, and terminated
2627
* by the @next_extension being 0. Currently, no extensions are defined.
2628
*
2629
* DRM_I915_GEM_VM_DESTROY -
2630
*
2631
* Destroys a previously created VM id, specified in @vm_id.
2632
*
2633
* No extensions or flags are allowed currently, and so must be zero.
2634
*/
2635
struct drm_i915_gem_vm_control {
2636
/** @extensions: Zero-terminated chain of extensions. */
2637
__u64 extensions;
2638
2639
/** @flags: reserved for future usage, currently MBZ */
2640
__u32 flags;
2641
2642
/** @vm_id: Id of the VM created or to be destroyed */
2643
__u32 vm_id;
2644
};
2645
2646
struct drm_i915_reg_read {
2647
/*
2648
* Register offset.
2649
* For 64bit wide registers where the upper 32bits don't immediately
2650
* follow the lower 32bits, the offset of the lower 32bits must
2651
* be specified
2652
*/
2653
__u64 offset;
2654
#define I915_REG_READ_8B_WA (1ul << 0)
2655
2656
__u64 val; /* Return value */
2657
};
2658
2659
/* Known registers:
2660
*
2661
* Render engine timestamp - 0x2358 + 64bit - gen7+
2662
* - Note this register returns an invalid value if using the default
2663
* single instruction 8byte read, in order to workaround that pass
2664
* flag I915_REG_READ_8B_WA in offset field.
2665
*
2666
*/
2667
2668
/*
2669
* struct drm_i915_reset_stats - Return global reset and other context stats
2670
*
2671
* Driver keeps few stats for each contexts and also global reset count.
2672
* This struct can be used to query those stats.
2673
*/
2674
struct drm_i915_reset_stats {
2675
/** @ctx_id: ID of the requested context */
2676
__u32 ctx_id;
2677
2678
/** @flags: MBZ */
2679
__u32 flags;
2680
2681
/** @reset_count: All resets since boot/module reload, for all contexts */
2682
__u32 reset_count;
2683
2684
/** @batch_active: Number of batches lost when active in GPU, for this context */
2685
__u32 batch_active;
2686
2687
/** @batch_pending: Number of batches lost pending for execution, for this context */
2688
__u32 batch_pending;
2689
2690
/** @pad: MBZ */
2691
__u32 pad;
2692
};
2693
2694
/**
2695
* struct drm_i915_gem_userptr - Create GEM object from user allocated memory.
2696
*
2697
* Userptr objects have several restrictions on what ioctls can be used with the
2698
* object handle.
2699
*/
2700
struct drm_i915_gem_userptr {
2701
/**
2702
* @user_ptr: The pointer to the allocated memory.
2703
*
2704
* Needs to be aligned to PAGE_SIZE.
2705
*/
2706
__u64 user_ptr;
2707
2708
/**
2709
* @user_size:
2710
*
2711
* The size in bytes for the allocated memory. This will also become the
2712
* object size.
2713
*
2714
* Needs to be aligned to PAGE_SIZE, and should be at least PAGE_SIZE,
2715
* or larger.
2716
*/
2717
__u64 user_size;
2718
2719
/**
2720
* @flags:
2721
*
2722
* Supported flags:
2723
*
2724
* I915_USERPTR_READ_ONLY:
2725
*
2726
* Mark the object as readonly, this also means GPU access can only be
2727
* readonly. This is only supported on HW which supports readonly access
2728
* through the GTT. If the HW can't support readonly access, an error is
2729
* returned.
2730
*
2731
* I915_USERPTR_PROBE:
2732
*
2733
* Probe the provided @user_ptr range and validate that the @user_ptr is
2734
* indeed pointing to normal memory and that the range is also valid.
2735
* For example if some garbage address is given to the kernel, then this
2736
* should complain.
2737
*
2738
* Returns -EFAULT if the probe failed.
2739
*
2740
* Note that this doesn't populate the backing pages, and also doesn't
2741
* guarantee that the object will remain valid when the object is
2742
* eventually used.
2743
*
2744
* The kernel supports this feature if I915_PARAM_HAS_USERPTR_PROBE
2745
* returns a non-zero value.
2746
*
2747
* I915_USERPTR_UNSYNCHRONIZED:
2748
*
2749
* NOT USED. Setting this flag will result in an error.
2750
*/
2751
__u32 flags;
2752
#define I915_USERPTR_READ_ONLY 0x1
2753
#define I915_USERPTR_PROBE 0x2
2754
#define I915_USERPTR_UNSYNCHRONIZED 0x80000000
2755
/**
2756
* @handle: Returned handle for the object.
2757
*
2758
* Object handles are nonzero.
2759
*/
2760
__u32 handle;
2761
};
2762
2763
enum drm_i915_oa_format {
2764
I915_OA_FORMAT_A13 = 1, /* HSW only */
2765
I915_OA_FORMAT_A29, /* HSW only */
2766
I915_OA_FORMAT_A13_B8_C8, /* HSW only */
2767
I915_OA_FORMAT_B4_C8, /* HSW only */
2768
I915_OA_FORMAT_A45_B8_C8, /* HSW only */
2769
I915_OA_FORMAT_B4_C8_A16, /* HSW only */
2770
I915_OA_FORMAT_C4_B8, /* HSW+ */
2771
2772
/* Gen8+ */
2773
I915_OA_FORMAT_A12,
2774
I915_OA_FORMAT_A12_B8_C8,
2775
I915_OA_FORMAT_A32u40_A4u32_B8_C8,
2776
2777
/* DG2 */
2778
I915_OAR_FORMAT_A32u40_A4u32_B8_C8,
2779
I915_OA_FORMAT_A24u40_A14u32_B8_C8,
2780
2781
/* MTL OAM */
2782
I915_OAM_FORMAT_MPEC8u64_B8_C8,
2783
I915_OAM_FORMAT_MPEC8u32_B8_C8,
2784
2785
I915_OA_FORMAT_MAX /* non-ABI */
2786
};
2787
2788
enum drm_i915_perf_property_id {
2789
/**
2790
* Open the stream for a specific context handle (as used with
2791
* execbuffer2). A stream opened for a specific context this way
2792
* won't typically require root privileges.
2793
*
2794
* This property is available in perf revision 1.
2795
*/
2796
DRM_I915_PERF_PROP_CTX_HANDLE = 1,
2797
2798
/**
2799
* A value of 1 requests the inclusion of raw OA unit reports as
2800
* part of stream samples.
2801
*
2802
* This property is available in perf revision 1.
2803
*/
2804
DRM_I915_PERF_PROP_SAMPLE_OA,
2805
2806
/**
2807
* The value specifies which set of OA unit metrics should be
2808
* configured, defining the contents of any OA unit reports.
2809
*
2810
* This property is available in perf revision 1.
2811
*/
2812
DRM_I915_PERF_PROP_OA_METRICS_SET,
2813
2814
/**
2815
* The value specifies the size and layout of OA unit reports.
2816
*
2817
* This property is available in perf revision 1.
2818
*/
2819
DRM_I915_PERF_PROP_OA_FORMAT,
2820
2821
/**
2822
* Specifying this property implicitly requests periodic OA unit
2823
* sampling and (at least on Haswell) the sampling frequency is derived
2824
* from this exponent as follows:
2825
*
2826
* 80ns * 2^(period_exponent + 1)
2827
*
2828
* This property is available in perf revision 1.
2829
*/
2830
DRM_I915_PERF_PROP_OA_EXPONENT,
2831
2832
/**
2833
* Specifying this property is only valid when specify a context to
2834
* filter with DRM_I915_PERF_PROP_CTX_HANDLE. Specifying this property
2835
* will hold preemption of the particular context we want to gather
2836
* performance data about. The execbuf2 submissions must include a
2837
* drm_i915_gem_execbuffer_ext_perf parameter for this to apply.
2838
*
2839
* This property is available in perf revision 3.
2840
*/
2841
DRM_I915_PERF_PROP_HOLD_PREEMPTION,
2842
2843
/**
2844
* Specifying this pins all contexts to the specified SSEU power
2845
* configuration for the duration of the recording.
2846
*
2847
* This parameter's value is a pointer to a struct
2848
* drm_i915_gem_context_param_sseu.
2849
*
2850
* This property is available in perf revision 4.
2851
*/
2852
DRM_I915_PERF_PROP_GLOBAL_SSEU,
2853
2854
/**
2855
* This optional parameter specifies the timer interval in nanoseconds
2856
* at which the i915 driver will check the OA buffer for available data.
2857
* Minimum allowed value is 100 microseconds. A default value is used by
2858
* the driver if this parameter is not specified. Note that larger timer
2859
* values will reduce cpu consumption during OA perf captures. However,
2860
* excessively large values would potentially result in OA buffer
2861
* overwrites as captures reach end of the OA buffer.
2862
*
2863
* This property is available in perf revision 5.
2864
*/
2865
DRM_I915_PERF_PROP_POLL_OA_PERIOD,
2866
2867
/**
2868
* Multiple engines may be mapped to the same OA unit. The OA unit is
2869
* identified by class:instance of any engine mapped to it.
2870
*
2871
* This parameter specifies the engine class and must be passed along
2872
* with DRM_I915_PERF_PROP_OA_ENGINE_INSTANCE.
2873
*
2874
* This property is available in perf revision 6.
2875
*/
2876
DRM_I915_PERF_PROP_OA_ENGINE_CLASS,
2877
2878
/**
2879
* This parameter specifies the engine instance and must be passed along
2880
* with DRM_I915_PERF_PROP_OA_ENGINE_CLASS.
2881
*
2882
* This property is available in perf revision 6.
2883
*/
2884
DRM_I915_PERF_PROP_OA_ENGINE_INSTANCE,
2885
2886
DRM_I915_PERF_PROP_MAX /* non-ABI */
2887
};
2888
2889
struct drm_i915_perf_open_param {
2890
__u32 flags;
2891
#define I915_PERF_FLAG_FD_CLOEXEC (1<<0)
2892
#define I915_PERF_FLAG_FD_NONBLOCK (1<<1)
2893
#define I915_PERF_FLAG_DISABLED (1<<2)
2894
2895
/** The number of u64 (id, value) pairs */
2896
__u32 num_properties;
2897
2898
/**
2899
* Pointer to array of u64 (id, value) pairs configuring the stream
2900
* to open.
2901
*/
2902
__u64 properties_ptr;
2903
};
2904
2905
/*
2906
* Enable data capture for a stream that was either opened in a disabled state
2907
* via I915_PERF_FLAG_DISABLED or was later disabled via
2908
* I915_PERF_IOCTL_DISABLE.
2909
*
2910
* It is intended to be cheaper to disable and enable a stream than it may be
2911
* to close and re-open a stream with the same configuration.
2912
*
2913
* It's undefined whether any pending data for the stream will be lost.
2914
*
2915
* This ioctl is available in perf revision 1.
2916
*/
2917
#define I915_PERF_IOCTL_ENABLE _IO('i', 0x0)
2918
2919
/*
2920
* Disable data capture for a stream.
2921
*
2922
* It is an error to try and read a stream that is disabled.
2923
*
2924
* This ioctl is available in perf revision 1.
2925
*/
2926
#define I915_PERF_IOCTL_DISABLE _IO('i', 0x1)
2927
2928
/*
2929
* Change metrics_set captured by a stream.
2930
*
2931
* If the stream is bound to a specific context, the configuration change
2932
* will performed inline with that context such that it takes effect before
2933
* the next execbuf submission.
2934
*
2935
* Returns the previously bound metrics set id, or a negative error code.
2936
*
2937
* This ioctl is available in perf revision 2.
2938
*/
2939
#define I915_PERF_IOCTL_CONFIG _IO('i', 0x2)
2940
2941
/*
2942
* Common to all i915 perf records
2943
*/
2944
struct drm_i915_perf_record_header {
2945
__u32 type;
2946
__u16 pad;
2947
__u16 size;
2948
};
2949
2950
enum drm_i915_perf_record_type {
2951
2952
/**
2953
* Samples are the work horse record type whose contents are extensible
2954
* and defined when opening an i915 perf stream based on the given
2955
* properties.
2956
*
2957
* Boolean properties following the naming convention
2958
* DRM_I915_PERF_SAMPLE_xyz_PROP request the inclusion of 'xyz' data in
2959
* every sample.
2960
*
2961
* The order of these sample properties given by userspace has no
2962
* affect on the ordering of data within a sample. The order is
2963
* documented here.
2964
*
2965
* struct {
2966
* struct drm_i915_perf_record_header header;
2967
*
2968
* { u32 oa_report[]; } && DRM_I915_PERF_PROP_SAMPLE_OA
2969
* };
2970
*/
2971
DRM_I915_PERF_RECORD_SAMPLE = 1,
2972
2973
/*
2974
* Indicates that one or more OA reports were not written by the
2975
* hardware. This can happen for example if an MI_REPORT_PERF_COUNT
2976
* command collides with periodic sampling - which would be more likely
2977
* at higher sampling frequencies.
2978
*/
2979
DRM_I915_PERF_RECORD_OA_REPORT_LOST = 2,
2980
2981
/**
2982
* An error occurred that resulted in all pending OA reports being lost.
2983
*/
2984
DRM_I915_PERF_RECORD_OA_BUFFER_LOST = 3,
2985
2986
DRM_I915_PERF_RECORD_MAX /* non-ABI */
2987
};
2988
2989
/**
2990
* struct drm_i915_perf_oa_config
2991
*
2992
* Structure to upload perf dynamic configuration into the kernel.
2993
*/
2994
struct drm_i915_perf_oa_config {
2995
/**
2996
* @uuid:
2997
*
2998
* String formatted like "%\08x-%\04x-%\04x-%\04x-%\012x"
2999
*/
3000
char uuid[36];
3001
3002
/**
3003
* @n_mux_regs:
3004
*
3005
* Number of mux regs in &mux_regs_ptr.
3006
*/
3007
__u32 n_mux_regs;
3008
3009
/**
3010
* @n_boolean_regs:
3011
*
3012
* Number of boolean regs in &boolean_regs_ptr.
3013
*/
3014
__u32 n_boolean_regs;
3015
3016
/**
3017
* @n_flex_regs:
3018
*
3019
* Number of flex regs in &flex_regs_ptr.
3020
*/
3021
__u32 n_flex_regs;
3022
3023
/**
3024
* @mux_regs_ptr:
3025
*
3026
* Pointer to tuples of u32 values (register address, value) for mux
3027
* registers. Expected length of buffer is (2 * sizeof(u32) *
3028
* &n_mux_regs).
3029
*/
3030
__u64 mux_regs_ptr;
3031
3032
/**
3033
* @boolean_regs_ptr:
3034
*
3035
* Pointer to tuples of u32 values (register address, value) for mux
3036
* registers. Expected length of buffer is (2 * sizeof(u32) *
3037
* &n_boolean_regs).
3038
*/
3039
__u64 boolean_regs_ptr;
3040
3041
/**
3042
* @flex_regs_ptr:
3043
*
3044
* Pointer to tuples of u32 values (register address, value) for mux
3045
* registers. Expected length of buffer is (2 * sizeof(u32) *
3046
* &n_flex_regs).
3047
*/
3048
__u64 flex_regs_ptr;
3049
};
3050
3051
/**
3052
* struct drm_i915_query_item - An individual query for the kernel to process.
3053
*
3054
* The behaviour is determined by the @query_id. Note that exactly what
3055
* @data_ptr is also depends on the specific @query_id.
3056
*/
3057
struct drm_i915_query_item {
3058
/**
3059
* @query_id:
3060
*
3061
* The id for this query. Currently accepted query IDs are:
3062
* - %DRM_I915_QUERY_TOPOLOGY_INFO (see struct drm_i915_query_topology_info)
3063
* - %DRM_I915_QUERY_ENGINE_INFO (see struct drm_i915_engine_info)
3064
* - %DRM_I915_QUERY_PERF_CONFIG (see struct drm_i915_query_perf_config)
3065
* - %DRM_I915_QUERY_MEMORY_REGIONS (see struct drm_i915_query_memory_regions)
3066
* - %DRM_I915_QUERY_HWCONFIG_BLOB (see `GuC HWCONFIG blob uAPI`)
3067
* - %DRM_I915_QUERY_GEOMETRY_SUBSLICES (see struct drm_i915_query_topology_info)
3068
* - %DRM_I915_QUERY_GUC_SUBMISSION_VERSION (see struct drm_i915_query_guc_submission_version)
3069
*/
3070
__u64 query_id;
3071
#define DRM_I915_QUERY_TOPOLOGY_INFO 1
3072
#define DRM_I915_QUERY_ENGINE_INFO 2
3073
#define DRM_I915_QUERY_PERF_CONFIG 3
3074
#define DRM_I915_QUERY_MEMORY_REGIONS 4
3075
#define DRM_I915_QUERY_HWCONFIG_BLOB 5
3076
#define DRM_I915_QUERY_GEOMETRY_SUBSLICES 6
3077
#define DRM_I915_QUERY_GUC_SUBMISSION_VERSION 7
3078
/* Must be kept compact -- no holes and well documented */
3079
3080
/**
3081
* @length:
3082
*
3083
* When set to zero by userspace, this is filled with the size of the
3084
* data to be written at the @data_ptr pointer. The kernel sets this
3085
* value to a negative value to signal an error on a particular query
3086
* item.
3087
*/
3088
__s32 length;
3089
3090
/**
3091
* @flags:
3092
*
3093
* When &query_id == %DRM_I915_QUERY_TOPOLOGY_INFO, must be 0.
3094
*
3095
* When &query_id == %DRM_I915_QUERY_PERF_CONFIG, must be one of the
3096
* following:
3097
*
3098
* - %DRM_I915_QUERY_PERF_CONFIG_LIST
3099
* - %DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID
3100
* - %DRM_I915_QUERY_PERF_CONFIG_FOR_UUID
3101
*
3102
* When &query_id == %DRM_I915_QUERY_GEOMETRY_SUBSLICES must contain
3103
* a struct i915_engine_class_instance that references a render engine.
3104
*/
3105
__u32 flags;
3106
#define DRM_I915_QUERY_PERF_CONFIG_LIST 1
3107
#define DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID 2
3108
#define DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_ID 3
3109
3110
/**
3111
* @data_ptr:
3112
*
3113
* Data will be written at the location pointed by @data_ptr when the
3114
* value of @length matches the length of the data to be written by the
3115
* kernel.
3116
*/
3117
__u64 data_ptr;
3118
};
3119
3120
/**
3121
* struct drm_i915_query - Supply an array of struct drm_i915_query_item for the
3122
* kernel to fill out.
3123
*
3124
* Note that this is generally a two step process for each struct
3125
* drm_i915_query_item in the array:
3126
*
3127
* 1. Call the DRM_IOCTL_I915_QUERY, giving it our array of struct
3128
* drm_i915_query_item, with &drm_i915_query_item.length set to zero. The
3129
* kernel will then fill in the size, in bytes, which tells userspace how
3130
* memory it needs to allocate for the blob(say for an array of properties).
3131
*
3132
* 2. Next we call DRM_IOCTL_I915_QUERY again, this time with the
3133
* &drm_i915_query_item.data_ptr equal to our newly allocated blob. Note that
3134
* the &drm_i915_query_item.length should still be the same as what the
3135
* kernel previously set. At this point the kernel can fill in the blob.
3136
*
3137
* Note that for some query items it can make sense for userspace to just pass
3138
* in a buffer/blob equal to or larger than the required size. In this case only
3139
* a single ioctl call is needed. For some smaller query items this can work
3140
* quite well.
3141
*
3142
*/
3143
struct drm_i915_query {
3144
/** @num_items: The number of elements in the @items_ptr array */
3145
__u32 num_items;
3146
3147
/**
3148
* @flags: Unused for now. Must be cleared to zero.
3149
*/
3150
__u32 flags;
3151
3152
/**
3153
* @items_ptr:
3154
*
3155
* Pointer to an array of struct drm_i915_query_item. The number of
3156
* array elements is @num_items.
3157
*/
3158
__u64 items_ptr;
3159
};
3160
3161
/**
3162
* struct drm_i915_query_topology_info
3163
*
3164
* Describes slice/subslice/EU information queried by
3165
* %DRM_I915_QUERY_TOPOLOGY_INFO
3166
*/
3167
struct drm_i915_query_topology_info {
3168
/**
3169
* @flags:
3170
*
3171
* Unused for now. Must be cleared to zero.
3172
*/
3173
__u16 flags;
3174
3175
/**
3176
* @max_slices:
3177
*
3178
* The number of bits used to express the slice mask.
3179
*/
3180
__u16 max_slices;
3181
3182
/**
3183
* @max_subslices:
3184
*
3185
* The number of bits used to express the subslice mask.
3186
*/
3187
__u16 max_subslices;
3188
3189
/**
3190
* @max_eus_per_subslice:
3191
*
3192
* The number of bits in the EU mask that correspond to a single
3193
* subslice's EUs.
3194
*/
3195
__u16 max_eus_per_subslice;
3196
3197
/**
3198
* @subslice_offset:
3199
*
3200
* Offset in data[] at which the subslice masks are stored.
3201
*/
3202
__u16 subslice_offset;
3203
3204
/**
3205
* @subslice_stride:
3206
*
3207
* Stride at which each of the subslice masks for each slice are
3208
* stored.
3209
*/
3210
__u16 subslice_stride;
3211
3212
/**
3213
* @eu_offset:
3214
*
3215
* Offset in data[] at which the EU masks are stored.
3216
*/
3217
__u16 eu_offset;
3218
3219
/**
3220
* @eu_stride:
3221
*
3222
* Stride at which each of the EU masks for each subslice are stored.
3223
*/
3224
__u16 eu_stride;
3225
3226
/**
3227
* @data:
3228
*
3229
* Contains 3 pieces of information :
3230
*
3231
* - The slice mask with one bit per slice telling whether a slice is
3232
* available. The availability of slice X can be queried with the
3233
* following formula :
3234
*
3235
* .. code:: c
3236
*
3237
* (data[X / 8] >> (X % 8)) & 1
3238
*
3239
* Starting with Xe_HP platforms, Intel hardware no longer has
3240
* traditional slices so i915 will always report a single slice
3241
* (hardcoded slicemask = 0x1) which contains all of the platform's
3242
* subslices. I.e., the mask here does not reflect any of the newer
3243
* hardware concepts such as "gslices" or "cslices" since userspace
3244
* is capable of inferring those from the subslice mask.
3245
*
3246
* - The subslice mask for each slice with one bit per subslice telling
3247
* whether a subslice is available. Starting with Gen12 we use the
3248
* term "subslice" to refer to what the hardware documentation
3249
* describes as a "dual-subslices." The availability of subslice Y
3250
* in slice X can be queried with the following formula :
3251
*
3252
* .. code:: c
3253
*
3254
* (data[subslice_offset + X * subslice_stride + Y / 8] >> (Y % 8)) & 1
3255
*
3256
* - The EU mask for each subslice in each slice, with one bit per EU
3257
* telling whether an EU is available. The availability of EU Z in
3258
* subslice Y in slice X can be queried with the following formula :
3259
*
3260
* .. code:: c
3261
*
3262
* (data[eu_offset +
3263
* (X * max_subslices + Y) * eu_stride +
3264
* Z / 8
3265
* ] >> (Z % 8)) & 1
3266
*/
3267
__u8 data[];
3268
};
3269
3270
/**
3271
* DOC: Engine Discovery uAPI
3272
*
3273
* Engine discovery uAPI is a way of enumerating physical engines present in a
3274
* GPU associated with an open i915 DRM file descriptor. This supersedes the old
3275
* way of using `DRM_IOCTL_I915_GETPARAM` and engine identifiers like
3276
* `I915_PARAM_HAS_BLT`.
3277
*
3278
* The need for this interface came starting with Icelake and newer GPUs, which
3279
* started to establish a pattern of having multiple engines of a same class,
3280
* where not all instances were always completely functionally equivalent.
3281
*
3282
* Entry point for this uapi is `DRM_IOCTL_I915_QUERY` with the
3283
* `DRM_I915_QUERY_ENGINE_INFO` as the queried item id.
3284
*
3285
* Example for getting the list of engines:
3286
*
3287
* .. code-block:: C
3288
*
3289
* struct drm_i915_query_engine_info *info;
3290
* struct drm_i915_query_item item = {
3291
* .query_id = DRM_I915_QUERY_ENGINE_INFO;
3292
* };
3293
* struct drm_i915_query query = {
3294
* .num_items = 1,
3295
* .items_ptr = (uintptr_t)&item,
3296
* };
3297
* int err, i;
3298
*
3299
* // First query the size of the blob we need, this needs to be large
3300
* // enough to hold our array of engines. The kernel will fill out the
3301
* // item.length for us, which is the number of bytes we need.
3302
* //
3303
* // Alternatively a large buffer can be allocated straightaway enabling
3304
* // querying in one pass, in which case item.length should contain the
3305
* // length of the provided buffer.
3306
* err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
3307
* if (err) ...
3308
*
3309
* info = calloc(1, item.length);
3310
* // Now that we allocated the required number of bytes, we call the ioctl
3311
* // again, this time with the data_ptr pointing to our newly allocated
3312
* // blob, which the kernel can then populate with info on all engines.
3313
* item.data_ptr = (uintptr_t)&info;
3314
*
3315
* err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
3316
* if (err) ...
3317
*
3318
* // We can now access each engine in the array
3319
* for (i = 0; i < info->num_engines; i++) {
3320
* struct drm_i915_engine_info einfo = info->engines[i];
3321
* u16 class = einfo.engine.class;
3322
* u16 instance = einfo.engine.instance;
3323
* ....
3324
* }
3325
*
3326
* free(info);
3327
*
3328
* Each of the enumerated engines, apart from being defined by its class and
3329
* instance (see `struct i915_engine_class_instance`), also can have flags and
3330
* capabilities defined as documented in i915_drm.h.
3331
*
3332
* For instance video engines which support HEVC encoding will have the
3333
* `I915_VIDEO_CLASS_CAPABILITY_HEVC` capability bit set.
3334
*
3335
* Engine discovery only fully comes to its own when combined with the new way
3336
* of addressing engines when submitting batch buffers using contexts with
3337
* engine maps configured.
3338
*/
3339
3340
/**
3341
* struct drm_i915_engine_info
3342
*
3343
* Describes one engine and its capabilities as known to the driver.
3344
*/
3345
struct drm_i915_engine_info {
3346
/** @engine: Engine class and instance. */
3347
struct i915_engine_class_instance engine;
3348
3349
/** @rsvd0: Reserved field. */
3350
__u32 rsvd0;
3351
3352
/** @flags: Engine flags. */
3353
__u64 flags;
3354
#define I915_ENGINE_INFO_HAS_LOGICAL_INSTANCE (1 << 0)
3355
3356
/** @capabilities: Capabilities of this engine. */
3357
__u64 capabilities;
3358
#define I915_VIDEO_CLASS_CAPABILITY_HEVC (1 << 0)
3359
#define I915_VIDEO_AND_ENHANCE_CLASS_CAPABILITY_SFC (1 << 1)
3360
3361
/** @logical_instance: Logical instance of engine */
3362
__u16 logical_instance;
3363
3364
/** @rsvd1: Reserved fields. */
3365
__u16 rsvd1[3];
3366
/** @rsvd2: Reserved fields. */
3367
__u64 rsvd2[3];
3368
};
3369
3370
/**
3371
* struct drm_i915_query_engine_info
3372
*
3373
* Engine info query enumerates all engines known to the driver by filling in
3374
* an array of struct drm_i915_engine_info structures.
3375
*/
3376
struct drm_i915_query_engine_info {
3377
/** @num_engines: Number of struct drm_i915_engine_info structs following. */
3378
__u32 num_engines;
3379
3380
/** @rsvd: MBZ */
3381
__u32 rsvd[3];
3382
3383
/** @engines: Marker for drm_i915_engine_info structures. */
3384
struct drm_i915_engine_info engines[];
3385
};
3386
3387
/**
3388
* struct drm_i915_query_perf_config
3389
*
3390
* Data written by the kernel with query %DRM_I915_QUERY_PERF_CONFIG and
3391
* %DRM_I915_QUERY_GEOMETRY_SUBSLICES.
3392
*/
3393
struct drm_i915_query_perf_config {
3394
union {
3395
/**
3396
* @n_configs:
3397
*
3398
* When &drm_i915_query_item.flags ==
3399
* %DRM_I915_QUERY_PERF_CONFIG_LIST, i915 sets this fields to
3400
* the number of configurations available.
3401
*/
3402
__u64 n_configs;
3403
3404
/**
3405
* @config:
3406
*
3407
* When &drm_i915_query_item.flags ==
3408
* %DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_ID, i915 will use the
3409
* value in this field as configuration identifier to decide
3410
* what data to write into config_ptr.
3411
*/
3412
__u64 config;
3413
3414
/**
3415
* @uuid:
3416
*
3417
* When &drm_i915_query_item.flags ==
3418
* %DRM_I915_QUERY_PERF_CONFIG_DATA_FOR_UUID, i915 will use the
3419
* value in this field as configuration identifier to decide
3420
* what data to write into config_ptr.
3421
*
3422
* String formatted like "%08x-%04x-%04x-%04x-%012x"
3423
*/
3424
char uuid[36];
3425
};
3426
3427
/**
3428
* @flags:
3429
*
3430
* Unused for now. Must be cleared to zero.
3431
*/
3432
__u32 flags;
3433
3434
/**
3435
* @data:
3436
*
3437
* When &drm_i915_query_item.flags == %DRM_I915_QUERY_PERF_CONFIG_LIST,
3438
* i915 will write an array of __u64 of configuration identifiers.
3439
*
3440
* When &drm_i915_query_item.flags == %DRM_I915_QUERY_PERF_CONFIG_DATA,
3441
* i915 will write a struct drm_i915_perf_oa_config. If the following
3442
* fields of struct drm_i915_perf_oa_config are not set to 0, i915 will
3443
* write into the associated pointers the values of submitted when the
3444
* configuration was created :
3445
*
3446
* - &drm_i915_perf_oa_config.n_mux_regs
3447
* - &drm_i915_perf_oa_config.n_boolean_regs
3448
* - &drm_i915_perf_oa_config.n_flex_regs
3449
*/
3450
__u8 data[];
3451
};
3452
3453
/**
3454
* enum drm_i915_gem_memory_class - Supported memory classes
3455
*/
3456
enum drm_i915_gem_memory_class {
3457
/** @I915_MEMORY_CLASS_SYSTEM: System memory */
3458
I915_MEMORY_CLASS_SYSTEM = 0,
3459
/** @I915_MEMORY_CLASS_DEVICE: Device local-memory */
3460
I915_MEMORY_CLASS_DEVICE,
3461
};
3462
3463
/**
3464
* struct drm_i915_gem_memory_class_instance - Identify particular memory region
3465
*/
3466
struct drm_i915_gem_memory_class_instance {
3467
/** @memory_class: See enum drm_i915_gem_memory_class */
3468
__u16 memory_class;
3469
3470
/** @memory_instance: Which instance */
3471
__u16 memory_instance;
3472
};
3473
3474
/**
3475
* struct drm_i915_memory_region_info - Describes one region as known to the
3476
* driver.
3477
*
3478
* Note this is using both struct drm_i915_query_item and struct drm_i915_query.
3479
* For this new query we are adding the new query id DRM_I915_QUERY_MEMORY_REGIONS
3480
* at &drm_i915_query_item.query_id.
3481
*/
3482
struct drm_i915_memory_region_info {
3483
/** @region: The class:instance pair encoding */
3484
struct drm_i915_gem_memory_class_instance region;
3485
3486
/** @rsvd0: MBZ */
3487
__u32 rsvd0;
3488
3489
/**
3490
* @probed_size: Memory probed by the driver
3491
*
3492
* Note that it should not be possible to ever encounter a zero value
3493
* here, also note that no current region type will ever return -1 here.
3494
* Although for future region types, this might be a possibility. The
3495
* same applies to the other size fields.
3496
*/
3497
__u64 probed_size;
3498
3499
/**
3500
* @unallocated_size: Estimate of memory remaining
3501
*
3502
* Requires CAP_PERFMON or CAP_SYS_ADMIN to get reliable accounting.
3503
* Without this (or if this is an older kernel) the value here will
3504
* always equal the @probed_size. Note this is only currently tracked
3505
* for I915_MEMORY_CLASS_DEVICE regions (for other types the value here
3506
* will always equal the @probed_size).
3507
*/
3508
__u64 unallocated_size;
3509
3510
union {
3511
/** @rsvd1: MBZ */
3512
__u64 rsvd1[8];
3513
struct {
3514
/**
3515
* @probed_cpu_visible_size: Memory probed by the driver
3516
* that is CPU accessible.
3517
*
3518
* This will be always be <= @probed_size, and the
3519
* remainder (if there is any) will not be CPU
3520
* accessible.
3521
*
3522
* On systems without small BAR, the @probed_size will
3523
* always equal the @probed_cpu_visible_size, since all
3524
* of it will be CPU accessible.
3525
*
3526
* Note this is only tracked for
3527
* I915_MEMORY_CLASS_DEVICE regions (for other types the
3528
* value here will always equal the @probed_size).
3529
*
3530
* Note that if the value returned here is zero, then
3531
* this must be an old kernel which lacks the relevant
3532
* small-bar uAPI support (including
3533
* I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS), but on
3534
* such systems we should never actually end up with a
3535
* small BAR configuration, assuming we are able to load
3536
* the kernel module. Hence it should be safe to treat
3537
* this the same as when @probed_cpu_visible_size ==
3538
* @probed_size.
3539
*/
3540
__u64 probed_cpu_visible_size;
3541
3542
/**
3543
* @unallocated_cpu_visible_size: Estimate of CPU
3544
* visible memory remaining.
3545
*
3546
* Note this is only tracked for
3547
* I915_MEMORY_CLASS_DEVICE regions (for other types the
3548
* value here will always equal the
3549
* @probed_cpu_visible_size).
3550
*
3551
* Requires CAP_PERFMON or CAP_SYS_ADMIN to get reliable
3552
* accounting. Without this the value here will always
3553
* equal the @probed_cpu_visible_size. Note this is only
3554
* currently tracked for I915_MEMORY_CLASS_DEVICE
3555
* regions (for other types the value here will also
3556
* always equal the @probed_cpu_visible_size).
3557
*
3558
* If this is an older kernel the value here will be
3559
* zero, see also @probed_cpu_visible_size.
3560
*/
3561
__u64 unallocated_cpu_visible_size;
3562
};
3563
};
3564
};
3565
3566
/**
3567
* struct drm_i915_query_memory_regions
3568
*
3569
* The region info query enumerates all regions known to the driver by filling
3570
* in an array of struct drm_i915_memory_region_info structures.
3571
*
3572
* Example for getting the list of supported regions:
3573
*
3574
* .. code-block:: C
3575
*
3576
* struct drm_i915_query_memory_regions *info;
3577
* struct drm_i915_query_item item = {
3578
* .query_id = DRM_I915_QUERY_MEMORY_REGIONS;
3579
* };
3580
* struct drm_i915_query query = {
3581
* .num_items = 1,
3582
* .items_ptr = (uintptr_t)&item,
3583
* };
3584
* int err, i;
3585
*
3586
* // First query the size of the blob we need, this needs to be large
3587
* // enough to hold our array of regions. The kernel will fill out the
3588
* // item.length for us, which is the number of bytes we need.
3589
* err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
3590
* if (err) ...
3591
*
3592
* info = calloc(1, item.length);
3593
* // Now that we allocated the required number of bytes, we call the ioctl
3594
* // again, this time with the data_ptr pointing to our newly allocated
3595
* // blob, which the kernel can then populate with the all the region info.
3596
* item.data_ptr = (uintptr_t)&info,
3597
*
3598
* err = ioctl(fd, DRM_IOCTL_I915_QUERY, &query);
3599
* if (err) ...
3600
*
3601
* // We can now access each region in the array
3602
* for (i = 0; i < info->num_regions; i++) {
3603
* struct drm_i915_memory_region_info mr = info->regions[i];
3604
* u16 class = mr.region.class;
3605
* u16 instance = mr.region.instance;
3606
*
3607
* ....
3608
* }
3609
*
3610
* free(info);
3611
*/
3612
struct drm_i915_query_memory_regions {
3613
/** @num_regions: Number of supported regions */
3614
__u32 num_regions;
3615
3616
/** @rsvd: MBZ */
3617
__u32 rsvd[3];
3618
3619
/** @regions: Info about each supported region */
3620
struct drm_i915_memory_region_info regions[];
3621
};
3622
3623
/**
3624
* struct drm_i915_query_guc_submission_version - query GuC submission interface version
3625
*/
3626
struct drm_i915_query_guc_submission_version {
3627
/** @branch: Firmware branch version. */
3628
__u32 branch;
3629
/** @major: Firmware major version. */
3630
__u32 major;
3631
/** @minor: Firmware minor version. */
3632
__u32 minor;
3633
/** @patch: Firmware patch version. */
3634
__u32 patch;
3635
};
3636
3637
/**
3638
* DOC: GuC HWCONFIG blob uAPI
3639
*
3640
* The GuC produces a blob with information about the current device.
3641
* i915 reads this blob from GuC and makes it available via this uAPI.
3642
*
3643
* The format and meaning of the blob content are documented in the
3644
* Programmer's Reference Manual.
3645
*/
3646
3647
/**
3648
* struct drm_i915_gem_create_ext - Existing gem_create behaviour, with added
3649
* extension support using struct i915_user_extension.
3650
*
3651
* Note that new buffer flags should be added here, at least for the stuff that
3652
* is immutable. Previously we would have two ioctls, one to create the object
3653
* with gem_create, and another to apply various parameters, however this
3654
* creates some ambiguity for the params which are considered immutable. Also in
3655
* general we're phasing out the various SET/GET ioctls.
3656
*/
3657
struct drm_i915_gem_create_ext {
3658
/**
3659
* @size: Requested size for the object.
3660
*
3661
* The (page-aligned) allocated size for the object will be returned.
3662
*
3663
* On platforms like DG2/ATS the kernel will always use 64K or larger
3664
* pages for I915_MEMORY_CLASS_DEVICE. The kernel also requires a
3665
* minimum of 64K GTT alignment for such objects.
3666
*
3667
* NOTE: Previously the ABI here required a minimum GTT alignment of 2M
3668
* on DG2/ATS, due to how the hardware implemented 64K GTT page support,
3669
* where we had the following complications:
3670
*
3671
* 1) The entire PDE (which covers a 2MB virtual address range), must
3672
* contain only 64K PTEs, i.e mixing 4K and 64K PTEs in the same
3673
* PDE is forbidden by the hardware.
3674
*
3675
* 2) We still need to support 4K PTEs for I915_MEMORY_CLASS_SYSTEM
3676
* objects.
3677
*
3678
* However on actual production HW this was completely changed to now
3679
* allow setting a TLB hint at the PTE level (see PS64), which is a lot
3680
* more flexible than the above. With this the 2M restriction was
3681
* dropped where we now only require 64K.
3682
*/
3683
__u64 size;
3684
3685
/**
3686
* @handle: Returned handle for the object.
3687
*
3688
* Object handles are nonzero.
3689
*/
3690
__u32 handle;
3691
3692
/**
3693
* @flags: Optional flags.
3694
*
3695
* Supported values:
3696
*
3697
* I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS - Signal to the kernel that
3698
* the object will need to be accessed via the CPU.
3699
*
3700
* Only valid when placing objects in I915_MEMORY_CLASS_DEVICE, and only
3701
* strictly required on configurations where some subset of the device
3702
* memory is directly visible/mappable through the CPU (which we also
3703
* call small BAR), like on some DG2+ systems. Note that this is quite
3704
* undesirable, but due to various factors like the client CPU, BIOS etc
3705
* it's something we can expect to see in the wild. See
3706
* &drm_i915_memory_region_info.probed_cpu_visible_size for how to
3707
* determine if this system applies.
3708
*
3709
* Note that one of the placements MUST be I915_MEMORY_CLASS_SYSTEM, to
3710
* ensure the kernel can always spill the allocation to system memory,
3711
* if the object can't be allocated in the mappable part of
3712
* I915_MEMORY_CLASS_DEVICE.
3713
*
3714
* Also note that since the kernel only supports flat-CCS on objects
3715
* that can *only* be placed in I915_MEMORY_CLASS_DEVICE, we therefore
3716
* don't support I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS together with
3717
* flat-CCS.
3718
*
3719
* Without this hint, the kernel will assume that non-mappable
3720
* I915_MEMORY_CLASS_DEVICE is preferred for this object. Note that the
3721
* kernel can still migrate the object to the mappable part, as a last
3722
* resort, if userspace ever CPU faults this object, but this might be
3723
* expensive, and so ideally should be avoided.
3724
*
3725
* On older kernels which lack the relevant small-bar uAPI support (see
3726
* also &drm_i915_memory_region_info.probed_cpu_visible_size),
3727
* usage of the flag will result in an error, but it should NEVER be
3728
* possible to end up with a small BAR configuration, assuming we can
3729
* also successfully load the i915 kernel module. In such cases the
3730
* entire I915_MEMORY_CLASS_DEVICE region will be CPU accessible, and as
3731
* such there are zero restrictions on where the object can be placed.
3732
*/
3733
#define I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS (1 << 0)
3734
__u32 flags;
3735
3736
/**
3737
* @extensions: The chain of extensions to apply to this object.
3738
*
3739
* This will be useful in the future when we need to support several
3740
* different extensions, and we need to apply more than one when
3741
* creating the object. See struct i915_user_extension.
3742
*
3743
* If we don't supply any extensions then we get the same old gem_create
3744
* behaviour.
3745
*
3746
* For I915_GEM_CREATE_EXT_MEMORY_REGIONS usage see
3747
* struct drm_i915_gem_create_ext_memory_regions.
3748
*
3749
* For I915_GEM_CREATE_EXT_PROTECTED_CONTENT usage see
3750
* struct drm_i915_gem_create_ext_protected_content.
3751
*
3752
* For I915_GEM_CREATE_EXT_SET_PAT usage see
3753
* struct drm_i915_gem_create_ext_set_pat.
3754
*/
3755
#define I915_GEM_CREATE_EXT_MEMORY_REGIONS 0
3756
#define I915_GEM_CREATE_EXT_PROTECTED_CONTENT 1
3757
#define I915_GEM_CREATE_EXT_SET_PAT 2
3758
__u64 extensions;
3759
};
3760
3761
/**
3762
* struct drm_i915_gem_create_ext_memory_regions - The
3763
* I915_GEM_CREATE_EXT_MEMORY_REGIONS extension.
3764
*
3765
* Set the object with the desired set of placements/regions in priority
3766
* order. Each entry must be unique and supported by the device.
3767
*
3768
* This is provided as an array of struct drm_i915_gem_memory_class_instance, or
3769
* an equivalent layout of class:instance pair encodings. See struct
3770
* drm_i915_query_memory_regions and DRM_I915_QUERY_MEMORY_REGIONS for how to
3771
* query the supported regions for a device.
3772
*
3773
* As an example, on discrete devices, if we wish to set the placement as
3774
* device local-memory we can do something like:
3775
*
3776
* .. code-block:: C
3777
*
3778
* struct drm_i915_gem_memory_class_instance region_lmem = {
3779
* .memory_class = I915_MEMORY_CLASS_DEVICE,
3780
* .memory_instance = 0,
3781
* };
3782
* struct drm_i915_gem_create_ext_memory_regions regions = {
3783
* .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
3784
* .regions = (uintptr_t)&region_lmem,
3785
* .num_regions = 1,
3786
* };
3787
* struct drm_i915_gem_create_ext create_ext = {
3788
* .size = 16 * PAGE_SIZE,
3789
* .extensions = (uintptr_t)&regions,
3790
* };
3791
*
3792
* int err = ioctl(fd, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext);
3793
* if (err) ...
3794
*
3795
* At which point we get the object handle in &drm_i915_gem_create_ext.handle,
3796
* along with the final object size in &drm_i915_gem_create_ext.size, which
3797
* should account for any rounding up, if required.
3798
*
3799
* Note that userspace has no means of knowing the current backing region
3800
* for objects where @num_regions is larger than one. The kernel will only
3801
* ensure that the priority order of the @regions array is honoured, either
3802
* when initially placing the object, or when moving memory around due to
3803
* memory pressure
3804
*
3805
* On Flat-CCS capable HW, compression is supported for the objects residing
3806
* in I915_MEMORY_CLASS_DEVICE. When such objects (compressed) have other
3807
* memory class in @regions and migrated (by i915, due to memory
3808
* constraints) to the non I915_MEMORY_CLASS_DEVICE region, then i915 needs to
3809
* decompress the content. But i915 doesn't have the required information to
3810
* decompress the userspace compressed objects.
3811
*
3812
* So i915 supports Flat-CCS, on the objects which can reside only on
3813
* I915_MEMORY_CLASS_DEVICE regions.
3814
*/
3815
struct drm_i915_gem_create_ext_memory_regions {
3816
/** @base: Extension link. See struct i915_user_extension. */
3817
struct i915_user_extension base;
3818
3819
/** @pad: MBZ */
3820
__u32 pad;
3821
/** @num_regions: Number of elements in the @regions array. */
3822
__u32 num_regions;
3823
/**
3824
* @regions: The regions/placements array.
3825
*
3826
* An array of struct drm_i915_gem_memory_class_instance.
3827
*/
3828
__u64 regions;
3829
};
3830
3831
/**
3832
* struct drm_i915_gem_create_ext_protected_content - The
3833
* I915_OBJECT_PARAM_PROTECTED_CONTENT extension.
3834
*
3835
* If this extension is provided, buffer contents are expected to be protected
3836
* by PXP encryption and require decryption for scan out and processing. This
3837
* is only possible on platforms that have PXP enabled, on all other scenarios
3838
* using this extension will cause the ioctl to fail and return -ENODEV. The
3839
* flags parameter is reserved for future expansion and must currently be set
3840
* to zero.
3841
*
3842
* The buffer contents are considered invalid after a PXP session teardown.
3843
*
3844
* The encryption is guaranteed to be processed correctly only if the object
3845
* is submitted with a context created using the
3846
* I915_CONTEXT_PARAM_PROTECTED_CONTENT flag. This will also enable extra checks
3847
* at submission time on the validity of the objects involved.
3848
*
3849
* Below is an example on how to create a protected object:
3850
*
3851
* .. code-block:: C
3852
*
3853
* struct drm_i915_gem_create_ext_protected_content protected_ext = {
3854
* .base = { .name = I915_GEM_CREATE_EXT_PROTECTED_CONTENT },
3855
* .flags = 0,
3856
* };
3857
* struct drm_i915_gem_create_ext create_ext = {
3858
* .size = PAGE_SIZE,
3859
* .extensions = (uintptr_t)&protected_ext,
3860
* };
3861
*
3862
* int err = ioctl(fd, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext);
3863
* if (err) ...
3864
*/
3865
struct drm_i915_gem_create_ext_protected_content {
3866
/** @base: Extension link. See struct i915_user_extension. */
3867
struct i915_user_extension base;
3868
/** @flags: reserved for future usage, currently MBZ */
3869
__u32 flags;
3870
};
3871
3872
/**
3873
* struct drm_i915_gem_create_ext_set_pat - The
3874
* I915_GEM_CREATE_EXT_SET_PAT extension.
3875
*
3876
* If this extension is provided, the specified caching policy (PAT index) is
3877
* applied to the buffer object.
3878
*
3879
* Below is an example on how to create an object with specific caching policy:
3880
*
3881
* .. code-block:: C
3882
*
3883
* struct drm_i915_gem_create_ext_set_pat set_pat_ext = {
3884
* .base = { .name = I915_GEM_CREATE_EXT_SET_PAT },
3885
* .pat_index = 0,
3886
* };
3887
* struct drm_i915_gem_create_ext create_ext = {
3888
* .size = PAGE_SIZE,
3889
* .extensions = (uintptr_t)&set_pat_ext,
3890
* };
3891
*
3892
* int err = ioctl(fd, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext);
3893
* if (err) ...
3894
*/
3895
struct drm_i915_gem_create_ext_set_pat {
3896
/** @base: Extension link. See struct i915_user_extension. */
3897
struct i915_user_extension base;
3898
/**
3899
* @pat_index: PAT index to be set
3900
* PAT index is a bit field in Page Table Entry to control caching
3901
* behaviors for GPU accesses. The definition of PAT index is
3902
* platform dependent and can be found in hardware specifications,
3903
*/
3904
__u32 pat_index;
3905
/** @rsvd: reserved for future use */
3906
__u32 rsvd;
3907
};
3908
3909
/* ID of the protected content session managed by i915 when PXP is active */
3910
#define I915_PROTECTED_CONTENT_DEFAULT_SESSION 0xf
3911
3912
#if defined(__cplusplus)
3913
}
3914
#endif
3915
3916
#endif /* _UAPI_I915_DRM_H_ */
3917
3918