Home | History | Annotate | Download | only in libdrmutils
      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 frame buffer ID for plane. Set together with CRTC.
     96    * Arg: uint32_t - Plane ID
     97    *      uint32_t - Framebuffer ID
     98    */
     99   PLANE_SET_FB_ID,
    100   /*
    101    * Op: Sets the crtc for this plane. Set together with FB_ID.
    102    * Arg: uint32_t - Plane ID
    103    *      uint32_t - CRTC ID
    104    */
    105   PLANE_SET_CRTC,
    106   /*
    107    * Op: Sets acquire fence for this plane's buffer. Set together with FB_ID, CRTC.
    108    * Arg: uint32_t - Plane ID
    109    *      uint32_t - Input fence
    110    */
    111   PLANE_SET_INPUT_FENCE,
    112   /*
    113    * Op: Activate or deactivate a CRTC
    114    * Arg: uint32_t - CRTC ID
    115    *      uint32_t - 1 to enable, 0 to disable
    116    */
    117   CRTC_SET_ACTIVE,
    118   /*
    119    * Op: Sets display mode
    120    * Arg: uint32_t - CRTC ID
    121    *      drmModeModeInfo* - Pointer to display mode
    122    */
    123   CRTC_SET_MODE,
    124   /*
    125    * Op: Sets an offset indicating when a release fence should be signalled.
    126    * Arg: uint32_t - offset
    127    *      0: non-speculative, default
    128    *      1: speculative
    129    */
    130   CRTC_SET_OUTPUT_FENCE_OFFSET,
    131   /*
    132    * Op: Returns release fence for this frame. Should be called after Commit() on
    133    * DRMAtomicReqInterface.
    134    * Arg: uint32_t - CRTC ID
    135    *      int * - Pointer to an integer that will hold the returned fence
    136    */
    137   CRTC_GET_RELEASE_FENCE,
    138   /*
    139    * Op: Sets PP feature
    140    * Arg: uint32_t - CRTC ID
    141    *      DRMPPFeatureInfo * - PP feature data pointer
    142    */
    143   CRTC_SET_POST_PROC,
    144   /*
    145    * Op: Returns retire fence for this commit. Should be called after Commit() on
    146    * DRMAtomicReqInterface.
    147    * Arg: uint32_t - Connector ID
    148    *      int * - Pointer to an integer that will hold the returned fence
    149    */
    150   CONNECTOR_GET_RETIRE_FENCE,
    151   /*
    152    * Op: Sets writeback connector destination rect
    153    * Arg: uint32_t - Connector ID
    154    *      DRMRect - Dst Rectangle
    155    */
    156   CONNECTOR_SET_OUTPUT_RECT,
    157   /*
    158    * Op: Sets frame buffer ID for writeback connector.
    159    * Arg: uint32_t - Connector ID
    160    *      uint32_t - Framebuffer ID
    161    */
    162   CONNECTOR_SET_OUTPUT_FB_ID,
    163 };
    164 
    165 enum struct DRMBlendType {
    166   UNDEFINED = 0,
    167   OPAQUE = 1,
    168   PREMULTIPLIED = 2,
    169   COVERAGE = 3,
    170 };
    171 
    172 /* Display type to identify a suitable connector */
    173 enum struct DRMDisplayType {
    174   PERIPHERAL,
    175   TV,
    176   VIRTUAL,
    177 };
    178 
    179 struct DRMRect {
    180   uint32_t left;    // Left-most pixel coordinate.
    181   uint32_t top;     // Top-most pixel coordinate.
    182   uint32_t right;   // Right-most pixel coordinate.
    183   uint32_t bottom;  // Bottom-most pixel coordinate.
    184 };
    185 
    186 //------------------------------------------------------------------------
    187 // DRM Info Query Types
    188 //------------------------------------------------------------------------
    189 
    190 enum struct QSEEDVersion {
    191   V1,
    192   V2,
    193   V3,
    194 };
    195 
    196 /* Per CRTC Resource Info*/
    197 struct DRMCrtcInfo {
    198   bool has_src_split;
    199   uint32_t max_blend_stages;
    200   QSEEDVersion qseed_version;
    201 };
    202 
    203 enum struct DRMPlaneType {
    204   // Has CSC and scaling capability
    205   VIG = 0,
    206   // Has scaling capability but no CSC
    207   RGB,
    208   // No scaling support
    209   DMA,
    210   // Supports a small dimension and doesn't use a CRTC stage
    211   CURSOR,
    212   MAX,
    213 };
    214 
    215 struct DRMPlaneTypeInfo {
    216   // FourCC format enum and modifier
    217   std::vector<std::pair<uint32_t, uint64_t>> formats_supported;
    218   uint32_t max_linewidth;
    219   uint32_t max_upscale;
    220   uint32_t max_downscale;
    221   uint32_t max_horizontal_deci;
    222   uint32_t max_vertical_deci;
    223 };
    224 
    225 /* All DRM Planes Info*/
    226 struct DRMPlanesInfo {
    227   // Plane id and plane type sorted by highest to lowest priority
    228   std::vector<std::pair<uint32_t, DRMPlaneType>> planes;
    229   // Plane type and type info
    230   std::map<DRMPlaneType, DRMPlaneTypeInfo> types;
    231 };
    232 
    233 enum struct DRMTopology {
    234   UNKNOWN,  // To be compat with driver defs in sde_kms.h
    235   SINGLE_LM,
    236   DUAL_LM,
    237   PPSPLIT,
    238   DUAL_LM_MERGE,
    239 };
    240 
    241 enum struct DRMPanelMode {
    242   VIDEO,
    243   COMMAND,
    244 };
    245 
    246 /* Per Connector Info*/
    247 struct DRMConnectorInfo {
    248   uint32_t mmWidth;
    249   uint32_t mmHeight;
    250   uint32_t type;
    251   uint32_t num_modes;
    252   drmModeModeInfo *modes;
    253   DRMTopology topology;
    254   std::string panel_name;
    255   DRMPanelMode panel_mode;
    256   bool is_primary;
    257   // Valid only if DRMPanelMode is VIDEO
    258   bool dynamic_fps;
    259   // FourCC format enum and modifier
    260   std::vector<std::pair<uint32_t, uint64_t>> formats_supported;
    261   // Valid only if type is DRM_MODE_CONNECTOR_VIRTUAL
    262   uint32_t max_linewidth;
    263 };
    264 
    265 /* Identifier token for a display */
    266 struct DRMDisplayToken {
    267   uint32_t conn_id;
    268   uint32_t crtc_id;
    269 };
    270 
    271 enum DRMPPFeatureID {
    272   kFeaturePcc,
    273   kFeatureIgc,
    274   kFeaturePgc,
    275   kFeatureMixerGc,
    276   kFeaturePaV2,
    277   kFeatureDither,
    278   kFeatureGamut,
    279   kFeaturePADither,
    280   kPPFeaturesMax,
    281 };
    282 
    283 enum DRMPPPropType {
    284   kPropEnum,
    285   kPropRange,
    286   kPropBlob,
    287   kPropTypeMax,
    288 };
    289 
    290 struct DRMPPFeatureInfo {
    291   DRMPPFeatureID id;
    292   DRMPPPropType type;
    293   uint32_t version;
    294   uint32_t payload_size;
    295   void *payload;
    296 };
    297 
    298 /* DRM Atomic Request Property Set.
    299  *
    300  * Helper class to create and populate atomic properties of DRM components
    301  * when rendered in DRM atomic mode */
    302 class DRMAtomicReqInterface {
    303  public:
    304   virtual ~DRMAtomicReqInterface() {}
    305   /* Perform request operation.
    306    *
    307    * [input]: opcode: operation code from DRMOps list.
    308    *          var_arg: arguments for DRMOps's can differ in number and
    309    *          data type. Refer above DRMOps to details.
    310    * [return]: Error code if the API fails, 0 on success.
    311    */
    312   virtual int Perform(DRMOps opcode, ...) = 0;
    313 
    314   /*
    315    * Commit the params set via Perform(). Also resets the properties after commit. Needs to be
    316    * called every frame.
    317    * [input]: synchronous: Determines if the call should block until a h/w flip
    318    * [return]: Error code if the API fails, 0 on success.
    319    */
    320   virtual int Commit(bool synchronous) = 0;
    321   /*
    322    * Validate the params set via Perform().
    323    * [return]: Error code if the API fails, 0 on success.
    324    */
    325   virtual int Validate() = 0;
    326 };
    327 
    328 class DRMManagerInterface;
    329 
    330 /* Populates a singleton instance of DRMManager */
    331 typedef int (*GetDRMManager)(int fd, DRMManagerInterface **intf);
    332 
    333 /* Destroy DRMManager instance */
    334 typedef int (*DestroyDRMManager)();
    335 
    336 /*
    337  * DRM Manager Interface - Any class which plans to implement helper function for vendor
    338  * specific DRM driver implementation must implement the below interface routines to work
    339  * with SDM.
    340  */
    341 
    342 class DRMManagerInterface {
    343  public:
    344   virtual ~DRMManagerInterface() {}
    345 
    346   /*
    347    * Since SDM completely manages the planes. GetPlanesInfo will provide all
    348    * the plane information.
    349    * [output]: DRMPlanesInfo: Resource Info for planes.
    350    */
    351   virtual void GetPlanesInfo(DRMPlanesInfo *info) = 0;
    352 
    353   /*
    354    * Will provide all the information of a selected crtc.
    355    * [input]: Use crtc id 0 to obtain system wide info
    356    * [output]: DRMCrtcInfo: Resource Info for the given CRTC id.
    357    */
    358   virtual void GetCrtcInfo(uint32_t crtc_id, DRMCrtcInfo *info) = 0;
    359 
    360   /*
    361    * Will provide all the information of a selected connector.
    362    * [output]: DRMConnectorInfo: Resource Info for the given connector id
    363    */
    364   virtual void GetConnectorInfo(uint32_t conn_id, DRMConnectorInfo *info) = 0;
    365 
    366   /*
    367    * Will query post propcessing feature info of a CRTC.
    368    * [output]: DRMPPFeatureInfo: CRTC post processing feature info
    369    */
    370    virtual void GetCrtcPPInfo(uint32_t crtc_id, DRMPPFeatureInfo &info) = 0;
    371   /*
    372    * Register a logical display to receive a token.
    373    * Each display pipeline in DRM is identified by its CRTC and Connector(s).
    374    * On display connect(bootup or hotplug), clients should invoke this interface to
    375    * establish the pipeline for the display and should get a DisplayToken
    376    * populated with crtc and connnector(s) id's. Here onwards, Client should
    377    * use this token to represent the display for any Perform operations if
    378    * needed.
    379    *
    380    * [input]: disp_type - Peripheral / TV / Virtual
    381    * [output]: DRMDisplayToken - CRTC and Connector id's for the display
    382    * [return]: 0 on success, a negative error value otherwise
    383    */
    384   virtual int RegisterDisplay(DRMDisplayType disp_type, DRMDisplayToken *tok) = 0;
    385 
    386   /* Client should invoke this interface on display disconnect.
    387    * [input]: DRMDisplayToken - identifier for the display.
    388    */
    389   virtual void UnregisterDisplay(const DRMDisplayToken &token) = 0;
    390 
    391   /*
    392    * Creates and returns an instance of DRMAtomicReqInterface corresponding to a display token
    393    * returned as part of RegisterDisplay API. Needs to be called per display.
    394    * [input]: DRMDisplayToken that identifies a display pipeline
    395    * [output]: Pointer to an instance of DRMAtomicReqInterface.
    396    * [return]: Error code if the API fails, 0 on success.
    397    */
    398   virtual int CreateAtomicReq(const DRMDisplayToken &token, DRMAtomicReqInterface **intf) = 0;
    399 
    400   /*
    401    * Destroys the instance of DRMAtomicReqInterface
    402    * [input]: Pointer to a DRMAtomicReqInterface
    403    * [return]: Error code if the API fails, 0 on success.
    404    */
    405   virtual int DestroyAtomicReq(DRMAtomicReqInterface *intf) = 0;
    406 };
    407 }  // namespace sde_drm
    408 #endif  // __DRM_INTERFACE_H__
    409