diff options
author | Andrii Chepurnyi <andrii_chepurnyi@epam.com> | 2020-07-10 16:07:03 +0300 |
---|---|---|
committer | Andrii Chepurnyi <andrii_chepurnyi@epam.com> | 2020-09-11 16:00:02 +0300 |
commit | adc5d8229b9ce25f1bf0e4d02bb838eae62b89fc (patch) | |
tree | d6956dd550c04b16db41e0553b350f281472969d | |
parent | 13cc3666c63010a4fc12568d645703bf365ccfc7 (diff) | |
download | drm_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.cpp | 7 | ||||
-rw-r--r-- | drm/DrmConnector.cpp | 29 | ||||
-rw-r--r-- | drm/DrmConnector.h | 2 |
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; |