1d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema/*
2d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* Copyright (c) 2017, The Linux Foundation. All rights reserved.
3d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*
4d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* Redistribution and use in source and binary forms, with or without
5d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* modification, are permitted provided that the following conditions are
6d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* met:
7d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*     * Redistributions of source code must retain the above copyright
8d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*       notice, this list of conditions and the following disclaimer.
9d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*     * Redistributions in binary form must reproduce the above
10d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*       copyright notice, this list of conditions and the following
11d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*       disclaimer in the documentation and/or other materials provided
12d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*       with the distribution.
13d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*     * Neither the name of The Linux Foundation nor the names of its
14d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*       contributors may be used to endorse or promote products derived
15d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*       from this software without specific prior written permission.
16d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*
17d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema*/
29d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
30d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <dlfcn.h>
31d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <drm/drm_fourcc.h>
32d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <drm_lib_loader.h>
33d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <drm_master.h>
34d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <drm_res_mgr.h>
35d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <fcntl.h>
36d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <media/msm_sde_rotator.h>
37d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <stdio.h>
38d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <stdlib.h>
39d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <string.h>
40d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <sys/stat.h>
41d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <sys/types.h>
42d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <utils/constants.h>
43d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <utils/debug.h>
44d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <utils/sys.h>
45d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
46d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <algorithm>
47d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <fstream>
48d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <iostream>
49d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <map>
50d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <memory>
51d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <string>
52d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <utility>
53d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include <vector>
54d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
55d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#include "hw_info_drm.h"
56d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
57d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#ifndef DRM_FORMAT_MOD_QCOM_COMPRESSED
58d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#define DRM_FORMAT_MOD_QCOM_COMPRESSED fourcc_mod_code(QCOM, 1)
59d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#endif
60d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#ifndef DRM_FORMAT_MOD_QCOM_DX
61d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#define DRM_FORMAT_MOD_QCOM_DX fourcc_mod_code(QCOM, 0x2)
62d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#endif
63d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#ifndef DRM_FORMAT_MOD_QCOM_TIGHT
64d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#define DRM_FORMAT_MOD_QCOM_TIGHT fourcc_mod_code(QCOM, 0x4)
65d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#endif
66d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
67d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#define __CLASS__ "HWInfoDRM"
68d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
69d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing drm_utils::DRMMaster;
70d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing drm_utils::DRMResMgr;
71d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing drm_utils::DRMLogger;
72d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing drm_utils::DRMLibLoader;
73d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing sde_drm::GetDRMManager;
74d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing sde_drm::DRMPlanesInfo;
75d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing sde_drm::DRMCrtcInfo;
76d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing sde_drm::DRMPlaneType;
77d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
78d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing std::vector;
79d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing std::map;
80d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing std::string;
81d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing std::fstream;
82d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemausing std::to_string;
83d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
84d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemanamespace sdm {
85d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
86d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemaclass DRMLoggerImpl : public DRMLogger {
87d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema public:
88d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema#define PRINTLOG(tag, method, format, buf)        \
89d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  va_list list;                              \
90d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  va_start(list, format);                    \
91d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  vsnprintf(buf, sizeof(buf), format, list); \
92d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  va_end(list);                              \
93d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  Debug::Get()->method(tag, "%s", buf);
94d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
95d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void Error(const char *format, ...) { PRINTLOG(kTagNone, Error, format, buf_); }
96d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void Warning(const char *format, ...) { PRINTLOG(kTagDriverConfig, Warning, format, buf_); }
97d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void Info(const char *format, ...) { PRINTLOG(kTagDriverConfig, Info, format, buf_); }
98d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void Debug(const char *format, ...) { PRINTLOG(kTagDriverConfig, Debug, format, buf_); }
99d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  void Verbose(const char *format, ...) { PRINTLOG(kTagDriverConfig, Verbose, format, buf_); }
100d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
101d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema private:
102d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  char buf_[1024] = {};
103d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema};
104d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
105d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaHWResourceInfo *HWInfoDRM::hw_resource_ = nullptr;
106d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
107d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaHWInfoDRM::HWInfoDRM() {
108d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DRMLogger::Set(new DRMLoggerImpl());
109d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_lib = DRMLibLoader::GetInstance();
110d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (drm_lib == nullptr) {
111d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DLOGE("Failed to load DRM Library");
112d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    return;
113d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
114d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  default_mode_ = (drm_lib->IsLoaded() == false);
115d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (!default_mode_) {
116d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DRMMaster *drm_master = {};
117d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    int dev_fd = -1;
118d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DRMMaster::GetInstance(&drm_master);
119d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    if (!drm_master) {
120d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      DLOGE("Failed to acquire DRMMaster instance");
121d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      return;
122d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
123d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    drm_master->GetHandle(&dev_fd);
124d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    drm_lib->FuncGetDRMManager()(dev_fd, &drm_mgr_intf_);
125d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
126d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
127d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
128d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaHWInfoDRM::~HWInfoDRM() {
129d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (hw_resource_ != nullptr) {
130d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    delete hw_resource_;
131d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    hw_resource_ = nullptr;
132d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
133d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
134d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (drm_mgr_intf_) {
135d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    if (drm_lib != nullptr) {
136d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      drm_lib->FuncDestroyDRMManager()();
137d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
138d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    drm_mgr_intf_ = nullptr;
139d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
140d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
141d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_lib->Destroy();
142d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_lib = nullptr;
143d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DRMMaster::DestroyInstance();
144d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
145d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
146d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaDisplayError HWInfoDRM::GetDynamicBWLimits(HWResourceInfo *hw_resource) {
147d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  HWDynBwLimitInfo* bw_info = &hw_resource->dyn_bw_info;
148d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  for (int index = 0; index < kBwModeMax; index++) {
149d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    bw_info->total_bw_limit[index] = UINT32(hw_resource->max_bandwidth_low);
150d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    bw_info->pipe_bw_limit[index] = hw_resource->max_pipe_bw;
151d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
152d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
153d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  return kErrorNone;
154d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
155d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
156d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaDisplayError HWInfoDRM::GetHWResourceInfo(HWResourceInfo *hw_resource) {
157d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (hw_resource_) {
158d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    *hw_resource = *hw_resource_;
159d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    return kErrorNone;
160d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
161d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
162d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->num_blending_stages = 1;
163d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_pipe_width = 2560;
164d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_cursor_size = 128;
165d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_scale_down = 1;
166d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_scale_up = 1;
167d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_decimation = false;
168d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_bandwidth_low = 9600000;
169d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_bandwidth_high = 9600000;
170d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_pipe_bw = 4500000;
171d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_sde_clk = 412500000;
172d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->clk_fudge_factor = FLOAT(105) / FLOAT(100);
173d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->macrotile_nv12_factor = 8;
174d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->macrotile_factor = 4;
175d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->linear_factor = 1;
176d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->scale_factor = 1;
177d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->extra_fudge_factor = 2;
178d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->amortizable_threshold = 0;
179d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->system_overhead_lines = 0;
180d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->hw_dest_scalar_info.count = 0;
181d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->hw_dest_scalar_info.max_scale_up = 0;
182d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->hw_dest_scalar_info.max_input_width = 0;
183d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->hw_dest_scalar_info.max_output_width = 0;
184d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->is_src_split = true;
185d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->perf_calc = false;
186d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_dyn_bw_support = false;
187d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_qseed3 = false;
188d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_concurrent_writeback = false;
189d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
190d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  // TODO(user): Deprecate
191d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->hw_version = kHWMdssVersion5;
192d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->hw_revision = 0;
193d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_mixer_width = 0;
194d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->writeback_index = 0;
195d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_bwc = false;
196d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_ubwc = true;
197d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_macrotile = true;
198d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->separate_rotator = true;
199d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_non_scalar_rgb = false;
200d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
201d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  GetSystemInfo(hw_resource);
202d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  GetHWPlanesInfo(hw_resource);
203d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  GetWBInfo(hw_resource);
204d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
205d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  // Disable destination scalar count to 0 if extension library is not present
206d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DynLib extension_lib;
207d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (!extension_lib.Open("libsdmextension.so")) {
208d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    hw_resource->hw_dest_scalar_info.count = 0;
209d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
210d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
211d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max plane width = %d", hw_resource->max_pipe_width);
212d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max cursor width = %d", hw_resource->max_cursor_size);
213d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max plane upscale = %d", hw_resource->max_scale_up);
214d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max plane downscale = %d", hw_resource->max_scale_down);
215d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Has Decimation = %d", hw_resource->has_decimation);
216d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max Blending Stages = %d", hw_resource->num_blending_stages);
217d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Has Source Split = %d", hw_resource->is_src_split);
218d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Has QSEED3 = %d", hw_resource->has_qseed3);
219d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Has UBWC = %d", hw_resource->has_ubwc);
220d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Has Concurrent Writeback = %d", hw_resource->has_concurrent_writeback);
221d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max Low Bw = %" PRIu64 "", hw_resource->max_bandwidth_low);
222d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max High Bw = % " PRIu64 "", hw_resource->max_bandwidth_high);
223d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Max Pipe Bw = %" PRIu64 " KBps", hw_resource->max_pipe_bw);
224d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("MaxSDEClock = % " PRIu64 " Hz", hw_resource->max_sde_clk);
225d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Clock Fudge Factor = %f", hw_resource->clk_fudge_factor);
226d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("Prefill factors:");
227d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("\tTiled_NV12 = %d", hw_resource->macrotile_nv12_factor);
228d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("\tTiled = %d", hw_resource->macrotile_factor);
229d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("\tLinear = %d", hw_resource->linear_factor);
230d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("\tScale = %d", hw_resource->scale_factor);
231d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("\tFudge_factor = %d", hw_resource->extra_fudge_factor);
232d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
233d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (hw_resource->separate_rotator || hw_resource->num_dma_pipe) {
234d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    GetHWRotatorInfo(hw_resource);
235d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
236d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
237d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (hw_resource->has_dyn_bw_support) {
238d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DisplayError ret = GetDynamicBWLimits(hw_resource);
239d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    if (ret != kErrorNone) {
240d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      DLOGE("Failed to read dynamic band width info");
241d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      return ret;
242d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
243d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
244d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DLOGI("Has Support for multiple bw limits shown below");
245d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    for (int index = 0; index < kBwModeMax; index++) {
246d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      DLOGI("Mode-index=%d  total_bw_limit=%d and pipe_bw_limit=%d", index,
247d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema            hw_resource->dyn_bw_info.total_bw_limit[index],
248d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema            hw_resource->dyn_bw_info.pipe_bw_limit[index]);
249d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
250d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
251d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
252d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (!hw_resource_) {
253d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    hw_resource_ = new HWResourceInfo();
254d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    *hw_resource_ = *hw_resource;
255d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
256d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
257d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  return kErrorNone;
258d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
259d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
260d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::GetSystemInfo(HWResourceInfo *hw_resource) {
261d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DRMCrtcInfo info;
262d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_mgr_intf_->GetCrtcInfo(0 /* system_info */, &info);
263d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->is_src_split = info.has_src_split;
264d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_qseed3 = (info.qseed_version == sde_drm::QSEEDVersion::V3);
265d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->num_blending_stages = info.max_blend_stages;
266d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->smart_dma_rev = (info.smart_dma_rev == sde_drm::SmartDMARevision::V2) ?
267d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    SmartDMARevision::V2 : SmartDMARevision::V1;
268d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
269d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
270d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::GetHWPlanesInfo(HWResourceInfo *hw_resource) {
271d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DRMPlanesInfo planes;
272d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_mgr_intf_->GetPlanesInfo(&planes);
273d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  for (auto &pipe_obj : planes) {
274d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    HWPipeCaps pipe_caps;
275d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    string name = {};
276d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    switch (pipe_obj.second.type) {
277d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      case DRMPlaneType::DMA:
278d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        name = "DMA";
279d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        pipe_caps.type = kPipeTypeDMA;
280d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        if (!hw_resource->num_dma_pipe) {
281d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          PopulateSupportedFmts(kHWDMAPipe, pipe_obj.second, hw_resource);
282d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        }
283d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        hw_resource->num_dma_pipe++;
284d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        break;
285d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      case DRMPlaneType::VIG:
286d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        name = "VIG";
287d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        pipe_caps.type = kPipeTypeVIG;
288d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        if (!hw_resource->num_vig_pipe) {
289d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          PopulatePipeCaps(pipe_obj.second, hw_resource);
290d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          PopulateSupportedFmts(kHWVIGPipe, pipe_obj.second, hw_resource);
291d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        }
292d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        hw_resource->num_vig_pipe++;
293d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        break;
294d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      case DRMPlaneType::CURSOR:
295d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        name = "CURSOR";
296d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        pipe_caps.type = kPipeTypeCursor;
297d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        if (!hw_resource->num_cursor_pipe) {
298d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          PopulateSupportedFmts(kHWCursorPipe, pipe_obj.second, hw_resource);
299d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          hw_resource->max_cursor_size = pipe_obj.second.max_linewidth;
300d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        }
301d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        hw_resource->num_cursor_pipe++;
302d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        break;
303d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      default:
304d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        continue;  // Not adding any other pipe type
305d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
306d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    pipe_caps.id = pipe_obj.first;
307d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    pipe_caps.master_pipe_id = pipe_obj.second.master_plane_id;
308d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DLOGI("Adding %s Pipe : Id %d", name.c_str(), pipe_obj.first);
309d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    hw_resource->hw_pipes.push_back(std::move(pipe_caps));
310d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
311d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
312d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
313d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::PopulatePipeCaps(const sde_drm::DRMPlaneTypeInfo &info,
314d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                    HWResourceInfo *hw_resource) {
315d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_pipe_width = info.max_linewidth;
316d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_scale_down = info.max_downscale;
317d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->max_scale_up = info.max_upscale;
318d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->has_decimation = info.max_horizontal_deci > 1 && info.max_vertical_deci > 1;
319d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
320d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
321d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::PopulateSupportedFmts(HWSubBlockType sub_blk_type,
322d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                      const sde_drm::DRMPlaneTypeInfo  &info,
323d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                      HWResourceInfo *hw_resource) {
324d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  vector<LayerBufferFormat> sdm_formats;
325d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  FormatsMap &fmts_map = hw_resource->supported_formats_map;
326d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
327d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (fmts_map.find(sub_blk_type) == fmts_map.end()) {
328d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    for (auto &fmts : info.formats_supported) {
329d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      GetSDMFormat(fmts.first, fmts.second, &sdm_formats);
330d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
331d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
332d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    fmts_map.insert(make_pair(sub_blk_type, sdm_formats));
333d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
334d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
335d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
336d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::GetWBInfo(HWResourceInfo *hw_resource) {
337d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  HWSubBlockType sub_blk_type = kHWWBIntfOutput;
338d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  vector<LayerBufferFormat> supported_sdm_formats;
339d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  sde_drm::DRMDisplayToken token;
340d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
341d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  // Fake register
342d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (drm_mgr_intf_->RegisterDisplay(sde_drm::DRMDisplayType::VIRTUAL, &token)) {
343d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    return;
344d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
345d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
346d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  sde_drm::DRMConnectorInfo connector_info;
347d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_mgr_intf_->GetConnectorInfo(token.conn_id, &connector_info);
348d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  for (auto &fmts : connector_info.formats_supported) {
349d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    GetSDMFormat(fmts.first, fmts.second, &supported_sdm_formats);
350d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
351d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
352d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->supported_formats_map.erase(sub_blk_type);
353d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->supported_formats_map.insert(make_pair(sub_blk_type, supported_sdm_formats));
354d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
355d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  drm_mgr_intf_->UnregisterDisplay(token);
356d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
357d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
358d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::GetSDMFormat(uint32_t v4l2_format, LayerBufferFormat *sdm_format) {
359d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  switch (v4l2_format) {
360d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_ARGB_8888:         *sdm_format = kFormatARGB8888;                 break;
361d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBA_8888:         *sdm_format = kFormatRGBA8888;                 break;
362d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_BGRA_8888:         *sdm_format = kFormatBGRA8888;                 break;
363d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBX_8888:         *sdm_format = kFormatRGBX8888;                 break;
364d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_BGRX_8888:         *sdm_format = kFormatBGRX8888;                 break;
365d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBA_5551:         *sdm_format = kFormatRGBA5551;                 break;
366d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBA_4444:         *sdm_format = kFormatRGBA4444;                 break;
367d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGB_888:           *sdm_format = kFormatRGB888;                   break;
368d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_BGR_888:           *sdm_format = kFormatBGR888;                   break;
369d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGB_565:           *sdm_format = kFormatRGB565;                   break;
370d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_BGR_565:           *sdm_format = kFormatBGR565;                   break;
371d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CB_CR_H2V2:      *sdm_format = kFormatYCbCr420Planar;           break;
372d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CR_CB_H2V2:      *sdm_format = kFormatYCrCb420Planar;           break;
373d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CR_CB_GH2V2:     *sdm_format = kFormatYCrCb420PlanarStride16;   break;
374d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H2V2:       *sdm_format = kFormatYCbCr420SemiPlanar;       break;
375d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CRCB_H2V2:       *sdm_format = kFormatYCrCb420SemiPlanar;       break;
376d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H1V2:       *sdm_format = kFormatYCbCr422H1V2SemiPlanar;   break;
377d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CRCB_H1V2:       *sdm_format = kFormatYCrCb422H1V2SemiPlanar;   break;
378d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H2V1:       *sdm_format = kFormatYCbCr422H2V1SemiPlanar;   break;
379d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CRCB_H2V1:       *sdm_format = kFormatYCrCb422H2V1SemiPlanar;   break;
380d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_YCBYCR_H2V1:       *sdm_format = kFormatYCbCr422H2V1Packed;       break;
381d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H2V2_VENUS: *sdm_format = kFormatYCbCr420SemiPlanarVenus;  break;
382d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CRCB_H2V2_VENUS: *sdm_format = kFormatYCrCb420SemiPlanarVenus;  break;
383d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBA_8888_UBWC:    *sdm_format = kFormatRGBA8888Ubwc;             break;
384d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBX_8888_UBWC:    *sdm_format = kFormatRGBX8888Ubwc;             break;
385d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGB_565_UBWC:      *sdm_format = kFormatBGR565Ubwc;               break;
386d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H2V2_UBWC:  *sdm_format = kFormatYCbCr420SPVenusUbwc;      break;
387d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBA_1010102:      *sdm_format = kFormatRGBA1010102;              break;
388d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_ARGB_2101010:      *sdm_format = kFormatARGB2101010;              break;
389d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBX_1010102:      *sdm_format = kFormatRGBX1010102;              break;
390d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_XRGB_2101010:      *sdm_format = kFormatXRGB2101010;              break;
391d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_BGRA_1010102:      *sdm_format = kFormatBGRA1010102;              break;
392d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_ABGR_2101010:      *sdm_format = kFormatABGR2101010;              break;
393d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_BGRX_1010102:      *sdm_format = kFormatBGRX1010102;              break;
394d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_XBGR_2101010:      *sdm_format = kFormatXBGR2101010;              break;
395d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBA_1010102_UBWC: *sdm_format = kFormatRGBA1010102Ubwc;          break;
396d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_RGBX_1010102_UBWC: *sdm_format = kFormatRGBX1010102Ubwc;          break;
397d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H2V2_P010:  *sdm_format = kFormatYCbCr420P010;             break;
398d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case SDE_PIX_FMT_Y_CBCR_H2V2_TP10_UBWC: *sdm_format = kFormatYCbCr420TP10Ubwc;     break;
399d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    /* TODO(user) : enable when defined in uapi
400d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      case SDE_PIX_FMT_Y_CBCR_H2V2_P010_UBWC: *sdm_format = kFormatYCbCr420P010Ubwc;     break; */
401d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    default: *sdm_format = kFormatInvalid;
402d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
403d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
404d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
405d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::GetRotatorFormatsForType(int fd, uint32_t type,
406d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                         vector<LayerBufferFormat> *supported_formats) {
407d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  struct v4l2_fmtdesc fmtdesc = {};
408d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  fmtdesc.type = type;
409d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  while (!Sys::ioctl_(fd, static_cast<int>(VIDIOC_ENUM_FMT), &fmtdesc)) {
410d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    LayerBufferFormat sdm_format = kFormatInvalid;
411d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    GetSDMFormat(fmtdesc.pixelformat, &sdm_format);
412d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    if (sdm_format != kFormatInvalid) {
413d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      supported_formats->push_back(sdm_format);
414d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
415d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    fmtdesc.index++;
416d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
417d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
418d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
419d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaDisplayError HWInfoDRM::GetRotatorSupportedFormats(uint32_t v4l2_index,
420d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                                   HWResourceInfo *hw_resource) {
421d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  string path = "/dev/video" + to_string(v4l2_index);
422d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  int fd = Sys::open_(path.c_str(), O_RDONLY);
423d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  if (fd < 0) {
424d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    DLOGE("Failed to open %s with error %d", path.c_str(), errno);
425d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    return kErrorNotSupported;
426d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
427d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
428d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  vector<LayerBufferFormat> supported_formats = {};
429d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  GetRotatorFormatsForType(fd, V4L2_BUF_TYPE_VIDEO_OUTPUT, &supported_formats);
430d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->supported_formats_map.erase(kHWRotatorInput);
431d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->supported_formats_map.insert(make_pair(kHWRotatorInput, supported_formats));
432d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
433d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  supported_formats = {};
434d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  GetRotatorFormatsForType(fd, V4L2_BUF_TYPE_VIDEO_CAPTURE, &supported_formats);
435d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->supported_formats_map.erase(kHWRotatorOutput);
436d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_resource->supported_formats_map.insert(make_pair(kHWRotatorOutput, supported_formats));
437d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
438d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  Sys::close_(fd);
439d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
440d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  return kErrorNone;
441d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
442d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
443d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaDisplayError HWInfoDRM::GetHWRotatorInfo(HWResourceInfo *hw_resource) {
444d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  string v4l2_path = "/sys/class/video4linux/video";
445d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  const uint32_t kMaxV4L2Nodes = 64;
446d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
447d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  for (uint32_t i = 0; i < kMaxV4L2Nodes; i++) {
448d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    string path = v4l2_path + to_string(i) + "/name";
449d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    Sys::fstream fs(path, fstream::in);
450d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    if (!fs.is_open()) {
451d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      continue;
452d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
453d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
454d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    string line;
455d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    if (Sys::getline_(fs, line) && (!strncmp(line.c_str(), "sde_rotator", strlen("sde_rotator")))) {
456d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      hw_resource->hw_rot_info.device_path = string("/dev/video" + to_string(i));
457d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      hw_resource->hw_rot_info.num_rotator++;
458d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      hw_resource->hw_rot_info.type = HWRotatorInfo::ROT_TYPE_V4L2;
459d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      hw_resource->hw_rot_info.has_downscale = true;
460d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      GetRotatorSupportedFormats(i, hw_resource);
461d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
462d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      string caps_path = v4l2_path + to_string(i) + "/device/caps";
463d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      Sys::fstream caps_fs(caps_path, fstream::in);
464d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
465d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      if (caps_fs.is_open()) {
466d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        string caps;
467d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        while (Sys::getline_(caps_fs, caps)) {
468d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          const string downscale_compression = "downscale_compression=";
469d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          const string min_downscale = "min_downscale=";
470d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          if (caps.find(downscale_compression) != string::npos) {
471d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema            hw_resource->hw_rot_info.downscale_compression =
472d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema              std::stoi(string(caps, downscale_compression.length()));
473d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          } else if (caps.find(min_downscale) != string::npos) {
474d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema            hw_resource->hw_rot_info.min_downscale =
475d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema              std::stof(string(caps, min_downscale.length()));
476d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          }
477d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        }
478d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      }
479d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
480d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      // We support only 1 rotator
481d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
482d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    }
483d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
484d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
485d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  DLOGI("V4L2 Rotator: Count = %d, Downscale = %d, Min_downscale = %f, Downscale_compression = %d",
486d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        hw_resource->hw_rot_info.num_rotator, hw_resource->hw_rot_info.has_downscale,
487d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        hw_resource->hw_rot_info.min_downscale, hw_resource->hw_rot_info.downscale_compression);
488d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
489d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  return kErrorNone;
490d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
491d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
492d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennemavoid HWInfoDRM::GetSDMFormat(uint32_t drm_format, uint64_t drm_format_modifier,
493d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                             vector<LayerBufferFormat> *sdm_formats) {
494d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  vector<LayerBufferFormat> &fmts(*sdm_formats);
495d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  switch (drm_format) {
496d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_BGRA8888:
497d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatARGB8888);
498d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
499d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_ABGR8888:
500d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(drm_format_modifier ? kFormatRGBA8888Ubwc : kFormatRGBA8888);
501d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
502d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_ARGB8888:
503d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatBGRA8888);
504d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
505d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_BGRX8888:
506d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatXRGB8888);
507d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
508d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_XBGR8888:
509d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(drm_format_modifier ? kFormatRGBX8888Ubwc : kFormatRGBX8888);
510d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
511d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_XRGB8888:
512d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatBGRX8888);
513d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
514d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_ABGR1555:
515d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatRGBA5551);
516d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
517d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_ABGR4444:
518d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatRGBA4444);
519d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
520d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_BGR888:
521d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatRGB888);
522d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
523d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_RGB888:
524d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatBGR888);
525d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
526d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_BGR565:
527d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(drm_format_modifier ? kFormatBGR565Ubwc : kFormatRGB565);
528d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
529d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_RGB565:
530d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatBGR565);
531d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
532d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_ABGR2101010:
533d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(drm_format_modifier ? kFormatRGBA1010102Ubwc : kFormatRGBA1010102);
534d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
535d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_BGRA1010102:
536d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatARGB2101010);
537d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
538d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_XBGR2101010:
539d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(drm_format_modifier ? kFormatRGBX1010102Ubwc : kFormatRGBX1010102);
540d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
541d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_BGRX1010102:
542d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatXRGB2101010);
543d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
544d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_ARGB2101010:
545d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatBGRA1010102);
546d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
547d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_RGBA1010102:
548d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatABGR2101010);
549d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
550d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_XRGB2101010:
551d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatBGRX1010102);
552d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
553d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_RGBX1010102:
554d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatXBGR2101010);
555d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
556d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_YVU420:
557d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatYCrCb420PlanarStride16);
558d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
559d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_NV12:
560d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      if (drm_format_modifier == (DRM_FORMAT_MOD_QCOM_COMPRESSED |
561d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          DRM_FORMAT_MOD_QCOM_DX | DRM_FORMAT_MOD_QCOM_TIGHT)) {
562d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema          fmts.push_back(kFormatYCbCr420TP10Ubwc);
563d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      } else if (drm_format_modifier == (DRM_FORMAT_MOD_QCOM_COMPRESSED |
564d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema                                         DRM_FORMAT_MOD_QCOM_DX)) {
565d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema        fmts.push_back(kFormatYCbCr420P010Ubwc);
566d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      } else if (drm_format_modifier == DRM_FORMAT_MOD_QCOM_COMPRESSED) {
567d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema         fmts.push_back(kFormatYCbCr420SPVenusUbwc);
568d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      } else if (drm_format_modifier == DRM_FORMAT_MOD_QCOM_DX) {
569d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema         fmts.push_back(kFormatYCbCr420P010);
570d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      } else {
571d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema         fmts.push_back(kFormatYCbCr420SemiPlanarVenus);
572d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema         fmts.push_back(kFormatYCbCr420SemiPlanar);
573d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      }
574d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
575d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_NV21:
576d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatYCrCb420SemiPlanarVenus);
577d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatYCrCb420SemiPlanar);
578d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
579d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    case DRM_FORMAT_NV16:
580d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      fmts.push_back(kFormatYCbCr422H2V1SemiPlanar);
581d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
582d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema    default:
583d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema      break;
584d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  }
585d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
586d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
587d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben FennemaDisplayError HWInfoDRM::GetFirstDisplayInterfaceType(HWDisplayInterfaceInfo *hw_disp_info) {
588d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_disp_info->type = kPrimary;
589d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  hw_disp_info->is_connected = true;
590d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
591d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema  return kErrorNone;
592d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}
593d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema
594d39a514dd0540cf47e121775a77e9ac1b578bdb1Ben Fennema}  // namespace sdm
595