From patchwork Wed Feb 5 19:04:08 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodrigo Vivi X-Patchwork-Id: 3588451 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 62FEAC02DC for ; Wed, 5 Feb 2014 19:03:41 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 734C820163 for ; Wed, 5 Feb 2014 19:03:40 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 897C620158 for ; Wed, 5 Feb 2014 19:03:39 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8EC2348F2; Wed, 5 Feb 2014 11:03:37 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by gabe.freedesktop.org (Postfix) with ESMTP id EDABD48F2 for ; Wed, 5 Feb 2014 11:03:35 -0800 (PST) Received: by mail-pa0-f52.google.com with SMTP id bj1so719620pad.11 for ; Wed, 05 Feb 2014 11:03:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zfrTS0H/ic547TzWItXVLCmYJIB4E74cumpwW5b9PwY=; b=QEFTklk3vkXd1NXAXliLk0/qZaVM++DB3KXKMXrFuOE2bVMOa/jqI/MTDPtkT+Lwdq 2O5rVVGy7qs+INPBnol+qLXjgcp0HBsiR4nG07hSf4OIMSfLVCvmFun22WUUstE4fczC qDlYjjLOfvOluzdYCSnozRwVs12JsmJGSTFGP11XLtwtt70Tpsxn1yGG2by9dC7/cpXH WDpnK8HcWAkG5tqWzxdhiIJ6rOK9MT8AaQrqBbLcFerxGCUi0xP09u55ET8lj49TkKMT wpYDj/9WXc2G/ozf0haPA8S+psD4LSI0aet52Co/PhkMgc02N5ViSDzxSJZUrqKpKdO/ hkhw== X-Received: by 10.68.202.225 with SMTP id kl1mr4484334pbc.54.1391627015733; Wed, 05 Feb 2014 11:03:35 -0800 (PST) Received: from localhost (jfdmzpr06-ext.jf.intel.com. [134.134.137.75]) by mx.google.com with ESMTPSA id ei4sm79139058pbb.42.2014.02.05.11.03.34 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Feb 2014 11:03:34 -0800 (PST) From: Rodrigo Vivi To: intel-gfx@lists.freedesktop.org Date: Wed, 5 Feb 2014 17:04:08 -0200 Message-Id: <1391627048-10034-1-git-send-email-rodrigo.vivi@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1390501010-4641-3-git-send-email-rodrigo.vivi@gmail.com> References: <1390501010-4641-3-git-send-email-rodrigo.vivi@gmail.com> Subject: [Intel-gfx] [PATCH 1/2] drm/i915: Update PSR on resume. X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, 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 Since now on update is also been called out of set_base let's use a mutex to protec psr state changes. Signed-off-by: Rodrigo Vivi --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/i915_suspend.c | 4 ++++ drivers/gpu/drm/i915/intel_dp.c | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 7c53d4d..21470be 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -747,6 +747,7 @@ struct i915_psr { bool sink_support; bool source_ok; bool setup_done; + struct mutex lock; }; enum intel_pch { diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 56785e8..ffcba21 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c @@ -288,6 +288,10 @@ static void i915_restore_display(struct drm_device *dev) I915_WRITE(PP_CONTROL, dev_priv->regfile.savePP_CONTROL); } + /* Force a full PSR setup on resume */ + dev_priv->psr.setup_done = false; + intel_edp_psr_update(dev); + /* only restore FBC info on the platform that supports FBC*/ intel_disable_fbc(dev); diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 30d4350..80054bb 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -1633,6 +1633,8 @@ static void intel_edp_psr_setup(struct intel_dp *intel_dp) if (dev_priv->psr.setup_done) return; + mutex_init(&dev_priv->psr.lock); + /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */ memset(&psr_vsc, 0, sizeof(psr_vsc)); psr_vsc.sdp_header.HB0 = 0; @@ -1777,9 +1779,6 @@ static void intel_edp_psr_do_enable(struct intel_dp *intel_dp) intel_edp_is_psr_enabled(dev)) return; - /* Setup PSR once */ - intel_edp_psr_setup(intel_dp); - /* Enable PSR on the panel */ intel_edp_psr_enable_sink(intel_dp); @@ -1790,10 +1789,16 @@ static void intel_edp_psr_do_enable(struct intel_dp *intel_dp) void intel_edp_psr_enable(struct intel_dp *intel_dp) { struct drm_device *dev = intel_dp_to_dev(intel_dp); + struct drm_i915_private *dev_priv = dev->dev_private; + /* Setup PSR once */ + intel_edp_psr_setup(intel_dp); + + mutex_lock(&dev_priv->psr.lock); if (intel_edp_psr_match_conditions(intel_dp) && !intel_edp_is_psr_enabled(dev)) intel_edp_psr_do_enable(intel_dp); + mutex_unlock(&dev_priv->psr.lock); } void intel_edp_psr_disable(struct intel_dp *intel_dp) @@ -1815,9 +1820,13 @@ void intel_edp_psr_disable(struct intel_dp *intel_dp) void intel_edp_psr_update(struct drm_device *dev) { + struct drm_i915_private *dev_priv = dev->dev_private; struct intel_encoder *encoder; struct intel_dp *intel_dp = NULL; + if (!dev_priv->psr.setup_done) + return; + list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) if (encoder->type == INTEL_OUTPUT_EDP) { intel_dp = enc_to_intel_dp(&encoder->base); @@ -1825,11 +1834,13 @@ void intel_edp_psr_update(struct drm_device *dev) if (!is_edp_psr(dev)) return; + mutex_lock(&dev_priv->psr.lock); if (!intel_edp_psr_match_conditions(intel_dp)) intel_edp_psr_disable(intel_dp); else if (!intel_edp_is_psr_enabled(dev)) intel_edp_psr_do_enable(intel_dp); + mutex_unlock(&dev_priv->psr.lock); } }