1*54e60f84SAndroid Build Coastguard Worker /* 2*54e60f84SAndroid Build Coastguard Worker * va_drmcommon.h - Common utilities for DRM-based drivers 3*54e60f84SAndroid Build Coastguard Worker * 4*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2012 Intel Corporation. All Rights Reserved. 5*54e60f84SAndroid Build Coastguard Worker * 6*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 7*54e60f84SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the 8*54e60f84SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including 9*54e60f84SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish, 10*54e60f84SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to 11*54e60f84SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to 12*54e60f84SAndroid Build Coastguard Worker * the following conditions: 13*54e60f84SAndroid Build Coastguard Worker * 14*54e60f84SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the 15*54e60f84SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions 16*54e60f84SAndroid Build Coastguard Worker * of the Software. 17*54e60f84SAndroid Build Coastguard Worker * 18*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19*54e60f84SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20*54e60f84SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21*54e60f84SAndroid Build Coastguard Worker * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR 22*54e60f84SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23*54e60f84SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24*54e60f84SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25*54e60f84SAndroid Build Coastguard Worker */ 26*54e60f84SAndroid Build Coastguard Worker 27*54e60f84SAndroid Build Coastguard Worker #ifndef VA_DRM_COMMON_H 28*54e60f84SAndroid Build Coastguard Worker #define VA_DRM_COMMON_H 29*54e60f84SAndroid Build Coastguard Worker 30*54e60f84SAndroid Build Coastguard Worker #include <stdint.h> 31*54e60f84SAndroid Build Coastguard Worker #include <va/va.h> 32*54e60f84SAndroid Build Coastguard Worker 33*54e60f84SAndroid Build Coastguard Worker 34*54e60f84SAndroid Build Coastguard Worker /** \brief DRM authentication type. */ 35*54e60f84SAndroid Build Coastguard Worker enum { 36*54e60f84SAndroid Build Coastguard Worker /** \brief Disconnected. */ 37*54e60f84SAndroid Build Coastguard Worker VA_DRM_AUTH_NONE = 0, 38*54e60f84SAndroid Build Coastguard Worker /** 39*54e60f84SAndroid Build Coastguard Worker * \brief Connected. Authenticated with DRI1 protocol. 40*54e60f84SAndroid Build Coastguard Worker * 41*54e60f84SAndroid Build Coastguard Worker * @deprecated 42*54e60f84SAndroid Build Coastguard Worker * This is a deprecated authentication type. All DRI-based drivers have 43*54e60f84SAndroid Build Coastguard Worker * been migrated to use the DRI2 protocol. Newly written drivers shall 44*54e60f84SAndroid Build Coastguard Worker * use DRI2 protocol only, or a custom authentication means. e.g. opt 45*54e60f84SAndroid Build Coastguard Worker * for authenticating on the VA driver side, instead of libva side. 46*54e60f84SAndroid Build Coastguard Worker */ 47*54e60f84SAndroid Build Coastguard Worker VA_DRM_AUTH_DRI1 = 1, 48*54e60f84SAndroid Build Coastguard Worker /** 49*54e60f84SAndroid Build Coastguard Worker * \brief Connected. Authenticated with DRI2 protocol. 50*54e60f84SAndroid Build Coastguard Worker * 51*54e60f84SAndroid Build Coastguard Worker * This is only useful to VA/X11 drivers. The libva-x11 library provides 52*54e60f84SAndroid Build Coastguard Worker * a helper function VA_DRI2Authenticate() for authenticating the 53*54e60f84SAndroid Build Coastguard Worker * connection. However, DRI2 conformant drivers don't need to call that 54*54e60f84SAndroid Build Coastguard Worker * function since authentication happens on the libva side, implicitly. 55*54e60f84SAndroid Build Coastguard Worker */ 56*54e60f84SAndroid Build Coastguard Worker VA_DRM_AUTH_DRI2 = 2, 57*54e60f84SAndroid Build Coastguard Worker /** 58*54e60f84SAndroid Build Coastguard Worker * \brief Connected. Authenticated with some alternate raw protocol. 59*54e60f84SAndroid Build Coastguard Worker * 60*54e60f84SAndroid Build Coastguard Worker * This authentication mode is mainly used in non-VA/X11 drivers. 61*54e60f84SAndroid Build Coastguard Worker * Authentication happens through some alternative method, at the 62*54e60f84SAndroid Build Coastguard Worker * discretion of the VA driver implementation. 63*54e60f84SAndroid Build Coastguard Worker */ 64*54e60f84SAndroid Build Coastguard Worker VA_DRM_AUTH_CUSTOM = 3 65*54e60f84SAndroid Build Coastguard Worker }; 66*54e60f84SAndroid Build Coastguard Worker 67*54e60f84SAndroid Build Coastguard Worker /** \brief Base DRM state. */ 68*54e60f84SAndroid Build Coastguard Worker struct drm_state { 69*54e60f84SAndroid Build Coastguard Worker /** \brief DRM connection descriptor. */ 70*54e60f84SAndroid Build Coastguard Worker int fd; 71*54e60f84SAndroid Build Coastguard Worker /** \brief DRM authentication type. */ 72*54e60f84SAndroid Build Coastguard Worker int auth_type; 73*54e60f84SAndroid Build Coastguard Worker /** \brief Reserved bytes for future use, must be zero */ 74*54e60f84SAndroid Build Coastguard Worker int va_reserved[8]; 75*54e60f84SAndroid Build Coastguard Worker }; 76*54e60f84SAndroid Build Coastguard Worker 77*54e60f84SAndroid Build Coastguard Worker /** \brief Kernel DRM buffer memory type. */ 78*54e60f84SAndroid Build Coastguard Worker #define VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM 0x10000000 79*54e60f84SAndroid Build Coastguard Worker /** \brief DRM PRIME memory type (old version) 80*54e60f84SAndroid Build Coastguard Worker * 81*54e60f84SAndroid Build Coastguard Worker * This supports only single objects with restricted memory layout. 82*54e60f84SAndroid Build Coastguard Worker * Used with VASurfaceAttribExternalBuffers. 83*54e60f84SAndroid Build Coastguard Worker */ 84*54e60f84SAndroid Build Coastguard Worker #define VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME 0x20000000 85*54e60f84SAndroid Build Coastguard Worker /** \brief DRM PRIME memory type 86*54e60f84SAndroid Build Coastguard Worker * 87*54e60f84SAndroid Build Coastguard Worker * Used with VADRMPRIMESurfaceDescriptor. 88*54e60f84SAndroid Build Coastguard Worker */ 89*54e60f84SAndroid Build Coastguard Worker #define VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 0x40000000 90*54e60f84SAndroid Build Coastguard Worker /** \brief DRM PRIME3 memory type 91*54e60f84SAndroid Build Coastguard Worker * 92*54e60f84SAndroid Build Coastguard Worker * Used with VADRMPRIME3SurfaceDescriptor. 93*54e60f84SAndroid Build Coastguard Worker */ 94*54e60f84SAndroid Build Coastguard Worker #define VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_3 0x08000000 95*54e60f84SAndroid Build Coastguard Worker 96*54e60f84SAndroid Build Coastguard Worker /** 97*54e60f84SAndroid Build Coastguard Worker * \brief External buffer descriptor for a DRM PRIME surface. 98*54e60f84SAndroid Build Coastguard Worker * 99*54e60f84SAndroid Build Coastguard Worker * For export, call vaExportSurfaceHandle() with mem_type set to 100*54e60f84SAndroid Build Coastguard Worker * VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 and pass a pointer to an 101*54e60f84SAndroid Build Coastguard Worker * instance of this structure to fill. 102*54e60f84SAndroid Build Coastguard Worker * If VA_EXPORT_SURFACE_SEPARATE_LAYERS is specified on export, each 103*54e60f84SAndroid Build Coastguard Worker * layer will contain exactly one plane. For example, an NV12 104*54e60f84SAndroid Build Coastguard Worker * surface will be exported as two layers, one of DRM_FORMAT_R8 and 105*54e60f84SAndroid Build Coastguard Worker * one of DRM_FORMAT_GR88. 106*54e60f84SAndroid Build Coastguard Worker * If VA_EXPORT_SURFACE_COMPOSED_LAYERS is specified on export, 107*54e60f84SAndroid Build Coastguard Worker * there will be exactly one layer. 108*54e60f84SAndroid Build Coastguard Worker * 109*54e60f84SAndroid Build Coastguard Worker * For import, call vaCreateSurfaces() with the MemoryType attribute 110*54e60f84SAndroid Build Coastguard Worker * set to VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 and the 111*54e60f84SAndroid Build Coastguard Worker * ExternalBufferDescriptor attribute set to point to an array of 112*54e60f84SAndroid Build Coastguard Worker * num_surfaces instances of this structure. 113*54e60f84SAndroid Build Coastguard Worker * The number of planes which need to be provided for a given layer 114*54e60f84SAndroid Build Coastguard Worker * is dependent on both the format and the format modifier used for 115*54e60f84SAndroid Build Coastguard Worker * the objects containing it. For example, the format DRM_FORMAT_RGBA 116*54e60f84SAndroid Build Coastguard Worker * normally requires one plane, but with the format modifier 117*54e60f84SAndroid Build Coastguard Worker * I915_FORMAT_MOD_Y_TILED_CCS it requires two planes - the first 118*54e60f84SAndroid Build Coastguard Worker * being the main data plane and the second containing the color 119*54e60f84SAndroid Build Coastguard Worker * control surface. 120*54e60f84SAndroid Build Coastguard Worker * Note that a given driver may only support a subset of possible 121*54e60f84SAndroid Build Coastguard Worker * representations of a particular format. For example, it may only 122*54e60f84SAndroid Build Coastguard Worker * support NV12 surfaces when they are contained within a single DRM 123*54e60f84SAndroid Build Coastguard Worker * object, and therefore fail to create such surfaces if the two 124*54e60f84SAndroid Build Coastguard Worker * planes are in different DRM objects. 125*54e60f84SAndroid Build Coastguard Worker * Note that backend driver will retrieve the resource represent by fd, 126*54e60f84SAndroid Build Coastguard Worker * and a valid surface ID is generated. Backend driver will not close 127*54e60f84SAndroid Build Coastguard Worker * the file descriptor. Application should handle the release of the fd. 128*54e60f84SAndroid Build Coastguard Worker * releasing the fd will not impact the existence of the surface. 129*54e60f84SAndroid Build Coastguard Worker */ 130*54e60f84SAndroid Build Coastguard Worker typedef struct _VADRMPRIMESurfaceDescriptor { 131*54e60f84SAndroid Build Coastguard Worker /** Pixel format fourcc of the whole surface (VA_FOURCC_*). */ 132*54e60f84SAndroid Build Coastguard Worker uint32_t fourcc; 133*54e60f84SAndroid Build Coastguard Worker /** Width of the surface in pixels. */ 134*54e60f84SAndroid Build Coastguard Worker uint32_t width; 135*54e60f84SAndroid Build Coastguard Worker /** Height of the surface in pixels. */ 136*54e60f84SAndroid Build Coastguard Worker uint32_t height; 137*54e60f84SAndroid Build Coastguard Worker /** Number of distinct DRM objects making up the surface. */ 138*54e60f84SAndroid Build Coastguard Worker uint32_t num_objects; 139*54e60f84SAndroid Build Coastguard Worker /** Description of each object. */ 140*54e60f84SAndroid Build Coastguard Worker struct { 141*54e60f84SAndroid Build Coastguard Worker /** DRM PRIME file descriptor for this object. */ 142*54e60f84SAndroid Build Coastguard Worker int fd; 143*54e60f84SAndroid Build Coastguard Worker /** Total size of this object (may include regions which are 144*54e60f84SAndroid Build Coastguard Worker * not part of the surface). */ 145*54e60f84SAndroid Build Coastguard Worker uint32_t size; 146*54e60f84SAndroid Build Coastguard Worker /** Format modifier applied to this object. */ 147*54e60f84SAndroid Build Coastguard Worker uint64_t drm_format_modifier; 148*54e60f84SAndroid Build Coastguard Worker } objects[4]; 149*54e60f84SAndroid Build Coastguard Worker /** Number of layers making up the surface. */ 150*54e60f84SAndroid Build Coastguard Worker uint32_t num_layers; 151*54e60f84SAndroid Build Coastguard Worker /** Description of each layer in the surface. */ 152*54e60f84SAndroid Build Coastguard Worker struct { 153*54e60f84SAndroid Build Coastguard Worker /** DRM format fourcc of this layer (DRM_FOURCC_*). */ 154*54e60f84SAndroid Build Coastguard Worker uint32_t drm_format; 155*54e60f84SAndroid Build Coastguard Worker /** Number of planes in this layer. */ 156*54e60f84SAndroid Build Coastguard Worker uint32_t num_planes; 157*54e60f84SAndroid Build Coastguard Worker /** Index in the objects array of the object containing each 158*54e60f84SAndroid Build Coastguard Worker * plane. */ 159*54e60f84SAndroid Build Coastguard Worker uint32_t object_index[4]; 160*54e60f84SAndroid Build Coastguard Worker /** Offset within the object of each plane. */ 161*54e60f84SAndroid Build Coastguard Worker uint32_t offset[4]; 162*54e60f84SAndroid Build Coastguard Worker /** Pitch of each plane. */ 163*54e60f84SAndroid Build Coastguard Worker uint32_t pitch[4]; 164*54e60f84SAndroid Build Coastguard Worker } layers[4]; 165*54e60f84SAndroid Build Coastguard Worker } VADRMPRIMESurfaceDescriptor; 166*54e60f84SAndroid Build Coastguard Worker 167*54e60f84SAndroid Build Coastguard Worker /** 168*54e60f84SAndroid Build Coastguard Worker * \brief External buffer descriptor for a DRM PRIME surface with flags 169*54e60f84SAndroid Build Coastguard Worker * 170*54e60f84SAndroid Build Coastguard Worker * This structure is an extention for VADRMPRIMESurfaceDescriptor, 171*54e60f84SAndroid Build Coastguard Worker * it has the same behavior as if used with VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2. 172*54e60f84SAndroid Build Coastguard Worker * 173*54e60f84SAndroid Build Coastguard Worker * The field "flags" is added, see "Surface external buffer descriptor flags". 174*54e60f84SAndroid Build Coastguard Worker * To use this structure, use VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_3 instead. 175*54e60f84SAndroid Build Coastguard Worker */ 176*54e60f84SAndroid Build Coastguard Worker typedef struct _VADRMPRIME3SurfaceDescriptor { 177*54e60f84SAndroid Build Coastguard Worker /** Pixel format fourcc of the whole surface (VA_FOURCC_*). */ 178*54e60f84SAndroid Build Coastguard Worker uint32_t fourcc; 179*54e60f84SAndroid Build Coastguard Worker /** Width of the surface in pixels. */ 180*54e60f84SAndroid Build Coastguard Worker uint32_t width; 181*54e60f84SAndroid Build Coastguard Worker /** Height of the surface in pixels. */ 182*54e60f84SAndroid Build Coastguard Worker uint32_t height; 183*54e60f84SAndroid Build Coastguard Worker /** Number of distinct DRM objects making up the surface. */ 184*54e60f84SAndroid Build Coastguard Worker uint32_t num_objects; 185*54e60f84SAndroid Build Coastguard Worker /** Description of each object. */ 186*54e60f84SAndroid Build Coastguard Worker struct { 187*54e60f84SAndroid Build Coastguard Worker /** DRM PRIME file descriptor for this object. */ 188*54e60f84SAndroid Build Coastguard Worker int fd; 189*54e60f84SAndroid Build Coastguard Worker /** Total size of this object (may include regions which are 190*54e60f84SAndroid Build Coastguard Worker * not part of the surface). */ 191*54e60f84SAndroid Build Coastguard Worker uint32_t size; 192*54e60f84SAndroid Build Coastguard Worker /** Format modifier applied to this object. */ 193*54e60f84SAndroid Build Coastguard Worker uint64_t drm_format_modifier; 194*54e60f84SAndroid Build Coastguard Worker } objects[4]; 195*54e60f84SAndroid Build Coastguard Worker /** Number of layers making up the surface. */ 196*54e60f84SAndroid Build Coastguard Worker uint32_t num_layers; 197*54e60f84SAndroid Build Coastguard Worker /** Description of each layer in the surface. */ 198*54e60f84SAndroid Build Coastguard Worker struct { 199*54e60f84SAndroid Build Coastguard Worker /** DRM format fourcc of this layer (DRM_FOURCC_*). */ 200*54e60f84SAndroid Build Coastguard Worker uint32_t drm_format; 201*54e60f84SAndroid Build Coastguard Worker /** Number of planes in this layer. */ 202*54e60f84SAndroid Build Coastguard Worker uint32_t num_planes; 203*54e60f84SAndroid Build Coastguard Worker /** Index in the objects array of the object containing each 204*54e60f84SAndroid Build Coastguard Worker * plane. */ 205*54e60f84SAndroid Build Coastguard Worker uint32_t object_index[4]; 206*54e60f84SAndroid Build Coastguard Worker /** Offset within the object of each plane. */ 207*54e60f84SAndroid Build Coastguard Worker uint32_t offset[4]; 208*54e60f84SAndroid Build Coastguard Worker /** Pitch of each plane. */ 209*54e60f84SAndroid Build Coastguard Worker uint32_t pitch[4]; 210*54e60f84SAndroid Build Coastguard Worker } layers[4]; 211*54e60f84SAndroid Build Coastguard Worker /** \brief flags. See "Surface external buffer descriptor flags". */ 212*54e60f84SAndroid Build Coastguard Worker uint32_t flags; 213*54e60f84SAndroid Build Coastguard Worker /** reserved bytes, must be zero */ 214*54e60f84SAndroid Build Coastguard Worker uint32_t reserved[VA_PADDING_MEDIUM - 1]; 215*54e60f84SAndroid Build Coastguard Worker } VADRMPRIME3SurfaceDescriptor; 216*54e60f84SAndroid Build Coastguard Worker /** 217*54e60f84SAndroid Build Coastguard Worker * \brief List of DRM format modifiers. 218*54e60f84SAndroid Build Coastguard Worker * 219*54e60f84SAndroid Build Coastguard Worker * To allocate surfaces with one of the modifiers specified in the array, call 220*54e60f84SAndroid Build Coastguard Worker * vaCreateSurfaces() with the VASurfaceAttribDRMFormatModifiers attribute set 221*54e60f84SAndroid Build Coastguard Worker * to point to an array of num_surfaces instances of this structure. The driver 222*54e60f84SAndroid Build Coastguard Worker * will select the optimal modifier in the list. 223*54e60f84SAndroid Build Coastguard Worker * 224*54e60f84SAndroid Build Coastguard Worker * DRM format modifiers are defined in drm_fourcc.h in the Linux kernel. 225*54e60f84SAndroid Build Coastguard Worker */ 226*54e60f84SAndroid Build Coastguard Worker typedef struct _VADRMFormatModifierList { 227*54e60f84SAndroid Build Coastguard Worker /** Number of modifiers. */ 228*54e60f84SAndroid Build Coastguard Worker uint32_t num_modifiers; 229*54e60f84SAndroid Build Coastguard Worker /** Array of modifiers. */ 230*54e60f84SAndroid Build Coastguard Worker uint64_t *modifiers; 231*54e60f84SAndroid Build Coastguard Worker } VADRMFormatModifierList; 232*54e60f84SAndroid Build Coastguard Worker 233*54e60f84SAndroid Build Coastguard Worker 234*54e60f84SAndroid Build Coastguard Worker #endif /* VA_DRM_COMMON_H */ 235