Skip to content

Commit e8cd188

Browse files
gmitulaknautiyal
authored andcommitted
drm/i915/display: Compute vrr_vsync params
Compute vrr_vsync_start/end, which sets the position for hardware to send the Vsync at a fixed position relative to the end of the Vblank. --v2: - Updated VSYNC_START/END macros to VRR_VSYNC_START/END. (Ankit) - Updated bit fields of VRR_VSYNC_START/END. (Ankit) --v3: - Add PIPE_CONF_CHECK_I(vrr.vsync_start/end). - Read/write vrr_vsync params only when we intend to send adaptive_sync sdp. --v4: - Use VRR_SYNC_START/END macros correctly. --v5: - Send AS SDP only when VRR is enabled. --v6: - Add TRANS_VRR_VSYNC before enabling VRR as per bspec. (Ankit) Signed-off-by: Mitul Golani <[email protected]> Reviewed-by: Arun R Murthy <[email protected]> Reviewed-by: Ankit Nautiyal <[email protected]> Signed-off-by: Ankit Nautiyal <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent abe1cd9 commit e8cd188

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

drivers/gpu/drm/i915/display/intel_display.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5385,6 +5385,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
53855385
PIPE_CONF_CHECK_I(vrr.flipline);
53865386
PIPE_CONF_CHECK_I(vrr.pipeline_full);
53875387
PIPE_CONF_CHECK_I(vrr.guardband);
5388+
PIPE_CONF_CHECK_I(vrr.vsync_start);
5389+
PIPE_CONF_CHECK_I(vrr.vsync_end);
53885390
}
53895391

53905392
#undef PIPE_CONF_CHECK_X

drivers/gpu/drm/i915/display/intel_display_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,7 @@ struct intel_crtc_state {
14341434
bool enable, in_range;
14351435
u8 pipeline_full;
14361436
u16 flipline, vmin, vmax, guardband;
1437+
u32 vsync_end, vsync_start;
14371438
} vrr;
14381439

14391440
/* Stream Splitter for eDP MSO */

drivers/gpu/drm/i915/display/intel_vrr.c

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "intel_de.h"
1010
#include "intel_display_types.h"
1111
#include "intel_vrr.h"
12+
#include "intel_dp.h"
1213

1314
bool intel_vrr_is_capable(struct intel_connector *connector)
1415
{
@@ -113,6 +114,7 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
113114
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
114115
struct intel_connector *connector =
115116
to_intel_connector(conn_state->connector);
117+
struct intel_dp *intel_dp = intel_attached_dp(connector);
116118
struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
117119
const struct drm_display_info *info = &connector->base.display_info;
118120
int vmin, vmax;
@@ -165,6 +167,14 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
165167
if (crtc_state->uapi.vrr_enabled) {
166168
crtc_state->vrr.enable = true;
167169
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
170+
if (intel_dp_as_sdp_supported(intel_dp)) {
171+
crtc_state->vrr.vsync_start =
172+
(crtc_state->hw.adjusted_mode.crtc_vtotal -
173+
crtc_state->hw.adjusted_mode.vsync_start);
174+
crtc_state->vrr.vsync_end =
175+
(crtc_state->hw.adjusted_mode.crtc_vtotal -
176+
crtc_state->hw.adjusted_mode.vsync_end);
177+
}
168178
}
169179
}
170180

@@ -240,6 +250,12 @@ void intel_vrr_enable(const struct intel_crtc_state *crtc_state)
240250
return;
241251

242252
intel_de_write(dev_priv, TRANS_PUSH(cpu_transcoder), TRANS_PUSH_EN);
253+
254+
if (HAS_AS_SDP(dev_priv))
255+
intel_de_write(dev_priv, TRANS_VRR_VSYNC(cpu_transcoder),
256+
VRR_VSYNC_END(crtc_state->vrr.vsync_end) |
257+
VRR_VSYNC_START(crtc_state->vrr.vsync_start));
258+
243259
intel_de_write(dev_priv, TRANS_VRR_CTL(cpu_transcoder),
244260
VRR_CTL_VRR_ENABLE | trans_vrr_ctl(crtc_state));
245261
}
@@ -258,13 +274,16 @@ void intel_vrr_disable(const struct intel_crtc_state *old_crtc_state)
258274
intel_de_wait_for_clear(dev_priv, TRANS_VRR_STATUS(cpu_transcoder),
259275
VRR_STATUS_VRR_EN_LIVE, 1000);
260276
intel_de_write(dev_priv, TRANS_PUSH(cpu_transcoder), 0);
277+
278+
if (HAS_AS_SDP(dev_priv))
279+
intel_de_write(dev_priv, TRANS_VRR_VSYNC(cpu_transcoder), 0);
261280
}
262281

263282
void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
264283
{
265284
struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
266285
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
267-
u32 trans_vrr_ctl;
286+
u32 trans_vrr_ctl, trans_vrr_vsync;
268287

269288
trans_vrr_ctl = intel_de_read(dev_priv, TRANS_VRR_CTL(cpu_transcoder));
270289

@@ -284,6 +303,16 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
284303
crtc_state->vrr.vmin = intel_de_read(dev_priv, TRANS_VRR_VMIN(cpu_transcoder)) + 1;
285304
}
286305

287-
if (crtc_state->vrr.enable)
306+
if (crtc_state->vrr.enable) {
288307
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
308+
309+
if (HAS_AS_SDP(dev_priv)) {
310+
trans_vrr_vsync =
311+
intel_de_read(dev_priv, TRANS_VRR_VSYNC(cpu_transcoder));
312+
crtc_state->vrr.vsync_start =
313+
REG_FIELD_GET(VRR_VSYNC_START_MASK, trans_vrr_vsync);
314+
crtc_state->vrr.vsync_end =
315+
REG_FIELD_GET(VRR_VSYNC_END_MASK, trans_vrr_vsync);
316+
}
317+
}
289318
}

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,6 +2093,13 @@
20932093
#define TRANS_PUSH_EN REG_BIT(31)
20942094
#define TRANS_PUSH_SEND REG_BIT(30)
20952095

2096+
#define _TRANS_VRR_VSYNC_A 0x60078
2097+
#define TRANS_VRR_VSYNC(trans) _MMIO_TRANS2(trans, _TRANS_VRR_VSYNC_A)
2098+
#define VRR_VSYNC_END_MASK REG_GENMASK(28, 16)
2099+
#define VRR_VSYNC_END(vsync_end) REG_FIELD_PREP(VRR_VSYNC_END_MASK, (vsync_end))
2100+
#define VRR_VSYNC_START_MASK REG_GENMASK(12, 0)
2101+
#define VRR_VSYNC_START(vsync_start) REG_FIELD_PREP(VRR_VSYNC_START_MASK, (vsync_start))
2102+
20962103
/* VGA port control */
20972104
#define ADPA _MMIO(0x61100)
20982105
#define PCH_ADPA _MMIO(0xe1100)

0 commit comments

Comments
 (0)