These changes avoid following logcat error on integrated and dedicated GPUs: ... 2245 2245 E hwc-drm-resources: Could not find a suitable encoder/crtc for display 2 ... 2245 2245 E hwc-drm-resources: Failed CreateDisplayPipe 56 with -19 ... 2245 2245 E hwcomposer-drm: Can't initialize Drm object -19 (v1) There are various places where we should be really taking connection state into account before querying the properties or assuming it as primary. This patch fixes them. BUG=None. TEST=System boots up and shows UI. (v1) Signed-off-by: Jim Bish <jim.bish@xxxxxxxxx> (v2) porting of original commit 76fb87e675 of android-ia master with additional external connector types (DisplayPort, DVID, DVII, VGA) Tested with i965 on Sandybridge and nouveau on GT120, GT610 --- drmconnector.cpp | 4 +++- drmresources.cpp | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/drmconnector.cpp b/drmconnector.cpp index 247f56b..145518f 100644 --- a/drmconnector.cpp +++ b/drmconnector.cpp @@ -73,7 +73,9 @@ bool DrmConnector::internal() const { } bool DrmConnector::external() const { - return type_ == DRM_MODE_CONNECTOR_HDMIA; + return type_ == DRM_MODE_CONNECTOR_HDMIA || type_ == DRM_MODE_CONNECTOR_DisplayPort || + type_ == DRM_MODE_CONNECTOR_DVID || type_ == DRM_MODE_CONNECTOR_DVII || + type_ == DRM_MODE_CONNECTOR_VGA; } bool DrmConnector::valid_type() const { diff --git a/drmresources.cpp b/drmresources.cpp index 32dd376..d582cfe 100644 --- a/drmresources.cpp +++ b/drmresources.cpp @@ -159,7 +159,7 @@ int DrmResources::Init() { // First look for primary amongst internal connectors for (auto &conn : connectors_) { - if (conn->internal() && !found_primary) { + if (conn->state() == DRM_MODE_CONNECTED && conn->internal() && !found_primary) { conn->set_display(0); found_primary = true; } else { @@ -170,7 +170,7 @@ int DrmResources::Init() { // Then look for primary amongst external connectors for (auto &conn : connectors_) { - if (conn->external() && !found_primary) { + if (conn->state() == DRM_MODE_CONNECTED && conn->external() && !found_primary) { conn->set_display(0); found_primary = true; } @@ -288,6 +288,11 @@ int DrmResources::TryEncoderForDisplay(int display, DrmEncoder *enc) { int DrmResources::CreateDisplayPipe(DrmConnector *connector) { int display = connector->display(); + + // skip not connected + if (connector->state() == DRM_MODE_DISCONNECTED) + return 0; + /* Try to use current setup first */ if (connector->encoder()) { int ret = TryEncoderForDisplay(display, connector->encoder()); -- 2.14.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel