From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Gustavo Sousa <gustavo.sousa@intel.com>
Cc: intel-xe@lists.freedesktop.org, intel-gfx@lists.freedesktop.org,
"Ankit Nautiyal" <ankit.k.nautiyal@intel.com>,
"Dnyaneshwar Bhadane" <dnyaneshwar.bhadane@intel.com>,
"Jouni Högander" <jouni.hogander@intel.com>,
"Juha-pekka Heikkila" <juha-pekka.heikkila@intel.com>,
"Luca Coelho" <luciano.coelho@intel.com>,
"Lucas De Marchi" <lucas.demarchi@intel.com>,
"Matt Atwood" <matthew.s.atwood@intel.com>,
"Matt Roper" <matthew.d.roper@intel.com>,
"Ravi Kumar Vodapalli" <ravi.kumar.vodapalli@intel.com>,
"Sai Teja Pottumuttu" <sai.teja.pottumuttu@intel.com>,
"Shekhar Chauhan" <shekhar.chauhan@intel.com>,
"Vinod Govindapillai" <vinod.govindapillai@intel.com>
Subject: Re: [PATCH 12/32] drm/i915/xe3p_lpd: Underrun debuggability and error codes/hints
Date: Wed, 15 Oct 2025 18:01:52 +0300 [thread overview]
Message-ID: <aO-3YG2MAzjuPJnR@intel.com> (raw)
In-Reply-To: <20251015-xe3p_lpd-basic-enabling-v1-12-d2d1e26520aa@intel.com>
On Wed, Oct 15, 2025 at 12:15:12AM -0300, Gustavo Sousa wrote:
> From: Sai Teja Pottumuttu <sai.teja.pottumuttu@intel.com>
>
> Currently there is no way in the driver to classify the underruns into
> different categories. Starting with Xe3p_LPD, we get two new registers
> and some bits in existing registers which can help us categorise the
> underruns and let us know possible reason behind the underrun.
>
> Bspec: 69111, 69561, 74411, 74412
> Signed-off-by: Sai Teja Pottumuttu <sai.teja.pottumuttu@intel.com>
> Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display_regs.h | 31 +++++++
> drivers/gpu/drm/i915/display/intel_fifo_underrun.c | 100 ++++++++++++++++++++-
> 2 files changed, 130 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h b/drivers/gpu/drm/i915/display/intel_display_regs.h
> index 9d71e26a4fa2..9e2414b730db 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_regs.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
> @@ -882,6 +882,36 @@
> #define PIPE_MISC2_FLIP_INFO_PLANE_SEL_MASK REG_GENMASK(2, 0) /* tgl+ */
> #define PIPE_MISC2_FLIP_INFO_PLANE_SEL(plane_id) REG_FIELD_PREP(PIPE_MISC2_FLIP_INFO_PLANE_SEL_MASK, (plane_id))
>
> +#define _UNDERRUN_DBG1_A 0x70064
> +#define _UNDERRUN_DBG1_B 0x71064
> +#define UNDERRUN_DBG1(pipe) _MMIO_PIPE(pipe, \
> + _UNDERRUN_DBG1_A, \
> + _UNDERRUN_DBG1_B)
> +#define UNDERRUN_DBUF_BLOCK_NOT_VALID_MASK REG_GENMASK(29, 24)
> +#define UNDERRUN_DBUF_BLOCK_NOT_VALID_PLANE_CURSOR REG_BIT(24)
> +#define UNDERRUN_DDB_EMPTY_MASK REG_GENMASK(21, 16)
> +#define UNDERRUN_DDB_EMPTY_PLANE_CURSOR REG_BIT(16)
> +#define UNDERRUN_DBUF_NOT_FILLED_MASK REG_GENMASK(13, 8)
> +#define UNDERRUN_DBUF_NOT_FILLED_PLANE_CURSOR REG_BIT(8)
> +#define UNDERRUN_BELOW_WM0_MASK REG_GENMASK(5, 0)
> +#define UNDERRUN_BELOW_WM0_PLANE_CURSOR REG_BIT(0)
> +
> +#define _UNDERRUN_DBG2_A 0x70068
> +#define _UNDERRUN_DBG2_B 0x71068
> +#define UNDERRUN_DBG2(pipe) _MMIO_PIPE(pipe, \
> + _UNDERRUN_DBG2_A, \
> + _UNDERRUN_DBG2_B)
> +#define UNDERRUN_FRAME_LINE_COUNTERS_FROZEN REG_BIT(31)
> +#define UNDERRUN_PIPE_FRAME_COUNT_MASK REG_GENMASK(30, 20)
> +#define UNDERRUN_LINE_COUNT_MASK REG_GENMASK(19, 0)
> +
> +#define _FBC_DEBUG_STATUS_A 0x43220
> +#define _FBC_DEBUG_STATUS_B 0x43260
> +#define FBC_DEBUG_STATUS(pipe) _MMIO_PIPE(pipe, \
> + _FBC_DEBUG_STATUS_A, \
> + _FBC_DEBUG_STATUS_B)
> +#define FBC_UNDERRUN_DECOMPRESSION REG_BIT(27)
FBC stuff doesn't belong here.
> +
> #define DPINVGTT _MMIO(VLV_DISPLAY_BASE + 0x7002c) /* VLV/CHV only */
> #define DPINVGTT_EN_MASK_CHV REG_GENMASK(27, 16)
> #define DPINVGTT_EN_MASK_VLV REG_GENMASK(23, 16)
> @@ -1416,6 +1446,7 @@
>
> #define GEN12_DCPR_STATUS_1 _MMIO(0x46440)
> #define XELPDP_PMDEMAND_INFLIGHT_STATUS REG_BIT(26)
> +#define XE3P_UNDERRUN_PKGC REG_BIT(21)
>
> #define FUSE_STRAP _MMIO(0x42014)
> #define ILK_INTERNAL_GRAPHICS_DISABLE REG_BIT(31)
> diff --git a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> index c2ce8461ac9e..753872ad28ed 100644
> --- a/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> +++ b/drivers/gpu/drm/i915/display/intel_fifo_underrun.c
> @@ -352,6 +352,101 @@ bool intel_set_pch_fifo_underrun_reporting(struct intel_display *display,
> return old;
> }
>
> +static void snprintf_underrun_planes(char *buf, size_t len,
> + u32 underrun_dbg, u32 underrun_cursor)
> +{
> + snprintf(buf, len, "%s%s%s%s%s%s",
> + underrun_dbg & (underrun_cursor << 1) ? "[1]" : "",
> + underrun_dbg & (underrun_cursor << 2) ? "[2]" : "",
> + underrun_dbg & (underrun_cursor << 3) ? "[3]" : "",
> + underrun_dbg & (underrun_cursor << 4) ? "[4]" : "",
> + underrun_dbg & (underrun_cursor << 5) ? "[5]" : "",
> + underrun_dbg & underrun_cursor ? "[C]" : "");
> +}
> +
> +static void xe3p_lpd_log_underrun(struct intel_display *display,
> + enum pipe pipe)
> +{
> + u32 underrun_dbg1;
> + u32 underrun_dbg2;
> + u32 fbc_debug_status;
> + u32 dcpr_status;
> + char planes[32];
> +
> + /*
> + * UNDERRUN_DBG1 reports the following things
> + * 1. If DBUF block is not valid
> + * 2. If DDB is empty
> + * 3. If streamer could not completely fill DBUF at the end of vblank
> + * 4. Each enabled plane/cursor below watermark 0
> + */
> + underrun_dbg1 = intel_de_read(display, UNDERRUN_DBG1(pipe));
> + intel_de_write(display, UNDERRUN_DBG1(pipe), underrun_dbg1);
> +
> + if (underrun_dbg1 & UNDERRUN_DBUF_BLOCK_NOT_VALID_MASK) {
> + snprintf_underrun_planes(planes, sizeof(planes), underrun_dbg1,
> + UNDERRUN_DBUF_BLOCK_NOT_VALID_PLANE_CURSOR);
> + drm_err(display->drm,
> + "Pipe %c FIFO underrun: DBUF block not valid for plane(s): %s\n",
> + pipe_name(pipe), planes);
> + }
> +
> + if (underrun_dbg1 & UNDERRUN_DDB_EMPTY_MASK) {
> + snprintf_underrun_planes(planes, sizeof(planes), underrun_dbg1,
> + UNDERRUN_DDB_EMPTY_PLANE_CURSOR);
> + drm_err(display->drm, "Pipe %c FIFO underrun: DDB empty for plane(s): %s\n",
> + pipe_name(pipe), planes);
> + }
> +
> + if (underrun_dbg1 & UNDERRUN_DBUF_NOT_FILLED_MASK) {
> + snprintf_underrun_planes(planes, sizeof(planes), underrun_dbg1,
> + UNDERRUN_DBUF_NOT_FILLED_PLANE_CURSOR);
> + drm_err(display->drm, "Pipe %c FIFO underrun: DBUF not filled for plane(s): %s\n",
> + pipe_name(pipe), planes);
> + }
> +
> + if (underrun_dbg1 & UNDERRUN_BELOW_WM0_MASK) {
> + snprintf_underrun_planes(planes, sizeof(planes), underrun_dbg1,
> + UNDERRUN_BELOW_WM0_PLANE_CURSOR);
> + drm_err(display->drm, "Pipe %c FIFO underrun: Below watermark 0 on plane(s): %s\n",
> + pipe_name(pipe), planes);
> + }
> +
> + /*
> + * UNDERRUN_DBG2 reports the frame count and line count when the underrun started.
> + */
> + underrun_dbg2 = intel_de_read(display, UNDERRUN_DBG2(pipe));
> + if (underrun_dbg2 & UNDERRUN_FRAME_LINE_COUNTERS_FROZEN) {
> + intel_de_write(display, UNDERRUN_DBG2(pipe), UNDERRUN_FRAME_LINE_COUNTERS_FROZEN);
> + drm_err(display->drm, "Pipe %c FIFO underrun: Frame count: %u, Line count: %u\n",
> + pipe_name(pipe),
> + REG_FIELD_GET(UNDERRUN_PIPE_FRAME_COUNT_MASK, underrun_dbg2),
> + REG_FIELD_GET(UNDERRUN_LINE_COUNT_MASK, underrun_dbg2));
> + }
> +
> + /*
> + * FBC_DEBUG_STATUS's FBC_UNDERRUN_DECOMPRESSION indicates if FBC was
> + * decompressing when underrun got triggered.
> + */
> + fbc_debug_status = intel_de_read(display, FBC_DEBUG_STATUS(pipe));
> + if (fbc_debug_status & FBC_UNDERRUN_DECOMPRESSION) {
> + intel_de_write(display, FBC_DEBUG_STATUS(pipe), FBC_UNDERRUN_DECOMPRESSION);
> + drm_err(display->drm, "Pipe %c FIFO underrun: FBC decompression\n",
> + pipe_name(pipe));
> + }
> +
> + /*
> + * GEN12_DCPR_STATUS_1's XE3P_UNDERRUN_PKGC, indicates that underrun started
> + * while pkgc was blocking memory.
> + */
> + dcpr_status = intel_de_read(display, GEN12_DCPR_STATUS_1);
> + if (dcpr_status & XE3P_UNDERRUN_PKGC) {
> + intel_de_write(display, GEN12_DCPR_STATUS_1, XE3P_UNDERRUN_PKGC);
> + drm_err(display->drm, "Pipe %c FIFO underrun: Pkgc blocking memory\n",
> + pipe_name(pipe));
> + }
> +}
> +
> /**
> * intel_cpu_fifo_underrun_irq_handler - handle CPU fifo underrun interrupt
> * @display: display device instance
> @@ -378,7 +473,10 @@ void intel_cpu_fifo_underrun_irq_handler(struct intel_display *display,
> if (intel_set_cpu_fifo_underrun_reporting(display, pipe, false)) {
> trace_intel_cpu_fifo_underrun(display, pipe);
>
> - drm_err(display->drm, "CPU pipe %c FIFO underrun\n", pipe_name(pipe));
> + if (DISPLAY_VER(display) >= 35)
> + xe3p_lpd_log_underrun(display, pipe);
> + else
> + drm_err(display->drm, "CPU pipe %c FIFO underrun\n", pipe_name(pipe));
> }
>
> intel_fbc_handle_fifo_underrun_irq(display);
>
> --
> 2.51.0
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2025-10-15 15:02 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-15 3:15 [PATCH 00/32] drm/i915/display: Add initial support for Xe3p_LPD Gustavo Sousa
2025-10-15 3:15 ` [PATCH 01/32] drm/xe/nvl: Define NVL-S platform Gustavo Sousa
2025-10-15 8:07 ` Shekhar Chauhan
2025-10-15 8:09 ` Shekhar Chauhan
2025-10-15 17:43 ` Lucas De Marchi
2025-10-15 3:15 ` [PATCH 02/32] drm/i915/xe3p_lpd: Add Xe3p_LPD display IP features Gustavo Sousa
2025-10-15 8:11 ` Shekhar Chauhan
2025-10-15 3:15 ` [PATCH 03/32] drm/i915/xe3p_lpd: Drop north display reset option programming Gustavo Sousa
2025-10-15 15:56 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 04/32] drm/i915/display: Use braces for if-ladder in intel_bw_init_hw() Gustavo Sousa
2025-10-15 17:40 ` Matt Roper
2025-10-15 3:15 ` [PATCH 05/32] drm/i915/dram: Add field ecc_impacting_de Gustavo Sousa
2025-10-15 14:46 ` Jani Nikula
2025-10-15 15:54 ` Matt Atwood
2025-10-15 16:13 ` Gustavo Sousa
2025-10-15 16:20 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 06/32] drm/i915/xe3p_lpd: Update bandwidth parameters Gustavo Sousa
2025-10-15 17:48 ` Matt Roper
2025-10-15 18:12 ` Gustavo Sousa
2025-10-15 19:12 ` Matt Roper
2025-10-15 19:51 ` Gustavo Sousa
2025-10-15 3:15 ` [PATCH 07/32] drm/i915/xe3p_lpd: Expand bifield masks dbuf blocks fields Gustavo Sousa
2025-10-15 17:55 ` Matt Roper
2025-10-15 3:15 ` [PATCH 08/32] drm/i915/xe3p_lpd: Support UINT16 formats Gustavo Sousa
2025-10-15 20:23 ` Matt Atwood
2025-10-15 20:55 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 09/32] drm/i915/xe3p_lpd: Extend FBC support to " Gustavo Sousa
2025-10-15 3:15 ` [PATCH 10/32] drm/i915/xe3p_lpd: Horizontal flip support for linear surfaces Gustavo Sousa
2025-10-15 17:58 ` Matt Roper
2025-10-15 3:15 ` [PATCH 11/32] drm/i915/xe3p_lpd: Wait for AUX channel power status Gustavo Sousa
2025-10-15 3:15 ` [PATCH 12/32] drm/i915/xe3p_lpd: Underrun debuggability and error codes/hints Gustavo Sousa
2025-10-15 14:56 ` Jani Nikula
2025-10-15 15:01 ` Ville Syrjälä [this message]
2025-10-15 3:15 ` [PATCH 13/32] drm/i915/xe3p_lpd: Remove gamma,csc bottom color checks Gustavo Sousa
2025-10-17 6:02 ` Borah, Chaitanya Kumar
2025-10-15 3:15 ` [PATCH 14/32] drm/i915/xe3p_lpd: Adapt to updates on MBUS_CTL/DBUF_CTL registers Gustavo Sousa
2025-10-15 14:58 ` Jani Nikula
2025-10-16 20:33 ` Gustavo Sousa
2025-10-15 3:15 ` [PATCH 15/32] drm/i915/xe3p_lpd: Always apply level-0 watermark adjustment Gustavo Sousa
2025-10-16 20:53 ` Matt Atwood
2025-10-16 21:03 ` Ville Syrjälä
2025-10-17 18:38 ` Gustavo Sousa
2025-10-15 3:15 ` [PATCH 16/32] drm/i915/xe3p_lpd: Add CDCLK table Gustavo Sousa
2025-10-15 17:39 ` Matt Roper
2025-10-15 17:43 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 17/32] drm/i915/xe3p_lpd: Load DMC firmware Gustavo Sousa
2025-10-15 16:22 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 18/32] drm/i915/xe3p_lpd: Drop support for interlace mode Gustavo Sousa
2025-10-15 4:21 ` Kandpal, Suraj
2025-10-15 3:15 ` [PATCH 19/32] drm/i915/xe3p_lpd: PSR SU minimum lines is 4 Gustavo Sousa
2025-10-15 15:00 ` Jani Nikula
2025-10-15 16:18 ` Gustavo Sousa
2025-10-15 3:15 ` [PATCH 20/32] drm/i915/xe3p_lpd: Enable system caching for FBC Gustavo Sousa
2025-10-15 3:15 ` [PATCH 21/32] drm/i915/xe3p_lpd: Extend Wa_16025573575 Gustavo Sousa
2025-10-15 8:13 ` Shekhar Chauhan
2025-10-15 3:15 ` [PATCH 22/32] drm/i915/xe3p_lpd: Don't allow odd ypan or ysize with semiplanar format Gustavo Sousa
2025-10-16 20:50 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 23/32] drm/i915/xe3p_lpd: Reload DMC MMIO for pipes C and D Gustavo Sousa
2025-10-15 17:47 ` Matt Atwood
2025-10-15 3:15 ` [PATCH 24/32] drm/i915/xe3p_lpd: Introduce pixel normalizer config support Gustavo Sousa
2025-10-15 15:11 ` Jani Nikula
2025-10-20 9:35 ` Govindapillai, Vinod
2025-10-15 3:15 ` [PATCH 25/32] drm/i915/xe3p_lpd: Add FBC support for FP16 formats Gustavo Sousa
2025-10-15 15:13 ` Jani Nikula
2025-10-15 3:15 ` [PATCH 26/32] drm/i915/xe3p_lpd: Enable pixel normalizer for fp16 formats for FBC Gustavo Sousa
2025-10-15 15:15 ` Jani Nikula
2025-10-15 3:15 ` [PATCH 27/32] drm/i915/vbt: Add fields dedicated_external and dyn_port_over_tc Gustavo Sousa
2025-10-15 15:24 ` Jani Nikula
2025-10-17 19:52 ` Gustavo Sousa
2025-10-20 7:45 ` Jani Nikula
2025-10-20 12:43 ` Gustavo Sousa
2025-10-15 15:29 ` Jani Nikula
2025-10-17 20:20 ` Gustavo Sousa
2025-10-21 8:32 ` Jani Nikula
2025-10-15 3:15 ` [PATCH 28/32] drm/i915/power: Use intel_encoder_is_tc() Gustavo Sousa
2025-10-15 4:20 ` Kandpal, Suraj
2025-10-15 3:15 ` [PATCH 29/32] drm/i915/display: Handle dedicated external ports in intel_encoder_is_tc() Gustavo Sousa
2025-10-15 15:33 ` Jani Nikula
2025-10-15 16:25 ` Gustavo Sousa
2025-10-21 8:36 ` Jani Nikula
2025-10-15 3:15 ` [PATCH 30/32] drm/i915/wm: don't use method1 in Xe3p_LPD onwards Gustavo Sousa
2025-10-15 8:02 ` Shekhar Chauhan
2025-10-21 20:19 ` Gustavo Sousa
2025-10-15 3:15 ` [PATCH 31/32] drm/i915/xe3p_lpd: Extend Type-C flow for static DDI allocation Gustavo Sousa
2025-10-15 3:15 ` [PATCH 32/32] drm/i915/nvls: Add NVL-S display support Gustavo Sousa
2025-10-15 3:29 ` ✗ CI.checkpatch: warning for drm/i915/display: Add initial support for Xe3p_LPD Patchwork
2025-10-15 3:30 ` ✓ CI.KUnit: success " Patchwork
2025-10-15 3:45 ` ✗ CI.checksparse: warning " Patchwork
2025-10-15 4:15 ` ✓ Xe.CI.BAT: success " Patchwork
2025-10-15 4:30 ` ✓ i915.CI.BAT: " Patchwork
2025-10-15 11:00 ` ✓ i915.CI.Full: " Patchwork
2025-10-15 13:44 ` ✗ Xe.CI.Full: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aO-3YG2MAzjuPJnR@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=ankit.k.nautiyal@intel.com \
--cc=dnyaneshwar.bhadane@intel.com \
--cc=gustavo.sousa@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jouni.hogander@intel.com \
--cc=juha-pekka.heikkila@intel.com \
--cc=lucas.demarchi@intel.com \
--cc=luciano.coelho@intel.com \
--cc=matthew.d.roper@intel.com \
--cc=matthew.s.atwood@intel.com \
--cc=ravi.kumar.vodapalli@intel.com \
--cc=sai.teja.pottumuttu@intel.com \
--cc=shekhar.chauhan@intel.com \
--cc=vinod.govindapillai@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.