• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification, are permitted
5 * provided that the following conditions are met:
6 *    * Redistributions of source code must retain the above copyright notice, this list of
7 *      conditions and the following disclaimer.
8 *    * Redistributions in binary form must reproduce the above copyright notice, this list of
9 *      conditions and the following disclaimer in the documentation and/or other materials provided
10 *      with the distribution.
11 *    * Neither the name of The Linux Foundation nor the names of its contributors may be used to
12 *      endorse or promote products derived from this software without specific prior written
13 *      permission.
14 *
15 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
21 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24 
25 #ifndef __HW_INFO_TYPES_H__
26 #define __HW_INFO_TYPES_H__
27 
28 #include <stdint.h>
29 #include <core/display_interface.h>
30 #include <core/core_interface.h>
31 #include <vector>
32 #include <map>
33 #include <string>
34 #include <bitset>
35 
36 namespace sdm {
37 const int kMaxSDELayers = 16;   // Maximum number of layers that can be handled by hardware in a
38                                 // given layer stack.
39 #define MAX_PLANES 4
40 
41 #define MAX_DETAIL_ENHANCE_CURVE 3
42 
43 enum HWDeviceType {
44   kDevicePrimary,
45   kDeviceHDMI,
46   kDeviceVirtual,
47   kDeviceRotator,
48   kDeviceMax,
49 };
50 
51 enum HWBlockType {
52   kHWPrimary,
53   kHWHDMI,
54   kHWWriteback0,
55   kHWWriteback1,
56   kHWWriteback2,
57   kHWBlockMax
58 };
59 
60 enum HWDisplayMode {
61   kModeDefault,
62   kModeVideo,
63   kModeCommand,
64 };
65 
66 enum HWDisplayPort {
67   kPortDefault,
68   kPortDSI,
69   kPortDTv,
70   kPortWriteBack,
71   kPortLVDS,
72   kPortEDP,
73 };
74 
75 enum PipeType {
76   kPipeTypeUnused,
77   kPipeTypeVIG,
78   kPipeTypeRGB,
79   kPipeTypeDMA,
80   kPipeTypeCursor,
81 };
82 
83 enum HWSubBlockType {
84   kHWVIGPipe,
85   kHWRGBPipe,
86   kHWDMAPipe,
87   kHWCursorPipe,
88   kHWRotatorInput,
89   kHWRotatorOutput,
90   kHWWBIntfOutput,
91   kHWDestinationScalar,
92   kHWSubBlockMax,
93 };
94 
95 enum HWAlphaInterpolation {
96   kInterpolationPixelRepeat,
97   kInterpolationBilinear,
98   kInterpolationMax,
99 };
100 
101 enum HWBlendingFilter {
102   kBlendFilterCircular,
103   kBlendFilterSeparable,
104   kBlendFilterMax,
105 };
106 
107 enum HWPipeFlags {
108   kIGC = 0x01,
109   kMultiRect = 0x02,
110   kMultiRectParallelMode = 0x04,
111 };
112 
113 typedef std::map<HWSubBlockType, std::vector<LayerBufferFormat>> FormatsMap;
114 
115 struct HWDynBwLimitInfo {
116   uint32_t cur_mode = kBwDefault;
117   uint32_t total_bw_limit[kBwModeMax] = { 0 };
118   uint32_t pipe_bw_limit[kBwModeMax] = { 0 };
119 };
120 
121 struct HWPipeCaps {
122   PipeType type = kPipeTypeUnused;
123   uint32_t id = 0;
124   uint32_t max_rects = 1;
125 };
126 
127 struct HWRotatorInfo {
128   enum { ROT_TYPE_MDSS, ROT_TYPE_V4L2 };
129   uint32_t type = ROT_TYPE_MDSS;
130   uint32_t num_rotator = 0;
131   bool has_downscale = false;
132   std::string device_path = "";
133 
ResetHWRotatorInfo134   void Reset() { *this = HWRotatorInfo(); }
135 };
136 
137 struct HWDestScalarInfo {
138   uint32_t count = 0;
139   uint32_t max_input_width = 0;
140   uint32_t max_output_width = 0;
141   uint32_t max_scale_up = 1;
142 };
143 
144 struct HWResourceInfo {
145   uint32_t hw_version = 0;
146   uint32_t hw_revision = 0;
147   uint32_t num_dma_pipe = 0;
148   uint32_t num_vig_pipe = 0;
149   uint32_t num_rgb_pipe = 0;
150   uint32_t num_cursor_pipe = 0;
151   uint32_t num_blending_stages = 0;
152   uint32_t num_control = 0;
153   uint32_t num_mixer_to_disp = 0;
154   uint32_t smp_total = 0;
155   uint32_t smp_size = 0;
156   uint32_t num_smp_per_pipe = 0;
157   uint32_t max_scale_up = 1;
158   uint32_t max_scale_down = 1;
159   uint64_t max_bandwidth_low = 0;
160   uint64_t max_bandwidth_high = 0;
161   uint32_t max_mixer_width = 2048;
162   uint32_t max_pipe_width = 2048;
163   uint32_t max_cursor_size = 0;
164   uint32_t max_pipe_bw =  0;
165   uint32_t max_sde_clk = 0;
166   float clk_fudge_factor = 1.0f;
167   uint32_t macrotile_nv12_factor = 0;
168   uint32_t macrotile_factor = 0;
169   uint32_t linear_factor = 0;
170   uint32_t scale_factor = 0;
171   uint32_t extra_fudge_factor = 0;
172   uint32_t amortizable_threshold = 0;
173   uint32_t system_overhead_lines = 0;
174   bool has_bwc = false;
175   bool has_ubwc = false;
176   bool has_decimation = false;
177   bool has_macrotile = false;
178   bool has_non_scalar_rgb = false;
179   bool is_src_split = false;
180   bool perf_calc = false;
181   bool has_dyn_bw_support = false;
182   bool separate_rotator = false;
183   bool has_qseed3 = false;
184   bool has_concurrent_writeback = false;
185   uint32_t writeback_index = kHWBlockMax;
186   HWDynBwLimitInfo dyn_bw_info;
187   std::vector<HWPipeCaps> hw_pipes;
188   FormatsMap supported_formats_map;
189   HWRotatorInfo hw_rot_info;
190   HWDestScalarInfo hw_dest_scalar_info;
191 
ResetHWResourceInfo192   void Reset() { *this = HWResourceInfo(); }
193 };
194 
195 struct HWSplitInfo {
196   uint32_t left_split = 0;
197   uint32_t right_split = 0;
198 
199   bool operator !=(const HWSplitInfo &split_info) {
200     return ((left_split != split_info.left_split) || (right_split != split_info.right_split));
201   }
202 
203   bool operator ==(const HWSplitInfo &split_info) {
204     return !(operator !=(split_info));
205   }
206 };
207 
208 enum HWS3DMode {
209   kS3DModeNone,
210   kS3DModeLR,
211   kS3DModeRL,
212   kS3DModeTB,
213   kS3DModeFP,
214   kS3DModeMax,
215 };
216 
217 struct HWPanelInfo {
218   HWDisplayPort port = kPortDefault;  // Display port
219   HWDisplayMode mode = kModeDefault;  // Display mode
220   bool partial_update = false;        // Partial update feature
221   int left_align = 0;                 // ROI left alignment restriction
222   int width_align = 0;                // ROI width alignment restriction
223   int top_align = 0;                  // ROI top alignment restriction
224   int height_align = 0;               // ROI height alignment restriction
225   int min_roi_width = 0;              // Min width needed for ROI
226   int min_roi_height = 0;             // Min height needed for ROI
227   bool needs_roi_merge = false;       // Merge ROI's of both the DSI's
228   bool dynamic_fps = false;           // Panel Supports dynamic fps
229   uint32_t min_fps = 0;               // Min fps supported by panel
230   uint32_t max_fps = 0;               // Max fps supported by panel
231   bool is_primary_panel = false;      // Panel is primary display
232   bool is_pluggable = false;          // Panel is pluggable
233   HWSplitInfo split_info;             // Panel split configuration
234   char panel_name[256] = {0};         // Panel name
235   HWS3DMode s3d_mode = kS3DModeNone;  // Panel's current s3d mode.
236   int panel_max_brightness = 0;       // Max panel brightness
237 
238   bool operator !=(const HWPanelInfo &panel_info) {
239     return ((port != panel_info.port) || (mode != panel_info.mode) ||
240             (partial_update != panel_info.partial_update) ||
241             (left_align != panel_info.left_align) || (width_align != panel_info.width_align) ||
242             (top_align != panel_info.top_align) || (height_align != panel_info.height_align) ||
243             (min_roi_width != panel_info.min_roi_width) ||
244             (min_roi_height != panel_info.min_roi_height) ||
245             (needs_roi_merge != panel_info.needs_roi_merge) ||
246             (dynamic_fps != panel_info.dynamic_fps) || (min_fps != panel_info.min_fps) ||
247             (max_fps != panel_info.max_fps) || (is_primary_panel != panel_info.is_primary_panel) ||
248             (split_info != panel_info.split_info) ||
249             (s3d_mode != panel_info.s3d_mode));
250   }
251 
252   bool operator ==(const HWPanelInfo &panel_info) {
253     return !(operator !=(panel_info));
254   }
255 };
256 
257 struct HWSessionConfig {
258   LayerRect src_rect;
259   LayerRect dst_rect;
260   uint32_t buffer_count = 0;
261   bool secure = false;
262   uint32_t frame_rate = 0;
263   LayerTransform transform;
264 
265   bool operator==(const HWSessionConfig& config) const {
266     return (src_rect == config.src_rect &&
267             dst_rect == config.dst_rect &&
268             buffer_count == config.buffer_count &&
269             secure == config.secure &&
270             frame_rate == config.frame_rate &&
271             transform == config.transform);
272   }
273 
274   bool operator!=(const HWSessionConfig& config) const {
275     return !operator==(config);
276   }
277 };
278 
279 struct HWRotateInfo {
280   int pipe_id = -1;  // Not actual pipe id, but the relative DMA id
281   int writeback_id = -1;  // Writeback block id, but this is the same as DMA id
282   LayerRect src_roi;  // Source crop of each split
283   LayerRect dst_roi;  // Destination crop of each split
284   bool valid = false;
285   int rotate_id = -1;  // Actual rotator session id with driver
286 
ResetHWRotateInfo287   void Reset() { *this = HWRotateInfo(); }
288 };
289 
290 struct HWRotatorSession {
291   HWRotateInfo hw_rotate_info[kMaxRotatePerLayer];
292   uint32_t hw_block_count = 0;  // number of rotator hw blocks used by rotator session
293   int session_id = -1;  // A handle with Session Manager
294   HWSessionConfig hw_session_config;
295   LayerBuffer input_buffer;  // Input to rotator
296   LayerBuffer output_buffer;  // Output of rotator, crop width and stride are same
297   float input_compression = 1.0f;
298   float output_compression = 1.0f;
299   bool is_buffer_cached = false;
300 };
301 
302 struct HWScaleLutInfo {
303   uint32_t dir_lut_size = 0;
304   uint32_t cir_lut_size = 0;
305   uint32_t sep_lut_size = 0;
306   uint64_t dir_lut = 0;
307   uint64_t cir_lut = 0;
308   uint64_t sep_lut = 0;
309 };
310 
311 struct HWDetailEnhanceData : DisplayDetailEnhancerData {
312   uint16_t prec_shift = 0;
313   int16_t adjust_a[MAX_DETAIL_ENHANCE_CURVE] = {0};
314   int16_t adjust_b[MAX_DETAIL_ENHANCE_CURVE] = {0};
315   int16_t adjust_c[MAX_DETAIL_ENHANCE_CURVE] = {0};
316 };
317 
318 struct HWPixelExtension {
319   int32_t extension = 0;  // Number of pixels extension in left, right, top and bottom directions
320                           // for all color components. This pixel value for each color component
321                           // should be sum of fetch and repeat pixels.
322 
323   int32_t overfetch = 0;  // Number of pixels need to be overfetched in left, right, top and bottom
324                           // directions from source image for scaling.
325 
326   int32_t repeat = 0;     // Number of pixels need to be repeated in left, right, top and bottom
327                           // directions for scaling.
328 };
329 
330 struct HWPlane {
331   int32_t init_phase_x = 0;
332   int32_t phase_step_x = 0;
333   int32_t init_phase_y = 0;
334   int32_t phase_step_y = 0;
335   HWPixelExtension left;
336   HWPixelExtension top;
337   HWPixelExtension right;
338   HWPixelExtension bottom;
339   uint32_t roi_width = 0;
340   int32_t preload_x = 0;
341   int32_t preload_y = 0;
342   uint32_t src_width = 0;
343   uint32_t src_height = 0;
344 };
345 
346 struct HWScaleData {
347   struct enable {
348     uint8_t scale = 0;
349     uint8_t direction_detection = 0;
350     uint8_t detail_enhance = 0;
351   } enable;
352   uint32_t dst_width = 0;
353   uint32_t dst_height = 0;
354   HWPlane plane[MAX_PLANES];
355   // scale_v2_data fields
356   ScalingFilterConfig y_rgb_filter_cfg = kFilterEdgeDirected;
357   ScalingFilterConfig uv_filter_cfg = kFilterEdgeDirected;
358   HWAlphaInterpolation alpha_filter_cfg = kInterpolationPixelRepeat;
359   HWBlendingFilter blend_cfg = kBlendFilterCircular;
360 
361   struct lut_flags {
362     uint8_t lut_swap = 0;
363     uint8_t lut_dir_wr = 0;
364     uint8_t lut_y_cir_wr = 0;
365     uint8_t lut_uv_cir_wr = 0;
366     uint8_t lut_y_sep_wr = 0;
367     uint8_t lut_uv_sep_wr = 0;
368   } lut_flag;
369 
370   uint32_t dir_lut_idx = 0;
371   /* for Y(RGB) and UV planes*/
372   uint32_t y_rgb_cir_lut_idx = 0;
373   uint32_t uv_cir_lut_idx = 0;
374   uint32_t y_rgb_sep_lut_idx = 0;
375   uint32_t uv_sep_lut_idx = 0;
376 
377   HWDetailEnhanceData detail_enhance;
378 };
379 
380 struct HWDestScaleInfo {
381   uint32_t mixer_width = 0;
382   uint32_t mixer_height = 0;
383   bool scale_update = false;
384   HWScaleData scale_data = {};
385 };
386 
387 typedef std::map<uint32_t, HWDestScaleInfo *> DestScaleInfoMap;
388 
389 struct HWPipeInfo {
390   uint32_t pipe_id = 0;
391   HWSubBlockType sub_block_type = kHWSubBlockMax;
392   LayerRect src_roi;
393   LayerRect dst_roi;
394   uint8_t horizontal_decimation = 0;
395   uint8_t vertical_decimation = 0;
396   HWScaleData scale_data;
397   uint32_t z_order = 0;
398   uint8_t flags = 0;
399   bool valid = false;
400 
ResetHWPipeInfo401   void Reset() { *this = HWPipeInfo(); }
402 };
403 
404 struct HWLayerConfig {
405   HWPipeInfo left_pipe;           // pipe for left side of output
406   HWPipeInfo right_pipe;          // pipe for right side of output
407   HWRotatorSession hw_rotator_session;
408   float compression = 1.0f;
409 
ResetHWLayerConfig410   void Reset() { *this = HWLayerConfig(); }
411 };
412 
413 struct HWLayersInfo {
414   LayerStack *stack = NULL;        // Input layer stack. Set by the caller.
415 
416   uint32_t index[kMaxSDELayers];   // Indexes of the layers from the layer stack which need to be
417                                    // programmed on hardware.
418   LayerRect updated_src_rect[kMaxSDELayers];  // Updated layer src rects in s3d mode
419   LayerRect updated_dst_rect[kMaxSDELayers];  // Updated layer dst rects in s3d mode
420   bool updating[kMaxSDELayers] = {0};  // Updated by strategy, considering plane_alpha+updating
421 
422   uint32_t count = 0;              // Total number of layers which need to be set on hardware.
423 
424   int sync_handle = -1;
425 
426   LayerRect left_partial_update;   // Left ROI.
427   LayerRect right_partial_update;  // Right ROI.
428 
429   bool use_hw_cursor = false;      // Indicates that HWCursor pipe needs to be used for cursor layer
430   DestScaleInfoMap dest_scale_info_map = {};
431 };
432 
433 struct HWLayers {
434   HWLayersInfo info;
435   HWLayerConfig config[kMaxSDELayers];
436   float output_compression = 1.0f;
437   uint32_t bandwidth = 0;
438   uint32_t clock = 0;
439 };
440 
441 struct HWDisplayAttributes : DisplayConfigVariableInfo {
442   bool is_device_split = false;
443   uint32_t v_front_porch = 0;  //!< Vertical front porch of panel
444   uint32_t v_back_porch = 0;   //!< Vertical back porch of panel
445   uint32_t v_pulse_width = 0;  //!< Vertical pulse width of panel
446   uint32_t h_total = 0;        //!< Total width of panel (hActive + hFP + hBP + hPulseWidth)
447   std::bitset<32> s3d_config;  //!< Stores the bit mask of S3D modes
448 
ResetHWDisplayAttributes449   void Reset() { *this = HWDisplayAttributes(); }
450 
451   bool operator !=(const HWDisplayAttributes &display_attributes) {
452     return ((is_device_split != display_attributes.is_device_split) ||
453             (x_pixels != display_attributes.x_pixels) ||
454             (y_pixels != display_attributes.y_pixels) ||
455             (x_dpi != display_attributes.x_dpi) ||
456             (y_dpi != display_attributes.y_dpi) ||
457             (fps != display_attributes.fps) ||
458             (vsync_period_ns != display_attributes.vsync_period_ns) ||
459             (v_front_porch != display_attributes.v_front_porch) ||
460             (v_back_porch != display_attributes.v_back_porch) ||
461             (v_pulse_width != display_attributes.v_pulse_width) ||
462             (is_yuv != display_attributes.is_yuv));
463   }
464 
465   bool operator ==(const HWDisplayAttributes &display_attributes) {
466     return !(operator !=(display_attributes));
467   }
468 };
469 
470 struct HWMixerAttributes {
471   uint32_t width = 0;                                  // Layer mixer width
472   uint32_t height = 0;                                 // Layer mixer height
473   uint32_t split_left = 0;
474   LayerBufferFormat output_format = kFormatRGB101010;  // Layer mixer output format
475 
476   bool operator !=(const HWMixerAttributes &mixer_attributes) {
477     return ((width != mixer_attributes.width) ||
478             (height != mixer_attributes.height) ||
479             (output_format != mixer_attributes.output_format) ||
480             (split_left != mixer_attributes.split_left));
481   }
482 
483   bool operator ==(const HWMixerAttributes &mixer_attributes) {
484     return !(operator !=(mixer_attributes));
485   }
486 
IsValidHWMixerAttributes487   bool IsValid() {
488     return (width > 0 && height > 0);
489   }
490 };
491 
492 }  // namespace sdm
493 
494 #endif  // __HW_INFO_TYPES_H__
495 
496