• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 typedef std::map<std::pair<uint32_t, uint64_t>, float> CompRatioMap;
44 
45 /*
46  * Drm Atomic Operation Codes
47  */
48 enum struct DRMOps {
49   /*
50    * Op: Sets plane source crop
51    * Arg: uint32_t - Plane ID
52    *      DRMRect  - Source Rectangle
53    */
54   PLANE_SET_SRC_RECT,
55   /*
56    * Op: Sets plane destination rect
57    * Arg: uint32_t - Plane ID
58    *      DRMRect - Dst Rectangle
59    */
60   PLANE_SET_DST_RECT,
61   /*
62    * Op: Sets plane zorder
63    * Arg: uint32_t - Plane ID
64    *      uint32_t - zorder
65    */
66   PLANE_SET_ZORDER,
67   /*
68    * Op: Sets plane rotation flags
69    * Arg: uint32_t - Plane ID
70    *      uint32_t - bit mask of rotation flags (See drm_mode.h for enums)
71    */
72   PLANE_SET_ROTATION,
73   /*
74    * Op: Sets plane alpha
75    * Arg: uint32_t - Plane ID
76    *      uint32_t - alpha value
77    */
78   PLANE_SET_ALPHA,
79   /*
80    * Op: Sets the blend type
81    * Arg: uint32_t - Plane ID
82    *      uint32_t - blend type (see DRMBlendType)
83    */
84   PLANE_SET_BLEND_TYPE,
85   /*
86    * Op: Sets horizontal decimation
87    * Arg: uint32_t - Plane ID
88    *      uint32_t - decimation factor
89    */
90   PLANE_SET_H_DECIMATION,
91   /*
92    * Op: Sets vertical decimation
93    * Arg: uint32_t - Plane ID
94    *      uint32_t - decimation factor
95    */
96   PLANE_SET_V_DECIMATION,
97   /*
98    * Op: Sets source config flags
99    * Arg: uint32_t - Plane ID
100    *      uint32_t - flags to enable or disable a specific op. E.g. deinterlacing
101    */
102   PLANE_SET_SRC_CONFIG,
103   /*
104    * Op: Sets frame buffer ID for plane. Set together with CRTC.
105    * Arg: uint32_t - Plane ID
106    *      uint32_t - Framebuffer ID
107    */
108   PLANE_SET_FB_ID,
109   /*
110    * Op: Sets the crtc for this plane. Set together with FB_ID.
111    * Arg: uint32_t - Plane ID
112    *      uint32_t - CRTC ID
113    */
114   PLANE_SET_CRTC,
115   /*
116    * Op: Sets acquire fence for this plane's buffer. Set together with FB_ID, CRTC.
117    * Arg: uint32_t - Plane ID
118    *      uint32_t - Input fence
119    */
120   PLANE_SET_INPUT_FENCE,
121   /*
122    * Op: Sets scaler config on this plane.
123    * Arg: uint32_t - Plane ID
124    *      uint64_t - Address of the scaler config object (version based)
125    */
126   PLANE_SET_SCALER_CONFIG,
127   /*
128    * Op: Activate or deactivate a CRTC
129    * Arg: uint32_t - CRTC ID
130    *      uint32_t - 1 to enable, 0 to disable
131    */
132   CRTC_SET_ACTIVE,
133   /*
134    * Op: Sets display mode
135    * Arg: uint32_t - CRTC ID
136    *      drmModeModeInfo* - Pointer to display mode
137    */
138   CRTC_SET_MODE,
139   /*
140    * Op: Sets an offset indicating when a release fence should be signalled.
141    * Arg: uint32_t - offset
142    *      0: non-speculative, default
143    *      1: speculative
144    */
145   CRTC_SET_OUTPUT_FENCE_OFFSET,
146   /*
147    * Op: Sets overall SDE core clock
148    * Arg: uint32_t - CRTC ID
149    *      uint32_t - core_clk
150    */
151   CRTC_SET_CORE_CLK,
152    /*
153    * Op: Sets overall SDE core average bandwidth
154    * Arg: uint32_t - CRTC ID
155    *      uint32_t - core_ab
156    */
157   CRTC_SET_CORE_AB,
158    /*
159    * Op: Sets overall SDE core instantaneous bandwidth
160    * Arg: uint32_t - CRTC ID
161    *      uint32_t - core_ib
162    */
163   CRTC_SET_CORE_IB,
164   /*
165    * Op: Returns release fence for this frame. Should be called after Commit() on
166    * DRMAtomicReqInterface.
167    * Arg: uint32_t - CRTC ID
168    *      int * - Pointer to an integer that will hold the returned fence
169    */
170   CRTC_GET_RELEASE_FENCE,
171   /*
172    * Op: Sets PP feature
173    * Arg: uint32_t - CRTC ID
174    *      DRMPPFeatureInfo * - PP feature data pointer
175    */
176   CRTC_SET_POST_PROC,
177   /*
178    * Op: Sets CRTC ROIs.
179    * Arg: uint32_t - CRTC ID
180    *      uint32_t - number of ROIs
181    *      DRMRect * - Array of CRTC ROIs
182    */
183   CRTC_SET_ROI,
184   /*
185    * Op: Returns retire fence for this commit. Should be called after Commit() on
186    * DRMAtomicReqInterface.
187    * Arg: uint32_t - Connector ID
188    *      int * - Pointer to an integer that will hold the returned fence
189    */
190   CONNECTOR_GET_RETIRE_FENCE,
191   /*
192    * Op: Sets writeback connector destination rect
193    * Arg: uint32_t - Connector ID
194    *      DRMRect - Dst Rectangle
195    */
196   CONNECTOR_SET_OUTPUT_RECT,
197   /*
198    * Op: Sets frame buffer ID for writeback connector.
199    * Arg: uint32_t - Connector ID
200    *      uint32_t - Framebuffer ID
201    */
202   CONNECTOR_SET_OUTPUT_FB_ID,
203   /*
204    * Op: Sets power mode for connector.
205    * Arg: uint32_t - Connector ID
206    *      uint32_t - Power Mode
207    */
208   CONNECTOR_SET_POWER_MODE,
209   /*
210    * Op: Sets panel ROIs.
211    * Arg: uint32_t - Connector ID
212    *      uint32_t - number of ROIs
213    *      DRMRect * - Array of Connector ROIs
214    */
215   CONNECTOR_SET_ROI,
216 };
217 
218 enum struct DRMRotation {
219   FLIP_H = 0x1,
220   FLIP_V = 0x2,
221   ROT_180 = FLIP_H | FLIP_V,
222   ROT_90 = 0x4,
223 };
224 
225 enum struct DRMPowerMode {
226   ON,
227   DOZE,
228   DOZE_SUSPEND,
229   OFF,
230 };
231 
232 enum struct DRMBlendType {
233   UNDEFINED = 0,
234   OPAQUE = 1,
235   PREMULTIPLIED = 2,
236   COVERAGE = 3,
237 };
238 
239 enum struct DRMSrcConfig {
240   DEINTERLACE = 0,
241 };
242 
243 /* Display type to identify a suitable connector */
244 enum struct DRMDisplayType {
245   PERIPHERAL,
246   TV,
247   VIRTUAL,
248 };
249 
250 struct DRMRect {
251   uint32_t left;    // Left-most pixel coordinate.
252   uint32_t top;     // Top-most pixel coordinate.
253   uint32_t right;   // Right-most pixel coordinate.
254   uint32_t bottom;  // Bottom-most pixel coordinate.
255 };
256 
257 //------------------------------------------------------------------------
258 // DRM Info Query Types
259 //------------------------------------------------------------------------
260 
261 enum struct QSEEDVersion {
262   V1,
263   V2,
264   V3,
265 };
266 
267 enum struct SmartDMARevision {
268   V1,
269   V2,
270 };
271 
272 /* Per CRTC Resource Info*/
273 struct DRMCrtcInfo {
274   bool has_src_split;
275   uint32_t max_blend_stages;
276   QSEEDVersion qseed_version;
277   SmartDMARevision smart_dma_rev;
278   float ib_fudge_factor;
279   float clk_fudge_factor;
280   uint32_t dest_scale_prefill_lines;
281   uint32_t undersized_prefill_lines;
282   uint32_t macrotile_prefill_lines;
283   uint32_t nv12_prefill_lines;
284   uint32_t linear_prefill_lines;
285   uint32_t downscale_prefill_lines;
286   uint32_t extra_prefill_lines;
287   uint32_t amortized_threshold;
288   uint64_t max_bandwidth_low;
289   uint64_t max_bandwidth_high;
290   uint32_t max_sde_clk;
291   CompRatioMap comp_ratio_rt_map;
292   CompRatioMap comp_ratio_nrt_map;
293 };
294 
295 enum struct DRMPlaneType {
296   // Has CSC and scaling capability
297   VIG = 0,
298   // Has scaling capability but no CSC
299   RGB,
300   // No scaling support
301   DMA,
302   // Supports a small dimension and doesn't use a CRTC stage
303   CURSOR,
304   MAX,
305 };
306 
307 struct DRMPlaneTypeInfo {
308   DRMPlaneType type;
309   uint32_t master_plane_id;
310   // FourCC format enum and modifier
311   std::vector<std::pair<uint32_t, uint64_t>> formats_supported;
312   uint32_t max_linewidth;
313   uint32_t max_upscale;
314   uint32_t max_downscale;
315   uint32_t max_horizontal_deci;
316   uint32_t max_vertical_deci;
317   uint64_t max_pipe_bandwidth;
318 };
319 
320 // All DRM Planes as map<Plane_id , plane_type_info> listed from highest to lowest priority
321 typedef std::vector<std::pair<uint32_t, DRMPlaneTypeInfo>>  DRMPlanesInfo;
322 
323 enum struct DRMTopology {
324   UNKNOWN,  // To be compat with driver defs in sde_kms.h
325   SINGLE_LM,
326   DUAL_LM,
327   PPSPLIT,
328   DUAL_LM_MERGE,
329 };
330 
331 enum struct DRMPanelMode {
332   VIDEO,
333   COMMAND,
334 };
335 
336 /* Per Connector Info*/
337 struct DRMConnectorInfo {
338   uint32_t mmWidth;
339   uint32_t mmHeight;
340   uint32_t type;
341   uint32_t num_modes;
342   drmModeModeInfo *modes;
343   DRMTopology topology;
344   std::string panel_name;
345   DRMPanelMode panel_mode;
346   bool is_primary;
347   // Valid only if DRMPanelMode is VIDEO
348   bool dynamic_fps;
349   // FourCC format enum and modifier
350   std::vector<std::pair<uint32_t, uint64_t>> formats_supported;
351   // Valid only if type is DRM_MODE_CONNECTOR_VIRTUAL
352   uint32_t max_linewidth;
353   // Valid only if mode is command
354   int num_roi;
355   int xstart;
356   int ystart;
357   int walign;
358   int halign;
359   int wmin;
360   int hmin;
361   bool roi_merge;
362   DRMRotation panel_orientation;
363 };
364 
365 /* Identifier token for a display */
366 struct DRMDisplayToken {
367   uint32_t conn_id;
368   uint32_t crtc_id;
369 };
370 
371 enum DRMPPFeatureID {
372   kFeaturePcc,
373   kFeatureIgc,
374   kFeaturePgc,
375   kFeatureMixerGc,
376   kFeaturePaV2,
377   kFeatureDither,
378   kFeatureGamut,
379   kFeaturePADither,
380   kPPFeaturesMax,
381 };
382 
383 enum DRMPPPropType {
384   kPropEnum,
385   kPropRange,
386   kPropBlob,
387   kPropTypeMax,
388 };
389 
390 struct DRMPPFeatureInfo {
391   DRMPPFeatureID id;
392   DRMPPPropType type;
393   uint32_t version;
394   uint32_t payload_size;
395   void *payload;
396 };
397 
398 struct DRMScalerLUTInfo {
399   uint32_t dir_lut_size = 0;
400   uint32_t cir_lut_size = 0;
401   uint32_t sep_lut_size = 0;
402   uint64_t dir_lut = 0;
403   uint64_t cir_lut = 0;
404   uint64_t sep_lut = 0;
405 };
406 
407 /* DRM Atomic Request Property Set.
408  *
409  * Helper class to create and populate atomic properties of DRM components
410  * when rendered in DRM atomic mode */
411 class DRMAtomicReqInterface {
412  public:
~DRMAtomicReqInterface()413   virtual ~DRMAtomicReqInterface() {}
414   /* Perform request operation.
415    *
416    * [input]: opcode: operation code from DRMOps list.
417    *          var_arg: arguments for DRMOps's can differ in number and
418    *          data type. Refer above DRMOps to details.
419    * [return]: Error code if the API fails, 0 on success.
420    */
421   virtual int Perform(DRMOps opcode, ...) = 0;
422 
423   /*
424    * Commit the params set via Perform(). Also resets the properties after commit. Needs to be
425    * called every frame.
426    * [input]: synchronous: Determines if the call should block until a h/w flip
427    * [return]: Error code if the API fails, 0 on success.
428    */
429   virtual int Commit(bool synchronous) = 0;
430   /*
431    * Validate the params set via Perform().
432    * [return]: Error code if the API fails, 0 on success.
433    */
434   virtual int Validate() = 0;
435 };
436 
437 class DRMManagerInterface;
438 
439 /* Populates a singleton instance of DRMManager */
440 typedef int (*GetDRMManager)(int fd, DRMManagerInterface **intf);
441 
442 /* Destroy DRMManager instance */
443 typedef int (*DestroyDRMManager)();
444 
445 /*
446  * DRM Manager Interface - Any class which plans to implement helper function for vendor
447  * specific DRM driver implementation must implement the below interface routines to work
448  * with SDM.
449  */
450 
451 class DRMManagerInterface {
452  public:
~DRMManagerInterface()453   virtual ~DRMManagerInterface() {}
454 
455   /*
456    * Since SDM completely manages the planes. GetPlanesInfo will provide all
457    * the plane information.
458    * [output]: DRMPlanesInfo: Resource Info for planes.
459    */
460   virtual void GetPlanesInfo(DRMPlanesInfo *info) = 0;
461 
462   /*
463    * Will provide all the information of a selected crtc.
464    * [input]: Use crtc id 0 to obtain system wide info
465    * [output]: DRMCrtcInfo: Resource Info for the given CRTC id.
466    */
467   virtual void GetCrtcInfo(uint32_t crtc_id, DRMCrtcInfo *info) = 0;
468 
469   /*
470    * Will provide all the information of a selected connector.
471    * [output]: DRMConnectorInfo: Resource Info for the given connector id
472    */
473   virtual void GetConnectorInfo(uint32_t conn_id, DRMConnectorInfo *info) = 0;
474 
475   /*
476    * Will query post propcessing feature info of a CRTC.
477    * [output]: DRMPPFeatureInfo: CRTC post processing feature info
478    */
479   virtual void GetCrtcPPInfo(uint32_t crtc_id, DRMPPFeatureInfo &info) = 0;
480   /*
481    * Register a logical display to receive a token.
482    * Each display pipeline in DRM is identified by its CRTC and Connector(s).
483    * On display connect(bootup or hotplug), clients should invoke this interface to
484    * establish the pipeline for the display and should get a DisplayToken
485    * populated with crtc and connnector(s) id's. Here onwards, Client should
486    * use this token to represent the display for any Perform operations if
487    * needed.
488    *
489    * [input]: disp_type - Peripheral / TV / Virtual
490    * [output]: DRMDisplayToken - CRTC and Connector id's for the display
491    * [return]: 0 on success, a negative error value otherwise
492    */
493   virtual int RegisterDisplay(DRMDisplayType disp_type, DRMDisplayToken *tok) = 0;
494 
495   /* Client should invoke this interface on display disconnect.
496    * [input]: DRMDisplayToken - identifier for the display.
497    */
498   virtual void UnregisterDisplay(const DRMDisplayToken &token) = 0;
499 
500   /*
501    * Creates and returns an instance of DRMAtomicReqInterface corresponding to a display token
502    * returned as part of RegisterDisplay API. Needs to be called per display.
503    * [input]: DRMDisplayToken that identifies a display pipeline
504    * [output]: Pointer to an instance of DRMAtomicReqInterface.
505    * [return]: Error code if the API fails, 0 on success.
506    */
507   virtual int CreateAtomicReq(const DRMDisplayToken &token, DRMAtomicReqInterface **intf) = 0;
508 
509   /*
510    * Destroys the instance of DRMAtomicReqInterface
511    * [input]: Pointer to a DRMAtomicReqInterface
512    * [return]: Error code if the API fails, 0 on success.
513    */
514   virtual int DestroyAtomicReq(DRMAtomicReqInterface *intf) = 0;
515   /*
516    * Sets the global scaler LUT
517    * [input]: LUT Info
518    * [return]: Error code if the API fails, 0 on success.
519    */
520   virtual int SetScalerLUT(const DRMScalerLUTInfo &lut_info) = 0;
521 };
522 
523 }  // namespace sde_drm
524 #endif  // __DRM_INTERFACE_H__
525