From patchwork Mon Nov 25 23:38:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Souza, Jose" X-Patchwork-Id: 11261223 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 54E62913 for ; Mon, 25 Nov 2019 23:38:40 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3D4D32071A for ; Mon, 25 Nov 2019 23:38:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3D4D32071A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 786D989D7C; Mon, 25 Nov 2019 23:38:39 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id 22BE289D7C for ; Mon, 25 Nov 2019 23:38:37 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Nov 2019 15:38:37 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,243,1571727600"; d="scan'208";a="260538799" Received: from josouza-mobl.jf.intel.com (HELO josouza-MOBL.intel.com) ([10.24.8.225]) by FMSMGA003.fm.intel.com with ESMTP; 25 Nov 2019 15:38:37 -0800 From: =?utf-8?q?Jos=C3=A9_Roberto_de_Souza?= To: intel-gfx@lists.freedesktop.org Date: Mon, 25 Nov 2019 15:38:26 -0800 Message-Id: <20191125233826.161899-1-jose.souza@intel.com> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH] drm/i915/display: Force the state compute phase once to enable PSR X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: s.zharkoff@gmail.com Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Recent improvements in the state tracking in i915 caused PSR to not be enabled when reusing firmware/BIOS modeset, this is due to all initial commits returning ealier in intel_atomic_check() as needs_modeset() is always false. To fix that here forcing the state compute phase in CRTC that is driving the eDP that supports PSR once. Enable or disable PSR do not require a fullmodeset, so user will still experience glitch free boot process plus the power savings that PSR brings. It was tried to set mode_changed in intel_initial_commit() but at this point the connectors are not registered causing a crash when computing encoder state. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112253 Reported-by: Cc: Gwan-gyeong Mun Signed-off-by: José Roberto de Souza --- drivers/gpu/drm/i915/display/intel_atomic.c | 6 ++++ drivers/gpu/drm/i915/display/intel_psr.c | 32 +++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_psr.h | 5 ++++ drivers/gpu/drm/i915/i915_drv.h | 1 + 4 files changed, 44 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c index fd0026fc3618..6b57488d9238 100644 --- a/drivers/gpu/drm/i915/display/intel_atomic.c +++ b/drivers/gpu/drm/i915/display/intel_atomic.c @@ -37,6 +37,7 @@ #include "intel_atomic.h" #include "intel_display_types.h" #include "intel_hdcp.h" +#include "intel_psr.h" #include "intel_sprite.h" /** @@ -127,6 +128,7 @@ int intel_digital_connector_atomic_check(struct drm_connector *conn, struct intel_digital_connector_state *old_conn_state = to_intel_digital_connector_state(old_state); struct drm_crtc_state *crtc_state; + int ret; intel_hdcp_atomic_check(conn, old_state, new_state); @@ -149,6 +151,10 @@ int intel_digital_connector_atomic_check(struct drm_connector *conn, old_conn_state->base.hdr_output_metadata)) crtc_state->mode_changed = true; + ret = intel_psr_atomic_check(conn, state); + if (ret) + return ret; + return 0; } diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c index c1d133362b76..a1acae8d72f7 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.c +++ b/drivers/gpu/drm/i915/display/intel_psr.c @@ -1444,3 +1444,35 @@ bool intel_psr_enabled(struct intel_dp *intel_dp) return ret; } + +int +intel_psr_atomic_check(struct drm_connector *conn, + struct drm_atomic_state *state) +{ + struct drm_i915_private *dev_priv = to_i915(conn->dev); + struct drm_connector_state *conn_state; + struct intel_digital_port *dig_port; + struct intel_connector *intel_conn; + struct drm_crtc_state *crtc_state; + + if (!CAN_PSR(dev_priv)) + return 0; + + conn_state = drm_atomic_get_new_connector_state(state, conn); + if (!conn_state->crtc) + return 0; + + intel_conn = to_intel_connector(conn); + dig_port = enc_to_dig_port(&intel_conn->encoder->base); + if (dev_priv->psr.dp != &dig_port->dp) + return 0; + + if (dev_priv->psr.initially_probed) + return 0; + + crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); + crtc_state->mode_changed = true; + dev_priv->psr.initially_probed = true; + + return 0; +} diff --git a/drivers/gpu/drm/i915/display/intel_psr.h b/drivers/gpu/drm/i915/display/intel_psr.h index 46e4de8b8cd5..b3535e5752a6 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.h +++ b/drivers/gpu/drm/i915/display/intel_psr.h @@ -6,6 +6,9 @@ #ifndef __INTEL_PSR_H__ #define __INTEL_PSR_H__ +#include +#include + #include "intel_frontbuffer.h" struct drm_i915_private; @@ -35,5 +38,7 @@ void intel_psr_short_pulse(struct intel_dp *intel_dp); int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state, u32 *out_value); bool intel_psr_enabled(struct intel_dp *intel_dp); +int intel_psr_atomic_check(struct drm_connector *conn, + struct drm_atomic_state *state); #endif /* __INTEL_PSR_H__ */ diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index fdae5a919bc8..d834924ba7c3 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -508,6 +508,7 @@ struct i915_psr { bool dc3co_enabled; u32 dc3co_exit_delay; struct delayed_work idle_work; + bool initially_probed; }; #define QUIRK_LVDS_SSC_DISABLE (1<<1)