16cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/*
26cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* Copyright (c) 2017, The Linux Foundation. All rights reserved.
36cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*
46cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* Redistribution and use in source and binary forms, with or without
56cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* modification, are permitted provided that the following conditions are
66cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* met:
76cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*   * Redistributions of source code must retain the above copyright
86cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*     notice, this list of conditions and the following disclaimer.
96cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*   * Redistributions in binary form must reproduce the above
106cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*     copyright notice, this list of conditions and the following
116cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*     disclaimer in the documentation and/or other materials provided
126cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*     with the distribution.
136cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*   * Neither the name of The Linux Foundation nor the names of its
146cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*     contributors may be used to endorse or promote products derived
156cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*     from this software without specific prior written permission.
166cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*
176cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
186cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
196cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
206cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
216cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
226cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
236cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
246cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
256cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
266cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
276cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel*/
296cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
306cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#ifndef __DRM_INTERFACE_H__
316cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#define __DRM_INTERFACE_H__
326cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
336cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include <map>
346cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include <string>
356cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include <utility>
366cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include <vector>
376cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
386cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include "xf86drm.h"
396cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#include "xf86drmMode.h"
406cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
416cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelnamespace sde_drm {
426cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/*
436cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Drm Atomic Operation Codes
446cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel */
456cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct DRMOps {
466cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
476cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets plane source crop
486cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
496cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      DRMRect  - Source Rectangle
506cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
516cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_SRC_RECT,
526cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
536cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets plane destination rect
546cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
556cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      DRMRect - Dst Rectangle
566cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
576cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_DST_RECT,
586cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
596cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets plane zorder
606cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
616cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - zorder
626cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
636cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_ZORDER,
646cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
656cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets plane rotation flags
666cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
676cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - bit mask of rotation flags (See drm_mode.h for enums)
686cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
696cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_ROTATION,
706cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
716cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets plane alpha
726cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
736cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - alpha value
746cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
756cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_ALPHA,
766cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
776cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets the blend type
786cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
796cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - blend type (see DRMBlendType)
806cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
816cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_BLEND_TYPE,
826cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
836cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets horizontal decimation
846cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
856cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - decimation factor
866cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
876cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_H_DECIMATION,
886cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
896cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets vertical decimation
906cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
916cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - decimation factor
926cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
936cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_V_DECIMATION,
946cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
956cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets frame buffer ID for plane. Set together with CRTC.
966cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
976cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - Framebuffer ID
986cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
996cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_FB_ID,
1006cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1016cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets the crtc for this plane. Set together with FB_ID.
1026cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
1036cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - CRTC ID
1046cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1056cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_CRTC,
1066cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1076cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets acquire fence for this plane's buffer. Set together with FB_ID, CRTC.
1086cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Plane ID
1096cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - Input fence
1106cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1116cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PLANE_SET_INPUT_FENCE,
1126cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1136cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Activate or deactivate a CRTC
1146cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - CRTC ID
1156cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - 1 to enable, 0 to disable
1166cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1176cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CRTC_SET_ACTIVE,
1186cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1196cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets display mode
1206cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - CRTC ID
1216cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      drmModeModeInfo* - Pointer to display mode
1226cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1236cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CRTC_SET_MODE,
1246cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1256cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets an offset indicating when a release fence should be signalled.
1266cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - offset
1276cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      0: non-speculative, default
1286cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      1: speculative
1296cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1306cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CRTC_SET_OUTPUT_FENCE_OFFSET,
1316cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1326cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Returns release fence for this frame. Should be called after Commit() on
1336cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * DRMAtomicReqInterface.
1346cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - CRTC ID
1356cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      int * - Pointer to an integer that will hold the returned fence
1366cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1376cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CRTC_GET_RELEASE_FENCE,
1386cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
139cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   * Op: Sets PP feature
140cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   * Arg: uint32_t - CRTC ID
141cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   *      DRMPPFeatureInfo * - PP feature data pointer
142cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   */
143cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  CRTC_SET_POST_PROC,
144cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  /*
1456cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Returns retire fence for this commit. Should be called after Commit() on
1466cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * DRMAtomicReqInterface.
1476cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Connector ID
1486cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      int * - Pointer to an integer that will hold the returned fence
1496cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1506cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CONNECTOR_GET_RETIRE_FENCE,
1516cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1526cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets writeback connector destination rect
1536cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Connector ID
1546cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      DRMRect - Dst Rectangle
1556cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1566cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CONNECTOR_SET_OUTPUT_RECT,
1576cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
1586cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Op: Sets frame buffer ID for writeback connector.
1596cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Arg: uint32_t - Connector ID
1606cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *      uint32_t - Framebuffer ID
1616cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
1626cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CONNECTOR_SET_OUTPUT_FB_ID,
1636cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
1646cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
1656cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct DRMBlendType {
1666cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  UNDEFINED = 0,
1676cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  OPAQUE = 1,
1686cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PREMULTIPLIED = 2,
1696cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  COVERAGE = 3,
1706cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
1716cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
1726cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* Display type to identify a suitable connector */
1736cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct DRMDisplayType {
1746cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PERIPHERAL,
1756cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  TV,
1766cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  VIRTUAL,
1776cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
1786cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
1796cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMRect {
1806cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t left;    // Left-most pixel coordinate.
1816cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t top;     // Top-most pixel coordinate.
1826cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t right;   // Right-most pixel coordinate.
1836cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t bottom;  // Bottom-most pixel coordinate.
1846cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
1856cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
1866cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel//------------------------------------------------------------------------
1876cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel// DRM Info Query Types
1886cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel//------------------------------------------------------------------------
1896cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
1906cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct QSEEDVersion {
1916cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  V1,
1926cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  V2,
1936cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  V3,
1946cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
1956cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
1966cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* Per CRTC Resource Info*/
1976cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMCrtcInfo {
1986cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  bool has_src_split;
1996cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_blend_stages;
2006cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  QSEEDVersion qseed_version;
2016cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2026cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2036cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct DRMPlaneType {
2046cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Has CSC and scaling capability
2056cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  VIG = 0,
2066cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Has scaling capability but no CSC
2076cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  RGB,
2086cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // No scaling support
2096cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  DMA,
2106cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Supports a small dimension and doesn't use a CRTC stage
2116cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  CURSOR,
2126cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  MAX,
2136cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2146cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2156cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMPlaneTypeInfo {
2166cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // FourCC format enum and modifier
2176cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  std::vector<std::pair<uint32_t, uint64_t>> formats_supported;
2186cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_linewidth;
2196cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_upscale;
2206cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_downscale;
2216cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_horizontal_deci;
2226cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_vertical_deci;
2236cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2246cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2256cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* All DRM Planes Info*/
2266cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMPlanesInfo {
2276cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Plane id and plane type sorted by highest to lowest priority
2286cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  std::vector<std::pair<uint32_t, DRMPlaneType>> planes;
2296cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Plane type and type info
2306cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  std::map<DRMPlaneType, DRMPlaneTypeInfo> types;
2316cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2326cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2336cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct DRMTopology {
2346cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  UNKNOWN,  // To be compat with driver defs in sde_kms.h
2356cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  SINGLE_LM,
2366cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  DUAL_LM,
2376cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  PPSPLIT,
2386cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  DUAL_LM_MERGE,
2396cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2406cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2416cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelenum struct DRMPanelMode {
2426cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  VIDEO,
2436cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  COMMAND,
2446cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2456cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2466cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* Per Connector Info*/
2476cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMConnectorInfo {
2486cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t mmWidth;
2496cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t mmHeight;
2506cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t type;
2516cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t num_modes;
2526cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  drmModeModeInfo *modes;
2536cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  DRMTopology topology;
2546cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  std::string panel_name;
2556cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  DRMPanelMode panel_mode;
2566cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  bool is_primary;
2576cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Valid only if DRMPanelMode is VIDEO
2586cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  bool dynamic_fps;
2596cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // FourCC format enum and modifier
2606cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  std::vector<std::pair<uint32_t, uint64_t>> formats_supported;
2616cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  // Valid only if type is DRM_MODE_CONNECTOR_VIRTUAL
2626cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t max_linewidth;
2636cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2646cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
2656cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* Identifier token for a display */
2666cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelstruct DRMDisplayToken {
2676cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t conn_id;
2686cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  uint32_t crtc_id;
2696cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
2706cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
271cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudelenum DRMPPFeatureID {
272cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeaturePcc,
273cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeatureIgc,
274cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeaturePgc,
275cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeatureMixerGc,
276cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeaturePaV2,
277cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeatureDither,
278cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeatureGamut,
279cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kFeaturePADither,
280cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kPPFeaturesMax,
281cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel};
282cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel
283cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudelenum DRMPPPropType {
284cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kPropEnum,
285cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kPropRange,
286cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kPropBlob,
287cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  kPropTypeMax,
288cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel};
289cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel
290cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudelstruct DRMPPFeatureInfo {
291cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  DRMPPFeatureID id;
292cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  DRMPPPropType type;
293cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  uint32_t version;
294cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  uint32_t payload_size;
295cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  void *payload;
296cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel};
297cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel
2986cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* DRM Atomic Request Property Set.
2996cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel *
3006cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * Helper class to create and populate atomic properties of DRM components
3016cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * when rendered in DRM atomic mode */
3026cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelclass DRMAtomicReqInterface {
3036cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel public:
3046cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual ~DRMAtomicReqInterface() {}
3056cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /* Perform request operation.
3066cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *
3076cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: opcode: operation code from DRMOps list.
3086cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *          var_arg: arguments for DRMOps's can differ in number and
3096cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *          data type. Refer above DRMOps to details.
3106cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [return]: Error code if the API fails, 0 on success.
3116cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3126cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual int Perform(DRMOps opcode, ...) = 0;
3136cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3146cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
3156cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Commit the params set via Perform(). Also resets the properties after commit. Needs to be
3166cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * called every frame.
3176cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: synchronous: Determines if the call should block until a h/w flip
3186cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [return]: Error code if the API fails, 0 on success.
3196cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3206cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual int Commit(bool synchronous) = 0;
3216cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
3226cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Validate the params set via Perform().
3236cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [return]: Error code if the API fails, 0 on success.
3246cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3256cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual int Validate() = 0;
3266cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
3276cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3286cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelclass DRMManagerInterface;
3296cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3306cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* Populates a singleton instance of DRMManager */
3316cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudeltypedef int (*GetDRMManager)(int fd, DRMManagerInterface **intf);
3326cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3336cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/* Destroy DRMManager instance */
3346cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudeltypedef int (*DestroyDRMManager)();
3356cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3366cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel/*
3376cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * DRM Manager Interface - Any class which plans to implement helper function for vendor
3386cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * specific DRM driver implementation must implement the below interface routines to work
3396cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel * with SDM.
3406cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel */
3416cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3426cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudelclass DRMManagerInterface {
3436cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel public:
3446cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual ~DRMManagerInterface() {}
3456cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3466cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
3476cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Since SDM completely manages the planes. GetPlanesInfo will provide all
3486cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * the plane information.
3496cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [output]: DRMPlanesInfo: Resource Info for planes.
3506cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3516cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual void GetPlanesInfo(DRMPlanesInfo *info) = 0;
3526cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3536cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
3546cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Will provide all the information of a selected crtc.
3556cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: Use crtc id 0 to obtain system wide info
3566cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [output]: DRMCrtcInfo: Resource Info for the given CRTC id.
3576cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3586cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual void GetCrtcInfo(uint32_t crtc_id, DRMCrtcInfo *info) = 0;
3596cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3606cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
3616cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Will provide all the information of a selected connector.
3626cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [output]: DRMConnectorInfo: Resource Info for the given connector id
3636cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3646cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual void GetConnectorInfo(uint32_t conn_id, DRMConnectorInfo *info) = 0;
3656cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3666cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
367cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   * Will query post propcessing feature info of a CRTC.
368cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   * [output]: DRMPPFeatureInfo: CRTC post processing feature info
369cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   */
370cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel   virtual void GetCrtcPPInfo(uint32_t crtc_id, DRMPPFeatureInfo &info) = 0;
371cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  /*
3726cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Register a logical display to receive a token.
3736cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Each display pipeline in DRM is identified by its CRTC and Connector(s).
3746cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * On display connect(bootup or hotplug), clients should invoke this interface to
3756cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * establish the pipeline for the display and should get a DisplayToken
3766cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * populated with crtc and connnector(s) id's. Here onwards, Client should
3776cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * use this token to represent the display for any Perform operations if
3786cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * needed.
3796cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   *
3806cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: disp_type - Peripheral / TV / Virtual
3816cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [output]: DRMDisplayToken - CRTC and Connector id's for the display
3826cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [return]: 0 on success, a negative error value otherwise
3836cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3846cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual int RegisterDisplay(DRMDisplayType disp_type, DRMDisplayToken *tok) = 0;
3856cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3866cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /* Client should invoke this interface on display disconnect.
3876cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: DRMDisplayToken - identifier for the display.
3886cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3896cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual void UnregisterDisplay(const DRMDisplayToken &token) = 0;
3906cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
3916cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
3926cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Creates and returns an instance of DRMAtomicReqInterface corresponding to a display token
3936cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * returned as part of RegisterDisplay API. Needs to be called per display.
3946cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: DRMDisplayToken that identifies a display pipeline
3956cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [output]: Pointer to an instance of DRMAtomicReqInterface.
3966cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [return]: Error code if the API fails, 0 on success.
3976cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
3986cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual int CreateAtomicReq(const DRMDisplayToken &token, DRMAtomicReqInterface **intf) = 0;
3996cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel
4006cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  /*
4016cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * Destroys the instance of DRMAtomicReqInterface
4026cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [input]: Pointer to a DRMAtomicReqInterface
4036cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   * [return]: Error code if the API fails, 0 on success.
4046cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel   */
4056cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel  virtual int DestroyAtomicReq(DRMAtomicReqInterface *intf) = 0;
4066cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel};
4076cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel}  // namespace sde_drm
4086cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel#endif  // __DRM_INTERFACE_H__
409