1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "drm_device.h" 17094332d3Sopenharmony_ci#include <string> 18094332d3Sopenharmony_ci#include <cerrno> 19094332d3Sopenharmony_ci#include <fcntl.h> 20094332d3Sopenharmony_ci#include <memory> 21094332d3Sopenharmony_ci#include <drm_fourcc.h> 22094332d3Sopenharmony_ci#include "display_log.h" 23094332d3Sopenharmony_ci#include "drm_display.h" 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cinamespace OHOS { 26094332d3Sopenharmony_cinamespace HDI { 27094332d3Sopenharmony_cinamespace DISPLAY { 28094332d3Sopenharmony_ciFdPtr DrmDevice::mDrmFd = nullptr; 29094332d3Sopenharmony_cistd::shared_ptr<DrmDevice> DrmDevice::mInstance; 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_cistd::shared_ptr<HdiDeviceInterface> DrmDevice::Create() 32094332d3Sopenharmony_ci{ 33094332d3Sopenharmony_ci DISPLAY_LOGD(); 34094332d3Sopenharmony_ci if (mDrmFd == nullptr) { 35094332d3Sopenharmony_ci const std::string name("rockchip"); 36094332d3Sopenharmony_ci int drmFd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); // drmOpen(name.c_str(), nullptr); 37094332d3Sopenharmony_ci if (drmFd < 0) { 38094332d3Sopenharmony_ci DISPLAY_LOGE("drm file:%{public}s open failed %{public}s", name.c_str(), strerror(errno)); 39094332d3Sopenharmony_ci return nullptr; 40094332d3Sopenharmony_ci } 41094332d3Sopenharmony_ci DISPLAY_LOGD("the drm fd is %{public}d", drmFd); 42094332d3Sopenharmony_ci mDrmFd = std::make_shared<HdiFd>(drmFd); 43094332d3Sopenharmony_ci } 44094332d3Sopenharmony_ci if (mInstance == nullptr) { 45094332d3Sopenharmony_ci mInstance = std::make_shared<DrmDevice>(); 46094332d3Sopenharmony_ci } 47094332d3Sopenharmony_ci return mInstance; 48094332d3Sopenharmony_ci} 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ciint DrmDevice::GetDrmFd() 51094332d3Sopenharmony_ci{ 52094332d3Sopenharmony_ci if (mDrmFd == nullptr) { 53094332d3Sopenharmony_ci DISPLAY_LOGE("the drmfd is null not open"); 54094332d3Sopenharmony_ci return -1; 55094332d3Sopenharmony_ci } 56094332d3Sopenharmony_ci return mDrmFd->GetFd(); 57094332d3Sopenharmony_ci} 58094332d3Sopenharmony_ci 59094332d3Sopenharmony_ciusing PixelFormatConvertTbl = struct PixFmtConvertTbl { 60094332d3Sopenharmony_ci uint32_t drmFormat; 61094332d3Sopenharmony_ci PixelFormat pixFormat; 62094332d3Sopenharmony_ci}; 63094332d3Sopenharmony_ci 64094332d3Sopenharmony_ciuint32_t DrmDevice::ConvertToDrmFormat(PixelFormat fmtIn) 65094332d3Sopenharmony_ci{ 66094332d3Sopenharmony_ci static const PixelFormatConvertTbl convertTable[] = { 67094332d3Sopenharmony_ci {DRM_FORMAT_XBGR8888, PIXEL_FMT_RGBX_8888}, {DRM_FORMAT_ABGR8888, PIXEL_FMT_RGBA_8888}, 68094332d3Sopenharmony_ci {DRM_FORMAT_RGB888, PIXEL_FMT_RGB_888}, {DRM_FORMAT_RGB565, PIXEL_FMT_BGR_565}, 69094332d3Sopenharmony_ci {DRM_FORMAT_BGRX4444, PIXEL_FMT_BGRX_4444}, {DRM_FORMAT_BGRA4444, PIXEL_FMT_BGRA_4444}, 70094332d3Sopenharmony_ci {DRM_FORMAT_RGBA4444, PIXEL_FMT_RGBA_4444}, {DRM_FORMAT_RGBX4444, PIXEL_FMT_RGBX_4444}, 71094332d3Sopenharmony_ci {DRM_FORMAT_BGRX5551, PIXEL_FMT_BGRX_5551}, {DRM_FORMAT_BGRA5551, PIXEL_FMT_BGRA_5551}, 72094332d3Sopenharmony_ci {DRM_FORMAT_BGRX8888, PIXEL_FMT_BGRX_8888}, {DRM_FORMAT_ARGB8888, PIXEL_FMT_BGRA_8888}, 73094332d3Sopenharmony_ci {DRM_FORMAT_NV12, PIXEL_FMT_YCBCR_420_SP}, {DRM_FORMAT_NV21, PIXEL_FMT_YCRCB_420_SP}, 74094332d3Sopenharmony_ci {DRM_FORMAT_YUV420, PIXEL_FMT_YCBCR_420_P}, {DRM_FORMAT_YVU420, PIXEL_FMT_YCRCB_420_P}, 75094332d3Sopenharmony_ci {DRM_FORMAT_NV16, PIXEL_FMT_YCBCR_422_SP}, {DRM_FORMAT_NV61, PIXEL_FMT_YCRCB_422_SP}, 76094332d3Sopenharmony_ci {DRM_FORMAT_YUV422, PIXEL_FMT_YCBCR_422_P}, {DRM_FORMAT_YVU422, PIXEL_FMT_YCRCB_422_P}, 77094332d3Sopenharmony_ci }; 78094332d3Sopenharmony_ci uint32_t fmtOut = 0; 79094332d3Sopenharmony_ci for (uint32_t i = 0; i < sizeof(convertTable) / sizeof(convertTable[0]); i++) { 80094332d3Sopenharmony_ci if (convertTable[i].pixFormat == fmtIn) { 81094332d3Sopenharmony_ci fmtOut = convertTable[i].drmFormat; 82094332d3Sopenharmony_ci } 83094332d3Sopenharmony_ci } 84094332d3Sopenharmony_ci DISPLAY_LOGD("fmtIn %{public}d, outFmt %{public}d", fmtIn, fmtOut); 85094332d3Sopenharmony_ci return fmtOut; 86094332d3Sopenharmony_ci} 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_ciDrmDevice::DrmDevice() {} 89094332d3Sopenharmony_ci 90094332d3Sopenharmony_ciint32_t DrmDevice::GetCrtcProperty(const DrmCrtc &crtc, const std::string &name, DrmProperty &prop) 91094332d3Sopenharmony_ci{ 92094332d3Sopenharmony_ci return GetProperty(crtc.GetId(), DRM_MODE_OBJECT_CRTC, name, prop); 93094332d3Sopenharmony_ci} 94094332d3Sopenharmony_ci 95094332d3Sopenharmony_ciint32_t DrmDevice::GetConnectorProperty(const DrmConnector &connector, const std::string &name, DrmProperty &prop) 96094332d3Sopenharmony_ci{ 97094332d3Sopenharmony_ci return GetProperty(connector.GetId(), DRM_MODE_OBJECT_CONNECTOR, name, prop); 98094332d3Sopenharmony_ci} 99094332d3Sopenharmony_ci 100094332d3Sopenharmony_ciint32_t DrmDevice::GetPlaneProperty(const DrmPlane &plane, const std::string &name, DrmProperty &prop) 101094332d3Sopenharmony_ci{ 102094332d3Sopenharmony_ci return GetProperty(plane.GetId(), DRM_MODE_OBJECT_PLANE, name, prop); 103094332d3Sopenharmony_ci} 104094332d3Sopenharmony_ci 105094332d3Sopenharmony_ciint32_t DrmDevice::GetProperty(uint32_t objId, uint32_t objType, const std::string &name, DrmProperty &prop) 106094332d3Sopenharmony_ci{ 107094332d3Sopenharmony_ci drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(GetDrmFd(), objId, objType); 108094332d3Sopenharmony_ci DISPLAY_CHK_RETURN((!props), DISPLAY_FAILURE, DISPLAY_LOGE("can not get properties")); 109094332d3Sopenharmony_ci bool found = false; 110094332d3Sopenharmony_ci for (uint32_t i = 0; i < props->count_props; i++) { 111094332d3Sopenharmony_ci drmModePropertyPtr p = drmModeGetProperty(GetDrmFd(), props->props[i]); 112094332d3Sopenharmony_ci if (strcmp(p->name, name.c_str()) == 0) { 113094332d3Sopenharmony_ci found = true; 114094332d3Sopenharmony_ci prop.propId = p->prop_id; 115094332d3Sopenharmony_ci prop.value = props->prop_values[i]; 116094332d3Sopenharmony_ci prop.name = p->name; 117094332d3Sopenharmony_ci prop.flags = p->flags; 118094332d3Sopenharmony_ci 119094332d3Sopenharmony_ci for (int i = 0; i < p->count_values; ++i) { 120094332d3Sopenharmony_ci prop.values.push_back(p->values[i]); 121094332d3Sopenharmony_ci } 122094332d3Sopenharmony_ci for (int i = 0; i < p->count_enums; ++i) { 123094332d3Sopenharmony_ci prop.enums.push_back(DrmPropertyEnum(&p->enums[i])); 124094332d3Sopenharmony_ci } 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_ci for (int i = 0; i < p->count_blobs; ++i) { 127094332d3Sopenharmony_ci prop.blob_ids.push_back(p->blob_ids[i]); 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci if (prop.flags & DRM_MODE_PROP_RANGE) { 130094332d3Sopenharmony_ci prop.type = static_cast<uint32_t>(DrmPropertyType::DRM_PROPERTY_TYPE_INT); 131094332d3Sopenharmony_ci } else if (prop.flags & DRM_MODE_PROP_ENUM) { 132094332d3Sopenharmony_ci prop.type = static_cast<uint32_t>(DrmPropertyType::DRM_PROPERTY_TYPE_ENUM); 133094332d3Sopenharmony_ci } else if (prop.flags & DRM_MODE_PROP_OBJECT) { 134094332d3Sopenharmony_ci prop.type = static_cast<uint32_t>(DrmPropertyType::DRM_PROPERTY_TYPE_OBJECT); 135094332d3Sopenharmony_ci } else if (prop.flags & DRM_MODE_PROP_BLOB) { 136094332d3Sopenharmony_ci prop.type = static_cast<uint32_t>(DrmPropertyType::DRM_PROPERTY_TYPE_BLOB); 137094332d3Sopenharmony_ci } else if (prop.flags & DRM_MODE_PROP_BITMASK) { 138094332d3Sopenharmony_ci prop.type = static_cast<uint32_t>(DrmPropertyType::DRM_PROPERTY_TYPE_BITMASK); 139094332d3Sopenharmony_ci } 140094332d3Sopenharmony_ci } 141094332d3Sopenharmony_ci drmModeFreeProperty(p); 142094332d3Sopenharmony_ci } 143094332d3Sopenharmony_ci drmModeFreeObjectProperties(props); 144094332d3Sopenharmony_ci return found ? DISPLAY_SUCCESS : DISPLAY_NOT_SUPPORT; 145094332d3Sopenharmony_ci} 146094332d3Sopenharmony_ci 147094332d3Sopenharmony_ciint32_t DrmDevice::Init() 148094332d3Sopenharmony_ci{ 149094332d3Sopenharmony_ci int ret = drmSetClientCap(GetDrmFd(), DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); 150094332d3Sopenharmony_ci DISPLAY_CHK_RETURN((ret), DISPLAY_FAILURE, 151094332d3Sopenharmony_ci DISPLAY_LOGE("DRM_CLIENT_CAP_UNIVERSAL_PLANES set failed %{public}s", strerror(errno))); 152094332d3Sopenharmony_ci ret = drmSetClientCap(GetDrmFd(), DRM_CLIENT_CAP_ATOMIC, 1); 153094332d3Sopenharmony_ci DISPLAY_CHK_RETURN((ret), DISPLAY_FAILURE, 154094332d3Sopenharmony_ci DISPLAY_LOGE("DRM_CLIENT_CAP_ATOMIC set failed %{public}s", strerror(errno))); 155094332d3Sopenharmony_ci 156094332d3Sopenharmony_ci ret = drmSetMaster(GetDrmFd()); 157094332d3Sopenharmony_ci DISPLAY_CHK_RETURN((ret), DISPLAY_FAILURE, DISPLAY_LOGE("can not set to master errno : %{public}d", errno)); 158094332d3Sopenharmony_ci DISPLAY_LOGE("chenyf master"); 159094332d3Sopenharmony_ci ret = drmIsMaster(GetDrmFd()); 160094332d3Sopenharmony_ci DISPLAY_CHK_RETURN((!ret), DISPLAY_FAILURE, DISPLAY_LOGE("is not master : %{public}d", errno)); 161094332d3Sopenharmony_ci 162094332d3Sopenharmony_ci return DISPLAY_SUCCESS; 163094332d3Sopenharmony_ci} 164094332d3Sopenharmony_ci 165094332d3Sopenharmony_civoid DrmDevice::DeInit() 166094332d3Sopenharmony_ci{ 167094332d3Sopenharmony_ci mDisplays.clear(); 168094332d3Sopenharmony_ci mCrtcs.clear(); 169094332d3Sopenharmony_ci} 170094332d3Sopenharmony_ci 171094332d3Sopenharmony_civoid DrmDevice::FindAllCrtc(const drmModeResPtr &res) 172094332d3Sopenharmony_ci{ 173094332d3Sopenharmony_ci DISPLAY_CHK_RETURN_NOT_VALUE((res == nullptr), DISPLAY_LOGE("the res is null")); 174094332d3Sopenharmony_ci mCrtcs.clear(); 175094332d3Sopenharmony_ci for (int i = 0; i < res->count_crtcs; i++) { 176094332d3Sopenharmony_ci drmModeCrtcPtr crtc = drmModeGetCrtc(GetDrmFd(), res->crtcs[i]); 177094332d3Sopenharmony_ci if (!crtc) { 178094332d3Sopenharmony_ci DISPLAY_LOGE("can not get crtc %{public}d", i); 179094332d3Sopenharmony_ci continue; 180094332d3Sopenharmony_ci } 181094332d3Sopenharmony_ci uint32_t crtc_id = crtc->crtc_id; 182094332d3Sopenharmony_ci std::shared_ptr<DrmCrtc> drmCrtc = std::make_shared<DrmCrtc>(crtc, i); 183094332d3Sopenharmony_ci int ret = drmCrtc->Init(*this); 184094332d3Sopenharmony_ci drmModeFreeCrtc(crtc); 185094332d3Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 186094332d3Sopenharmony_ci DISPLAY_LOGE("crtc %{public}d init failed", i); 187094332d3Sopenharmony_ci continue; 188094332d3Sopenharmony_ci } 189094332d3Sopenharmony_ci mCrtcs.emplace(crtc_id, std::move(drmCrtc)); 190094332d3Sopenharmony_ci } 191094332d3Sopenharmony_ci} 192094332d3Sopenharmony_ci 193094332d3Sopenharmony_civoid DrmDevice::FindAllEncoder(const drmModeResPtr &res) 194094332d3Sopenharmony_ci{ 195094332d3Sopenharmony_ci DISPLAY_CHK_RETURN_NOT_VALUE((res == nullptr), DISPLAY_LOGE("the res is null")); 196094332d3Sopenharmony_ci mEncoders.clear(); 197094332d3Sopenharmony_ci for (int i = 0; i < res->count_encoders; i++) { 198094332d3Sopenharmony_ci drmModeEncoderPtr encoder = drmModeGetEncoder(GetDrmFd(), res->encoders[i]); 199094332d3Sopenharmony_ci if (!encoder) { 200094332d3Sopenharmony_ci DISPLAY_LOGE("can not get encoder %{public}d", i); 201094332d3Sopenharmony_ci continue; 202094332d3Sopenharmony_ci } 203094332d3Sopenharmony_ci std::shared_ptr<DrmEncoder> drmEncoder = std::make_shared<DrmEncoder>(*encoder); 204094332d3Sopenharmony_ci mEncoders.emplace(encoder->encoder_id, std::move(drmEncoder)); 205094332d3Sopenharmony_ci drmModeFreeEncoder(encoder); 206094332d3Sopenharmony_ci } 207094332d3Sopenharmony_ci DISPLAY_LOGD("find encoder count %{public}zd", mEncoders.size()); 208094332d3Sopenharmony_ci} 209094332d3Sopenharmony_ci 210094332d3Sopenharmony_civoid DrmDevice::FindAllConnector(const drmModeResPtr &res) 211094332d3Sopenharmony_ci{ 212094332d3Sopenharmony_ci DISPLAY_CHK_RETURN_NOT_VALUE((res == nullptr), DISPLAY_LOGE("the res is null")); 213094332d3Sopenharmony_ci mConnectors.clear(); 214094332d3Sopenharmony_ci int ret; 215094332d3Sopenharmony_ci for (int i = 0; i < res->count_connectors; i++) { 216094332d3Sopenharmony_ci drmModeConnectorPtr connector = drmModeGetConnector(GetDrmFd(), res->connectors[i]); 217094332d3Sopenharmony_ci if (!connector) { 218094332d3Sopenharmony_ci DISPLAY_LOGE("can not get connector mode %{public}d", i); 219094332d3Sopenharmony_ci continue; 220094332d3Sopenharmony_ci } 221094332d3Sopenharmony_ci std::shared_ptr<DrmConnector> drmConnector = std::make_shared<DrmConnector>(*connector, mDrmFd); 222094332d3Sopenharmony_ci ret = drmConnector->Init(*this); 223094332d3Sopenharmony_ci drmModeFreeConnector(connector); 224094332d3Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 225094332d3Sopenharmony_ci continue; 226094332d3Sopenharmony_ci } 227094332d3Sopenharmony_ci int connectorId = drmConnector->GetId(); 228094332d3Sopenharmony_ci mConnectors.emplace(connectorId, std::move(drmConnector)); 229094332d3Sopenharmony_ci } 230094332d3Sopenharmony_ci DISPLAY_LOGD("find connector count %{public}zd", mConnectors.size()); 231094332d3Sopenharmony_ci} 232094332d3Sopenharmony_ci 233094332d3Sopenharmony_civoid DrmDevice::FindAllPlane() 234094332d3Sopenharmony_ci{ 235094332d3Sopenharmony_ci mPlanes.clear(); 236094332d3Sopenharmony_ci int ret; 237094332d3Sopenharmony_ci drmModePlaneResPtr planeRes = drmModeGetPlaneResources(GetDrmFd()); 238094332d3Sopenharmony_ci DISPLAY_CHK_RETURN_NOT_VALUE((planeRes == nullptr), DISPLAY_LOGE("can not get plane resource")); 239094332d3Sopenharmony_ci DISPLAY_LOGD("count_planes %{public}d", planeRes->count_planes); 240094332d3Sopenharmony_ci for (uint32_t i = 0; i < planeRes->count_planes; i++) { 241094332d3Sopenharmony_ci drmModePlanePtr p = drmModeGetPlane(GetDrmFd(), planeRes->planes[i]); 242094332d3Sopenharmony_ci if (!p) { 243094332d3Sopenharmony_ci DISPLAY_LOGE("can not get plane %{public}d", i); 244094332d3Sopenharmony_ci continue; 245094332d3Sopenharmony_ci } 246094332d3Sopenharmony_ci std::shared_ptr<DrmPlane> drmPlane = std::make_shared<DrmPlane>(*p); 247094332d3Sopenharmony_ci DISPLAY_LOGD(); 248094332d3Sopenharmony_ci ret = drmPlane->Init(*this); 249094332d3Sopenharmony_ci DISPLAY_LOGD(); 250094332d3Sopenharmony_ci drmModeFreePlane(p); 251094332d3Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 252094332d3Sopenharmony_ci DISPLAY_LOGE("drm plane %{public}d init failed", i); 253094332d3Sopenharmony_ci continue; 254094332d3Sopenharmony_ci } 255094332d3Sopenharmony_ci mPlanes.emplace_back(std::move(drmPlane)); 256094332d3Sopenharmony_ci } 257094332d3Sopenharmony_ci DISPLAY_LOGD("find plane count %{public}zd", mPlanes.size()); 258094332d3Sopenharmony_ci} 259094332d3Sopenharmony_ci 260094332d3Sopenharmony_cistd::shared_ptr<DrmEncoder> DrmDevice::GetDrmEncoderFromId(uint32_t id) 261094332d3Sopenharmony_ci{ 262094332d3Sopenharmony_ci return nullptr; 263094332d3Sopenharmony_ci} 264094332d3Sopenharmony_ci 265094332d3Sopenharmony_cistd::shared_ptr<DrmConnector> DrmDevice::GetDrmConnectorFromId(uint32_t id) 266094332d3Sopenharmony_ci{ 267094332d3Sopenharmony_ci return nullptr; 268094332d3Sopenharmony_ci} 269094332d3Sopenharmony_ci 270094332d3Sopenharmony_cistd::shared_ptr<DrmCrtc> DrmDevice::GetDrmCrtcFromId(uint32_t id) 271094332d3Sopenharmony_ci{ 272094332d3Sopenharmony_ci return nullptr; 273094332d3Sopenharmony_ci} 274094332d3Sopenharmony_ci 275094332d3Sopenharmony_cistd::vector<std::shared_ptr<DrmPlane>> DrmDevice::GetDrmPlane(uint32_t pipe, uint32_t type) 276094332d3Sopenharmony_ci{ 277094332d3Sopenharmony_ci std::vector<std::shared_ptr<DrmPlane>> planes; 278094332d3Sopenharmony_ci for (const auto &plane : mPlanes) { 279094332d3Sopenharmony_ci if (plane->IsIdle() && ((1 << pipe) & plane->GetPossibleCrtcs()) && (type == plane->GetType())) { 280094332d3Sopenharmony_ci planes.push_back(plane); 281094332d3Sopenharmony_ci } 282094332d3Sopenharmony_ci } 283094332d3Sopenharmony_ci DISPLAY_LOGD("the planes count %{public}zd", planes.size()); 284094332d3Sopenharmony_ci return planes; 285094332d3Sopenharmony_ci} 286094332d3Sopenharmony_ci 287094332d3Sopenharmony_cibool DrmDevice::HandleHotplug(uint32_t dispId, bool plugIn) 288094332d3Sopenharmony_ci{ 289094332d3Sopenharmony_ci uint32_t find = 0; 290094332d3Sopenharmony_ci uint32_t connectorId; 291094332d3Sopenharmony_ci 292094332d3Sopenharmony_ci for (auto &dispConnectorIdMap : dispConnectorIdMaps_) { 293094332d3Sopenharmony_ci if (dispConnectorIdMap.first == dispId) { 294094332d3Sopenharmony_ci connectorId = dispConnectorIdMap.second; 295094332d3Sopenharmony_ci find = 1; 296094332d3Sopenharmony_ci break; 297094332d3Sopenharmony_ci } 298094332d3Sopenharmony_ci } 299094332d3Sopenharmony_ci 300094332d3Sopenharmony_ci if (find == 0) { 301094332d3Sopenharmony_ci return false; 302094332d3Sopenharmony_ci } 303094332d3Sopenharmony_ci 304094332d3Sopenharmony_ci for (auto &connectorPair : mConnectors) { 305094332d3Sopenharmony_ci auto connector = connectorPair.second; 306094332d3Sopenharmony_ci if (connectorId == connector->GetId()) { 307094332d3Sopenharmony_ci if (connector->HandleHotplug(mEncoders, mCrtcs, plugIn) == true) { 308094332d3Sopenharmony_ci connector->Init(*this); 309094332d3Sopenharmony_ci return true; 310094332d3Sopenharmony_ci } 311094332d3Sopenharmony_ci } 312094332d3Sopenharmony_ci } 313094332d3Sopenharmony_ci return false; 314094332d3Sopenharmony_ci} 315094332d3Sopenharmony_ci 316094332d3Sopenharmony_cistd::unordered_map<uint32_t, std::shared_ptr<HdiDisplay>> DrmDevice::DiscoveryDisplay() 317094332d3Sopenharmony_ci{ 318094332d3Sopenharmony_ci uint32_t dispId; 319094332d3Sopenharmony_ci uint32_t connectorId; 320094332d3Sopenharmony_ci 321094332d3Sopenharmony_ci dispConnectorIdMaps_.clear(); 322094332d3Sopenharmony_ci mDisplays.clear(); 323094332d3Sopenharmony_ci drmModeResPtr res = drmModeGetResources(GetDrmFd()); 324094332d3Sopenharmony_ci DISPLAY_CHK_RETURN((res == nullptr), mDisplays, DISPLAY_LOGE("can not get drm resource")); 325094332d3Sopenharmony_ci // discovery all drm resource 326094332d3Sopenharmony_ci FindAllCrtc(res); 327094332d3Sopenharmony_ci FindAllEncoder(res); 328094332d3Sopenharmony_ci FindAllConnector(res); 329094332d3Sopenharmony_ci FindAllPlane(); 330094332d3Sopenharmony_ci DISPLAY_LOGD(); 331094332d3Sopenharmony_ci // travel all connector 332094332d3Sopenharmony_ci for (auto &connectorPair : mConnectors) { 333094332d3Sopenharmony_ci auto connector = connectorPair.second; 334094332d3Sopenharmony_ci uint32_t crtcId = 0; 335094332d3Sopenharmony_ci int32_t ret = connector->PickIdleCrtcId(mEncoders, mCrtcs, crtcId); 336094332d3Sopenharmony_ci if (ret != DISPLAY_SUCCESS) { 337094332d3Sopenharmony_ci continue; 338094332d3Sopenharmony_ci } 339094332d3Sopenharmony_ci DISPLAY_LOGD(); 340094332d3Sopenharmony_ci 341094332d3Sopenharmony_ci auto crtcIter = mCrtcs.find(crtcId); 342094332d3Sopenharmony_ci if (crtcIter == mCrtcs.end()) { 343094332d3Sopenharmony_ci DISPLAY_LOGE("can not find crtc for the id %{public}d", connector->GetId()); 344094332d3Sopenharmony_ci continue; 345094332d3Sopenharmony_ci } 346094332d3Sopenharmony_ci DISPLAY_LOGD(); 347094332d3Sopenharmony_ci auto crtc = crtcIter->second; 348094332d3Sopenharmony_ci // create the display 349094332d3Sopenharmony_ci std::shared_ptr<HdiDisplay> display = std::make_shared<DrmDisplay>(connector, crtc, mInstance); 350094332d3Sopenharmony_ci DISPLAY_LOGD(); 351094332d3Sopenharmony_ci display->Init(); 352094332d3Sopenharmony_ci dispId = display->GetId(); 353094332d3Sopenharmony_ci connectorId = connector->GetId(); 354094332d3Sopenharmony_ci mDisplays.emplace(dispId, std::move(display)); 355094332d3Sopenharmony_ci dispConnectorIdMaps_.emplace(dispId, connectorId); 356094332d3Sopenharmony_ci } 357094332d3Sopenharmony_ci DISPLAY_LOGD("find display size %{public}zd", mDisplays.size()); 358094332d3Sopenharmony_ci return mDisplays; 359094332d3Sopenharmony_ci} 360094332d3Sopenharmony_ci} // namespace OHOS 361094332d3Sopenharmony_ci} // namespace HDI 362094332d3Sopenharmony_ci} // namespace DISPLAY 363