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