From patchwork Tue Jun 30 05:43:58 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sonika.jindal@intel.com X-Patchwork-Id: 6693571 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 50DD69F1C1 for ; Tue, 30 Jun 2015 05:54:13 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 73C0E20379 for ; Tue, 30 Jun 2015 05:54:12 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 9A2B120377 for ; Tue, 30 Jun 2015 05:54:11 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 272456E1AC; Mon, 29 Jun 2015 22:54:11 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id B3C9B6E1AC for ; Mon, 29 Jun 2015 22:54:10 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP; 29 Jun 2015 22:54:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,375,1432623600"; d="scan'208";a="516379374" Received: from sonikaji-desktop.iind.intel.com ([10.223.25.81]) by FMSMGA003.fm.intel.com with ESMTP; 29 Jun 2015 22:54:09 -0700 From: Sonika Jindal To: intel-gfx@lists.freedesktop.org Date: Tue, 30 Jun 2015 11:13:58 +0530 Message-Id: <1435643038-3078-3-git-send-email-sonika.jindal@intel.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1435643038-3078-1-git-send-email-sonika.jindal@intel.com> References: <1435643038-3078-1-git-send-email-sonika.jindal@intel.com> Cc: Shashank Sharma Subject: [Intel-gfx] [PATCH 3/3] drm/i915: Read HDMI EDID only when required X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Shashank Sharma This patch makes sure that the HDMI detect function reads EDID only when its forced to do it. All the other times, it uses the connector->detect_edid which was cached during hotplug handling in the hdmi_probe() function. As the probe function gets called before detect in the interrupt handler and handles the EDID cacheing part, its absolutely safe to assume that presence of EDID reflects monitor connected and viceversa. This will save us from many race conditions between hotplug/unplug detect call handler threads and userspace calls for the same. The previous patch in this patch series explains this in detail. Signed-off-by: Shashank Sharma Tested-By: Intel Graphics QA PRTS (Patch Regression Test System Contact: shuang.he@intel.com) --- drivers/gpu/drm/i915/intel_hdmi.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 064ddd8..1fb6919 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -1362,19 +1362,33 @@ static enum drm_connector_status intel_hdmi_detect(struct drm_connector *connector, bool force) { enum drm_connector_status status; + struct intel_connector *intel_connector = + to_intel_connector(connector); DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, connector->name); + /* + * There are many userspace calls which probe EDID from + * detect path. In case on multiple hotplug/unplug, these + * can cause race conditions while probing EDID. Also its + * waste of CPU cycles to read the EDID again and again + * unless there is a real hotplug. + * So until we are forced, check connector status + * based on availability of cached EDID. This will avoid many of + * these race conditions and timing problems. + */ + if (force) + intel_hdmi_probe(intel_connector->encoder); - intel_hdmi_unset_edid(connector); - - if (intel_hdmi_set_edid(connector)) { + if (intel_connector->detect_edid) { struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); - - hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI; status = connector_status_connected; - } else + hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI; + DRM_DEBUG_DRIVER("hdmi status = connected\n"); + } else { status = connector_status_disconnected; + DRM_DEBUG_DRIVER("hdmi status = disconnected\n"); + } return status; }