1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright © 2014-2018 Broadcom 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next 12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the 13*4882a593Smuzhiyun * Software. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*4882a593Smuzhiyun * IN THE SOFTWARE. 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef _V3D_DRM_H_ 25*4882a593Smuzhiyun #define _V3D_DRM_H_ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #include "drm.h" 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #if defined(__cplusplus) 30*4882a593Smuzhiyun extern "C" { 31*4882a593Smuzhiyun #endif 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_CL 0x00 34*4882a593Smuzhiyun #define DRM_V3D_WAIT_BO 0x01 35*4882a593Smuzhiyun #define DRM_V3D_CREATE_BO 0x02 36*4882a593Smuzhiyun #define DRM_V3D_MMAP_BO 0x03 37*4882a593Smuzhiyun #define DRM_V3D_GET_PARAM 0x04 38*4882a593Smuzhiyun #define DRM_V3D_GET_BO_OFFSET 0x05 39*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_TFU 0x06 40*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_CSD 0x07 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define DRM_IOCTL_V3D_SUBMIT_CL DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_CL, struct drm_v3d_submit_cl) 43*4882a593Smuzhiyun #define DRM_IOCTL_V3D_WAIT_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_WAIT_BO, struct drm_v3d_wait_bo) 44*4882a593Smuzhiyun #define DRM_IOCTL_V3D_CREATE_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_CREATE_BO, struct drm_v3d_create_bo) 45*4882a593Smuzhiyun #define DRM_IOCTL_V3D_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_MMAP_BO, struct drm_v3d_mmap_bo) 46*4882a593Smuzhiyun #define DRM_IOCTL_V3D_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_GET_PARAM, struct drm_v3d_get_param) 47*4882a593Smuzhiyun #define DRM_IOCTL_V3D_GET_BO_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_V3D_GET_BO_OFFSET, struct drm_v3d_get_bo_offset) 48*4882a593Smuzhiyun #define DRM_IOCTL_V3D_SUBMIT_TFU DRM_IOW(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_TFU, struct drm_v3d_submit_tfu) 49*4882a593Smuzhiyun #define DRM_IOCTL_V3D_SUBMIT_CSD DRM_IOW(DRM_COMMAND_BASE + DRM_V3D_SUBMIT_CSD, struct drm_v3d_submit_csd) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define DRM_V3D_SUBMIT_CL_FLUSH_CACHE 0x01 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /** 54*4882a593Smuzhiyun * struct drm_v3d_submit_cl - ioctl argument for submitting commands to the 3D 55*4882a593Smuzhiyun * engine. 56*4882a593Smuzhiyun * 57*4882a593Smuzhiyun * This asks the kernel to have the GPU execute an optional binner 58*4882a593Smuzhiyun * command list, and a render command list. 59*4882a593Smuzhiyun * 60*4882a593Smuzhiyun * The L1T, slice, L2C, L2T, and GCA caches will be flushed before 61*4882a593Smuzhiyun * each CL executes. The VCD cache should be flushed (if necessary) 62*4882a593Smuzhiyun * by the submitted CLs. The TLB writes are guaranteed to have been 63*4882a593Smuzhiyun * flushed by the time the render done IRQ happens, which is the 64*4882a593Smuzhiyun * trigger for out_sync. Any dirtying of cachelines by the job (only 65*4882a593Smuzhiyun * possible using TMU writes) must be flushed by the caller using the 66*4882a593Smuzhiyun * DRM_V3D_SUBMIT_CL_FLUSH_CACHE_FLAG flag. 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun struct drm_v3d_submit_cl { 69*4882a593Smuzhiyun /* Pointer to the binner command list. 70*4882a593Smuzhiyun * 71*4882a593Smuzhiyun * This is the first set of commands executed, which runs the 72*4882a593Smuzhiyun * coordinate shader to determine where primitives land on the screen, 73*4882a593Smuzhiyun * then writes out the state updates and draw calls necessary per tile 74*4882a593Smuzhiyun * to the tile allocation BO. 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * This BCL will block on any previous BCL submitted on the 77*4882a593Smuzhiyun * same FD, but not on any RCL or BCLs submitted by other 78*4882a593Smuzhiyun * clients -- that is left up to the submitter to control 79*4882a593Smuzhiyun * using in_sync_bcl if necessary. 80*4882a593Smuzhiyun */ 81*4882a593Smuzhiyun __u32 bcl_start; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /** End address of the BCL (first byte after the BCL) */ 84*4882a593Smuzhiyun __u32 bcl_end; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* Offset of the render command list. 87*4882a593Smuzhiyun * 88*4882a593Smuzhiyun * This is the second set of commands executed, which will either 89*4882a593Smuzhiyun * execute the tiles that have been set up by the BCL, or a fixed set 90*4882a593Smuzhiyun * of tiles (in the case of RCL-only blits). 91*4882a593Smuzhiyun * 92*4882a593Smuzhiyun * This RCL will block on this submit's BCL, and any previous 93*4882a593Smuzhiyun * RCL submitted on the same FD, but not on any RCL or BCLs 94*4882a593Smuzhiyun * submitted by other clients -- that is left up to the 95*4882a593Smuzhiyun * submitter to control using in_sync_rcl if necessary. 96*4882a593Smuzhiyun */ 97*4882a593Smuzhiyun __u32 rcl_start; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /** End address of the RCL (first byte after the RCL) */ 100*4882a593Smuzhiyun __u32 rcl_end; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /** An optional sync object to wait on before starting the BCL. */ 103*4882a593Smuzhiyun __u32 in_sync_bcl; 104*4882a593Smuzhiyun /** An optional sync object to wait on before starting the RCL. */ 105*4882a593Smuzhiyun __u32 in_sync_rcl; 106*4882a593Smuzhiyun /** An optional sync object to place the completion fence in. */ 107*4882a593Smuzhiyun __u32 out_sync; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* Offset of the tile alloc memory 110*4882a593Smuzhiyun * 111*4882a593Smuzhiyun * This is optional on V3D 3.3 (where the CL can set the value) but 112*4882a593Smuzhiyun * required on V3D 4.1. 113*4882a593Smuzhiyun */ 114*4882a593Smuzhiyun __u32 qma; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /** Size of the tile alloc memory. */ 117*4882a593Smuzhiyun __u32 qms; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /** Offset of the tile state data array. */ 120*4882a593Smuzhiyun __u32 qts; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* Pointer to a u32 array of the BOs that are referenced by the job. 123*4882a593Smuzhiyun */ 124*4882a593Smuzhiyun __u64 bo_handles; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Number of BO handles passed in (size is that times 4). */ 127*4882a593Smuzhiyun __u32 bo_handle_count; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun __u32 flags; 130*4882a593Smuzhiyun }; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /** 133*4882a593Smuzhiyun * struct drm_v3d_wait_bo - ioctl argument for waiting for 134*4882a593Smuzhiyun * completion of the last DRM_V3D_SUBMIT_CL on a BO. 135*4882a593Smuzhiyun * 136*4882a593Smuzhiyun * This is useful for cases where multiple processes might be 137*4882a593Smuzhiyun * rendering to a BO and you want to wait for all rendering to be 138*4882a593Smuzhiyun * completed. 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun struct drm_v3d_wait_bo { 141*4882a593Smuzhiyun __u32 handle; 142*4882a593Smuzhiyun __u32 pad; 143*4882a593Smuzhiyun __u64 timeout_ns; 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /** 147*4882a593Smuzhiyun * struct drm_v3d_create_bo - ioctl argument for creating V3D BOs. 148*4882a593Smuzhiyun * 149*4882a593Smuzhiyun * There are currently no values for the flags argument, but it may be 150*4882a593Smuzhiyun * used in a future extension. 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun struct drm_v3d_create_bo { 153*4882a593Smuzhiyun __u32 size; 154*4882a593Smuzhiyun __u32 flags; 155*4882a593Smuzhiyun /** Returned GEM handle for the BO. */ 156*4882a593Smuzhiyun __u32 handle; 157*4882a593Smuzhiyun /** 158*4882a593Smuzhiyun * Returned offset for the BO in the V3D address space. This offset 159*4882a593Smuzhiyun * is private to the DRM fd and is valid for the lifetime of the GEM 160*4882a593Smuzhiyun * handle. 161*4882a593Smuzhiyun * 162*4882a593Smuzhiyun * This offset value will always be nonzero, since various HW 163*4882a593Smuzhiyun * units treat 0 specially. 164*4882a593Smuzhiyun */ 165*4882a593Smuzhiyun __u32 offset; 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /** 169*4882a593Smuzhiyun * struct drm_v3d_mmap_bo - ioctl argument for mapping V3D BOs. 170*4882a593Smuzhiyun * 171*4882a593Smuzhiyun * This doesn't actually perform an mmap. Instead, it returns the 172*4882a593Smuzhiyun * offset you need to use in an mmap on the DRM device node. This 173*4882a593Smuzhiyun * means that tools like valgrind end up knowing about the mapped 174*4882a593Smuzhiyun * memory. 175*4882a593Smuzhiyun * 176*4882a593Smuzhiyun * There are currently no values for the flags argument, but it may be 177*4882a593Smuzhiyun * used in a future extension. 178*4882a593Smuzhiyun */ 179*4882a593Smuzhiyun struct drm_v3d_mmap_bo { 180*4882a593Smuzhiyun /** Handle for the object being mapped. */ 181*4882a593Smuzhiyun __u32 handle; 182*4882a593Smuzhiyun __u32 flags; 183*4882a593Smuzhiyun /** offset into the drm node to use for subsequent mmap call. */ 184*4882a593Smuzhiyun __u64 offset; 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun enum drm_v3d_param { 188*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_UIFCFG, 189*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_HUB_IDENT1, 190*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_HUB_IDENT2, 191*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_HUB_IDENT3, 192*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_CORE0_IDENT0, 193*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_CORE0_IDENT1, 194*4882a593Smuzhiyun DRM_V3D_PARAM_V3D_CORE0_IDENT2, 195*4882a593Smuzhiyun DRM_V3D_PARAM_SUPPORTS_TFU, 196*4882a593Smuzhiyun DRM_V3D_PARAM_SUPPORTS_CSD, 197*4882a593Smuzhiyun DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH, 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct drm_v3d_get_param { 201*4882a593Smuzhiyun __u32 param; 202*4882a593Smuzhiyun __u32 pad; 203*4882a593Smuzhiyun __u64 value; 204*4882a593Smuzhiyun }; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /** 207*4882a593Smuzhiyun * Returns the offset for the BO in the V3D address space for this DRM fd. 208*4882a593Smuzhiyun * This is the same value returned by drm_v3d_create_bo, if that was called 209*4882a593Smuzhiyun * from this DRM fd. 210*4882a593Smuzhiyun */ 211*4882a593Smuzhiyun struct drm_v3d_get_bo_offset { 212*4882a593Smuzhiyun __u32 handle; 213*4882a593Smuzhiyun __u32 offset; 214*4882a593Smuzhiyun }; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun struct drm_v3d_submit_tfu { 217*4882a593Smuzhiyun __u32 icfg; 218*4882a593Smuzhiyun __u32 iia; 219*4882a593Smuzhiyun __u32 iis; 220*4882a593Smuzhiyun __u32 ica; 221*4882a593Smuzhiyun __u32 iua; 222*4882a593Smuzhiyun __u32 ioa; 223*4882a593Smuzhiyun __u32 ios; 224*4882a593Smuzhiyun __u32 coef[4]; 225*4882a593Smuzhiyun /* First handle is the output BO, following are other inputs. 226*4882a593Smuzhiyun * 0 for unused. 227*4882a593Smuzhiyun */ 228*4882a593Smuzhiyun __u32 bo_handles[4]; 229*4882a593Smuzhiyun /* sync object to block on before running the TFU job. Each TFU 230*4882a593Smuzhiyun * job will execute in the order submitted to its FD. Synchronization 231*4882a593Smuzhiyun * against rendering jobs requires using sync objects. 232*4882a593Smuzhiyun */ 233*4882a593Smuzhiyun __u32 in_sync; 234*4882a593Smuzhiyun /* Sync object to signal when the TFU job is done. */ 235*4882a593Smuzhiyun __u32 out_sync; 236*4882a593Smuzhiyun }; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* Submits a compute shader for dispatch. This job will block on any 239*4882a593Smuzhiyun * previous compute shaders submitted on this fd, and any other 240*4882a593Smuzhiyun * synchronization must be performed with in_sync/out_sync. 241*4882a593Smuzhiyun */ 242*4882a593Smuzhiyun struct drm_v3d_submit_csd { 243*4882a593Smuzhiyun __u32 cfg[7]; 244*4882a593Smuzhiyun __u32 coef[4]; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* Pointer to a u32 array of the BOs that are referenced by the job. 247*4882a593Smuzhiyun */ 248*4882a593Smuzhiyun __u64 bo_handles; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* Number of BO handles passed in (size is that times 4). */ 251*4882a593Smuzhiyun __u32 bo_handle_count; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* sync object to block on before running the CSD job. Each 254*4882a593Smuzhiyun * CSD job will execute in the order submitted to its FD. 255*4882a593Smuzhiyun * Synchronization against rendering/TFU jobs or CSD from 256*4882a593Smuzhiyun * other fds requires using sync objects. 257*4882a593Smuzhiyun */ 258*4882a593Smuzhiyun __u32 in_sync; 259*4882a593Smuzhiyun /* Sync object to signal when the CSD job is done. */ 260*4882a593Smuzhiyun __u32 out_sync; 261*4882a593Smuzhiyun }; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun #if defined(__cplusplus) 264*4882a593Smuzhiyun } 265*4882a593Smuzhiyun #endif 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #endif /* _V3D_DRM_H_ */ 268