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