1 /* 2 * Copyright (c) 2017, The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef __DRM_INTERFACE_H__ 31 #define __DRM_INTERFACE_H__ 32 33 #include <map> 34 #include <string> 35 #include <utility> 36 #include <vector> 37 38 #include "xf86drm.h" 39 #include "xf86drmMode.h" 40 41 namespace sde_drm { 42 /* 43 * Drm Atomic Operation Codes 44 */ 45 enum struct DRMOps { 46 /* 47 * Op: Sets plane source crop 48 * Arg: uint32_t - Plane ID 49 * DRMRect - Source Rectangle 50 */ 51 PLANE_SET_SRC_RECT, 52 /* 53 * Op: Sets plane destination rect 54 * Arg: uint32_t - Plane ID 55 * DRMRect - Dst Rectangle 56 */ 57 PLANE_SET_DST_RECT, 58 /* 59 * Op: Sets plane zorder 60 * Arg: uint32_t - Plane ID 61 * uint32_t - zorder 62 */ 63 PLANE_SET_ZORDER, 64 /* 65 * Op: Sets plane rotation flags 66 * Arg: uint32_t - Plane ID 67 * uint32_t - bit mask of rotation flags (See drm_mode.h for enums) 68 */ 69 PLANE_SET_ROTATION, 70 /* 71 * Op: Sets plane alpha 72 * Arg: uint32_t - Plane ID 73 * uint32_t - alpha value 74 */ 75 PLANE_SET_ALPHA, 76 /* 77 * Op: Sets the blend type 78 * Arg: uint32_t - Plane ID 79 * uint32_t - blend type (see DRMBlendType) 80 */ 81 PLANE_SET_BLEND_TYPE, 82 /* 83 * Op: Sets horizontal decimation 84 * Arg: uint32_t - Plane ID 85 * uint32_t - decimation factor 86 */ 87 PLANE_SET_H_DECIMATION, 88 /* 89 * Op: Sets vertical decimation 90 * Arg: uint32_t - Plane ID 91 * uint32_t - decimation factor 92 */ 93 PLANE_SET_V_DECIMATION, 94 /* 95 * Op: Sets source config flags 96 * Arg: uint32_t - Plane ID 97 * uint32_t - flags to enable or disable a specific op. E.g. deinterlacing 98 */ 99 PLANE_SET_SRC_CONFIG, 100 /* 101 * Op: Sets frame buffer ID for plane. Set together with CRTC. 102 * Arg: uint32_t - Plane ID 103 * uint32_t - Framebuffer ID 104 */ 105 PLANE_SET_FB_ID, 106 /* 107 * Op: Sets the crtc for this plane. Set together with FB_ID. 108 * Arg: uint32_t - Plane ID 109 * uint32_t - CRTC ID 110 */ 111 PLANE_SET_CRTC, 112 /* 113 * Op: Sets acquire fence for this plane's buffer. Set together with FB_ID, CRTC. 114 * Arg: uint32_t - Plane ID 115 * uint32_t - Input fence 116 */ 117 PLANE_SET_INPUT_FENCE, 118 /* 119 * Op: Sets scaler config on this plane. 120 * Arg: uint32_t - Plane ID 121 * uint64_t - Address of the scaler config object (version based) 122 */ 123 PLANE_SET_SCALER_CONFIG, 124 /* 125 * Op: Activate or deactivate a CRTC 126 * Arg: uint32_t - CRTC ID 127 * uint32_t - 1 to enable, 0 to disable 128 */ 129 CRTC_SET_ACTIVE, 130 /* 131 * Op: Sets display mode 132 * Arg: uint32_t - CRTC ID 133 * drmModeModeInfo* - Pointer to display mode 134 */ 135 CRTC_SET_MODE, 136 /* 137 * Op: Sets an offset indicating when a release fence should be signalled. 138 * Arg: uint32_t - offset 139 * 0: non-speculative, default 140 * 1: speculative 141 */ 142 CRTC_SET_OUTPUT_FENCE_OFFSET, 143 /* 144 * Op: Returns release fence for this frame. Should be called after Commit() on 145 * DRMAtomicReqInterface. 146 * Arg: uint32_t - CRTC ID 147 * int * - Pointer to an integer that will hold the returned fence 148 */ 149 CRTC_GET_RELEASE_FENCE, 150 /* 151 * Op: Sets PP feature 152 * Arg: uint32_t - CRTC ID 153 * DRMPPFeatureInfo * - PP feature data pointer 154 */ 155 CRTC_SET_POST_PROC, 156 /* 157 * Op: Returns retire fence for this commit. Should be called after Commit() on 158 * DRMAtomicReqInterface. 159 * Arg: uint32_t - Connector ID 160 * int * - Pointer to an integer that will hold the returned fence 161 */ 162 CONNECTOR_GET_RETIRE_FENCE, 163 /* 164 * Op: Sets writeback connector destination rect 165 * Arg: uint32_t - Connector ID 166 * DRMRect - Dst Rectangle 167 */ 168 CONNECTOR_SET_OUTPUT_RECT, 169 /* 170 * Op: Sets frame buffer ID for writeback connector. 171 * Arg: uint32_t - Connector ID 172 * uint32_t - Framebuffer ID 173 */ 174 CONNECTOR_SET_OUTPUT_FB_ID, 175 }; 176 177 enum struct DRMRotation { 178 FLIP_H = 0x1, 179 FLIP_V = 0x2, 180 ROT_90 = 0x4, 181 }; 182 183 enum struct DRMBlendType { 184 UNDEFINED = 0, 185 OPAQUE = 1, 186 PREMULTIPLIED = 2, 187 COVERAGE = 3, 188 }; 189 190 enum struct DRMSrcConfig { 191 DEINTERLACE = 0, 192 }; 193 194 /* Display type to identify a suitable connector */ 195 enum struct DRMDisplayType { 196 PERIPHERAL, 197 TV, 198 VIRTUAL, 199 }; 200 201 struct DRMRect { 202 uint32_t left; // Left-most pixel coordinate. 203 uint32_t top; // Top-most pixel coordinate. 204 uint32_t right; // Right-most pixel coordinate. 205 uint32_t bottom; // Bottom-most pixel coordinate. 206 }; 207 208 //------------------------------------------------------------------------ 209 // DRM Info Query Types 210 //------------------------------------------------------------------------ 211 212 enum struct QSEEDVersion { 213 V1, 214 V2, 215 V3, 216 }; 217 218 enum struct SmartDMARevision { 219 V1, 220 V2, 221 }; 222 223 /* Per CRTC Resource Info*/ 224 struct DRMCrtcInfo { 225 bool has_src_split; 226 uint32_t max_blend_stages; 227 QSEEDVersion qseed_version; 228 SmartDMARevision smart_dma_rev; 229 }; 230 231 enum struct DRMPlaneType { 232 // Has CSC and scaling capability 233 VIG = 0, 234 // Has scaling capability but no CSC 235 RGB, 236 // No scaling support 237 DMA, 238 // Supports a small dimension and doesn't use a CRTC stage 239 CURSOR, 240 MAX, 241 }; 242 243 struct DRMPlaneTypeInfo { 244 DRMPlaneType type; 245 uint32_t master_plane_id; 246 // FourCC format enum and modifier 247 std::vector<std::pair<uint32_t, uint64_t>> formats_supported; 248 uint32_t max_linewidth; 249 uint32_t max_upscale; 250 uint32_t max_downscale; 251 uint32_t max_horizontal_deci; 252 uint32_t max_vertical_deci; 253 }; 254 255 // All DRM Planes as map<Plane_id , plane_type_info> listed from highest to lowest priority 256 typedef std::vector<std::pair<uint32_t, DRMPlaneTypeInfo>> DRMPlanesInfo; 257 258 enum struct DRMTopology { 259 UNKNOWN, // To be compat with driver defs in sde_kms.h 260 SINGLE_LM, 261 DUAL_LM, 262 PPSPLIT, 263 DUAL_LM_MERGE, 264 }; 265 266 enum struct DRMPanelMode { 267 VIDEO, 268 COMMAND, 269 }; 270 271 /* Per Connector Info*/ 272 struct DRMConnectorInfo { 273 uint32_t mmWidth; 274 uint32_t mmHeight; 275 uint32_t type; 276 uint32_t num_modes; 277 drmModeModeInfo *modes; 278 DRMTopology topology; 279 std::string panel_name; 280 DRMPanelMode panel_mode; 281 bool is_primary; 282 // Valid only if DRMPanelMode is VIDEO 283 bool dynamic_fps; 284 // FourCC format enum and modifier 285 std::vector<std::pair<uint32_t, uint64_t>> formats_supported; 286 // Valid only if type is DRM_MODE_CONNECTOR_VIRTUAL 287 uint32_t max_linewidth; 288 }; 289 290 /* Identifier token for a display */ 291 struct DRMDisplayToken { 292 uint32_t conn_id; 293 uint32_t crtc_id; 294 }; 295 296 enum DRMPPFeatureID { 297 kFeaturePcc, 298 kFeatureIgc, 299 kFeaturePgc, 300 kFeatureMixerGc, 301 kFeaturePaV2, 302 kFeatureDither, 303 kFeatureGamut, 304 kFeaturePADither, 305 kPPFeaturesMax, 306 }; 307 308 enum DRMPPPropType { 309 kPropEnum, 310 kPropRange, 311 kPropBlob, 312 kPropTypeMax, 313 }; 314 315 struct DRMPPFeatureInfo { 316 DRMPPFeatureID id; 317 DRMPPPropType type; 318 uint32_t version; 319 uint32_t payload_size; 320 void *payload; 321 }; 322 323 struct DRMScalerLUTInfo { 324 uint32_t dir_lut_size = 0; 325 uint32_t cir_lut_size = 0; 326 uint32_t sep_lut_size = 0; 327 uint64_t dir_lut = 0; 328 uint64_t cir_lut = 0; 329 uint64_t sep_lut = 0; 330 }; 331 332 /* DRM Atomic Request Property Set. 333 * 334 * Helper class to create and populate atomic properties of DRM components 335 * when rendered in DRM atomic mode */ 336 class DRMAtomicReqInterface { 337 public: ~DRMAtomicReqInterface()338 virtual ~DRMAtomicReqInterface() {} 339 /* Perform request operation. 340 * 341 * [input]: opcode: operation code from DRMOps list. 342 * var_arg: arguments for DRMOps's can differ in number and 343 * data type. Refer above DRMOps to details. 344 * [return]: Error code if the API fails, 0 on success. 345 */ 346 virtual int Perform(DRMOps opcode, ...) = 0; 347 348 /* 349 * Commit the params set via Perform(). Also resets the properties after commit. Needs to be 350 * called every frame. 351 * [input]: synchronous: Determines if the call should block until a h/w flip 352 * [return]: Error code if the API fails, 0 on success. 353 */ 354 virtual int Commit(bool synchronous) = 0; 355 /* 356 * Validate the params set via Perform(). 357 * [return]: Error code if the API fails, 0 on success. 358 */ 359 virtual int Validate() = 0; 360 }; 361 362 class DRMManagerInterface; 363 364 /* Populates a singleton instance of DRMManager */ 365 typedef int (*GetDRMManager)(int fd, DRMManagerInterface **intf); 366 367 /* Destroy DRMManager instance */ 368 typedef int (*DestroyDRMManager)(); 369 370 /* 371 * DRM Manager Interface - Any class which plans to implement helper function for vendor 372 * specific DRM driver implementation must implement the below interface routines to work 373 * with SDM. 374 */ 375 376 class DRMManagerInterface { 377 public: ~DRMManagerInterface()378 virtual ~DRMManagerInterface() {} 379 380 /* 381 * Since SDM completely manages the planes. GetPlanesInfo will provide all 382 * the plane information. 383 * [output]: DRMPlanesInfo: Resource Info for planes. 384 */ 385 virtual void GetPlanesInfo(DRMPlanesInfo *info) = 0; 386 387 /* 388 * Will provide all the information of a selected crtc. 389 * [input]: Use crtc id 0 to obtain system wide info 390 * [output]: DRMCrtcInfo: Resource Info for the given CRTC id. 391 */ 392 virtual void GetCrtcInfo(uint32_t crtc_id, DRMCrtcInfo *info) = 0; 393 394 /* 395 * Will provide all the information of a selected connector. 396 * [output]: DRMConnectorInfo: Resource Info for the given connector id 397 */ 398 virtual void GetConnectorInfo(uint32_t conn_id, DRMConnectorInfo *info) = 0; 399 400 /* 401 * Will query post propcessing feature info of a CRTC. 402 * [output]: DRMPPFeatureInfo: CRTC post processing feature info 403 */ 404 virtual void GetCrtcPPInfo(uint32_t crtc_id, DRMPPFeatureInfo &info) = 0; 405 /* 406 * Register a logical display to receive a token. 407 * Each display pipeline in DRM is identified by its CRTC and Connector(s). 408 * On display connect(bootup or hotplug), clients should invoke this interface to 409 * establish the pipeline for the display and should get a DisplayToken 410 * populated with crtc and connnector(s) id's. Here onwards, Client should 411 * use this token to represent the display for any Perform operations if 412 * needed. 413 * 414 * [input]: disp_type - Peripheral / TV / Virtual 415 * [output]: DRMDisplayToken - CRTC and Connector id's for the display 416 * [return]: 0 on success, a negative error value otherwise 417 */ 418 virtual int RegisterDisplay(DRMDisplayType disp_type, DRMDisplayToken *tok) = 0; 419 420 /* Client should invoke this interface on display disconnect. 421 * [input]: DRMDisplayToken - identifier for the display. 422 */ 423 virtual void UnregisterDisplay(const DRMDisplayToken &token) = 0; 424 425 /* 426 * Creates and returns an instance of DRMAtomicReqInterface corresponding to a display token 427 * returned as part of RegisterDisplay API. Needs to be called per display. 428 * [input]: DRMDisplayToken that identifies a display pipeline 429 * [output]: Pointer to an instance of DRMAtomicReqInterface. 430 * [return]: Error code if the API fails, 0 on success. 431 */ 432 virtual int CreateAtomicReq(const DRMDisplayToken &token, DRMAtomicReqInterface **intf) = 0; 433 434 /* 435 * Destroys the instance of DRMAtomicReqInterface 436 * [input]: Pointer to a DRMAtomicReqInterface 437 * [return]: Error code if the API fails, 0 on success. 438 */ 439 virtual int DestroyAtomicReq(DRMAtomicReqInterface *intf) = 0; 440 /* 441 * Sets the global scaler LUT 442 * [input]: LUT Info 443 * [return]: Error code if the API fails, 0 on success. 444 */ 445 virtual int SetScalerLUT(const DRMScalerLUTInfo &lut_info) = 0; 446 }; 447 448 } // namespace sde_drm 449 #endif // __DRM_INTERFACE_H__ 450