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