From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org 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 smtp.lore.kernel.org (Postfix) with ESMTPS id B440DCCA470 for ; Thu, 9 Oct 2025 07:30:59 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 780A910E94D; Thu, 9 Oct 2025 07:30:59 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.b="nIzVxOrt"; dkim-atps=neutral Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6F5EE10E94B; Thu, 9 Oct 2025 07:30:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1759995057; x=1791531057; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9fsZJJdddU6LOcXEBKlD36K/MkLm5V37KT78RXrpc74=; b=nIzVxOrtiT2GC/dfhVQ/GHFnJtHHh66seLG0MT2vv5YpIwQv+mUcPiQd fiVURXgZSxC9EQVejMJ1PQd9yof8as8teIaMl9LQNtdrygBs9aJBDVurb QQ8Tw0YAo9OPVv2t4l6i4QeH78ViwLDEsem0WMQ95fEYkgqFeT6R8T0AX PsIMSuvw/ngisWNRE79R9kuBHf2X6xMRVr1TWN5uA2xLmlR8BITJW8R0k xnU9vTDj2RlU1DGgxxoYcaApZoPyAmeekx4jiNc8IMKo6Yh2u5XXykH4G rmPWGhJltyoeHkXVRblfCEd1pUXISWDXP35XiSjVnoCTb8QEcmNTyA0G/ g==; X-CSE-ConnectionGUID: GqU5/m3OT1mIdDeflRG2+w== X-CSE-MsgGUID: HoqLUET0QqGIthuKnoMyNw== X-IronPort-AV: E=McAfee;i="6800,10657,11576"; a="66050828" X-IronPort-AV: E=Sophos;i="6.19,215,1754982000"; d="scan'208";a="66050828" Received: from fmviesa009.fm.intel.com ([10.60.135.149]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2025 00:30:57 -0700 X-CSE-ConnectionGUID: o0zNLecJT1KPzXz9XZJiJw== X-CSE-MsgGUID: RPUpWVvzTgm3w0ZgDVrgnQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.19,215,1754982000"; d="scan'208";a="181073534" Received: from srr4-3-linux-103-aknautiy.iind.intel.com ([10.223.34.160]) by fmviesa009-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2025 00:30:55 -0700 From: Ankit Nautiyal To: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org Cc: ville.syrjala@linux.intel.com, Ankit Nautiyal , Animesh Manna , =?UTF-8?q?Jouni=20H=C3=B6gander?= Subject: [PATCH 5/8] drm/i915/display: Check if final vblank is sufficient for PSR features Date: Thu, 9 Oct 2025 12:47:33 +0530 Message-ID: <20251009071736.800248-6-ankit.k.nautiyal@intel.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20251009071736.800248-1-ankit.k.nautiyal@intel.com> References: <20251009071736.800248-1-ankit.k.nautiyal@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: intel-xe@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel Xe graphics driver List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-xe-bounces@lists.freedesktop.org Sender: "Intel-xe" Currently, wake line latency checks rely on the vblank length, which does not account for either the extra vblank delay for icl/tgl or for the optimized guardband which will come into picture later at some point. Introduce intel_dp_compute_config_late() to handle late-stage configuration checks for DP/eDP features. For now, it validates whether the final vblank (with extra vblank delay) or guardband is sufficient to support wake line latencies required by Panel Replay and PSR2 selective update. Check if vblank is sufficient for PSR features, and disable them if their wake requirements cannot be accomodated. Signed-off-by: Ankit Nautiyal Cc: Animesh Manna Cc: Jouni Högander --- drivers/gpu/drm/i915/display/intel_ddi.c | 3 ++ drivers/gpu/drm/i915/display/intel_dp.c | 9 +++++ drivers/gpu/drm/i915/display/intel_dp.h | 3 ++ drivers/gpu/drm/i915/display/intel_psr.c | 50 ++++++++++++++++++++---- drivers/gpu/drm/i915/display/intel_psr.h | 2 + 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index c09aa759f4d4..94c593bbedf4 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -4560,6 +4560,9 @@ static int intel_ddi_compute_config_late(struct intel_encoder *encoder, struct drm_connector *connector = conn_state->connector; u8 port_sync_transcoders = 0; + if (intel_crtc_has_dp_encoder(crtc_state)) + intel_dp_compute_config_late(encoder, crtc_state, conn_state); + drm_dbg_kms(display->drm, "[ENCODER:%d:%s] [CRTC:%d:%s]\n", encoder->base.base.id, encoder->base.name, crtc_state->uapi.crtc->base.id, crtc_state->uapi.crtc->name); diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 8a2fc1fcb5d0..5bca288a2ed7 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -6979,3 +6979,12 @@ void intel_dp_mst_resume(struct intel_display *display) } } } + +void intel_dp_compute_config_late(struct intel_encoder *encoder, + struct intel_crtc_state *crtc_state, + struct drm_connector_state *conn_state) +{ + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); + + intel_psr_compute_config_late(intel_dp, crtc_state); +} diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index b379443e0211..0d9573ca44cb 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -218,5 +218,8 @@ int intel_dp_compute_min_hblank(struct intel_crtc_state *crtc_state, int intel_dp_dsc_bpp_step_x16(const struct intel_connector *connector); void intel_dp_dpcd_set_probe(struct intel_dp *intel_dp, bool force_on_external); bool intel_dp_in_hdr_mode(const struct drm_connector_state *conn_state); +void intel_dp_compute_config_late(struct intel_encoder *encoder, + struct intel_crtc_state *crtc_state, + struct drm_connector_state *conn_state); #endif /* __INTEL_DP_H__ */ diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c index 295ce6e15ab2..7fe4abfe7e95 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.c +++ b/drivers/gpu/drm/i915/display/intel_psr.c @@ -1404,6 +1404,20 @@ int _intel_psr_min_set_context_latency(const struct intel_crtc_state *crtc_state return 1; } +static bool _wake_lines_fit_into_vblank(const struct intel_crtc_state *crtc_state, + int vblank, + int wake_lines) +{ + if (crtc_state->req_psr2_sdp_prior_scanline) + vblank -= 1; + + /* Vblank >= PSR2_CTL Block Count Number maximum line count */ + if (vblank < wake_lines) + return false; + + return true; +} + static bool wake_lines_fit_into_vblank(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state, bool aux_less, @@ -1426,14 +1440,7 @@ static bool wake_lines_fit_into_vblank(struct intel_dp *intel_dp, psr2_block_count_lines(intel_dp) : intel_dp->alpm_parameters.io_wake_lines; - if (crtc_state->req_psr2_sdp_prior_scanline) - vblank -= 1; - - /* Vblank >= PSR2_CTL Block Count Number maximum line count */ - if (vblank < wake_lines) - return false; - - return true; + return _wake_lines_fit_into_vblank(crtc_state, vblank, wake_lines); } static bool alpm_config_valid(struct intel_dp *intel_dp, @@ -4342,3 +4349,30 @@ bool intel_psr_needs_alpm_aux_less(struct intel_dp *intel_dp, { return intel_dp_is_edp(intel_dp) && crtc_state->has_panel_replay; } + +void intel_psr_compute_config_late(struct intel_dp *intel_dp, + struct intel_crtc_state *crtc_state) +{ + struct intel_display *display = to_intel_display(intel_dp); + int vblank = intel_crtc_vblank_length(crtc_state); + int aux_less_wake_lines = intel_dp->alpm_parameters.aux_less_wake_lines; + int wake_lines = DISPLAY_VER(display) < 20 ? + psr2_block_count_lines(intel_dp) : + intel_dp->alpm_parameters.io_wake_lines; + + if (intel_psr_needs_alpm_aux_less(intel_dp, crtc_state) && + !_wake_lines_fit_into_vblank(crtc_state, vblank, aux_less_wake_lines)) { + drm_dbg_kms(display->drm, + "Disabling Panel replay: vblank insufficient for wakelines = %d\n", + aux_less_wake_lines); + crtc_state->has_panel_replay = false; + } + + if (crtc_state->has_sel_update && + !_wake_lines_fit_into_vblank(crtc_state, vblank, wake_lines)) { + drm_dbg_kms(display->drm, + "Disabling Selective Update: vblank insufficient for wakelines = %d\n", + wake_lines); + crtc_state->has_sel_update = false; + } +} diff --git a/drivers/gpu/drm/i915/display/intel_psr.h b/drivers/gpu/drm/i915/display/intel_psr.h index 9147996d6c9e..b17ce312dc37 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.h +++ b/drivers/gpu/drm/i915/display/intel_psr.h @@ -83,5 +83,7 @@ void intel_psr_debugfs_register(struct intel_display *display); bool intel_psr_needs_alpm(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state); bool intel_psr_needs_alpm_aux_less(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state); +void intel_psr_compute_config_late(struct intel_dp *intel_dp, + struct intel_crtc_state *crtc_state); #endif /* __INTEL_PSR_H__ */ -- 2.45.2