From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Kocialkowski Subject: [PATCH 2/2] drm/i915: Detect monitor change from EDID change after resume Date: Mon, 24 Jul 2017 17:54:47 +0300 Message-ID: <20170724145447.23449-2-paul.kocialkowski@linux.intel.com> References: <20170724145447.23449-1-paul.kocialkowski@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170724145447.23449-1-paul.kocialkowski@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org Cc: Daniel Vetter , Paul Kocialkowski List-Id: dri-devel@lists.freedesktop.org VGhpcyBpbnRyb2R1Y2VzIGEgZGVkaWNhdGVkIHdvcmsgYW5kIHJlbGF0ZWQgaGVscGVycyB0byBk ZXRlY3Qgd2hldGhlcgphIG1vbml0b3Igd2FzIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIGR1cmlu ZyBzdXNwZW5kLiBUaGlzIGRldGVjdGlvbiBpcwpiYXNlZCBvbiBFRElEIGNoYW5nZSBkZXRlY3Rp b24sIHVzaW5nIHRoZSBhc3NvY2lhdGVkIGdlbmVyaWMgZHJtIGhlbHBlci4KClRoaXMgcmVxdWly ZXMgc3RvcmluZyBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSBpbnRlbF9jb25uZWN0b3Igc3RydWN0 dXJlLApzdWNoIGFzIHRoZSBpMmMgYWRhcHRlciByZXF1aXJlZCB0byBnZXQgdGhlIEVESUQuCgpT dXBwb3J0IGZvciB0aGlzIGlzIGludHJvZHVjZWQgZm9yIERQLCBIRE1JIGFuZCBWR0EuCgpTaWdu ZWQtb2ZmLWJ5OiBQYXVsIEtvY2lhbGtvd3NraSA8cGF1bC5rb2NpYWxrb3dza2lAbGludXguaW50 ZWwuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgICAgICB8ICAyICsr CiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oICAgICAgfCAgNSArKysrCiBkcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYyAgICAgfCAgMyArKysKIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2Rpc3BsYXkuYyB8IDUwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyAgICAgIHwgIDMgKysrCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCAgICAgfCAgNiArKysrKwogZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfaGRtaS5jICAgIHwgIDMgKysrCiA3IGZpbGVzIGNoYW5nZWQsIDcyIGlu c2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5j IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCAzYWM4MjE1YzBlMzYuLmIz Y2Y0MTEyZmM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC0xNzAyLDYgKzE3MDIsOCBA QCBzdGF0aWMgaW50IGk5MTVfZHJtX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCiAJ aW50ZWxfZGlzcGxheV9yZXN1bWUoZGV2KTsKIAorCWludGVsX2VkaWRfY2hhbmdlc19kZXRlY3Qo ZGV2KTsKKwogCWRybV9rbXNfaGVscGVyX3BvbGxfZW5hYmxlKGRldik7CiAKIAkvKgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZHJ2LmgKaW5kZXggYjA1MTEyMmM5NjBiLi4yYzE4OWE1YjcxNGUgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9kcnYuaApAQCAtMzkwNCw2ICszOTA0LDExIEBAIGludGVsX2Rpc3BsYXlfY2Fw dHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogZXh0 ZXJuIHZvaWQgaW50ZWxfZGlzcGxheV9wcmludF9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2k5MTVf ZXJyb3Jfc3RhdGVfYnVmICplLAogCQkJCQkgICAgc3RydWN0IGludGVsX2Rpc3BsYXlfZXJyb3Jf c3RhdGUgKmVycm9yKTsKIAorLyogZWRpZCBjaGFuZ2UgKi8KK3ZvaWQgaW50ZWxfZWRpZF9jaGFu Z2VfaW5pdChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgICAgc3RydWN0 IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaW50ZWxfZWRpZF9jaGFuZ2VzX2RldGVjdChz dHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwogaW50IHNhbmR5YnJpZGdlX3Bjb2RlX3JlYWQoc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgbWJveCwgdTMyICp2YWwpOwogaW50 IHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diwgdTMyIG1ib3gsIHUzMiB2YWwpOwogaW50IHNrbF9wY29kZV9yZXF1ZXN0KHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIG1ib3gsIHUzMiByZXF1ZXN0LApkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9jcnQuYwppbmRleCA4NGExZjVlODUxNTMuLjYzZTIxODRhNmVhNCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfY3J0LmMKQEAgLTkyNSw2ICs5MjUsOSBAQCB2b2lkIGludGVsX2NydF9pbml0 KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIAkgKi8KIAljcnQtPmZvcmNlX2hv dHBsdWdfcmVxdWlyZWQgPSAwOwogCisJaW50ZWxfZWRpZF9jaGFuZ2VfaW5pdChpbnRlbF9jb25u ZWN0b3IsCisJCQkgICAgICAgaW50ZWxfZ21idXNfZ2V0X2FkYXB0ZXIoZGV2X3ByaXYsIGRldl9w cml2LT52YnQuY3J0X2RkY19waW4pKTsKKwogCS8qCiAJICogVE9ETzogZmluZCBhIHByb3BlciB3 YXkgdG8gZGlzY292ZXIgd2hldGhlciB3ZSBuZWVkIHRvIHNldCB0aGUgdGhlCiAJICogcG9sYXJp dHkgYW5kIGxpbmsgcmV2ZXJzYWwgYml0cyBvciBub3QsIGluc3RlYWQgb2YgcmVseWluZyBvbiB0 aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCA2YzgyM2NjMDJkYjMuLjY5 ZTMwNjc1OWEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxh eS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMTUwMTYs MyArMTUwMTYsNTMgQEAgaW50ZWxfZGlzcGxheV9wcmludF9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJt X2k5MTVfZXJyb3Jfc3RhdGVfYnVmICptLAogfQogCiAjZW5kaWYKKworc3RhdGljIHZvaWQgaW50 ZWxfZWRpZF9jaGFuZ2Vfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlz dHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IgPQorCQljb250YWluZXJfb2Yod29yaywg c3RydWN0IGludGVsX2Nvbm5lY3RvciwgZWRpZF9jaGFuZ2Vfd29yayk7CisJYm9vbCBjaGFuZ2Vk OworCisJY2hhbmdlZCA9IGRybV9jaGVja19lZGlkX2NoYW5nZWQoJmNvbm5lY3Rvci0+YmFzZSwg Y29ubmVjdG9yLT5hZGFwdGVyKTsKKwlpZiAoY2hhbmdlZCkgeworCQlEUk1fREVCVUdfS01TKCJb Q09OTkVDVE9SOiVkOiVzXSBFRElEIGNoYW5nZSBkZXRlY3RlZFxuIiwKKwkJCSAgICAgIGNvbm5l Y3Rvci0+YmFzZS5iYXNlLmlkLCBjb25uZWN0b3ItPmJhc2UubmFtZSk7CisKKwkJZHJtX2ttc19o ZWxwZXJfaG90cGx1Z19ldmVudChjb25uZWN0b3ItPmJhc2UuZGV2KTsKKwl9Cit9CisKKy8qKgor ICogaW50ZWxfZWRpZF9jaGFuZ2VfaW5pdCAtIGluaXQgdGhlIEVESUQgY2hhbmdlIGRhdGEKKyAq IEBjb25uZWN0b3I6IERSTSBjb25uZWN0b3IgZGV2aWNlIHRvIHVzZQorICogQGFkYXB0ZXI6IGky YyBhZGFwdGVyCisgKgorICogU3RvcmUgdGhlIGkyYyBhZGFwdGVyIGFuZCBpbml0aWFsaXplIHRo ZSBFRElEIGNoYW5nZSBkZXRlY3Rpb24gd29yay4KKyAqLwordm9pZCBpbnRlbF9lZGlkX2NoYW5n ZV9pbml0KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCSAgICBzdHJ1Y3Qg aTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJY29ubmVjdG9yLT5hZGFwdGVyID0gYWRhcHRlcjsK KworCUlOSVRfV09SSygmY29ubmVjdG9yLT5lZGlkX2NoYW5nZV93b3JrLCBpbnRlbF9lZGlkX2No YW5nZV93b3JrX2Z1bmMpOworfQorCisvKioKKyAqIGludGVsX2VkaWRfY2hhbmdlc19kZXRlY3Qg LSBkZXRlY3QgRURJRCBjaGFuZ2VzIHRvIGNvbm5lY3RvcnMKKyAqIEBkZXY6IERSTSBkZXZpY2Ug dG8gZ2V0IGNvbm5lY3RvcnMgZnJvbQorICoKKyAqIFNjaGVkdWxlIHRoZSBFRElEIGRldGVjdGlv biBjaGFuZ2Ugd29yayBmb3IgYWxsIHJlZ2lzdGVyZWQgY29ubmVjdG9ycy4KKyAqLwordm9pZCBp bnRlbF9lZGlkX2NoYW5nZXNfZGV0ZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3Ry dWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fY29ubmVjdG9yX2xp c3RfaXRlciBjb25uX2l0ZXI7CisKKwlkcm1fY29ubmVjdG9yX2xpc3RfaXRlcl9iZWdpbihkZXYs ICZjb25uX2l0ZXIpOworCWZvcl9lYWNoX2ludGVsX2Nvbm5lY3Rvcl9pdGVyKGNvbm5lY3Rvciwg JmNvbm5faXRlcikgeworCQlpZiAoIWNvbm5lY3Rvci0+YWRhcHRlcikKKwkJCWNvbnRpbnVlOwor CisJCXNjaGVkdWxlX3dvcmsoJmNvbm5lY3Rvci0+ZWRpZF9jaGFuZ2Vfd29yayk7CisJfQorfQpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggMmQ0MmQwOTQyOGM5Li5iYzRkYmIwNzYwOTYgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtNjA2Myw2ICs2MDYzLDkgQEAgaW50ZWxfZHBfaW5p dF9jb25uZWN0b3Ioc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQsCiAJ CWdvdG8gZmFpbDsKIAl9CiAKKwlpZiAoIWlzX2VkcChpbnRlbF9kcCkpCisJCWludGVsX2VkaWRf Y2hhbmdlX2luaXQoaW50ZWxfY29ubmVjdG9yLCAmaW50ZWxfZHAtPmF1eC5kZGMpOworCiAJaW50 ZWxfZHBfYWRkX3Byb3BlcnRpZXMoaW50ZWxfZHAsIGNvbm5lY3Rvcik7CiAKIAkvKiBGb3IgRzRY IGRlc2t0b3AgY2hpcCwgUEVHX0JBTkRfR0FQX0RBVEEgMzowIG11c3QgZmlyc3QgYmUgd3JpdHRl bgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmggYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAppbmRleCAwMjFjYzU0ODc4NTMuLjQ3ZDM1MGQyZjk5 MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTMxOSw2ICszMTksMTIgQEAgc3RydWN0 IGludGVsX2Nvbm5lY3RvciB7CiAJc3RydWN0IGVkaWQgKmVkaWQ7CiAJc3RydWN0IGVkaWQgKmRl dGVjdF9lZGlkOwogCisJLyogSTJDIGFkYXB0ZXIgdG8gcmV0cmlldmUgdGhlIEVESUQuICovCisJ c3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOworCisJLyogV29yayB0byBkZXRlY3QgRURJRCBj aGFuZ2UuICovCisJc3RydWN0IHdvcmtfc3RydWN0IGVkaWRfY2hhbmdlX3dvcms7CisKIAkvKiBz aW5jZSBQT0xMIGFuZCBIUEQgY29ubmVjdG9ycyBtYXkgdXNlIHRoZSBzYW1lIEhQRCBsaW5lIGtl ZXAgdGhlIG5hdGl2ZQogCSAgIHN0YXRlIG9mIGNvbm5lY3Rvci0+cG9sbGVkIGluIGNhc2UgaG90 cGx1ZyBzdG9ybSBkZXRlY3Rpb24gY2hhbmdlcyBpdCAqLwogCXU4IHBvbGxlZDsKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2hkbWkuYwppbmRleCAyZjgzMWNmZGQyNDMuLmE2Y2U3N2Y4MTY2OCAxMDA2NDQK LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2hkbWkuYwpAQCAtMTkwOSw2ICsxOTA5LDkgQEAgdm9pZCBpbnRlbF9o ZG1pX2luaXRfY29ubmVjdG9yKHN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19w b3J0LAogCWVsc2UKIAkJaW50ZWxfY29ubmVjdG9yLT5nZXRfaHdfc3RhdGUgPSBpbnRlbF9jb25u ZWN0b3JfZ2V0X2h3X3N0YXRlOwogCisJaW50ZWxfZWRpZF9jaGFuZ2VfaW5pdChpbnRlbF9jb25u ZWN0b3IsCisJCQkgICAgICAgaW50ZWxfZ21idXNfZ2V0X2FkYXB0ZXIoZGV2X3ByaXYsIGludGVs X2hkbWktPmRkY19idXMpKTsKKwogCWludGVsX2hkbWlfYWRkX3Byb3BlcnRpZXMoaW50ZWxfaGRt aSwgY29ubmVjdG9yKTsKIAogCWludGVsX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcihpbnRlbF9j b25uZWN0b3IsIGludGVsX2VuY29kZXIpOwotLSAKMi4xMy4yCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756323AbdGXOzX (ORCPT ); Mon, 24 Jul 2017 10:55:23 -0400 Received: from mga03.intel.com ([134.134.136.65]:37051 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756228AbdGXOzI (ORCPT ); Mon, 24 Jul 2017 10:55:08 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,407,1496127600"; d="scan'208";a="1154738519" From: Paul Kocialkowski To: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, intel-gfx@lists.freedesktop.org Cc: Daniel Vetter , Jani Nikula , Sean Paul , David Airlie , Paul Kocialkowski Subject: [PATCH 2/2] drm/i915: Detect monitor change from EDID change after resume Date: Mon, 24 Jul 2017 17:54:47 +0300 Message-Id: <20170724145447.23449-2-paul.kocialkowski@linux.intel.com> X-Mailer: git-send-email 2.13.2 In-Reply-To: <20170724145447.23449-1-paul.kocialkowski@linux.intel.com> References: <20170724145447.23449-1-paul.kocialkowski@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This introduces a dedicated work and related helpers to detect whether a monitor was replaced by another one during suspend. This detection is based on EDID change detection, using the associated generic drm helper. This requires storing more information to the intel_connector structure, such as the i2c adapter required to get the EDID. Support for this is introduced for DP, HDMI and VGA. Signed-off-by: Paul Kocialkowski --- drivers/gpu/drm/i915/i915_drv.c | 2 ++ drivers/gpu/drm/i915/i915_drv.h | 5 ++++ drivers/gpu/drm/i915/intel_crt.c | 3 +++ drivers/gpu/drm/i915/intel_display.c | 50 ++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_dp.c | 3 +++ drivers/gpu/drm/i915/intel_drv.h | 6 +++++ drivers/gpu/drm/i915/intel_hdmi.c | 3 +++ 7 files changed, 72 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 3ac8215c0e36..b3cf4112fc65 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -1702,6 +1702,8 @@ static int i915_drm_resume(struct drm_device *dev) intel_display_resume(dev); + intel_edid_changes_detect(dev); + drm_kms_helper_poll_enable(dev); /* diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index b051122c960b..2c189a5b714e 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -3904,6 +3904,11 @@ intel_display_capture_error_state(struct drm_i915_private *dev_priv); extern void intel_display_print_error_state(struct drm_i915_error_state_buf *e, struct intel_display_error_state *error); +/* edid change */ +void intel_edid_change_init(struct intel_connector *connector, + struct i2c_adapter *adapter); +void intel_edid_changes_detect(struct drm_device *dev); + int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 *val); int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val); int skl_pcode_request(struct drm_i915_private *dev_priv, u32 mbox, u32 request, diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 84a1f5e85153..63e2184a6ea4 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -925,6 +925,9 @@ void intel_crt_init(struct drm_i915_private *dev_priv) */ crt->force_hotplug_required = 0; + intel_edid_change_init(intel_connector, + intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin)); + /* * TODO: find a proper way to discover whether we need to set the the * polarity and link reversal bits or not, instead of relying on the diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 6c823cc02db3..69e306759a02 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -15016,3 +15016,53 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m, } #endif + +static void intel_edid_change_work_func(struct work_struct *work) +{ + struct intel_connector *connector = + container_of(work, struct intel_connector, edid_change_work); + bool changed; + + changed = drm_check_edid_changed(&connector->base, connector->adapter); + if (changed) { + DRM_DEBUG_KMS("[CONNECTOR:%d:%s] EDID change detected\n", + connector->base.base.id, connector->base.name); + + drm_kms_helper_hotplug_event(connector->base.dev); + } +} + +/** + * intel_edid_change_init - init the EDID change data + * @connector: DRM connector device to use + * @adapter: i2c adapter + * + * Store the i2c adapter and initialize the EDID change detection work. + */ +void intel_edid_change_init(struct intel_connector *connector, + struct i2c_adapter *adapter) +{ + connector->adapter = adapter; + + INIT_WORK(&connector->edid_change_work, intel_edid_change_work_func); +} + +/** + * intel_edid_changes_detect - detect EDID changes to connectors + * @dev: DRM device to get connectors from + * + * Schedule the EDID detection change work for all registered connectors. + */ +void intel_edid_changes_detect(struct drm_device *dev) +{ + struct intel_connector *connector; + struct drm_connector_list_iter conn_iter; + + drm_connector_list_iter_begin(dev, &conn_iter); + for_each_intel_connector_iter(connector, &conn_iter) { + if (!connector->adapter) + continue; + + schedule_work(&connector->edid_change_work); + } +} diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 2d42d09428c9..bc4dbb076096 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -6063,6 +6063,9 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, goto fail; } + if (!is_edp(intel_dp)) + intel_edid_change_init(intel_connector, &intel_dp->aux.ddc); + intel_dp_add_properties(intel_dp, connector); /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 021cc5487853..47d350d2f993 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -319,6 +319,12 @@ struct intel_connector { struct edid *edid; struct edid *detect_edid; + /* I2C adapter to retrieve the EDID. */ + struct i2c_adapter *adapter; + + /* Work to detect EDID change. */ + struct work_struct edid_change_work; + /* since POLL and HPD connectors may use the same HPD line keep the native state of connector->polled in case hotplug storm detection changes it */ u8 polled; diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 2f831cfdd243..a6ce77f81668 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -1909,6 +1909,9 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, else intel_connector->get_hw_state = intel_connector_get_hw_state; + intel_edid_change_init(intel_connector, + intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus)); + intel_hdmi_add_properties(intel_hdmi, connector); intel_connector_attach_encoder(intel_connector, intel_encoder); -- 2.13.2