summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorHyunKyung Kim <hk310.kim@samsung.com>2020-06-17 20:48:02 +0900
committerHyunKyung Kim <hk310.kim@samsung.com>2020-06-25 19:31:00 +0900
commitfcd8759afb1af76bbbf14443323cb4d166c740ca (patch)
tree2da6e2998356bd3df62fd05e8b0a0a3657a9724b /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parentfe0091447756133a0181745f02f71bab72d9e296 (diff)
libhwc2.1: Support getDisplayIdentificationData in drm interface
Bug: 156691791 Signed-off-by: HyunKyung Kim <hk310.kim@samsung.com> Change-Id: I7f9954ea5ba4f53d688cceee732682cae1527523
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index 19bfa7f..b997b2b 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -1409,3 +1409,52 @@ void ExynosDisplayDrmInterface::DrmReadbackInfo::pickFormatDataspace(int32_t col
if (!mSupportedDataspaces.empty())
mReadbackDataspace = mSupportedDataspaces[0];
}
+
+int32_t ExynosDisplayDrmInterface::getDisplayIdentificationData(
+ uint8_t* outPort, uint32_t* outDataSize, uint8_t* outData)
+{
+ if ((mDrmDevice == nullptr) || (mDrmConnector == nullptr)) {
+ ALOGE("%s: display(%s) mDrmDevice(%p), mDrmConnector(%p)",
+ __func__, mExynosDisplay->mDisplayName.string(),
+ mDrmDevice, mDrmConnector);
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ if (mDrmConnector->edid_property().id() == 0) {
+ ALOGD("%s: edid_property is not supported",
+ mExynosDisplay->mDisplayName.string());
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ drmModePropertyBlobPtr blob;
+ int ret;
+ uint64_t blobId;
+
+ std::tie(ret, blobId) = mDrmConnector->edid_property().value();
+ if (ret) {
+ ALOGE("Failed to get edid property value.");
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+ if (blobId == 0) {
+ ALOGD("%s: edid_property is supported but blob is not valid",
+ mExynosDisplay->mDisplayName.string());
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ blob = drmModeGetPropertyBlob(mDrmDevice->fd(), blobId);
+ if (blob == nullptr) {
+ ALOGD("%s: Failed to get blob",
+ mExynosDisplay->mDisplayName.string());
+ return HWC2_ERROR_UNSUPPORTED;
+ }
+
+ if (outData) {
+ *outDataSize = std::min(*outDataSize, blob->length);
+ memcpy(outData, blob->data, *outDataSize);
+ } else {
+ *outDataSize = blob->length;
+ }
+ *outPort = mDrmConnector->id();
+
+ return HWC2_ERROR_NONE;
+}