* [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB
@ 2025-10-27 16:29 Mitul Golani
2025-10-27 16:29 ` [PATCH v8 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
` (21 more replies)
0 siblings, 22 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Control DC Balance Adjustment bit to accomodate changes along
with VRR DSB implementation.
Mitul Golani (16):
drm/i915/display: Add source param for dc balance
drm/i915/vrr: Add VRR DC balance registers
drm/i915/vrr: Add DC Balance params to crtc_state
drm/i915/vrr: Add state dump for DC Balance params
drm/i915/vrr: Add compute config for DC Balance params
drm/i915/display: Add DC Balance flip counter in crtc
drm/i915/vrr: Increment DC balance flip count on every flip
drm/i915/vrr: Add function to reset DC Balance flip count
drm/i915/vrr: Add function reset DC balance accumulated params
drm/i915/vrr: Write DC balance params to hw registers
drm/i915/vrr: Configure DC balance flipline adjustment
drm/i915/display: Wait for VRR PUSH status update
drm/i915/display: Add function to configure event for dc balance
drm/i915/vrr: Enable Adaptive sync counter bit
drm/i915/vrr: Enable DC Balance
drm/i915/vrr: Add function to check if DC Balance Possible
Ville Syrjälä (6):
drm/i915/dmc: Add pipe dmc registers and bits for DC Balance
drm/i915/vrr: Add functions to read out vmin/vmax stuff
drm/i915/vblank: Extract vrr_vblank_start()
drm/i915/vrr: Implement vblank evasion with DC balancing
drm/i915/dsb: Add pipedmc dc balance enable/disable
drm/i915/vrr: Pause DC Balancing for DSB commits
drivers/gpu/drm/i915/display/intel_color.c | 1 +
.../drm/i915/display/intel_crtc_state_dump.c | 8 +
drivers/gpu/drm/i915/display/intel_display.c | 52 ++++
.../drm/i915/display/intel_display_device.h | 1 +
.../drm/i915/display/intel_display_types.h | 11 +
drivers/gpu/drm/i915/display/intel_dmc.c | 32 +++
drivers/gpu/drm/i915/display/intel_dmc.h | 6 +
drivers/gpu/drm/i915/display/intel_dmc_regs.h | 61 ++++-
drivers/gpu/drm/i915/display/intel_dsb.c | 31 ++-
drivers/gpu/drm/i915/display/intel_vblank.c | 33 ++-
drivers/gpu/drm/i915/display/intel_vrr.c | 232 ++++++++++++++++++
drivers/gpu/drm/i915/display/intel_vrr.h | 12 +
drivers/gpu/drm/i915/display/intel_vrr_regs.h | 69 ++++++
13 files changed, 543 insertions(+), 6 deletions(-)
--
2.48.1
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v8 01/22] drm/i915/display: Add source param for dc balance
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
` (20 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add source param for dc balance enablement further.
--v2:
- Arrange in alphabetic order. (Ankit)
- Update name. (Ankit)
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_device.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h
index 8fdb8a0a4282..b6bdba1ec2af 100644
--- a/drivers/gpu/drm/i915/display/intel_display_device.h
+++ b/drivers/gpu/drm/i915/display/intel_display_device.h
@@ -198,6 +198,7 @@ struct intel_display_platforms {
#define HAS_ULTRAJOINER(__display) (((__display)->platform.dgfx && \
DISPLAY_VER(__display) == 14) && HAS_DSC(__display))
#define HAS_VRR(__display) (DISPLAY_VER(__display) >= 11)
+#define HAS_VRR_DC_BALANCE(__display) (DISPLAY_VER(__display) >= 30)
#define INTEL_NUM_PIPES(__display) (hweight8(DISPLAY_RUNTIME_INFO(__display)->pipe_mask))
#define OVERLAY_NEEDS_PHYSICAL(__display) (DISPLAY_INFO(__display)->overlay_needs_physical)
#define SUPPORTS_TV(__display) (DISPLAY_INFO(__display)->supports_tv)
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
2025-10-27 16:29 ` [PATCH v8 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
` (19 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Add pipe dmc registers and access bits for DC Balance params
configuration and enablement.
--v2:
- Separate register definitions for transcoder and
pipe dmc. (Ankit)
- Use MMIO pipe macros instead of transcoder ones. (Ankit)
- Remove dev_priv use. (Jani, Nikula)
--v3:
- Add all register address, from capital alphabet to small. (Ankit)
- Add EVT CTL registers.
- Add co-author tag.
- Add event flag for Triggering DC Balance.
--v4:
- Add DCB Flip count and balance reset registers.
Co-authored-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dmc_regs.h | 61 ++++++++++++++++++-
1 file changed, 60 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dmc_regs.h b/drivers/gpu/drm/i915/display/intel_dmc_regs.h
index c5aa49921cb9..225dbe3ac137 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_dmc_regs.h
@@ -583,5 +583,64 @@ enum pipedmc_event_id {
/* undocumented magic DMC variables */
#define PTL_PIPEDMC_EXEC_TIME_LINES(start_mmioaddr) _MMIO((start_mmioaddr) + 0x6b8)
#define PTL_PIPEDMC_END_OF_EXEC_GB(start_mmioaddr) _MMIO((start_mmioaddr) + 0x6c0)
-
+#define _PIPEDMC_DCB_CTL_A 0x5f1a0
+#define _PIPEDMC_DCB_CTL_B 0x5f5a0
+#define PIPEDMC_DCB_CTL(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_CTL_A,\
+ _PIPEDMC_DCB_CTL_B)
+#define PIPEDMC_ADAPTIVE_DCB_ENABLE REG_BIT(31)
+
+#define _PIPEDMC_DCB_VBLANK_A 0x5f1bc
+#define _PIPEDMC_DCB_VBLANK_B 0x5f5bc
+#define PIPEDMC_DCB_VBLANK(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_VBLANK_A,\
+ _PIPEDMC_DCB_VBLANK_B)
+
+#define _PIPEDMC_DCB_SLOPE_A 0x5f1b8
+#define _PIPEDMC_DCB_SLOPE_B 0x5f5b8
+#define PIPEDMC_DCB_SLOPE(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_SLOPE_A,\
+ _PIPEDMC_DCB_SLOPE_B)
+
+#define _PIPEDMC_DCB_GUARDBAND_A 0x5f1b4
+#define _PIPEDMC_DCB_GUARDBAND_B 0x5f5b4
+#define PIPEDMC_DCB_GUARDBAND(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_GUARDBAND_A,\
+ _PIPEDMC_DCB_GUARDBAND_B)
+
+#define _PIPEDMC_DCB_MAX_INCREASE_A 0x5f1ac
+#define _PIPEDMC_DCB_MAX_INCREASE_B 0x5f5ac
+#define PIPEDMC_DCB_MAX_INCREASE(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_MAX_INCREASE_A,\
+ _PIPEDMC_DCB_MAX_INCREASE_B)
+
+#define _PIPEDMC_DCB_MAX_DECREASE_A 0x5f1b0
+#define _PIPEDMC_DCB_MAX_DECREASE_B 0x5f5b0
+#define PIPEDMC_DCB_MAX_DECREASE(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_MAX_DECREASE_A,\
+ _PIPEDMC_DCB_MAX_DECREASE_B)
+
+#define _PIPEDMC_DCB_VMIN_A 0x5f1a4
+#define _PIPEDMC_DCB_VMIN_B 0x5f5a4
+#define PIPEDMC_DCB_VMIN(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_VMIN_A,\
+ _PIPEDMC_DCB_VMIN_B)
+
+#define _PIPEDMC_DCB_VMAX_A 0x5f1a8
+#define _PIPEDMC_DCB_VMAX_B 0x5f5a8
+#define PIPEDMC_DCB_VMAX(pipe) _MMIO_PIPE((pipe), _PIPEDMC_DCB_VMAX_A,\
+ _PIPEDMC_DCB_VMAX_B)
+
+#define _PIPEDMC_DCB_DEBUG_A 0x5f1c0
+#define _PIPEDMC_DCB_DEBUG_B 0x5f5c0
+#define PIPEDMC_DCB_DEBUG(pipe) _MMIO_PIPE(pipe, _PIPEDMC_DCB_DEBUG_A,\
+ _PIPEDMC_DCB_DEBUG_B)
+
+#define _PIPEDMC_EVT_CTL_3_A 0x5f040
+#define _PIPEDMC_EVT_CTL_3_B 0x5f440
+#define PIPEDMC_EVT_CTL_3(pipe) _MMIO_PIPE(pipe, _PIPEDMC_EVT_CTL_3_A,\
+ _PIPEDMC_EVT_CTL_3_B)
+
+#define _PIPEDMC_DCB_FLIP_COUNT_A 0x906A4
+#define _PIPEDMC_DCB_FLIP_COUNT_B 0x986A4
+#define PIPEDMC_DCB_FLIP_COUNT(pipe) _MMIO_PIPE(pipe, _PIPEDMC_EVT_CTL_3_A,\
+ _PIPEDMC_DCB_FLIP_COUNT_B)
+
+#define _PIPEDMC_DCB_BALANCE_RESET_A 0x906A8
+#define _PIPEDMC_DCB_BALANCE_RESET_B 0x986A8
+#define PIPEDMC_DCB_BALANCE_RESET(pipe) _MMIO_PIPE(pipe, _PIPEDMC_DCB_BALANCE_RESET_A,\
+ _PIPEDMC_DCB_BALANCE_RESET_B)
#endif /* __INTEL_DMC_REGS_H__ */
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 03/22] drm/i915/vrr: Add VRR DC balance registers
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
2025-10-27 16:29 ` [PATCH v8 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
2025-10-27 16:29 ` [PATCH v8 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff Mitul Golani
` (18 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add VRR register offsets and bits to access DC Balance configuration.
--v2:
- Separate register definitions. (Ankit)
- Remove usage of dev_priv. (Jani, Nikula)
--v3:
- Convert register address offset, from capital to small. (Ankit)
- Move mask bits near to register offsets. (Ankit)
--v4:
- Use _MMIO_TRANS wherever possible. (Jani)
--v5:
- Added LIVE Value registers for VMAX and FLIPLINE as provided by DMC fw
- For pipe B it is temporary and expected to change later once finalised.
--v6:
- Add live value registers for DCB VMAX/FLIPLINE.
--v7:
- Correct commit message file. (Jani Nikula)
- Add bits in highest to lowest order. (Jani Nikula)
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr_regs.h | 69 +++++++++++++++++++
1 file changed, 69 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr_regs.h b/drivers/gpu/drm/i915/display/intel_vrr_regs.h
index ba9b9215dc11..f828db55d9b2 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_vrr_regs.h
@@ -8,6 +8,74 @@
#include "intel_display_reg_defs.h"
+/* VRR registers */
+#define _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_A 0x604d4
+#define _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_B 0x614d4
+#define TRANS_VRR_DCB_ADJ_FLIPLINE_CFG(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_A, \
+ _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_B)
+
+#define _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE_A 0x90700
+#define _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE_B 0x98700
+#define TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(trans) \
+ _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE_A, \
+ _TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE_B)
+#define VRR_DCB_ADJ_FLIPLINE_CNT_MASK REG_GENMASK(31, 24)
+#define VRR_DCB_ADJ_FLIPLINE_MASK REG_GENMASK(19, 0)
+#define VRR_DCB_ADJ_FLIPLINE(flipline) REG_FIELD_PREP(VRR_DCB_ADJ_FLIPLINE_MASK, \
+ (flipline))
+
+#define _TRANS_VRR_DCB_ADJ_VMAX_CFG_A 0x604d8
+#define _TRANS_VRR_DCB_ADJ_VMAX_CFG_B 0x614d8
+#define TRANS_VRR_DCB_ADJ_VMAX_CFG(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_ADJ_VMAX_CFG_A, \
+ _TRANS_VRR_DCB_ADJ_VMAX_CFG_B)
+
+#define _TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE_A 0x906F8
+#define _TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE_B 0x986F8
+#define TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE_A, \
+ _TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE_B)
+#define VRR_DCB_ADJ_VMAX_CNT_MASK REG_GENMASK(31, 24)
+#define VRR_DCB_ADJ_VMAX_MASK REG_GENMASK(19, 0)
+#define VRR_DCB_ADJ_VMAX(vmax) REG_FIELD_PREP(VRR_DCB_ADJ_VMAX_MASK, (vmax))
+
+#define _TRANS_VRR_DCB_FLIPLINE_A 0x60418
+#define _TRANS_VRR_DCB_FLIPLINE_B 0x61418
+#define TRANS_VRR_DCB_FLIPLINE(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_FLIPLINE_A, \
+ _TRANS_VRR_DCB_FLIPLINE_B)
+
+#define _TRANS_VRR_DCB_FLIPLINE_LIVE_A 0x906FC
+#define _TRANS_VRR_DCB_FLIPLINE_LIVE_B 0x986FC
+#define TRANS_VRR_DCB_FLIPLINE_LIVE(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_FLIPLINE_LIVE_A, \
+ _TRANS_VRR_DCB_FLIPLINE_LIVE_B)
+#define VRR_DCB_FLIPLINE_MASK REG_GENMASK(19, 0)
+#define VRR_DCB_FLIPLINE(flipline) REG_FIELD_PREP(VRR_DCB_FLIPLINE_MASK, \
+ (flipline))
+
+#define _TRANS_VRR_DCB_VMAX_A 0x60414
+#define _TRANS_VRR_DCB_VMAX_B 0x61414
+#define TRANS_VRR_DCB_VMAX(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_VMAX_A, \
+ _TRANS_VRR_DCB_VMAX_B)
+#define _TRANS_VRR_DCB_VMAX_LIVE_A 0x906F4
+#define _TRANS_VRR_DCB_VMAX_LIVE_B 0x986F4
+#define TRANS_VRR_DCB_VMAX_LIVE(trans) _MMIO_TRANS(trans, \
+ _TRANS_VRR_DCB_VMAX_LIVE_A, \
+ _TRANS_VRR_DCB_VMAX_LIVE_B)
+#define VRR_DCB_VMAX_MASK REG_GENMASK(19, 0)
+#define VRR_DCB_VMAX(vmax) REG_FIELD_PREP(VRR_DCB_VMAX_MASK, (vmax))
+
+#define _TRANS_ADAPTIVE_SYNC_DCB_CTL_A 0x604c0
+#define _TRANS_ADAPTIVE_SYNC_DCB_CTL_B 0x614c0
+#define TRANS_ADAPTIVE_SYNC_DCB_CTL(trans) _MMIO_TRANS(trans, \
+ _TRANS_ADAPTIVE_SYNC_DCB_CTL_A, \
+ _TRANS_ADAPTIVE_SYNC_DCB_CTL_B)
+#define ADAPTIVE_SYNC_COUNTER_EN REG_BIT(31)
+
#define _TRANS_VRR_CTL_A 0x60420
#define _TRANS_VRR_CTL_B 0x61420
#define _TRANS_VRR_CTL_C 0x62420
@@ -19,6 +87,7 @@
#define VRR_CTL_CMRR_ENABLE REG_BIT(27)
#define VRR_CTL_PIPELINE_FULL_MASK REG_GENMASK(10, 3)
#define VRR_CTL_PIPELINE_FULL(x) REG_FIELD_PREP(VRR_CTL_PIPELINE_FULL_MASK, (x))
+#define VRR_CTL_DCB_ADJ_ENABLE REG_BIT(28)
#define VRR_CTL_PIPELINE_FULL_OVERRIDE REG_BIT(0)
#define XELPD_VRR_CTL_VRR_GUARDBAND_MASK REG_GENMASK(15, 0)
#define XELPD_VRR_CTL_VRR_GUARDBAND(x) REG_FIELD_PREP(XELPD_VRR_CTL_VRR_GUARDBAND_MASK, (x))
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (2 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
` (17 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Calculate delayed vblank start position with the help of added
vmin/vmax stuff for next frame and final computation.
--v2:
- Correct Author details.
--v3:
- Separate register details from this patch.
--v4:
- Add mask macros.
--v5:
- As live prefix params indicate timings for current frame,
read just _live prefix values instead of next frame timings as
done previously.
- Squash Refactor vrr params patch.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 56 ++++++++++++++++++++++++
drivers/gpu/drm/i915/display/intel_vrr.h | 5 +++
2 files changed, 61 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 00cbc126fb36..68dde96583c0 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -261,6 +261,12 @@ static int intel_vrr_hw_value(const struct intel_crtc_state *crtc_state,
return value - crtc_state->set_context_latency;
}
+static int intel_vrr_vblank_start(const struct intel_crtc_state *crtc_state,
+ int vmin_vmax)
+{
+ return intel_vrr_hw_value(crtc_state, vmin_vmax) - crtc_state->vrr.guardband;
+}
+
/*
* For fixed refresh rate mode Vmin, Vmax and Flipline all are set to
* Vtotal value.
@@ -898,3 +904,53 @@ int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state)
return intel_vrr_vmin_vblank_start(crtc_state) -
crtc_state->set_context_latency;
}
+
+int intel_vrr_dcb_vmin_vblank_start_next(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+ u32 tmp = 0;
+
+ tmp = intel_de_read(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder));
+
+ if (REG_FIELD_GET(VRR_DCB_ADJ_FLIPLINE_CNT_MASK, tmp) == 0)
+ return -1;
+
+ return intel_vrr_vblank_start(crtc_state, VRR_DCB_ADJ_FLIPLINE(tmp) + 1);
+}
+
+int intel_vrr_dcb_vmax_vblank_start_next(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+ u32 tmp = 0;
+
+ tmp = intel_de_read(display, TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(cpu_transcoder));
+
+ if (REG_FIELD_GET(VRR_DCB_ADJ_VMAX_CNT_MASK, tmp) == 0)
+ return -1;
+
+ return intel_vrr_vblank_start(crtc_state, VRR_DCB_ADJ_VMAX(tmp) + 1);
+}
+
+int intel_vrr_dcb_vmin_vblank_start_final(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+ u32 tmp = 0;
+
+ tmp = intel_de_read(display, TRANS_VRR_DCB_FLIPLINE_LIVE(cpu_transcoder));
+
+ return intel_vrr_vblank_start(crtc_state, VRR_DCB_FLIPLINE(tmp) + 1);
+}
+
+int intel_vrr_dcb_vmax_vblank_start_final(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+ u32 tmp = 0;
+
+ tmp = intel_de_read(display, TRANS_VRR_DCB_VMAX_LIVE(cpu_transcoder));
+
+ return intel_vrr_vblank_start(crtc_state, VRR_DCB_VMAX(tmp) + 1);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.h b/drivers/gpu/drm/i915/display/intel_vrr.h
index bc9044621635..66fb9ad846f2 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.h
+++ b/drivers/gpu/drm/i915/display/intel_vrr.h
@@ -43,4 +43,9 @@ bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
int intel_vrr_safe_window_start(const struct intel_crtc_state *crtc_state);
int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state);
+int intel_vrr_dcb_vmin_vblank_start_next(const struct intel_crtc_state *crtc_state);
+int intel_vrr_dcb_vmax_vblank_start_next(const struct intel_crtc_state *crtc_state);
+int intel_vrr_dcb_vmin_vblank_start_final(const struct intel_crtc_state *crtc_state);
+int intel_vrr_dcb_vmax_vblank_start_final(const struct intel_crtc_state *crtc_state);
+
#endif /* __INTEL_VRR_H__ */
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 05/22] drm/i915/vrr: Add DC Balance params to crtc_state
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (3 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
` (16 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add DC Balance params to crtc_state, also add state checker
params for related properties.
--v3:
- Seggregate crtc_state params with this patch. (Ankit)
--v4:
- Update commit message and header. (Ankit)
- Add +1 to VMIN and VMAX only when it is non-zero. (Ankit)
--v5:
- Add headers in sorted order. (Jani Nikula)
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 7 ++++++
.../drm/i915/display/intel_display_types.h | 7 ++++++
drivers/gpu/drm/i915/display/intel_vrr.c | 22 +++++++++++++++++++
3 files changed, 36 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 2744f83bda2e..1790371e4a3b 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -5409,6 +5409,13 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
PIPE_CONF_CHECK_LLI(cmrr.cmrr_m);
PIPE_CONF_CHECK_LLI(cmrr.cmrr_n);
PIPE_CONF_CHECK_BOOL(cmrr.enable);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.vmin);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.vmax);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.guardband);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.slope);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.max_increase);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.max_decrease);
+ PIPE_CONF_CHECK_I(vrr.dc_balance.vblank_target);
}
if (!fastset || intel_vrr_always_use_vrr_tg(display)) {
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 5ae66b7444b6..710f9f925073 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1343,6 +1343,13 @@ struct intel_crtc_state {
u8 pipeline_full;
u16 flipline, vmin, vmax, guardband;
u32 vsync_end, vsync_start;
+ struct {
+ bool enable;
+ u16 vmin, vmax;
+ u16 guardband, slope;
+ u16 max_increase, max_decrease;
+ u16 vblank_target;
+ } dc_balance;
} vrr;
/* Content Match Refresh Rate state */
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 68dde96583c0..3c30c8d3e206 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -9,6 +9,7 @@
#include "intel_de.h"
#include "intel_display_regs.h"
#include "intel_display_types.h"
+#include "intel_dmc_regs.h"
#include "intel_dp.h"
#include "intel_psr.h"
#include "intel_vrr.h"
@@ -789,6 +790,8 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
{
struct intel_display *display = to_intel_display(crtc_state);
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+ enum pipe pipe = crtc->pipe;
u32 trans_vrr_ctl, trans_vrr_vsync;
bool vrr_enable;
@@ -866,6 +869,25 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
else
crtc_state->vrr.enable = vrr_enable;
+ if (HAS_VRR_DC_BALANCE(display)) {
+ crtc_state->vrr.dc_balance.vmin =
+ intel_de_read(display, PIPEDMC_DCB_VMIN(pipe)) ?
+ intel_de_read(display, PIPEDMC_DCB_VMIN(pipe)) + 1 : 0;
+ crtc_state->vrr.dc_balance.vmax =
+ intel_de_read(display, PIPEDMC_DCB_VMAX(pipe)) ?
+ intel_de_read(display, PIPEDMC_DCB_VMAX(pipe)) + 1 : 0;
+ crtc_state->vrr.dc_balance.guardband =
+ intel_de_read(display, PIPEDMC_DCB_GUARDBAND(pipe));
+ crtc_state->vrr.dc_balance.max_increase =
+ intel_de_read(display, PIPEDMC_DCB_MAX_INCREASE(pipe));
+ crtc_state->vrr.dc_balance.max_decrease =
+ intel_de_read(display, PIPEDMC_DCB_MAX_DECREASE(pipe));
+ crtc_state->vrr.dc_balance.slope =
+ intel_de_read(display, PIPEDMC_DCB_SLOPE(pipe));
+ crtc_state->vrr.dc_balance.vblank_target =
+ intel_de_read(display, PIPEDMC_DCB_VBLANK(pipe));
+ }
+
/*
* #TODO: For Both VRR and CMRR the flag I915_MODE_FLAG_VRR is set for mode_flags.
* Since CMRR is currently disabled, set this flag for VRR for now.
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 06/22] drm/i915/vrr: Add state dump for DC Balance params
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (4 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 07/22] drm/i915/vrr: Add compute config " Mitul Golani
` (15 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add state dump for dc balance params to track DC Balance
crtc state config.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_crtc_state_dump.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
index e6f300dbb5ee..0f97c7adbb42 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
@@ -303,6 +303,14 @@ void intel_crtc_state_dump(const struct intel_crtc_state *pipe_config,
drm_printf(&p, "vrr: vmin vblank: %d, vmax vblank: %d, vmin vtotal: %d, vmax vtotal: %d\n",
intel_vrr_vmin_vblank_start(pipe_config), intel_vrr_vmax_vblank_start(pipe_config),
intel_vrr_vmin_vtotal(pipe_config), intel_vrr_vmax_vtotal(pipe_config));
+ drm_printf(&p, "vrr: dc balance: %s, vmin: %d vmax: %d guardband: %d, slope: %d max increase: %d max decrease: %d Vblank target: %d\n",
+ str_yes_no(pipe_config->vrr.dc_balance.enable),
+ pipe_config->vrr.dc_balance.vmin, pipe_config->vrr.dc_balance.vmax,
+ pipe_config->vrr.dc_balance.guardband,
+ pipe_config->vrr.dc_balance.slope,
+ pipe_config->vrr.dc_balance.max_increase,
+ pipe_config->vrr.dc_balance.max_decrease,
+ pipe_config->vrr.dc_balance.vblank_target);
drm_printf(&p, "requested mode: " DRM_MODE_FMT "\n",
DRM_MODE_ARG(&pipe_config->hw.mode));
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 07/22] drm/i915/vrr: Add compute config for DC Balance params
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (5 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
` (14 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Compute DC Balance parameters and tunable params based on
experiments.
--v2:
- Document tunable params. (Ankit)
--v3:
- Add line spaces to compute config. (Ankit)
- Remove redundancy checks.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 26 ++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 3c30c8d3e206..2948abc90c69 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -20,6 +20,14 @@
#define FIXED_POINT_PRECISION 100
#define CMRR_PRECISION_TOLERANCE 10
+/*
+ * Tunable parameters for DC Balance correction.
+ * These are captured based on experimentations.
+ */
+#define DCB_CORRECTION_SENSITIVITY 30
+#define DCB_CORRECTION_AGGRESSIVENESS 1000
+#define DCB_BLANK_TARGET 50
+
bool intel_vrr_is_capable(struct intel_connector *connector)
{
struct intel_display *display = to_intel_display(connector);
@@ -399,6 +407,24 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
(crtc_state->hw.adjusted_mode.crtc_vtotal -
crtc_state->hw.adjusted_mode.crtc_vsync_end);
}
+
+ if (crtc_state->vrr.dc_balance.enable) {
+ crtc_state->vrr.dc_balance.vmax = crtc_state->vrr.vmax;
+ crtc_state->vrr.dc_balance.vmin = crtc_state->vrr.vmin;
+ crtc_state->vrr.dc_balance.max_increase =
+ crtc_state->vrr.vmax - crtc_state->vrr.vmin;
+ crtc_state->vrr.dc_balance.max_decrease =
+ crtc_state->vrr.vmax - crtc_state->vrr.vmin;
+ crtc_state->vrr.dc_balance.guardband =
+ DIV_ROUND_UP(crtc_state->vrr.dc_balance.vmax *
+ DCB_CORRECTION_SENSITIVITY, 100);
+ crtc_state->vrr.dc_balance.slope =
+ DIV_ROUND_UP(DCB_CORRECTION_AGGRESSIVENESS * 10,
+ crtc_state->vrr.dc_balance.guardband);
+ crtc_state->vrr.dc_balance.vblank_target =
+ DIV_ROUND_UP((crtc_state->vrr.vmax - crtc_state->vrr.vmin) *
+ DCB_BLANK_TARGET, 100);
+ }
}
static int
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 08/22] drm/i915/display: Add DC Balance flip counter in crtc
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (6 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 07/22] drm/i915/vrr: Add compute config " Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
` (13 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Track dc balance flip count with params per crtc.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_types.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index 710f9f925073..07bd2188303d 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1487,6 +1487,10 @@ struct intel_crtc {
struct intel_link_m_n m_n, m2_n2;
} drrs;
+ struct {
+ u64 flip_count;
+ } dc_balance;
+
int scanline_offset;
struct {
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 09/22] drm/i915/vrr: Increment DC balance flip count on every flip
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (7 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
` (12 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Increment DC Balance Flip count before every send push to indicate
DMC firmware about new flip occurrence. This is tracked separately
from legacy FLIP_COUNT register.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_color.c | 1 +
drivers/gpu/drm/i915/display/intel_display.c | 1 +
drivers/gpu/drm/i915/display/intel_vrr.c | 15 +++++++++++++++
drivers/gpu/drm/i915/display/intel_vrr.h | 3 +++
4 files changed, 20 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c
index 51db70d07fae..3aea1174593e 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -2012,6 +2012,7 @@ void intel_color_prepare_commit(struct intel_atomic_state *state,
display->funcs.color->load_luts(crtc_state);
if (crtc_state->use_dsb && intel_color_uses_chained_dsb(crtc_state)) {
+ intel_vrr_dcb_increment_flip_count(crtc_state, crtc);
intel_vrr_send_push(crtc_state->dsb_color, crtc_state);
intel_dsb_wait_for_delayed_vblank(state, crtc_state->dsb_color);
intel_vrr_check_push_sent(crtc_state->dsb_color, crtc_state);
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 1790371e4a3b..cbf073ff19d2 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7300,6 +7300,7 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
if (new_crtc_state->use_dsb && !intel_color_uses_chained_dsb(new_crtc_state)) {
intel_dsb_wait_vblanks(new_crtc_state->dsb_commit, 1);
+ intel_vrr_dcb_increment_flip_count(new_crtc_state, crtc);
intel_vrr_send_push(new_crtc_state->dsb_commit, new_crtc_state);
intel_dsb_wait_for_delayed_vblank(state, new_crtc_state->dsb_commit);
intel_vrr_check_push_sent(new_crtc_state->dsb_commit,
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 2948abc90c69..87bd722aa32d 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -14,6 +14,7 @@
#include "intel_psr.h"
#include "intel_vrr.h"
#include "intel_vrr_regs.h"
+#include "intel_dmc_regs.h"
#include "skl_prefill.h"
#include "skl_watermark.h"
@@ -612,6 +613,20 @@ void intel_vrr_set_transcoder_timings(const struct intel_crtc_state *crtc_state)
EMP_AS_SDP_DB_TL(crtc_state->vrr.vsync_start));
}
+void
+intel_vrr_dcb_increment_flip_count(struct intel_crtc_state *crtc_state,
+ struct intel_crtc *crtc)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum pipe pipe = crtc->pipe;
+
+ if (!crtc_state->vrr.dc_balance.enable)
+ return;
+
+ intel_de_write(display, PIPEDMC_DCB_FLIP_COUNT(pipe),
+ ++crtc->dc_balance.flip_count);
+}
+
void intel_vrr_send_push(struct intel_dsb *dsb,
const struct intel_crtc_state *crtc_state)
{
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.h b/drivers/gpu/drm/i915/display/intel_vrr.h
index 66fb9ad846f2..eebc7be309db 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.h
+++ b/drivers/gpu/drm/i915/display/intel_vrr.h
@@ -14,6 +14,7 @@ struct intel_connector;
struct intel_crtc_state;
struct intel_dsb;
struct intel_display;
+struct intel_crtc;
bool intel_vrr_is_capable(struct intel_connector *connector);
bool intel_vrr_is_in_range(struct intel_connector *connector, int vrefresh);
@@ -39,6 +40,8 @@ bool intel_vrr_is_fixed_rr(const struct intel_crtc_state *crtc_state);
void intel_vrr_transcoder_enable(const struct intel_crtc_state *crtc_state);
void intel_vrr_transcoder_disable(const struct intel_crtc_state *crtc_state);
void intel_vrr_set_fixed_rr_timings(const struct intel_crtc_state *crtc_state);
+void intel_vrr_dcb_increment_flip_count(struct intel_crtc_state *crtc_state,
+ struct intel_crtc *crtc);
bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
int intel_vrr_safe_window_start(const struct intel_crtc_state *crtc_state);
int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 10/22] drm/i915/vrr: Add function to reset DC Balance flip count
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (8 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
` (11 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Reset DC balance flip count value while disabling VRR
adaptive mode, this is to start with fresh counts when
VRR adaptive refresh mode is triggered again.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 1 +
drivers/gpu/drm/i915/display/intel_vrr.c | 12 ++++++++++++
drivers/gpu/drm/i915/display/intel_vrr.h | 2 ++
3 files changed, 15 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index cbf073ff19d2..1ce810625722 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1128,6 +1128,7 @@ static void intel_pre_plane_update(struct intel_atomic_state *state,
if (intel_crtc_vrr_disabling(state, crtc)) {
intel_vrr_disable(old_crtc_state);
+ intel_vrr_dcb_reset_flip_count(old_crtc_state, crtc);
intel_crtc_update_active_timings(old_crtc_state, false);
}
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 87bd722aa32d..2ae27751e5b4 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -627,6 +627,18 @@ intel_vrr_dcb_increment_flip_count(struct intel_crtc_state *crtc_state,
++crtc->dc_balance.flip_count);
}
+void intel_vrr_dcb_reset_flip_count(const struct intel_crtc_state *crtc_state,
+ struct intel_crtc *crtc)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum pipe pipe = crtc->pipe;
+
+ if (!crtc_state->vrr.dc_balance.enable)
+ return;
+
+ intel_de_write(display, PIPEDMC_DCB_FLIP_COUNT(pipe), 0);
+}
+
void intel_vrr_send_push(struct intel_dsb *dsb,
const struct intel_crtc_state *crtc_state)
{
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.h b/drivers/gpu/drm/i915/display/intel_vrr.h
index eebc7be309db..8f97525b8e2d 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.h
+++ b/drivers/gpu/drm/i915/display/intel_vrr.h
@@ -42,6 +42,8 @@ void intel_vrr_transcoder_disable(const struct intel_crtc_state *crtc_state);
void intel_vrr_set_fixed_rr_timings(const struct intel_crtc_state *crtc_state);
void intel_vrr_dcb_increment_flip_count(struct intel_crtc_state *crtc_state,
struct intel_crtc *crtc);
+void intel_vrr_dcb_reset_flip_count(const struct intel_crtc_state *crtc_state,
+ struct intel_crtc *crtc);
bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
int intel_vrr_safe_window_start(const struct intel_crtc_state *crtc_state);
int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 11/22] drm/i915/vrr: Add function reset DC balance accumulated params
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (9 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
` (10 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add function which resets all accumulated DC Balance parameters
whenever adaptive mode of VRR goes off. This helps to give a
fresh start when VRR is re-enabled.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 1 +
drivers/gpu/drm/i915/display/intel_vrr.c | 13 +++++++++++++
drivers/gpu/drm/i915/display/intel_vrr.h | 2 ++
3 files changed, 16 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 1ce810625722..83a64b13dca3 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1129,6 +1129,7 @@ static void intel_pre_plane_update(struct intel_atomic_state *state,
if (intel_crtc_vrr_disabling(state, crtc)) {
intel_vrr_disable(old_crtc_state);
intel_vrr_dcb_reset_flip_count(old_crtc_state, crtc);
+ intel_vrr_dcb_balance_reset(old_crtc_state, crtc);
intel_crtc_update_active_timings(old_crtc_state, false);
}
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 2ae27751e5b4..6168caff9cf0 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -639,6 +639,19 @@ void intel_vrr_dcb_reset_flip_count(const struct intel_crtc_state *crtc_state,
intel_de_write(display, PIPEDMC_DCB_FLIP_COUNT(pipe), 0);
}
+void
+intel_vrr_dcb_balance_reset(const struct intel_crtc_state *crtc_state,
+ struct intel_crtc *crtc)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum pipe pipe = crtc->pipe;
+
+ if (!crtc_state->vrr.dc_balance.enable)
+ return;
+
+ intel_de_write(display, PIPEDMC_DCB_BALANCE_RESET(pipe), 0);
+}
+
void intel_vrr_send_push(struct intel_dsb *dsb,
const struct intel_crtc_state *crtc_state)
{
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.h b/drivers/gpu/drm/i915/display/intel_vrr.h
index 8f97525b8e2d..a713d1a1e3dd 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.h
+++ b/drivers/gpu/drm/i915/display/intel_vrr.h
@@ -44,6 +44,8 @@ void intel_vrr_dcb_increment_flip_count(struct intel_crtc_state *crtc_state,
struct intel_crtc *crtc);
void intel_vrr_dcb_reset_flip_count(const struct intel_crtc_state *crtc_state,
struct intel_crtc *crtc);
+void intel_vrr_dcb_balance_reset(const struct intel_crtc_state *crtc_state,
+ struct intel_crtc *crtc);
bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
int intel_vrr_safe_window_start(const struct intel_crtc_state *crtc_state);
int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 12/22] drm/i915/vrr: Write DC balance params to hw registers
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (10 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
` (9 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Write DC Balance parameters to hw registers.
--v2:
- Update commit header.
- Separate crtc_state params from this patch. (Ankit)
--v3:
- Write registers at compute config.
- Update condition for write.
--v4:
- Address issue with state checker.
--v5:
- Initialise some more dc balance register while enabling VRR.
--v6:
- FLIPLINE_CFG need to be configure at last, as it is double buffer
arming point.
--v7:
- Initialise and reset live value of vmax and vmin as well.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 53 ++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 6168caff9cf0..2d418f45569f 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -764,10 +764,43 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
{
struct intel_display *display = to_intel_display(crtc_state);
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+ enum pipe pipe = crtc->pipe;
u32 vrr_ctl;
intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), TRANS_PUSH_EN);
+ if (crtc_state->vrr.dc_balance.enable) {
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG(cpu_transcoder),
+ VRR_DCB_ADJ_VMAX(crtc_state->vrr.vmax - 1));
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(cpu_transcoder),
+ VRR_DCB_ADJ_VMAX(crtc_state->vrr.vmax - 1));
+ intel_de_write(display, TRANS_VRR_DCB_VMAX(cpu_transcoder),
+ VRR_DCB_VMAX(crtc_state->vrr.vmax - 1));
+ intel_de_write(display, TRANS_VRR_DCB_VMAX_LIVE(cpu_transcoder),
+ VRR_DCB_VMAX(crtc_state->vrr.vmax - 1));
+ intel_de_write(display, TRANS_VRR_DCB_FLIPLINE(cpu_transcoder),
+ VRR_DCB_FLIPLINE(crtc_state->vrr.flipline - 1));
+ intel_de_write(display, TRANS_VRR_DCB_FLIPLINE_LIVE(cpu_transcoder),
+ VRR_DCB_FLIPLINE(crtc_state->vrr.flipline - 1));
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder),
+ VRR_DCB_ADJ_FLIPLINE(crtc_state->vrr.flipline - 1));
+ intel_de_write(display, PIPEDMC_DCB_VMIN(pipe),
+ crtc_state->vrr.dc_balance.vmin - 1);
+ intel_de_write(display, PIPEDMC_DCB_VMAX(pipe),
+ crtc_state->vrr.dc_balance.vmax - 1);
+ intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe),
+ crtc_state->vrr.dc_balance.max_increase);
+ intel_de_write(display, PIPEDMC_DCB_MAX_DECREASE(pipe),
+ crtc_state->vrr.dc_balance.max_decrease);
+ intel_de_write(display, PIPEDMC_DCB_GUARDBAND(pipe),
+ crtc_state->vrr.dc_balance.guardband);
+ intel_de_write(display, PIPEDMC_DCB_SLOPE(pipe),
+ crtc_state->vrr.dc_balance.slope);
+ intel_de_write(display, PIPEDMC_DCB_VBLANK(pipe),
+ crtc_state->vrr.dc_balance.vblank_target);
+ }
+
vrr_ctl = VRR_CTL_VRR_ENABLE | trans_vrr_ctl(crtc_state);
/*
@@ -785,6 +818,8 @@ static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state)
{
struct intel_display *display = to_intel_display(old_crtc_state);
enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
+ struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
+ enum pipe pipe = crtc->pipe;
intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder),
trans_vrr_ctl(old_crtc_state));
@@ -795,6 +830,24 @@ static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state)
drm_err(display->drm, "Timed out waiting for VRR live status to clear\n");
intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), 0);
+
+ if (old_crtc_state->vrr.dc_balance.enable) {
+ intel_de_write(display, PIPEDMC_DCB_VMIN(pipe), 0);
+ intel_de_write(display, PIPEDMC_DCB_VMAX(pipe), 0);
+ intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe), 0);
+ intel_de_write(display, PIPEDMC_DCB_MAX_DECREASE(pipe), 0);
+ intel_de_write(display, PIPEDMC_DCB_GUARDBAND(pipe), 0);
+ intel_de_write(display, PIPEDMC_DCB_SLOPE(pipe), 0);
+ intel_de_write(display, PIPEDMC_DCB_VBLANK(pipe), 0);
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_VMAX_LIVE(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_FLIPLINE_LIVE(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_VMAX(cpu_transcoder), 0);
+ intel_de_write(display, TRANS_VRR_DCB_FLIPLINE(cpu_transcoder), 0);
+ }
}
void intel_vrr_enable(const struct intel_crtc_state *crtc_state)
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 13/22] drm/i915/vrr: Configure DC balance flipline adjustment
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (11 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 14/22] drm/i915/vblank: Extract vrr_vblank_start() Mitul Golani
` (8 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Configure DC Balance Flipline adjustment once after other
DC balance adjustment registers are written.
Bspec: 68935
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 2d418f45569f..97949ff782aa 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -785,6 +785,8 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
VRR_DCB_FLIPLINE(crtc_state->vrr.flipline - 1));
intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder),
VRR_DCB_ADJ_FLIPLINE(crtc_state->vrr.flipline - 1));
+ intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG(cpu_transcoder),
+ VRR_DCB_ADJ_FLIPLINE(crtc_state->vrr.flipline - 1));
intel_de_write(display, PIPEDMC_DCB_VMIN(pipe),
crtc_state->vrr.dc_balance.vmin - 1);
intel_de_write(display, PIPEDMC_DCB_VMAX(pipe),
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 14/22] drm/i915/vblank: Extract vrr_vblank_start()
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (12 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing Mitul Golani
` (7 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Initialise delayed vblank position for evasion logic.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_vblank.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 2fc0c1c0bb87..0af8539e2e8e 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -650,6 +650,14 @@ intel_pre_commit_crtc_state(struct intel_atomic_state *state,
return pre_commit_crtc_state(old_crtc_state, new_crtc_state);
}
+static int vrr_vblank_start(const struct intel_crtc_state *crtc_state)
+{
+ if (intel_vrr_is_push_sent(crtc_state))
+ return intel_vrr_vmin_vblank_start(crtc_state);
+ else
+ return intel_vrr_vmax_vblank_start(crtc_state);
+}
+
void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
const struct intel_crtc_state *new_crtc_state,
struct intel_vblank_evade_ctx *evade)
@@ -676,10 +684,7 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
drm_WARN_ON(crtc->base.dev, intel_crtc_needs_modeset(new_crtc_state) ||
new_crtc_state->update_m_n || new_crtc_state->update_lrr);
- if (intel_vrr_is_push_sent(crtc_state))
- evade->vblank_start = intel_vrr_vmin_vblank_start(crtc_state);
- else
- evade->vblank_start = intel_vrr_vmax_vblank_start(crtc_state);
+ evade->vblank_start = vrr_vblank_start(crtc_state);
vblank_delay = crtc_state->set_context_latency;
} else {
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (13 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 14/22] drm/i915/vblank: Extract vrr_vblank_start() Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
` (6 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Add vblank evasion logic when vrr is already enabled along with
dc balance is computed.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dsb.c | 31 ++++++++++++++++++++-
drivers/gpu/drm/i915/display/intel_vblank.c | 26 +++++++++++++++--
2 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c
index 4ad4efbf9253..83130bb74aa9 100644
--- a/drivers/gpu/drm/i915/display/intel_dsb.c
+++ b/drivers/gpu/drm/i915/display/intel_dsb.c
@@ -704,7 +704,36 @@ void intel_dsb_vblank_evade(struct intel_atomic_state *state,
if (crtc_state->has_psr)
intel_dsb_emit_wait_dsl(dsb, DSB_OPCODE_WAIT_DSL_OUT, 0, 0);
- if (pre_commit_is_vrr_active(state, crtc)) {
+ if (pre_commit_is_vrr_active(state, crtc) && crtc_state->vrr.dc_balance.enable) {
+ int vblank_delay = crtc_state->set_context_latency;
+ int vmin_vblank_start, vmax_vblank_start;
+
+ vmin_vblank_start = intel_vrr_dcb_vmin_vblank_start_next(crtc_state);
+
+ if (vmin_vblank_start >= 0) {
+ end = vmin_vblank_start;
+ start = end - vblank_delay - latency;
+ intel_dsb_wait_scanline_out(state, dsb, start, end);
+ }
+
+ vmax_vblank_start = intel_vrr_dcb_vmax_vblank_start_next(crtc_state);
+
+ if (vmax_vblank_start >= 0) {
+ end = vmax_vblank_start;
+ start = end - vblank_delay - latency;
+ intel_dsb_wait_scanline_out(state, dsb, start, end);
+ }
+
+ vmin_vblank_start = intel_vrr_dcb_vmin_vblank_start_final(crtc_state);
+ end = vmin_vblank_start;
+ start = end - vblank_delay - latency;
+ intel_dsb_wait_scanline_out(state, dsb, start, end);
+
+ vmax_vblank_start = intel_vrr_dcb_vmax_vblank_start_final(crtc_state);
+ end = vmax_vblank_start;
+ start = end - vblank_delay - latency;
+ intel_dsb_wait_scanline_out(state, dsb, start, end);
+ } else if (pre_commit_is_vrr_active(state, crtc)) {
int vblank_delay = crtc_state->set_context_latency;
end = intel_vrr_vmin_vblank_start(crtc_state);
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 0af8539e2e8e..a3f489ae767f 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -652,10 +652,30 @@ intel_pre_commit_crtc_state(struct intel_atomic_state *state,
static int vrr_vblank_start(const struct intel_crtc_state *crtc_state)
{
- if (intel_vrr_is_push_sent(crtc_state))
- return intel_vrr_vmin_vblank_start(crtc_state);
+ bool is_push_sent = intel_vrr_is_push_sent(crtc_state);
+ int vblank_start;
+
+ if (!crtc_state->vrr.dc_balance.enable) {
+ if (is_push_sent)
+ return intel_vrr_vmin_vblank_start(crtc_state);
+ else
+ return intel_vrr_vmax_vblank_start(crtc_state);
+ }
+
+ if (is_push_sent)
+ vblank_start = intel_vrr_dcb_vmin_vblank_start_next(crtc_state);
else
- return intel_vrr_vmax_vblank_start(crtc_state);
+ vblank_start = intel_vrr_dcb_vmax_vblank_start_next(crtc_state);
+
+ if (vblank_start >= 0)
+ return vblank_start;
+
+ if (is_push_sent)
+ vblank_start = intel_vrr_dcb_vmin_vblank_start_final(crtc_state);
+ else
+ vblank_start = intel_vrr_dcb_vmax_vblank_start_final(crtc_state);
+
+ return vblank_start;
}
void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 16/22] drm/i915/display: Wait for VRR PUSH status update
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (14 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
` (5 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
After VRR Push is sent, need to wait till flipline decision boundary
to get Push bit to get cleared.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 23 ++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 83a64b13dca3..ea4e1ec65db7 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7221,6 +7221,22 @@ static void intel_atomic_dsb_prepare(struct intel_atomic_state *state,
intel_color_prepare_commit(state, crtc);
}
+static int
+dcb_vmin_vblank_start(struct intel_crtc_state *crtc_state)
+{
+ return (intel_vrr_dcb_vmin_vblank_start_next(crtc_state) < 0) ?
+ intel_vrr_dcb_vmin_vblank_start_final(crtc_state) :
+ intel_vrr_dcb_vmin_vblank_start_next(crtc_state);
+}
+
+static int
+dcb_vmax_vblank_start(struct intel_crtc_state *crtc_state)
+{
+ return (intel_vrr_dcb_vmax_vblank_start_next(crtc_state) < 0) ?
+ intel_vrr_dcb_vmax_vblank_start_final(crtc_state) :
+ intel_vrr_dcb_vmax_vblank_start_next(crtc_state);
+}
+
static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
struct intel_crtc *crtc)
{
@@ -7305,6 +7321,13 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
intel_vrr_dcb_increment_flip_count(new_crtc_state, crtc);
intel_vrr_send_push(new_crtc_state->dsb_commit, new_crtc_state);
intel_dsb_wait_for_delayed_vblank(state, new_crtc_state->dsb_commit);
+
+ if (new_crtc_state->vrr.dc_balance.enable) {
+ intel_dsb_wait_scanline_in(state, new_crtc_state->dsb_commit,
+ dcb_vmin_vblank_start(new_crtc_state),
+ dcb_vmax_vblank_start(new_crtc_state));
+ }
+
intel_vrr_check_push_sent(new_crtc_state->dsb_commit,
new_crtc_state);
intel_dsb_interrupt(new_crtc_state->dsb_commit);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (15 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits Mitul Golani
` (4 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Add function to control DC balance enable/disable bit via DSB.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_dmc.c | 17 +++++++++++++++++
drivers/gpu/drm/i915/display/intel_dmc.h | 4 ++++
2 files changed, 21 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c
index 5ba17e66d90b..3acce8c6d94c 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.c
+++ b/drivers/gpu/drm/i915/display/intel_dmc.c
@@ -1748,3 +1748,20 @@ u32 intel_pipedmc_start_mmioaddr(struct intel_crtc *crtc)
return dmc ? dmc->dmc_info[dmc_id].start_mmioaddr : 0;
}
+
+void intel_pipedmc_dcb_enable(struct intel_dsb *dsb, struct intel_crtc *crtc)
+{
+ struct intel_display *display = to_intel_display(crtc);
+ enum pipe pipe = crtc->pipe;
+
+ intel_de_write_dsb(display, dsb, PIPEDMC_DCB_CTL(pipe),
+ PIPEDMC_ADAPTIVE_DCB_ENABLE);
+}
+
+void intel_pipedmc_dcb_disable(struct intel_dsb *dsb, struct intel_crtc *crtc)
+{
+ struct intel_display *display = to_intel_display(crtc);
+ enum pipe pipe = crtc->pipe;
+
+ intel_de_write_dsb(display, dsb, PIPEDMC_DCB_CTL(pipe), 0);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_dmc.h b/drivers/gpu/drm/i915/display/intel_dmc.h
index 40e9dcb033cc..132d6cfc8e8b 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.h
+++ b/drivers/gpu/drm/i915/display/intel_dmc.h
@@ -10,11 +10,13 @@
enum pipe;
enum pipedmc_event_id;
+struct intel_crtc;
struct drm_printer;
struct intel_crtc;
struct intel_crtc_state;
struct intel_display;
struct intel_dmc_snapshot;
+struct intel_dsb;
void intel_dmc_init(struct intel_display *display);
void intel_dmc_load_program(struct intel_display *display);
@@ -39,6 +41,8 @@ void intel_dmc_update_dc6_allowed_count(struct intel_display *display, bool star
void assert_main_dmc_loaded(struct intel_display *display);
void intel_pipedmc_irq_handler(struct intel_display *display, enum pipe pipe);
+void intel_pipedmc_dcb_enable(struct intel_dsb *dsb, struct intel_crtc *crtc);
+void intel_pipedmc_dcb_disable(struct intel_dsb *dsb, struct intel_crtc *crtc);
u32 intel_pipedmc_start_mmioaddr(struct intel_crtc *crtc);
void intel_pipedmc_enable_event(struct intel_crtc *crtc,
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (16 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
` (3 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
From: Ville Syrjälä <ville.syrjala@linux.intel.com>
Pause the DMC DC Balancing for the remainder of the
commit so that vmin/vmax won't change after we've baked
them into the DSB vblank evasion commands.
--v2:
- Remove typo. (Ankit)
- Separate vrr enable structuring. (Ankit)
--v3:
- Add gaurd before accessing DC balance bits.
- Remove redundancy checks.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 19 +++++++++++++++++++
drivers/gpu/drm/i915/display/intel_vrr.c | 5 +++++
2 files changed, 24 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index ea4e1ec65db7..f2b84920c38e 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7269,6 +7269,21 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
if (new_crtc_state->use_flipq)
intel_flipq_wait_dmc_halt(new_crtc_state->dsb_commit, crtc);
+ if (new_crtc_state->vrr.dc_balance.enable) {
+ /*
+ * Pause the DMC DC balancing for the remainder of
+ * the commit so that vmin/vmax won't change after
+ * we've baked them into the DSB vblank evasion
+ * commands.
+ *
+ * FIXME maybe need a small delay here to make sure
+ * DMC has finished updating the values? Or we need
+ * a better DMC<->driver protocol that gives is real
+ * guarantees about that...
+ */
+ intel_pipedmc_dcb_disable(NULL, crtc);
+ }
+
if (intel_crtc_needs_color_update(new_crtc_state))
intel_color_commit_noarm(new_crtc_state->dsb_commit,
new_crtc_state);
@@ -7330,6 +7345,10 @@ static void intel_atomic_dsb_finish(struct intel_atomic_state *state,
intel_vrr_check_push_sent(new_crtc_state->dsb_commit,
new_crtc_state);
+
+ if (new_crtc_state->vrr.dc_balance.enable)
+ intel_pipedmc_dcb_enable(new_crtc_state->dsb_commit, crtc);
+
intel_dsb_interrupt(new_crtc_state->dsb_commit);
}
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 97949ff782aa..eb6643ec5194 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -9,6 +9,7 @@
#include "intel_de.h"
#include "intel_display_regs.h"
#include "intel_display_types.h"
+#include "intel_dmc.h"
#include "intel_dmc_regs.h"
#include "intel_dp.h"
#include "intel_psr.h"
@@ -813,6 +814,9 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
if (cmrr_enable)
vrr_ctl |= VRR_CTL_CMRR_ENABLE;
+ if (crtc_state->vrr.dc_balance.enable)
+ intel_pipedmc_dcb_enable(NULL, crtc);
+
intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl);
}
@@ -834,6 +838,7 @@ static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state)
intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), 0);
if (old_crtc_state->vrr.dc_balance.enable) {
+ intel_pipedmc_dcb_disable(NULL, crtc);
intel_de_write(display, PIPEDMC_DCB_VMIN(pipe), 0);
intel_de_write(display, PIPEDMC_DCB_VMAX(pipe), 0);
intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe), 0);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 19/22] drm/i915/display: Add function to configure event for dc balance
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (17 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
` (2 subsequent siblings)
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Configure pipe dmc event for dc balance enable/disable.
--v2:
- Initialize with redundant flags. (Ankit)
--v3:
- Add function as per new enable/disable configuration framework.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_dmc.c | 15 +++++++++++++++
drivers/gpu/drm/i915/display/intel_dmc.h | 2 ++
drivers/gpu/drm/i915/display/intel_vrr.c | 5 ++++-
3 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c
index 3acce8c6d94c..919c6e035b66 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.c
+++ b/drivers/gpu/drm/i915/display/intel_dmc.c
@@ -852,6 +852,21 @@ static void dmc_configure_event(struct intel_display *display,
dmc_id, num_handlers, event_id);
}
+/*
+ * intel_dmc_configure_dc_balance_event() - Configure event
+ * for dc balance enable/disable
+ * @display: display instance
+ * @pipe: pipe which register use to block
+ * @enable: enable/disable
+ */
+void intel_dmc_configure_dc_balance_event(struct intel_display *display,
+ enum pipe pipe, bool enable)
+{
+ enum intel_dmc_id dmc_id = PIPE_TO_DMC_ID(pipe);
+
+ dmc_configure_event(display, dmc_id, PIPEDMC_EVENT_ADAPTIVE_DCB_TRIGGER, enable);
+}
+
/**
* intel_dmc_block_pkgc() - block PKG C-state
* @display: display instance
diff --git a/drivers/gpu/drm/i915/display/intel_dmc.h b/drivers/gpu/drm/i915/display/intel_dmc.h
index 132d6cfc8e8b..32a9abd53a8d 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.h
+++ b/drivers/gpu/drm/i915/display/intel_dmc.h
@@ -26,6 +26,8 @@ void intel_dmc_enable_pipe(const struct intel_crtc_state *crtc_state);
void intel_dmc_disable_pipe(const struct intel_crtc_state *crtc_state);
void intel_dmc_block_pkgc(struct intel_display *display, enum pipe pipe,
bool block);
+void intel_dmc_configure_dc_balance_event(struct intel_display *display,
+ enum pipe pipe, bool enable);
void intel_dmc_start_pkgc_exit_at_start_of_undelayed_vblank(struct intel_display *display,
enum pipe pipe, bool enable);
void intel_dmc_fini(struct intel_display *display);
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index eb6643ec5194..4d56a4e8c7ca 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -814,8 +814,10 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
if (cmrr_enable)
vrr_ctl |= VRR_CTL_CMRR_ENABLE;
- if (crtc_state->vrr.dc_balance.enable)
+ if (crtc_state->vrr.dc_balance.enable) {
+ intel_dmc_configure_dc_balance_event(display, pipe, true);
intel_pipedmc_dcb_enable(NULL, crtc);
+ }
intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl);
}
@@ -839,6 +841,7 @@ static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state)
if (old_crtc_state->vrr.dc_balance.enable) {
intel_pipedmc_dcb_disable(NULL, crtc);
+ intel_dmc_configure_dc_balance_event(display, pipe, false);
intel_de_write(display, PIPEDMC_DCB_VMIN(pipe), 0);
intel_de_write(display, PIPEDMC_DCB_VMAX(pipe), 0);
intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe), 0);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 20/22] drm/i915/vrr: Enable Adaptive sync counter bit
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (18 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 21/22] drm/i915/vrr: Enable DC Balance Mitul Golani
2025-10-27 16:29 ` [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add enable/disable frame counters for DC Balance odd and even
frame count calculation.
--v2:
Update commit message
--v3:
- Driver should not control adjustment enable bit, as that
is already being controlled by firmware. Release bit from
driver computation.
- Commit message update.
--v4:
- Configure PIPEDMC_EVT_CTL enable/disable call.
--v5:
- Add Adaptive sync counter enable.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 4d56a4e8c7ca..4c4dc065d3ad 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -816,6 +816,8 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
if (crtc_state->vrr.dc_balance.enable) {
intel_dmc_configure_dc_balance_event(display, pipe, true);
+ intel_de_write(display, TRANS_ADAPTIVE_SYNC_DCB_CTL(cpu_transcoder),
+ ADAPTIVE_SYNC_COUNTER_EN);
intel_pipedmc_dcb_enable(NULL, crtc);
}
@@ -842,6 +844,7 @@ static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state)
if (old_crtc_state->vrr.dc_balance.enable) {
intel_pipedmc_dcb_disable(NULL, crtc);
intel_dmc_configure_dc_balance_event(display, pipe, false);
+ intel_de_write(display, TRANS_ADAPTIVE_SYNC_DCB_CTL(cpu_transcoder), 0);
intel_de_write(display, PIPEDMC_DCB_VMIN(pipe), 0);
intel_de_write(display, PIPEDMC_DCB_VMAX(pipe), 0);
intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe), 0);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 21/22] drm/i915/vrr: Enable DC Balance
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (19 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 16:29 ` [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
21 siblings, 0 replies; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Enable DC Balance from vrr compute config and related hw flag.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index 4c4dc065d3ad..d68306cdbf57 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -240,12 +240,17 @@ static
void intel_vrr_compute_vrr_timings(struct intel_crtc_state *crtc_state,
int vmin, int vmax)
{
+ struct intel_display *display = to_intel_display(crtc_state);
+
crtc_state->vrr.vmax = vmax;
crtc_state->vrr.vmin = vmin;
crtc_state->vrr.flipline = crtc_state->vrr.vmin;
crtc_state->vrr.enable = true;
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
+
+ if (HAS_VRR_DC_BALANCE(display))
+ crtc_state->vrr.dc_balance.enable = true;
}
static
@@ -815,6 +820,7 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
vrr_ctl |= VRR_CTL_CMRR_ENABLE;
if (crtc_state->vrr.dc_balance.enable) {
+ vrr_ctl |= VRR_CTL_DCB_ADJ_ENABLE;
intel_dmc_configure_dc_balance_event(display, pipe, true);
intel_de_write(display, TRANS_ADAPTIVE_SYNC_DCB_CTL(cpu_transcoder),
ADAPTIVE_SYNC_COUNTER_EN);
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (20 preceding siblings ...)
2025-10-27 16:29 ` [PATCH v8 21/22] drm/i915/vrr: Enable DC Balance Mitul Golani
@ 2025-10-27 16:29 ` Mitul Golani
2025-10-27 19:51 ` kernel test robot
21 siblings, 1 reply; 24+ messages in thread
From: Mitul Golani @ 2025-10-27 16:29 UTC (permalink / raw)
To: intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
Add function to check if DC Balance possibile on
requested PIPE and also validate along with DISPLAY_VER
check.
Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_vrr.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index d68306cdbf57..50bb3a1f6105 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -236,6 +236,22 @@ void intel_vrr_compute_cmrr_timings(struct intel_crtc_state *crtc_state)
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
}
+static
+int intel_vrr_dc_balance_possible(const struct intel_crtc_state *crtc_state)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+ enum pipe pipe = crtc->pipe;
+
+ /*
+ * FIXME: Currently Firmware supports DC Balancing on PIPE A
+ * and PIPE B. Account those limitation while computing DC
+ * Balance parameters.
+ */
+ return (HAS_VRR_DC_BALANCE(display) &&
+ ((pipe == PIPE_A) || (pipe == PIPE_B)));
+}
+
static
void intel_vrr_compute_vrr_timings(struct intel_crtc_state *crtc_state,
int vmin, int vmax)
@@ -249,7 +265,7 @@ void intel_vrr_compute_vrr_timings(struct intel_crtc_state *crtc_state,
crtc_state->vrr.enable = true;
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
- if (HAS_VRR_DC_BALANCE(display))
+ if (intel_vrr_dc_balance_possible(crtc_state))
crtc_state->vrr.dc_balance.enable = true;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible
2025-10-27 16:29 ` [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
@ 2025-10-27 19:51 ` kernel test robot
0 siblings, 0 replies; 24+ messages in thread
From: kernel test robot @ 2025-10-27 19:51 UTC (permalink / raw)
To: Mitul Golani, intel-gfx
Cc: oe-kbuild-all, intel-xe, mitulkumar.ajitkumar.golani,
ankit.k.nautiyal, uma.shankar, ville.syrjala
Hi Mitul,
kernel test robot noticed the following build warnings:
[auto build test WARNING on next-20251027]
[cannot apply to drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-tip/drm-tip v6.18-rc3 v6.18-rc2 v6.18-rc1 linus/master v6.18-rc3]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Mitul-Golani/drm-i915-display-Add-source-param-for-dc-balance/20251028-011354
base: next-20251027
patch link: https://lore.kernel.org/r/20251027162927.2655581-23-mitulkumar.ajitkumar.golani%40intel.com
patch subject: [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible
config: i386-buildonly-randconfig-003-20251028 (https://download.01.org/0day-ci/archive/20251028/202510280310.FHuwVpY6-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251028/202510280310.FHuwVpY6-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510280310.FHuwVpY6-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/gpu/drm/i915/display/intel_vrr.c: In function 'intel_vrr_compute_vrr_timings':
>> drivers/gpu/drm/i915/display/intel_vrr.c:259:31: warning: unused variable 'display' [-Wunused-variable]
259 | struct intel_display *display = to_intel_display(crtc_state);
| ^~~~~~~
vim +/display +259 drivers/gpu/drm/i915/display/intel_vrr.c
e098418ea9f1ca Mitul Golani 2025-10-27 254
58f9466c8292f8 Ankit Nautiyal 2025-03-11 255 static
8a553374db132e Ville Syrjälä 2025-10-20 256 void intel_vrr_compute_vrr_timings(struct intel_crtc_state *crtc_state,
8a553374db132e Ville Syrjälä 2025-10-20 257 int vmin, int vmax)
58f9466c8292f8 Ankit Nautiyal 2025-03-11 258 {
5de4c2be73f248 Mitul Golani 2025-10-27 @259 struct intel_display *display = to_intel_display(crtc_state);
5de4c2be73f248 Mitul Golani 2025-10-27 260
8a553374db132e Ville Syrjälä 2025-10-20 261 crtc_state->vrr.vmax = vmax;
8a553374db132e Ville Syrjälä 2025-10-20 262 crtc_state->vrr.vmin = vmin;
8a553374db132e Ville Syrjälä 2025-10-20 263 crtc_state->vrr.flipline = crtc_state->vrr.vmin;
8a553374db132e Ville Syrjälä 2025-10-20 264
58f9466c8292f8 Ankit Nautiyal 2025-03-11 265 crtc_state->vrr.enable = true;
58f9466c8292f8 Ankit Nautiyal 2025-03-11 266 crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
5de4c2be73f248 Mitul Golani 2025-10-27 267
e098418ea9f1ca Mitul Golani 2025-10-27 268 if (intel_vrr_dc_balance_possible(crtc_state))
5de4c2be73f248 Mitul Golani 2025-10-27 269 crtc_state->vrr.dc_balance.enable = true;
58f9466c8292f8 Ankit Nautiyal 2025-03-11 270 }
58f9466c8292f8 Ankit Nautiyal 2025-03-11 271
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2025-10-27 19:52 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-27 16:29 [PATCH v8 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
2025-10-27 16:29 ` [PATCH v8 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
2025-10-27 16:29 ` [PATCH v8 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
2025-10-27 16:29 ` [PATCH v8 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
2025-10-27 16:29 ` [PATCH v8 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff Mitul Golani
2025-10-27 16:29 ` [PATCH v8 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
2025-10-27 16:29 ` [PATCH v8 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
2025-10-27 16:29 ` [PATCH v8 07/22] drm/i915/vrr: Add compute config " Mitul Golani
2025-10-27 16:29 ` [PATCH v8 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
2025-10-27 16:29 ` [PATCH v8 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
2025-10-27 16:29 ` [PATCH v8 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
2025-10-27 16:29 ` [PATCH v8 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
2025-10-27 16:29 ` [PATCH v8 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
2025-10-27 16:29 ` [PATCH v8 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
2025-10-27 16:29 ` [PATCH v8 14/22] drm/i915/vblank: Extract vrr_vblank_start() Mitul Golani
2025-10-27 16:29 ` [PATCH v8 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing Mitul Golani
2025-10-27 16:29 ` [PATCH v8 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
2025-10-27 16:29 ` [PATCH v8 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
2025-10-27 16:29 ` [PATCH v8 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits Mitul Golani
2025-10-27 16:29 ` [PATCH v8 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
2025-10-27 16:29 ` [PATCH v8 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
2025-10-27 16:29 ` [PATCH v8 21/22] drm/i915/vrr: Enable DC Balance Mitul Golani
2025-10-27 16:29 ` [PATCH v8 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
2025-10-27 19:51 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox