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