summaryrefslogtreecommitdiffstats
path: root/src/platformsupport
diff options
context:
space:
mode:
authorPier Luigi Fiorini <pierluigi.fiorini@liri.io>2016-12-14 07:21:44 +0100
committerPier Luigi Fiorini <pierluigi.fiorini@liri.io>2017-05-02 12:07:05 +0000
commit3792ab804dc803f8cbb167178e499f9d5d9b6310 (patch)
treeeb5765ec93607eb0166a4baf9a89f0dac0dccc7c /src/platformsupport
parent5f7ab880558240be952b17a5dc0c9ea3805fc5cf (diff)
eglfs_kms: Decode EDID blob
Retrieve and parse EDID blob. Return screen product information from EDID. [ChangeLog][QPA][eglfs][kms] Add screen product information from EDID. Change-Id: I766999afd9298e82f6147fdeba5d14757bfb4b03 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/platformsupport')
-rw-r--r--src/platformsupport/kmsconvenience/qkmsdevice.cpp23
-rw-r--r--src/platformsupport/kmsconvenience/qkmsdevice_p.h2
2 files changed, 25 insertions, 0 deletions
diff --git a/src/platformsupport/kmsconvenience/qkmsdevice.cpp b/src/platformsupport/kmsconvenience/qkmsdevice.cpp
index fcc068c202..71b7633e6c 100644
--- a/src/platformsupport/kmsconvenience/qkmsdevice.cpp
+++ b/src/platformsupport/kmsconvenience/qkmsdevice.cpp
@@ -336,6 +336,7 @@ QPlatformScreen *QKmsDevice::createScreenForConnector(drmModeResPtr resources,
modes,
connector->subpixel,
connectorProperty(connector, QByteArrayLiteral("DPMS")),
+ connectorPropertyBlob(connector, QByteArrayLiteral("EDID")),
false,
0,
false
@@ -383,6 +384,23 @@ drmModePropertyPtr QKmsDevice::connectorProperty(drmModeConnectorPtr connector,
return Q_NULLPTR;
}
+drmModePropertyBlobPtr QKmsDevice::connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name)
+{
+ drmModePropertyPtr prop;
+ drmModePropertyBlobPtr blob = nullptr;
+
+ for (int i = 0; i < connector->count_props && !blob; i++) {
+ prop = drmModeGetProperty(m_dri_fd, connector->props[i]);
+ if (!prop)
+ continue;
+ if ((prop->flags & DRM_MODE_PROP_BLOB) && (strcmp(prop->name, name.constData()) == 0))
+ blob = drmModeGetPropertyBlob(m_dri_fd, connector->prop_values[i]);
+ drmModeFreeProperty(prop);
+ }
+
+ return blob;
+}
+
QKmsDevice::QKmsDevice(QKmsScreenConfig *screenConfig, const QString &path)
: m_screenConfig(screenConfig)
, m_path(path)
@@ -627,6 +645,11 @@ void QKmsOutput::cleanup(QKmsDevice *device)
dpms_prop = nullptr;
}
+ if (edid_blob) {
+ drmModeFreePropertyBlob(edid_blob);
+ edid_blob = nullptr;
+ }
+
restoreMode(device);
if (saved_crtc) {
diff --git a/src/platformsupport/kmsconvenience/qkmsdevice_p.h b/src/platformsupport/kmsconvenience/qkmsdevice_p.h
index 55b572f0dd..964a0b1775 100644
--- a/src/platformsupport/kmsconvenience/qkmsdevice_p.h
+++ b/src/platformsupport/kmsconvenience/qkmsdevice_p.h
@@ -107,6 +107,7 @@ struct QKmsOutput
QList<drmModeModeInfo> modes;
int subpixel;
drmModePropertyPtr dpms_prop;
+ drmModePropertyBlobPtr edid_blob;
bool wants_plane;
uint32_t plane_id;
bool plane_set;
@@ -154,6 +155,7 @@ protected:
drmModeConnectorPtr connector,
VirtualDesktopInfo *vinfo);
drmModePropertyPtr connectorProperty(drmModeConnectorPtr connector, const QByteArray &name);
+ drmModePropertyBlobPtr connectorPropertyBlob(drmModeConnectorPtr connector, const QByteArray &name);
QKmsScreenConfig *m_screenConfig;
QString m_path;