1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2013 Red Hat 3*61046927SAndroid Build Coastguard Worker * Author: Rob Clark <[email protected]> 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 6*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 7*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 8*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 10*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 11*61046927SAndroid Build Coastguard Worker * 12*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 13*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 14*61046927SAndroid Build Coastguard Worker * Software. 15*61046927SAndroid Build Coastguard Worker * 16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22*61046927SAndroid Build Coastguard Worker * SOFTWARE. 23*61046927SAndroid Build Coastguard Worker */ 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker #ifndef __MSM_DRM_H__ 26*61046927SAndroid Build Coastguard Worker #define __MSM_DRM_H__ 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker #include "drm.h" 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker #if defined(__cplusplus) 31*61046927SAndroid Build Coastguard Worker extern "C" { 32*61046927SAndroid Build Coastguard Worker #endif 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker /* Please note that modifications to all structs defined here are 35*61046927SAndroid Build Coastguard Worker * subject to backwards-compatibility constraints: 36*61046927SAndroid Build Coastguard Worker * 1) Do not use pointers, use __u64 instead for 32 bit / 64 bit 37*61046927SAndroid Build Coastguard Worker * user/kernel compatibility 38*61046927SAndroid Build Coastguard Worker * 2) Keep fields aligned to their size 39*61046927SAndroid Build Coastguard Worker * 3) Because of how drm_ioctl() works, we can add new fields at 40*61046927SAndroid Build Coastguard Worker * the end of an ioctl if some care is taken: drm_ioctl() will 41*61046927SAndroid Build Coastguard Worker * zero out the new fields at the tail of the ioctl, so a zero 42*61046927SAndroid Build Coastguard Worker * value should have a backwards compatible meaning. And for 43*61046927SAndroid Build Coastguard Worker * output params, userspace won't see the newly added output 44*61046927SAndroid Build Coastguard Worker * fields.. so that has to be somehow ok. 45*61046927SAndroid Build Coastguard Worker */ 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_NONE 0x00 48*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_2D0 0x01 49*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_2D1 0x02 50*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_3D0 0x10 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker /* The pipe-id just uses the lower bits, so can be OR'd with flags in 53*61046927SAndroid Build Coastguard Worker * the upper 16 bits (which could be extended further, if needed, maybe 54*61046927SAndroid Build Coastguard Worker * we extend/overload the pipe-id some day to deal with multiple rings, 55*61046927SAndroid Build Coastguard Worker * but even then I don't think we need the full lower 16 bits). 56*61046927SAndroid Build Coastguard Worker */ 57*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_ID_MASK 0xffff 58*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_ID(x) ((x) & MSM_PIPE_ID_MASK) 59*61046927SAndroid Build Coastguard Worker #define MSM_PIPE_FLAGS(x) ((x) & ~MSM_PIPE_ID_MASK) 60*61046927SAndroid Build Coastguard Worker 61*61046927SAndroid Build Coastguard Worker /* timeouts are specified in clock-monotonic absolute times (to simplify 62*61046927SAndroid Build Coastguard Worker * restarting interrupted ioctls). The following struct is logically the 63*61046927SAndroid Build Coastguard Worker * same as 'struct timespec' but 32/64b ABI safe. 64*61046927SAndroid Build Coastguard Worker */ 65*61046927SAndroid Build Coastguard Worker struct drm_msm_timespec { 66*61046927SAndroid Build Coastguard Worker __s64 tv_sec; /* seconds */ 67*61046927SAndroid Build Coastguard Worker __s64 tv_nsec; /* nanoseconds */ 68*61046927SAndroid Build Coastguard Worker }; 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Worker /* Below "RO" indicates a read-only param, "WO" indicates write-only, and 71*61046927SAndroid Build Coastguard Worker * "RW" indicates a param that can be both read (GET_PARAM) and written 72*61046927SAndroid Build Coastguard Worker * (SET_PARAM) 73*61046927SAndroid Build Coastguard Worker */ 74*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_GPU_ID 0x01 /* RO */ 75*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_GMEM_SIZE 0x02 /* RO */ 76*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_CHIP_ID 0x03 /* RO */ 77*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_MAX_FREQ 0x04 /* RO */ 78*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_TIMESTAMP 0x05 /* RO */ 79*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_GMEM_BASE 0x06 /* RO */ 80*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_PRIORITIES 0x07 /* RO: The # of priority levels */ 81*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_PP_PGTABLE 0x08 /* RO: Deprecated, always returns zero */ 82*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_FAULTS 0x09 /* RO */ 83*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_SUSPENDS 0x0a /* RO */ 84*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_SYSPROF 0x0b /* WO: 1 preserves perfcntrs, 2 also disables suspend */ 85*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_COMM 0x0c /* WO: override for task->comm */ 86*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_CMDLINE 0x0d /* WO: override for task cmdline */ 87*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_VA_START 0x0e /* RO: start of valid GPU iova range */ 88*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_VA_SIZE 0x0f /* RO: size of valid GPU iova range (bytes) */ 89*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_HIGHEST_BANK_BIT 0x10 /* RO */ 90*61046927SAndroid Build Coastguard Worker 91*61046927SAndroid Build Coastguard Worker /* For backwards compat. The original support for preemption was based on 92*61046927SAndroid Build Coastguard Worker * a single ring per priority level so # of priority levels equals the # 93*61046927SAndroid Build Coastguard Worker * of rings. With drm/scheduler providing additional levels of priority, 94*61046927SAndroid Build Coastguard Worker * the number of priorities is greater than the # of rings. The param is 95*61046927SAndroid Build Coastguard Worker * renamed to better reflect this. 96*61046927SAndroid Build Coastguard Worker */ 97*61046927SAndroid Build Coastguard Worker #define MSM_PARAM_NR_RINGS MSM_PARAM_PRIORITIES 98*61046927SAndroid Build Coastguard Worker 99*61046927SAndroid Build Coastguard Worker struct drm_msm_param { 100*61046927SAndroid Build Coastguard Worker __u32 pipe; /* in, MSM_PIPE_x */ 101*61046927SAndroid Build Coastguard Worker __u32 param; /* in, MSM_PARAM_x */ 102*61046927SAndroid Build Coastguard Worker __u64 value; /* out (get_param) or in (set_param) */ 103*61046927SAndroid Build Coastguard Worker __u32 len; /* zero for non-pointer params */ 104*61046927SAndroid Build Coastguard Worker __u32 pad; /* must be zero */ 105*61046927SAndroid Build Coastguard Worker }; 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker /* 108*61046927SAndroid Build Coastguard Worker * GEM buffers: 109*61046927SAndroid Build Coastguard Worker */ 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker #define MSM_BO_SCANOUT 0x00000001 /* scanout capable */ 112*61046927SAndroid Build Coastguard Worker #define MSM_BO_GPU_READONLY 0x00000002 113*61046927SAndroid Build Coastguard Worker #define MSM_BO_CACHE_MASK 0x000f0000 114*61046927SAndroid Build Coastguard Worker /* cache modes */ 115*61046927SAndroid Build Coastguard Worker #define MSM_BO_CACHED 0x00010000 116*61046927SAndroid Build Coastguard Worker #define MSM_BO_WC 0x00020000 117*61046927SAndroid Build Coastguard Worker #define MSM_BO_UNCACHED 0x00040000 /* deprecated, use MSM_BO_WC */ 118*61046927SAndroid Build Coastguard Worker #define MSM_BO_CACHED_COHERENT 0x080000 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker #define MSM_BO_FLAGS (MSM_BO_SCANOUT | \ 121*61046927SAndroid Build Coastguard Worker MSM_BO_GPU_READONLY | \ 122*61046927SAndroid Build Coastguard Worker MSM_BO_CACHE_MASK) 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_new { 125*61046927SAndroid Build Coastguard Worker __u64 size; /* in */ 126*61046927SAndroid Build Coastguard Worker __u32 flags; /* in, mask of MSM_BO_x */ 127*61046927SAndroid Build Coastguard Worker __u32 handle; /* out */ 128*61046927SAndroid Build Coastguard Worker }; 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker /* Get or set GEM buffer info. The requested value can be passed 131*61046927SAndroid Build Coastguard Worker * directly in 'value', or for data larger than 64b 'value' is a 132*61046927SAndroid Build Coastguard Worker * pointer to userspace buffer, with 'len' specifying the number of 133*61046927SAndroid Build Coastguard Worker * bytes copied into that buffer. For info returned by pointer, 134*61046927SAndroid Build Coastguard Worker * calling the GEM_INFO ioctl with null 'value' will return the 135*61046927SAndroid Build Coastguard Worker * required buffer size in 'len' 136*61046927SAndroid Build Coastguard Worker */ 137*61046927SAndroid Build Coastguard Worker #define MSM_INFO_GET_OFFSET 0x00 /* get mmap() offset, returned by value */ 138*61046927SAndroid Build Coastguard Worker #define MSM_INFO_GET_IOVA 0x01 /* get iova, returned by value */ 139*61046927SAndroid Build Coastguard Worker #define MSM_INFO_SET_NAME 0x02 /* set the debug name (by pointer) */ 140*61046927SAndroid Build Coastguard Worker #define MSM_INFO_GET_NAME 0x03 /* get debug name, returned by pointer */ 141*61046927SAndroid Build Coastguard Worker #define MSM_INFO_SET_IOVA 0x04 /* set the iova, passed by value */ 142*61046927SAndroid Build Coastguard Worker #define MSM_INFO_GET_FLAGS 0x05 /* get the MSM_BO_x flags */ 143*61046927SAndroid Build Coastguard Worker #define MSM_INFO_SET_METADATA 0x06 /* set userspace metadata */ 144*61046927SAndroid Build Coastguard Worker #define MSM_INFO_GET_METADATA 0x07 /* get userspace metadata */ 145*61046927SAndroid Build Coastguard Worker 146*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_info { 147*61046927SAndroid Build Coastguard Worker __u32 handle; /* in */ 148*61046927SAndroid Build Coastguard Worker __u32 info; /* in - one of MSM_INFO_* */ 149*61046927SAndroid Build Coastguard Worker __u64 value; /* in or out */ 150*61046927SAndroid Build Coastguard Worker __u32 len; /* in or out */ 151*61046927SAndroid Build Coastguard Worker __u32 pad; 152*61046927SAndroid Build Coastguard Worker }; 153*61046927SAndroid Build Coastguard Worker 154*61046927SAndroid Build Coastguard Worker #define MSM_PREP_READ 0x01 155*61046927SAndroid Build Coastguard Worker #define MSM_PREP_WRITE 0x02 156*61046927SAndroid Build Coastguard Worker #define MSM_PREP_NOSYNC 0x04 157*61046927SAndroid Build Coastguard Worker #define MSM_PREP_BOOST 0x08 158*61046927SAndroid Build Coastguard Worker 159*61046927SAndroid Build Coastguard Worker #define MSM_PREP_FLAGS (MSM_PREP_READ | \ 160*61046927SAndroid Build Coastguard Worker MSM_PREP_WRITE | \ 161*61046927SAndroid Build Coastguard Worker MSM_PREP_NOSYNC | \ 162*61046927SAndroid Build Coastguard Worker MSM_PREP_BOOST | \ 163*61046927SAndroid Build Coastguard Worker 0) 164*61046927SAndroid Build Coastguard Worker 165*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_cpu_prep { 166*61046927SAndroid Build Coastguard Worker __u32 handle; /* in */ 167*61046927SAndroid Build Coastguard Worker __u32 op; /* in, mask of MSM_PREP_x */ 168*61046927SAndroid Build Coastguard Worker struct drm_msm_timespec timeout; /* in */ 169*61046927SAndroid Build Coastguard Worker }; 170*61046927SAndroid Build Coastguard Worker 171*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_cpu_fini { 172*61046927SAndroid Build Coastguard Worker __u32 handle; /* in */ 173*61046927SAndroid Build Coastguard Worker }; 174*61046927SAndroid Build Coastguard Worker 175*61046927SAndroid Build Coastguard Worker /* 176*61046927SAndroid Build Coastguard Worker * Cmdstream Submission: 177*61046927SAndroid Build Coastguard Worker */ 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Worker /* The value written into the cmdstream is logically: 180*61046927SAndroid Build Coastguard Worker * 181*61046927SAndroid Build Coastguard Worker * ((relocbuf->gpuaddr + reloc_offset) << shift) | or 182*61046927SAndroid Build Coastguard Worker * 183*61046927SAndroid Build Coastguard Worker * When we have GPU's w/ >32bit ptrs, it should be possible to deal 184*61046927SAndroid Build Coastguard Worker * with this by emit'ing two reloc entries with appropriate shift 185*61046927SAndroid Build Coastguard Worker * values. Or a new MSM_SUBMIT_CMD_x type would also be an option. 186*61046927SAndroid Build Coastguard Worker * 187*61046927SAndroid Build Coastguard Worker * NOTE that reloc's must be sorted by order of increasing submit_offset, 188*61046927SAndroid Build Coastguard Worker * otherwise EINVAL. 189*61046927SAndroid Build Coastguard Worker */ 190*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_submit_reloc { 191*61046927SAndroid Build Coastguard Worker __u32 submit_offset; /* in, offset from submit_bo */ 192*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 193*61046927SAndroid Build Coastguard Worker __u32 _or; /* in, value OR'd with result */ 194*61046927SAndroid Build Coastguard Worker #else 195*61046927SAndroid Build Coastguard Worker __u32 or; /* in, value OR'd with result */ 196*61046927SAndroid Build Coastguard Worker #endif 197*61046927SAndroid Build Coastguard Worker __s32 shift; /* in, amount of left shift (can be negative) */ 198*61046927SAndroid Build Coastguard Worker __u32 reloc_idx; /* in, index of reloc_bo buffer */ 199*61046927SAndroid Build Coastguard Worker __u64 reloc_offset; /* in, offset from start of reloc_bo */ 200*61046927SAndroid Build Coastguard Worker }; 201*61046927SAndroid Build Coastguard Worker 202*61046927SAndroid Build Coastguard Worker /* submit-types: 203*61046927SAndroid Build Coastguard Worker * BUF - this cmd buffer is executed normally. 204*61046927SAndroid Build Coastguard Worker * IB_TARGET_BUF - this cmd buffer is an IB target. Reloc's are 205*61046927SAndroid Build Coastguard Worker * processed normally, but the kernel does not setup an IB to 206*61046927SAndroid Build Coastguard Worker * this buffer in the first-level ringbuffer 207*61046927SAndroid Build Coastguard Worker * CTX_RESTORE_BUF - only executed if there has been a GPU context 208*61046927SAndroid Build Coastguard Worker * switch since the last SUBMIT ioctl 209*61046927SAndroid Build Coastguard Worker */ 210*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_CMD_BUF 0x0001 211*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_CMD_IB_TARGET_BUF 0x0002 212*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_CMD_CTX_RESTORE_BUF 0x0003 213*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_submit_cmd { 214*61046927SAndroid Build Coastguard Worker __u32 type; /* in, one of MSM_SUBMIT_CMD_x */ 215*61046927SAndroid Build Coastguard Worker __u32 submit_idx; /* in, index of submit_bo cmdstream buffer */ 216*61046927SAndroid Build Coastguard Worker __u32 submit_offset; /* in, offset into submit_bo */ 217*61046927SAndroid Build Coastguard Worker __u32 size; /* in, cmdstream size */ 218*61046927SAndroid Build Coastguard Worker __u32 pad; 219*61046927SAndroid Build Coastguard Worker __u32 nr_relocs; /* in, number of submit_reloc's */ 220*61046927SAndroid Build Coastguard Worker __u64 relocs; /* in, ptr to array of submit_reloc's */ 221*61046927SAndroid Build Coastguard Worker }; 222*61046927SAndroid Build Coastguard Worker 223*61046927SAndroid Build Coastguard Worker /* Each buffer referenced elsewhere in the cmdstream submit (ie. the 224*61046927SAndroid Build Coastguard Worker * cmdstream buffer(s) themselves or reloc entries) has one (and only 225*61046927SAndroid Build Coastguard Worker * one) entry in the submit->bos[] table. 226*61046927SAndroid Build Coastguard Worker * 227*61046927SAndroid Build Coastguard Worker * As a optimization, the current buffer (gpu virtual address) can be 228*61046927SAndroid Build Coastguard Worker * passed back through the 'presumed' field. If on a subsequent reloc, 229*61046927SAndroid Build Coastguard Worker * userspace passes back a 'presumed' address that is still valid, 230*61046927SAndroid Build Coastguard Worker * then patching the cmdstream for this entry is skipped. This can 231*61046927SAndroid Build Coastguard Worker * avoid kernel needing to map/access the cmdstream bo in the common 232*61046927SAndroid Build Coastguard Worker * case. 233*61046927SAndroid Build Coastguard Worker */ 234*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_BO_READ 0x0001 235*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_BO_WRITE 0x0002 236*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_BO_DUMP 0x0004 237*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_BO_NO_IMPLICIT 0x0008 238*61046927SAndroid Build Coastguard Worker 239*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_BO_FLAGS (MSM_SUBMIT_BO_READ | \ 240*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_BO_WRITE | \ 241*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_BO_DUMP | \ 242*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_BO_NO_IMPLICIT) 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_submit_bo { 245*61046927SAndroid Build Coastguard Worker __u32 flags; /* in, mask of MSM_SUBMIT_BO_x */ 246*61046927SAndroid Build Coastguard Worker __u32 handle; /* in, GEM handle */ 247*61046927SAndroid Build Coastguard Worker __u64 presumed; /* in/out, presumed buffer address */ 248*61046927SAndroid Build Coastguard Worker }; 249*61046927SAndroid Build Coastguard Worker 250*61046927SAndroid Build Coastguard Worker /* Valid submit ioctl flags: */ 251*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_NO_IMPLICIT 0x80000000 /* disable implicit sync */ 252*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_FENCE_FD_IN 0x40000000 /* enable input fence_fd */ 253*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_FENCE_FD_OUT 0x20000000 /* enable output fence_fd */ 254*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_SUDO 0x10000000 /* run submitted cmds from RB */ 255*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_SYNCOBJ_IN 0x08000000 /* enable input syncobj */ 256*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_SYNCOBJ_OUT 0x04000000 /* enable output syncobj */ 257*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_FENCE_SN_IN 0x02000000 /* userspace passes in seqno fence */ 258*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_FLAGS ( \ 259*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_NO_IMPLICIT | \ 260*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_FENCE_FD_IN | \ 261*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_FENCE_FD_OUT | \ 262*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_SUDO | \ 263*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_SYNCOBJ_IN | \ 264*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_SYNCOBJ_OUT | \ 265*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_FENCE_SN_IN | \ 266*61046927SAndroid Build Coastguard Worker 0) 267*61046927SAndroid Build Coastguard Worker 268*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_SYNCOBJ_RESET 0x00000001 /* Reset syncobj after wait. */ 269*61046927SAndroid Build Coastguard Worker #define MSM_SUBMIT_SYNCOBJ_FLAGS ( \ 270*61046927SAndroid Build Coastguard Worker MSM_SUBMIT_SYNCOBJ_RESET | \ 271*61046927SAndroid Build Coastguard Worker 0) 272*61046927SAndroid Build Coastguard Worker 273*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_submit_syncobj { 274*61046927SAndroid Build Coastguard Worker __u32 handle; /* in, syncobj handle. */ 275*61046927SAndroid Build Coastguard Worker __u32 flags; /* in, from MSM_SUBMIT_SYNCOBJ_FLAGS */ 276*61046927SAndroid Build Coastguard Worker __u64 point; /* in, timepoint for timeline syncobjs. */ 277*61046927SAndroid Build Coastguard Worker }; 278*61046927SAndroid Build Coastguard Worker 279*61046927SAndroid Build Coastguard Worker /* Each cmdstream submit consists of a table of buffers involved, and 280*61046927SAndroid Build Coastguard Worker * one or more cmdstream buffers. This allows for conditional execution 281*61046927SAndroid Build Coastguard Worker * (context-restore), and IB buffers needed for per tile/bin draw cmds. 282*61046927SAndroid Build Coastguard Worker */ 283*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_submit { 284*61046927SAndroid Build Coastguard Worker __u32 flags; /* MSM_PIPE_x | MSM_SUBMIT_x */ 285*61046927SAndroid Build Coastguard Worker __u32 fence; /* out (or in with MSM_SUBMIT_FENCE_SN_IN flag) */ 286*61046927SAndroid Build Coastguard Worker __u32 nr_bos; /* in, number of submit_bo's */ 287*61046927SAndroid Build Coastguard Worker __u32 nr_cmds; /* in, number of submit_cmd's */ 288*61046927SAndroid Build Coastguard Worker __u64 bos; /* in, ptr to array of submit_bo's */ 289*61046927SAndroid Build Coastguard Worker __u64 cmds; /* in, ptr to array of submit_cmd's */ 290*61046927SAndroid Build Coastguard Worker __s32 fence_fd; /* in/out fence fd (see MSM_SUBMIT_FENCE_FD_IN/OUT) */ 291*61046927SAndroid Build Coastguard Worker __u32 queueid; /* in, submitqueue id */ 292*61046927SAndroid Build Coastguard Worker __u64 in_syncobjs; /* in, ptr to array of drm_msm_gem_submit_syncobj */ 293*61046927SAndroid Build Coastguard Worker __u64 out_syncobjs; /* in, ptr to array of drm_msm_gem_submit_syncobj */ 294*61046927SAndroid Build Coastguard Worker __u32 nr_in_syncobjs; /* in, number of entries in in_syncobj */ 295*61046927SAndroid Build Coastguard Worker __u32 nr_out_syncobjs; /* in, number of entries in out_syncobj. */ 296*61046927SAndroid Build Coastguard Worker __u32 syncobj_stride; /* in, stride of syncobj arrays. */ 297*61046927SAndroid Build Coastguard Worker __u32 pad; /*in, reserved for future use, always 0. */ 298*61046927SAndroid Build Coastguard Worker 299*61046927SAndroid Build Coastguard Worker }; 300*61046927SAndroid Build Coastguard Worker 301*61046927SAndroid Build Coastguard Worker #define MSM_WAIT_FENCE_BOOST 0x00000001 302*61046927SAndroid Build Coastguard Worker #define MSM_WAIT_FENCE_FLAGS ( \ 303*61046927SAndroid Build Coastguard Worker MSM_WAIT_FENCE_BOOST | \ 304*61046927SAndroid Build Coastguard Worker 0) 305*61046927SAndroid Build Coastguard Worker 306*61046927SAndroid Build Coastguard Worker /* The normal way to synchronize with the GPU is just to CPU_PREP on 307*61046927SAndroid Build Coastguard Worker * a buffer if you need to access it from the CPU (other cmdstream 308*61046927SAndroid Build Coastguard Worker * submission from same or other contexts, PAGE_FLIP ioctl, etc, all 309*61046927SAndroid Build Coastguard Worker * handle the required synchronization under the hood). This ioctl 310*61046927SAndroid Build Coastguard Worker * mainly just exists as a way to implement the gallium pipe_fence 311*61046927SAndroid Build Coastguard Worker * APIs without requiring a dummy bo to synchronize on. 312*61046927SAndroid Build Coastguard Worker */ 313*61046927SAndroid Build Coastguard Worker struct drm_msm_wait_fence { 314*61046927SAndroid Build Coastguard Worker __u32 fence; /* in */ 315*61046927SAndroid Build Coastguard Worker __u32 flags; /* in, bitmask of MSM_WAIT_FENCE_x */ 316*61046927SAndroid Build Coastguard Worker struct drm_msm_timespec timeout; /* in */ 317*61046927SAndroid Build Coastguard Worker __u32 queueid; /* in, submitqueue id */ 318*61046927SAndroid Build Coastguard Worker }; 319*61046927SAndroid Build Coastguard Worker 320*61046927SAndroid Build Coastguard Worker /* madvise provides a way to tell the kernel in case a buffers contents 321*61046927SAndroid Build Coastguard Worker * can be discarded under memory pressure, which is useful for userspace 322*61046927SAndroid Build Coastguard Worker * bo cache where we want to optimistically hold on to buffer allocate 323*61046927SAndroid Build Coastguard Worker * and potential mmap, but allow the pages to be discarded under memory 324*61046927SAndroid Build Coastguard Worker * pressure. 325*61046927SAndroid Build Coastguard Worker * 326*61046927SAndroid Build Coastguard Worker * Typical usage would involve madvise(DONTNEED) when buffer enters BO 327*61046927SAndroid Build Coastguard Worker * cache, and madvise(WILLNEED) if trying to recycle buffer from BO cache. 328*61046927SAndroid Build Coastguard Worker * In the WILLNEED case, 'retained' indicates to userspace whether the 329*61046927SAndroid Build Coastguard Worker * backing pages still exist. 330*61046927SAndroid Build Coastguard Worker */ 331*61046927SAndroid Build Coastguard Worker #define MSM_MADV_WILLNEED 0 /* backing pages are needed, status returned in 'retained' */ 332*61046927SAndroid Build Coastguard Worker #define MSM_MADV_DONTNEED 1 /* backing pages not needed */ 333*61046927SAndroid Build Coastguard Worker #define __MSM_MADV_PURGED 2 /* internal state */ 334*61046927SAndroid Build Coastguard Worker 335*61046927SAndroid Build Coastguard Worker struct drm_msm_gem_madvise { 336*61046927SAndroid Build Coastguard Worker __u32 handle; /* in, GEM handle */ 337*61046927SAndroid Build Coastguard Worker __u32 madv; /* in, MSM_MADV_x */ 338*61046927SAndroid Build Coastguard Worker __u32 retained; /* out, whether backing store still exists */ 339*61046927SAndroid Build Coastguard Worker }; 340*61046927SAndroid Build Coastguard Worker 341*61046927SAndroid Build Coastguard Worker /* 342*61046927SAndroid Build Coastguard Worker * Draw queues allow the user to set specific submission parameter. Command 343*61046927SAndroid Build Coastguard Worker * submissions specify a specific submitqueue to use. ID 0 is reserved for 344*61046927SAndroid Build Coastguard Worker * backwards compatibility as a "default" submitqueue 345*61046927SAndroid Build Coastguard Worker */ 346*61046927SAndroid Build Coastguard Worker 347*61046927SAndroid Build Coastguard Worker #define MSM_SUBMITQUEUE_FLAGS (0) 348*61046927SAndroid Build Coastguard Worker 349*61046927SAndroid Build Coastguard Worker /* 350*61046927SAndroid Build Coastguard Worker * The submitqueue priority should be between 0 and MSM_PARAM_PRIORITIES-1, 351*61046927SAndroid Build Coastguard Worker * a lower numeric value is higher priority. 352*61046927SAndroid Build Coastguard Worker */ 353*61046927SAndroid Build Coastguard Worker struct drm_msm_submitqueue { 354*61046927SAndroid Build Coastguard Worker __u32 flags; /* in, MSM_SUBMITQUEUE_x */ 355*61046927SAndroid Build Coastguard Worker __u32 prio; /* in, Priority level */ 356*61046927SAndroid Build Coastguard Worker __u32 id; /* out, identifier */ 357*61046927SAndroid Build Coastguard Worker }; 358*61046927SAndroid Build Coastguard Worker 359*61046927SAndroid Build Coastguard Worker #define MSM_SUBMITQUEUE_PARAM_FAULTS 0 360*61046927SAndroid Build Coastguard Worker 361*61046927SAndroid Build Coastguard Worker struct drm_msm_submitqueue_query { 362*61046927SAndroid Build Coastguard Worker __u64 data; 363*61046927SAndroid Build Coastguard Worker __u32 id; 364*61046927SAndroid Build Coastguard Worker __u32 param; 365*61046927SAndroid Build Coastguard Worker __u32 len; 366*61046927SAndroid Build Coastguard Worker __u32 pad; 367*61046927SAndroid Build Coastguard Worker }; 368*61046927SAndroid Build Coastguard Worker 369*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GET_PARAM 0x00 370*61046927SAndroid Build Coastguard Worker #define DRM_MSM_SET_PARAM 0x01 371*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_NEW 0x02 372*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_INFO 0x03 373*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_CPU_PREP 0x04 374*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_CPU_FINI 0x05 375*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_SUBMIT 0x06 376*61046927SAndroid Build Coastguard Worker #define DRM_MSM_WAIT_FENCE 0x07 377*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_MADVISE 0x08 378*61046927SAndroid Build Coastguard Worker /* placeholder: 379*61046927SAndroid Build Coastguard Worker #define DRM_MSM_GEM_SVM_NEW 0x09 380*61046927SAndroid Build Coastguard Worker */ 381*61046927SAndroid Build Coastguard Worker #define DRM_MSM_SUBMITQUEUE_NEW 0x0A 382*61046927SAndroid Build Coastguard Worker #define DRM_MSM_SUBMITQUEUE_CLOSE 0x0B 383*61046927SAndroid Build Coastguard Worker #define DRM_MSM_SUBMITQUEUE_QUERY 0x0C 384*61046927SAndroid Build Coastguard Worker 385*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GET_PARAM, struct drm_msm_param) 386*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_SET_PARAM DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_SET_PARAM, struct drm_msm_param) 387*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GEM_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_NEW, struct drm_msm_gem_new) 388*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_INFO, struct drm_msm_gem_info) 389*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GEM_CPU_PREP DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_GEM_CPU_PREP, struct drm_msm_gem_cpu_prep) 390*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GEM_CPU_FINI DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_GEM_CPU_FINI, struct drm_msm_gem_cpu_fini) 391*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GEM_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_SUBMIT, struct drm_msm_gem_submit) 392*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_WAIT_FENCE DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_WAIT_FENCE, struct drm_msm_wait_fence) 393*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_MADVISE, struct drm_msm_gem_madvise) 394*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_SUBMITQUEUE_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_NEW, struct drm_msm_submitqueue) 395*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_CLOSE, __u32) 396*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_MSM_SUBMITQUEUE_QUERY DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_QUERY, struct drm_msm_submitqueue_query) 397*61046927SAndroid Build Coastguard Worker 398*61046927SAndroid Build Coastguard Worker #if defined(__cplusplus) 399*61046927SAndroid Build Coastguard Worker } 400*61046927SAndroid Build Coastguard Worker #endif 401*61046927SAndroid Build Coastguard Worker 402*61046927SAndroid Build Coastguard Worker #endif /* __MSM_DRM_H__ */ 403