1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "drm_plane.h"
17 #include "drm_device.h"
18 
19 namespace OHOS {
20 namespace HDI {
21 namespace DISPLAY {
22 struct PlaneTypeName planeTypeNames[] = {
23     { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_WIN0, "Cluster0-win0" },
24     { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_WIN1, "Cluster0-win1" },
25     { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_WIN0, "Cluster1-win0" },
26     { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_WIN1, "Cluster1-win1" },
27 
28     { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN0, "Esmart0-win0" },
29     { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN1, "Esmart0-win1" },
30     { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN2, "Esmart0-win2" },
31     { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN3, "Esmart0-win3" },
32 
33     { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN0, "Esmart1-win0" },
34     { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN1, "Esmart1-win1" },
35     { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN2, "Esmart1-win2" },
36     { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN3, "Esmart1-win3" },
37 
38     { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN0, "Smart0-win0" },
39     { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN1, "Smart0-win1" },
40     { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN2, "Smart0-win2" },
41     { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN3, "Smart0-win3" },
42 
43     { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN0, "Smart1-win0" },
44     { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN1, "Smart1-win1" },
45     { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN2, "Smart1-win2" },
46     { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN3, "Smart1-win3" },
47 
48     { DrmPlaneType::DRM_PLANE_TYPE_Unknown, "unknown" },
49 };
50 
DrmPlane(drmModePlane & p)51 DrmPlane::DrmPlane(drmModePlane &p)
52     : mId(p.plane_id), mPossibleCrtcs(p.possible_crtcs), mCrtcId(p.crtc_id),
53     mFormats(p.formats, p.formats + p.count_formats)
54 {}
55 
~DrmPlane()56 DrmPlane::~DrmPlane()
57 {
58     DISPLAY_LOGD();
59 }
60 
GetCrtcProp(DrmDevice & drmDevice)61 int DrmPlane::GetCrtcProp(DrmDevice &drmDevice)
62 {
63     int32_t ret;
64     int32_t crtc_x;
65     int32_t crtc_y;
66     int32_t crtc_w;
67     int32_t crtc_h;
68     DrmProperty prop;
69 
70     ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_X_ID, prop);
71     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_x prop id"));
72     mPropCrtc_xId = prop.propId;
73     crtc_x = prop.value;
74 
75     ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_Y_ID, prop);
76     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_y prop id"));
77     mPropCrtc_yId = prop.propId;
78     crtc_y = prop.value;
79 
80     ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_W_ID, prop);
81     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_w prop id"));
82     mPropCrtc_wId = prop.propId;
83     crtc_w = prop.value;
84 
85     ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_H_ID, prop);
86     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_h prop id"));
87     mPropCrtc_hId = prop.propId;
88     crtc_h = prop.value;
89 
90     DISPLAY_LOGE("plane %{public}d crtc_x %{public}d crtc_y %{public}d crtc_w %{public}d crtc_h %{public}d",
91         GetId(), crtc_x, crtc_y, crtc_w, crtc_h);
92 
93     return 0;
94 }
95 
GetSrcProp(DrmDevice & drmDevice)96 int DrmPlane::GetSrcProp(DrmDevice &drmDevice)
97 {
98     int32_t ret;
99     int32_t src_x;
100     int32_t src_y;
101     int32_t src_w;
102     int32_t src_h;
103     DrmProperty prop;
104 
105     ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_X_ID, prop);
106     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_x prop id"));
107     mPropSrc_xId = prop.propId;
108     src_x = prop.value;
109 
110     ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_Y_ID, prop);
111     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_y prop id"));
112     mPropSrc_yId = prop.propId;
113     src_y = prop.value;
114 
115     ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_W_ID, prop);
116     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_w prop id"));
117     mPropSrc_wId = prop.propId;
118     src_w = prop.value;
119 
120     ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_H_ID, prop);
121     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_h prop id"));
122     mPropSrc_hId = prop.propId;
123     src_h = prop.value;
124 
125     DISPLAY_LOGE("plane %{public}d src_x %{public}d src_y %{public}d src_w %{public}d src_h %{public}d",
126         GetId(), src_x, src_y, src_w, src_h);
127 
128     return 0;
129 }
130 
GetNameProp(DrmDevice & drmDevice)131 int DrmPlane::GetNameProp(DrmDevice &drmDevice)
132 {
133     int32_t ret;
134     DrmProperty prop;
135     ret = drmDevice.GetPlaneProperty(*this, "NAME", prop);
136     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id"));
137 
138     uint32_t find_name = 0;
139     for (int i = 0; i < static_cast<int>ARRAY_SIZE(planeTypeNames); i++) {
140         find_name = 0;
141 
142         for (auto &drmEnum : prop.enums) {
143             if (!strncmp(drmEnum.name.c_str(), (const char*)planeTypeNames[i].name,
144                                 strlen(planeTypeNames[i].name))) {
145                 find_name = (1LL << drmEnum.value);
146             }
147         }
148 
149         if (find_name) {
150             DISPLAY_LOGI("find plane id %{public}d, type %{public}x %{public}s",
151                                     GetId(), planeTypeNames[i].type, planeTypeNames[i].name);
152             mWinType = planeTypeNames[i].type;
153             mName = planeTypeNames[i].name;
154             break;
155         }
156     }
157 
158     return 0;
159 }
160 
Init(DrmDevice & drmDevice)161 int32_t DrmPlane::Init(DrmDevice &drmDevice)
162 {
163     DISPLAY_LOGD();
164     int32_t ret;
165     DrmProperty prop;
166     GetCrtcProp(drmDevice);
167     GetSrcProp(drmDevice);
168     GetNameProp(drmDevice);
169 
170     ret = drmDevice.GetPlaneProperty(*this, PROP_FBID, prop);
171     mPropFbId = prop.propId;
172     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not get plane fb id"));
173     ret = drmDevice.GetPlaneProperty(*this, PROP_IN_FENCE_FD, prop);
174     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get plane in fence prop id"));
175     mPropFenceInId = prop.propId;
176     ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_ID, prop);
177     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id"));
178     mPropCrtcId = prop.propId;
179 
180     ret = drmDevice.GetPlaneProperty(*this, PROP_ZPOS_ID, prop);
181     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id"));
182     mPropZposId = prop.propId;
183 
184     ret = drmDevice.GetPlaneProperty(*this, PROP_TYPE, prop);
185     DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id"));
186     switch (prop.value) {
187         case DRM_PLANE_TYPE_OVERLAY:
188         case DRM_PLANE_TYPE_PRIMARY:
189         case DRM_PLANE_TYPE_CURSOR:
190             mType = static_cast<uint32_t>(prop.value);
191             break;
192         default:
193             DISPLAY_LOGE("unknown type value %{public}" PRIu64 "", prop.value);
194             return DISPLAY_FAILURE;
195     }
196     return DISPLAY_SUCCESS;
197 }
198 } // namespace OHOS
199 } // namespace HDI
200 } // namespace DISPLAY
201