aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrii Chepurnyi <andrii_chepurnyi@epam.com>2020-07-10 16:07:03 +0300
committerAndrii Chepurnyi <andrii_chepurnyi@epam.com>2020-09-11 16:00:02 +0300
commitadc5d8229b9ce25f1bf0e4d02bb838eae62b89fc (patch)
treed6956dd550c04b16db41e0553b350f281472969d
parent13cc3666c63010a4fc12568d645703bf365ccfc7 (diff)
downloaddrm_hwcomposer-adc5d8229b9ce25f1bf0e4d02bb838eae62b89fc.tar.gz
drm_hwcomposer: Fix EDID fetch from DRM
EDID fetch procedure consist of two steps: 1) get appropriate blob_id 2) fetch EDID blob using blob_id Those steps should be done sequentially, in other case drivers can update EDID and blob_id won't be actual. Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
-rw-r--r--DrmHwcTwo.cpp7
-rw-r--r--drm/DrmConnector.cpp29
-rw-r--r--drm/DrmConnector.h2
3 files changed, 28 insertions, 10 deletions
diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp
index 15fa324..65a317c 100644
--- a/DrmHwcTwo.cpp
+++ b/DrmHwcTwo.cpp
@@ -915,17 +915,12 @@ HWC2::Error DrmHwcTwo::HwcDisplay::GetDisplayIdentificationData(
supported(__func__);
drmModePropertyBlobPtr blob;
- int ret;
- uint64_t blob_id;
- std::tie(ret, blob_id) = connector_->edid_property().value();
- if (ret) {
+ if (connector_->GetEdidBlob(blob)) {
ALOGE("Failed to get edid property value.");
return HWC2::Error::Unsupported;
}
- blob = drmModeGetPropertyBlob(drm_->fd(), blob_id);
-
if (outData) {
*outDataSize = std::min(*outDataSize, blob->length);
memcpy(outData, blob->data, *outDataSize);
diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp
index 8fa47f5..0de0f91 100644
--- a/drm/DrmConnector.cpp
+++ b/drm/DrmConnector.cpp
@@ -58,10 +58,7 @@ int DrmConnector::Init() {
ALOGE("Could not get CRTC_ID property\n");
return ret;
}
- ret = drm_->GetConnectorProperty(*this, "EDID", &edid_property_);
- if (ret) {
- ALOGW("Could not get EDID property\n");
- }
+ ret = UpdateEdidProperty();
if (writeback()) {
ret = drm_->GetConnectorProperty(*this, "WRITEBACK_PIXEL_FORMATS",
&writeback_pixel_formats_);
@@ -85,6 +82,30 @@ int DrmConnector::Init() {
return 0;
}
+int DrmConnector::UpdateEdidProperty() {
+ int ret = drm_->GetConnectorProperty(*this, "EDID", &edid_property_);
+ if (ret) {
+ ALOGW("Could not get EDID property\n");
+ }
+ return ret;
+}
+
+int DrmConnector::GetEdidBlob(drmModePropertyBlobPtr &blob) {
+ uint64_t blob_id;
+ int ret = UpdateEdidProperty();
+ if (ret) {
+ return ret;
+ }
+
+ std::tie(ret, blob_id) = edid_property().value();
+ if (ret) {
+ return ret;
+ }
+
+ blob = drmModeGetPropertyBlob(drm_->fd(), blob_id);
+ return 0;
+}
+
uint32_t DrmConnector::id() const {
return id_;
}
diff --git a/drm/DrmConnector.h b/drm/DrmConnector.h
index 3fdf146..8533af8 100644
--- a/drm/DrmConnector.h
+++ b/drm/DrmConnector.h
@@ -40,6 +40,8 @@ class DrmConnector {
DrmConnector &operator=(const DrmProperty &) = delete;
int Init();
+ int UpdateEdidProperty();
+ int GetEdidBlob(drmModePropertyBlobPtr &blob);
uint32_t id() const;