summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy DeHaan <jdehaan@google.com>2023-02-14 16:39:35 -0800
committerJeremy DeHaan <jdehaan@google.com>2023-03-06 10:51:33 -0800
commit63a0f5a9767846308b109ddc22c9ecebd31a5a88 (patch)
treeb665a2fe5304baf7e2ebe640e86d3a402dd5e872
parent896de26fb1747138175169af681d92d93783113a (diff)
libhwc2.1: allow EDID descriptor to be modified
Allow the EDID monitor descriptor to be modified so that different panel revisions can have unique display ID's calculated. Bug: 217472351 Change-Id: I162778e6e30b2aac872d8070ce94b90c44e0619b Signed-off-by: Jeremy DeHaan <jdehaan@google.com>
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp8
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h4
2 files changed, 11 insertions, 1 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index 3746a46..a613314 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -431,7 +431,8 @@ int32_t ExynosDisplayDrmInterface::getDefaultModeId(int32_t *modeId) {
return NO_ERROR;
}
-ExynosDisplayDrmInterface::ExynosDisplayDrmInterface(ExynosDisplay *exynosDisplay)
+ExynosDisplayDrmInterface::ExynosDisplayDrmInterface(ExynosDisplay *exynosDisplay):
+ mMonitorDescription{0}
{
mType = INTERFACE_TYPE_DRM;
init(exynosDisplay);
@@ -2421,6 +2422,11 @@ int32_t ExynosDisplayDrmInterface::getDisplayFakeEdid(uint8_t &outPort, uint32_t
edid_buf[59] = height & 0xff;
edid_buf[61] = (height >> 4) & 0xf0;
+ if (mMonitorDescription[0] != 0) {
+ /* Descriptor block 3 starts at address 90, data offset is 5 bytes */
+ memcpy(&edid_buf[95], mMonitorDescription.data(), mMonitorDescription.size());
+ }
+
unsigned int sum = std::accumulate(edid_buf.begin(), edid_buf.end() - 1, 0);
edid_buf[127] = (0x100 - (sum & 0xFF)) & 0xFF;
if (outData) {
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h
index d3e9e66..bf5c9aa 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h
@@ -37,6 +37,9 @@
/* Max plane number of buffer object */
#define HWC_DRM_BO_MAX_PLANES 4
+/* Monitor Descriptor data is 13 bytes in VESA EDID Standard */
+#define MONITOR_DESCRIPTOR_DATA_LENGTH 13
+
#ifndef HWC_FORCE_PANIC_PATH
#define HWC_FORCE_PANIC_PATH "/d/dpu/panic"
#endif
@@ -492,6 +495,7 @@ class ExynosDisplayDrmInterface :
DrmReadbackInfo mReadbackInfo;
FramebufferManager mFBManager;
+ std::array<uint8_t, MONITOR_DESCRIPTOR_DATA_LENGTH> mMonitorDescription;
private:
int32_t getDisplayFakeEdid(uint8_t &outPort, uint32_t &outDataSize, uint8_t *outData);