* [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB
@ 2025-11-03 5:29 Mitul Golani
2025-11-03 5:29 ` [RESEND, 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
` (22 more replies)
0 siblings, 23 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 01/22] drm/i915/display: Add source param for dc balance
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 5:29 ` [RESEND, 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
` (21 subsequent siblings)
22 siblings, 0 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 ece66c8c4ce6..a43b90b53b68 100644
--- a/drivers/gpu/drm/i915/display/intel_display_device.h
+++ b/drivers/gpu/drm/i915/display/intel_display_device.h
@@ -199,6 +199,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] 43+ messages in thread
* [RESEND, 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
2025-11-03 5:29 ` [RESEND, 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:15 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
` (20 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
2025-11-03 5:29 ` [RESEND, 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
2025-11-03 5:29 ` [RESEND, 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 9:59 ` Jani Nikula
2025-11-05 4:19 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff Mitul Golani
` (19 subsequent siblings)
22 siblings, 2 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (2 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 5:29 ` [RESEND, 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
` (18 subsequent siblings)
22 siblings, 0 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 05/22] drm/i915/vrr: Add DC Balance params to crtc_state
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (3 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:24 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
` (17 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 42ec78798666..a00625f882e8 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -5470,6 +5470,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 00600134bda0..33fb70716110 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1358,6 +1358,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] 43+ messages in thread
* [RESEND, 06/22] drm/i915/vrr: Add state dump for DC Balance params
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (4 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:25 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 07/22] drm/i915/vrr: Add compute config " Mitul Golani
` (16 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 c2a6217c2262..e09c9f872e99 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] 43+ messages in thread
* [RESEND, 07/22] drm/i915/vrr: Add compute config for DC Balance params
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (5 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:27 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
` (15 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 08/22] drm/i915/display: Add DC Balance flip counter in crtc
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (6 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 07/22] drm/i915/vrr: Add compute config " Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:28 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
` (14 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 33fb70716110..09eda2c409d8 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1502,6 +1502,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] 43+ messages in thread
* [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (7 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 10:01 ` Jani Nikula
` (2 more replies)
2025-11-03 5:29 ` [RESEND, 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
` (13 subsequent siblings)
22 siblings, 3 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 1e97020e7304..47a732ae2448 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 a00625f882e8..1a3e7a6e4ab7 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7366,6 +7366,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] 43+ messages in thread
* [RESEND, 10/22] drm/i915/vrr: Add function to reset DC Balance flip count
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (8 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:52 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
` (12 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 1a3e7a6e4ab7..323293f4bf6d 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1148,6 +1148,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] 43+ messages in thread
* [RESEND, 11/22] drm/i915/vrr: Add function reset DC balance accumulated params
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (9 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:54 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
` (11 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 323293f4bf6d..b256517d58cf 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1149,6 +1149,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] 43+ messages in thread
* [RESEND, 12/22] drm/i915/vrr: Write DC balance params to hw registers
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (10 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:56 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
` (10 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 13/22] drm/i915/vrr: Configure DC balance flipline adjustment
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (11 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 4:57 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 14/22] drm/i915/vblank: Extract vrr_vblank_start() Mitul Golani
` (9 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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] 43+ messages in thread
* [RESEND, 14/22] drm/i915/vblank: Extract vrr_vblank_start()
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (12 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 5:29 ` [RESEND, 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing Mitul Golani
` (8 subsequent siblings)
22 siblings, 0 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 671f357c6563..de20baeb9d99 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -652,6 +652,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)
@@ -678,10 +686,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] 43+ messages in thread
* [RESEND, 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (13 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 14/22] drm/i915/vblank: Extract vrr_vblank_start() Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 5:29 ` [RESEND, 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
` (7 subsequent siblings)
22 siblings, 0 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 de20baeb9d99..df5879489963 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -654,10 +654,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] 43+ messages in thread
* [RESEND, 16/22] drm/i915/display: Wait for VRR PUSH status update
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (14 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 5:59 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
` (6 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 b256517d58cf..faec325e7652 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7287,6 +7287,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)
{
@@ -7371,6 +7387,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] 43+ messages in thread
* [RESEND, 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (15 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 10:02 ` Jani Nikula
2025-11-03 5:29 ` [RESEND, 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits Mitul Golani
` (5 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 0bddb20a7c86..3e3f4438d739 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] 43+ messages in thread
* [RESEND, 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (16 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-03 5:29 ` [RESEND, 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
` (4 subsequent siblings)
22 siblings, 0 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 faec325e7652..b88e20418327 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -7335,6 +7335,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);
@@ -7396,6 +7411,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] 43+ messages in thread
* [RESEND, 19/22] drm/i915/display: Add function to configure event for dc balance
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (17 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits Mitul Golani
@ 2025-11-03 5:29 ` Mitul Golani
2025-11-05 6:18 ` Nautiyal, Ankit K
2025-11-03 5:30 ` [RESEND, 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
` (3 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5: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 3e3f4438d739..1460f9674a35 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] 43+ messages in thread
* [RESEND, 20/22] drm/i915/vrr: Enable Adaptive sync counter bit
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (18 preceding siblings ...)
2025-11-03 5:29 ` [RESEND, 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
@ 2025-11-03 5:30 ` Mitul Golani
2025-11-05 6:02 ` Nautiyal, Ankit K
2025-11-03 5:30 ` [RESEND, 21/22] drm/i915/vrr: Enable DC Balance Mitul Golani
` (2 subsequent siblings)
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5:30 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] 43+ messages in thread
* [RESEND, 21/22] drm/i915/vrr: Enable DC Balance
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (19 preceding siblings ...)
2025-11-03 5:30 ` [RESEND, 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
@ 2025-11-03 5:30 ` Mitul Golani
2025-11-03 5:30 ` [RESEND, 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
2025-11-03 6:05 ` ✗ Fi.CI.BUILD: failure for Enable/Disable DC balance along with VRR DSB Patchwork
22 siblings, 0 replies; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5:30 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] 43+ messages in thread
* [RESEND, 22/22] drm/i915/vrr: Add function to check if DC Balance Possible
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (20 preceding siblings ...)
2025-11-03 5:30 ` [RESEND, 21/22] drm/i915/vrr: Enable DC Balance Mitul Golani
@ 2025-11-03 5:30 ` Mitul Golani
2025-11-05 6:04 ` Nautiyal, Ankit K
2025-11-03 6:05 ` ✗ Fi.CI.BUILD: failure for Enable/Disable DC balance along with VRR DSB Patchwork
22 siblings, 1 reply; 43+ messages in thread
From: Mitul Golani @ 2025-11-03 5:30 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] 43+ messages in thread
* ✗ Fi.CI.BUILD: failure for Enable/Disable DC balance along with VRR DSB
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
` (21 preceding siblings ...)
2025-11-03 5:30 ` [RESEND, 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
@ 2025-11-03 6:05 ` Patchwork
22 siblings, 0 replies; 43+ messages in thread
From: Patchwork @ 2025-11-03 6:05 UTC (permalink / raw)
To: Mitul Golani; +Cc: intel-gfx
== Series Details ==
Series: Enable/Disable DC balance along with VRR DSB
URL : https://patchwork.freedesktop.org/series/156899/
State : failure
== Summary ==
Error: make failed
CALL scripts/checksyscalls.sh
DESCEND objtool
INSTALL libsubcmd_headers
CC [M] drivers/gpu/drm/i915/display/intel_vrr.o
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: error: unused variable ‘display’ [-Werror=unused-variable]
259 | struct intel_display *display = to_intel_display(crtc_state);
| ^~~~~~~
cc1: all warnings being treated as errors
make[6]: *** [scripts/Makefile.build:287: drivers/gpu/drm/i915/display/intel_vrr.o] Error 1
make[5]: *** [scripts/Makefile.build:556: drivers/gpu/drm/i915] Error 2
make[4]: *** [scripts/Makefile.build:556: drivers/gpu/drm] Error 2
make[3]: *** [scripts/Makefile.build:556: drivers/gpu] Error 2
make[2]: *** [scripts/Makefile.build:556: drivers] Error 2
make[1]: *** [/home/kbuild2/kernel/Makefile:2010: .] Error 2
make: *** [Makefile:248: __sub-make] Error 2
Build failed, no error log produced
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers
2025-11-03 5:29 ` [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
@ 2025-11-03 9:59 ` Jani Nikula
2025-11-05 4:19 ` Nautiyal, Ankit K
1 sibling, 0 replies; 43+ messages in thread
From: Jani Nikula @ 2025-11-03 9:59 UTC (permalink / raw)
To: Mitul Golani, intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
On Mon, 03 Nov 2025, Mitul Golani <mitulkumar.ajitkumar.golani@intel.com> wrote:
> Add VRR register offsets and bits to access DC Balance configuration.
v7 and the indentation is still all over the place. Read the big comment
near the top of i915_reg.h.
>
> --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))
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip
2025-11-03 5:29 ` [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
@ 2025-11-03 10:01 ` Jani Nikula
2025-11-05 4:51 ` Nautiyal, Ankit K
2025-11-05 6:15 ` Nautiyal, Ankit K
2 siblings, 0 replies; 43+ messages in thread
From: Jani Nikula @ 2025-11-03 10:01 UTC (permalink / raw)
To: Mitul Golani, intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
On Mon, 03 Nov 2025, Mitul Golani <mitulkumar.ajitkumar.golani@intel.com> wrote:
> 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 1e97020e7304..47a732ae2448 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 a00625f882e8..1a3e7a6e4ab7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -7366,6 +7366,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"
Please keep includes sorted.
> #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;
Please keep forward declarations sorted.
>
> 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);
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable
2025-11-03 5:29 ` [RESEND, 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
@ 2025-11-03 10:02 ` Jani Nikula
0 siblings, 0 replies; 43+ messages in thread
From: Jani Nikula @ 2025-11-03 10:02 UTC (permalink / raw)
To: Mitul Golani, intel-gfx
Cc: intel-xe, mitulkumar.ajitkumar.golani, ankit.k.nautiyal,
uma.shankar, ville.syrjala
On Mon, 03 Nov 2025, Mitul Golani <mitulkumar.ajitkumar.golani@intel.com> wrote:
> 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 0bddb20a7c86..3e3f4438d739 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;
Please keep forward declarations sorted.
>
> 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,
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance
2025-11-03 5:29 ` [RESEND, 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
@ 2025-11-05 4:15 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:15 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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)
Missed to point this out earlier, quoting fromi915_reg.h :
Indent the register content macros using two extra spaces between
``#define`` and the macro name.
> +
> +#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)
This doesn’t seem to be right.
Regards,
Ankit
> +
> +#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__ */
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers
2025-11-03 5:29 ` [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
2025-11-03 9:59 ` Jani Nikula
@ 2025-11-05 4:19 ` Nautiyal, Ankit K
1 sibling, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:19 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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)
This is a bit awkward to read, can we have this in same line. I
understand this will be more than 100 chars but IMO that should be alright.
Regards,
Ankit
> +#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))
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 05/22] drm/i915/vrr: Add DC Balance params to crtc_state
2025-11-03 5:29 ` [RESEND, 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
@ 2025-11-05 4:24 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:24 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 42ec78798666..a00625f882e8 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -5470,6 +5470,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 00600134bda0..33fb70716110 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1358,6 +1358,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;
Instead of reading it twice, can we just use a temp variable:
reg = intel_de_read(display, PIPEDMC_DCB_VMIN(pipe)) ;
crtc_state->vrr.dc_balance.vmin = reg ? reg + 1 :0;
reg = intel_de_read(display, PIPEDMC_DCB_VMAX(pipe)) ;
crtc_state->vrr.dc_balance.vmax = reg ? reg + 1 :0;
Regards,
Ankit
> + 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.
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 06/22] drm/i915/vrr: Add state dump for DC Balance params
2025-11-03 5:29 ` [RESEND, 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
@ 2025-11-05 4:25 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:25 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 c2a6217c2262..e09c9f872e99 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",
nitpick: s/Vblank target/vblank target
Regards,
Ankit
> + 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));
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 07/22] drm/i915/vrr: Add compute config for DC Balance params
2025-11-03 5:29 ` [RESEND, 07/22] drm/i915/vrr: Add compute config " Mitul Golani
@ 2025-11-05 4:27 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:27 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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,
Should we have DCB_CORRECTION_AGGRESSIVENESS directly as 10000 instead?
Regards,
Ankit
> + 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
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 08/22] drm/i915/display: Add DC Balance flip counter in crtc
2025-11-03 5:29 ` [RESEND, 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
@ 2025-11-05 4:28 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:28 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
[-- Attachment #1: Type: text/html, Size: 1716 bytes --]
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip
2025-11-03 5:29 ` [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
2025-11-03 10:01 ` Jani Nikula
@ 2025-11-05 4:51 ` Nautiyal, Ankit K
2025-11-05 6:15 ` Nautiyal, Ankit K
2 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:51 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 1e97020e7304..47a732ae2448 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 a00625f882e8..1a3e7a6e4ab7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -7366,6 +7366,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);
Shouldn't these have DSB context? We are asking DSB to write these
registers.
We need to increment flip_count after intel_vrr_send_push() not before
as per the spec.
Also we need to do this for MMIO path along with the DSB path.
So IMO, add this flip count increment at last in intel_update_crtc()
instead, then we do not need to use DSB.
Regards,
Ankit
> 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);
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 10/22] drm/i915/vrr: Add function to reset DC Balance flip count
2025-11-03 5:29 ` [RESEND, 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
@ 2025-11-05 4:52 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:52 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 1a3e7a6e4ab7..323293f4bf6d 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -1148,6 +1148,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);
IMHO we should merge patches#8,9,10 to have a single patch that
introduces a new member flip_count to struct intel_crtc, and to
increment and reset the counter.
Regards,
Ankit
> 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);
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 11/22] drm/i915/vrr: Add function reset DC balance accumulated params
2025-11-03 5:29 ` [RESEND, 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
@ 2025-11-05 4:54 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:54 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 323293f4bf6d..b256517d58cf 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -1149,6 +1149,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);
Lets have both the reset functions in the intel_vrr_dcb_balance_reset().
Move this patch before the dcb_flip_count introduction patch.
Call the function to reset the flip_count from intel_vrr_dcb_balance_reset()
Regards,
Ankit
> 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);
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 12/22] drm/i915/vrr: Write DC balance params to hw registers
2025-11-03 5:29 ` [RESEND, 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
@ 2025-11-05 4:56 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:56 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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);
Can we make a separate function for this something like:
intel_vrr_enable_dc_balancing()
{
if (!crtc_state->vrr.dc_balance.enable)
Return;
…..
…..
}
Similar thing for disable.
Regards,
Ankit
> + }
> +
> 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)
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 13/22] drm/i915/vrr: Configure DC balance flipline adjustment
2025-11-03 5:29 ` [RESEND, 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
@ 2025-11-05 4:57 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 4:57 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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));
This can be part of the earlier patch.
Regards,
Ankit
> intel_de_write(display, PIPEDMC_DCB_VMIN(pipe),
> crtc_state->vrr.dc_balance.vmin - 1);
> intel_de_write(display, PIPEDMC_DCB_VMAX(pipe),
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 16/22] drm/i915/display: Wait for VRR PUSH status update
2025-11-03 5:29 ` [RESEND, 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
@ 2025-11-05 5:59 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 5:59 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 b256517d58cf..faec325e7652 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -7287,6 +7287,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)
> {
> @@ -7371,6 +7387,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));
> + }
Hmm... lets not add this as a separate thing. The idea is to wait for
vmin safe window, so that after that we are exactly SCL lines away from
the delayed vblank.
As I understand, DMC FW will adjust the VRR timings so we need to use
the Live values from the registers.
I think we need to use the TRANS_VRR_DCB_FLIPLINE_LIVE value for
computing thevrr vmin safe window end in
intel_dsb_wait_for_delayed_vblank() when DC balancing is enabled.
Regards,
Ankit
> +
> intel_vrr_check_push_sent(new_crtc_state->dsb_commit,
> new_crtc_state);
> intel_dsb_interrupt(new_crtc_state->dsb_commit);
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 20/22] drm/i915/vrr: Enable Adaptive sync counter bit
2025-11-03 5:30 ` [RESEND, 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
@ 2025-11-05 6:02 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 6:02 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 11:00 AM, Mitul Golani wrote:
> 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);
This change can be part of Patch#12.
Regards,
Ankit
> 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);
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 22/22] drm/i915/vrr: Add function to check if DC Balance Possible
2025-11-03 5:30 ` [RESEND, 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
@ 2025-11-05 6:04 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 6:04 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 11:00 AM, Mitul Golani wrote:
> 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)));
Earlier there were plans to have this supported on other pipes, but now
I think this condition is fixed that only PIPE A/B have this feature. So
this change can be clubbed with the previous patch.
Regards,
Ankit
> +}
> +
> 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;
> }
>
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip
2025-11-03 5:29 ` [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
2025-11-03 10:01 ` Jani Nikula
2025-11-05 4:51 ` Nautiyal, Ankit K
@ 2025-11-05 6:15 ` Nautiyal, Ankit K
2 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 6:15 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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 1e97020e7304..47a732ae2448 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 a00625f882e8..1a3e7a6e4ab7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -7366,6 +7366,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"
This is already added in patch#5, so drop this.
Regards,
Ankit
> #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);
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [RESEND, 19/22] drm/i915/display: Add function to configure event for dc balance
2025-11-03 5:29 ` [RESEND, 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
@ 2025-11-05 6:18 ` Nautiyal, Ankit K
0 siblings, 0 replies; 43+ messages in thread
From: Nautiyal, Ankit K @ 2025-11-05 6:18 UTC (permalink / raw)
To: Mitul Golani, intel-gfx; +Cc: intel-xe, uma.shankar, ville.syrjala
On 11/3/2025 10:59 AM, Mitul Golani wrote:
> 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.
This is a new patch, the version history is no more applicable.
Regards,
Ankit
> 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 3e3f4438d739..1460f9674a35 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);
^ permalink raw reply [flat|nested] 43+ messages in thread
end of thread, other threads:[~2025-11-05 6:18 UTC | newest]
Thread overview: 43+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-03 5:29 [RESEND, 00/22] Enable/Disable DC balance along with VRR DSB Mitul Golani
2025-11-03 5:29 ` [RESEND, 01/22] drm/i915/display: Add source param for dc balance Mitul Golani
2025-11-03 5:29 ` [RESEND, 02/22] drm/i915/dmc: Add pipe dmc registers and bits for DC Balance Mitul Golani
2025-11-05 4:15 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 03/22] drm/i915/vrr: Add VRR DC balance registers Mitul Golani
2025-11-03 9:59 ` Jani Nikula
2025-11-05 4:19 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 04/22] drm/i915/vrr: Add functions to read out vmin/vmax stuff Mitul Golani
2025-11-03 5:29 ` [RESEND, 05/22] drm/i915/vrr: Add DC Balance params to crtc_state Mitul Golani
2025-11-05 4:24 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 06/22] drm/i915/vrr: Add state dump for DC Balance params Mitul Golani
2025-11-05 4:25 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 07/22] drm/i915/vrr: Add compute config " Mitul Golani
2025-11-05 4:27 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 08/22] drm/i915/display: Add DC Balance flip counter in crtc Mitul Golani
2025-11-05 4:28 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 09/22] drm/i915/vrr: Increment DC balance flip count on every flip Mitul Golani
2025-11-03 10:01 ` Jani Nikula
2025-11-05 4:51 ` Nautiyal, Ankit K
2025-11-05 6:15 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 10/22] drm/i915/vrr: Add function to reset DC Balance flip count Mitul Golani
2025-11-05 4:52 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 11/22] drm/i915/vrr: Add function reset DC balance accumulated params Mitul Golani
2025-11-05 4:54 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 12/22] drm/i915/vrr: Write DC balance params to hw registers Mitul Golani
2025-11-05 4:56 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 13/22] drm/i915/vrr: Configure DC balance flipline adjustment Mitul Golani
2025-11-05 4:57 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 14/22] drm/i915/vblank: Extract vrr_vblank_start() Mitul Golani
2025-11-03 5:29 ` [RESEND, 15/22] drm/i915/vrr: Implement vblank evasion with DC balancing Mitul Golani
2025-11-03 5:29 ` [RESEND, 16/22] drm/i915/display: Wait for VRR PUSH status update Mitul Golani
2025-11-05 5:59 ` Nautiyal, Ankit K
2025-11-03 5:29 ` [RESEND, 17/22] drm/i915/dsb: Add pipedmc dc balance enable/disable Mitul Golani
2025-11-03 10:02 ` Jani Nikula
2025-11-03 5:29 ` [RESEND, 18/22] drm/i915/vrr: Pause DC Balancing for DSB commits Mitul Golani
2025-11-03 5:29 ` [RESEND, 19/22] drm/i915/display: Add function to configure event for dc balance Mitul Golani
2025-11-05 6:18 ` Nautiyal, Ankit K
2025-11-03 5:30 ` [RESEND, 20/22] drm/i915/vrr: Enable Adaptive sync counter bit Mitul Golani
2025-11-05 6:02 ` Nautiyal, Ankit K
2025-11-03 5:30 ` [RESEND, 21/22] drm/i915/vrr: Enable DC Balance Mitul Golani
2025-11-03 5:30 ` [RESEND, 22/22] drm/i915/vrr: Add function to check if DC Balance Possible Mitul Golani
2025-11-05 6:04 ` Nautiyal, Ankit K
2025-11-03 6:05 ` ✗ Fi.CI.BUILD: failure for Enable/Disable DC balance along with VRR DSB Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).