diff options
author | Pier Luigi Fiorini <pierluigi.fiorini@liri.io> | 2016-12-14 07:21:44 +0100 |
---|---|---|
committer | Pier Luigi Fiorini <pierluigi.fiorini@liri.io> | 2017-05-02 12:07:05 +0000 |
commit | 3792ab804dc803f8cbb167178e499f9d5d9b6310 (patch) | |
tree | eb5765ec93607eb0166a4baf9a89f0dac0dccc7c /src/platformsupport/kmsconvenience | |
parent | 5f7ab880558240be952b17a5dc0c9ea3805fc5cf (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/kmsconvenience')
-rw-r--r-- | src/platformsupport/kmsconvenience/qkmsdevice.cpp | 23 | ||||
-rw-r--r-- | src/platformsupport/kmsconvenience/qkmsdevice_p.h | 2 |
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; |