Skip to content

Commit 9df1e3f

Browse files
Manasi Navarejlahtine-intel
authored andcommitted
drm/i915/display/vrr: Reset VRR capable property on a long hpd
With some VRR panels, user can turn VRR ON/OFF on the fly from the panel settings. When VRR is turned OFF ,sends a long HPD to the driver clearing the Ignore MSA bit in the DPCD. Currently the driver parses that onevery HPD but fails to reset the corresponding VRR Capable Connector property. Hence the userspace still sees this as VRR Capable panel which is incorrect. Fix this by explicitly resetting the connector property. v2: Reset vrr capable if status == connector_disconnected v3: Use i915 and use bool vrr_capable (Jani Nikula) v4: Move vrr_capable to after update modes call (Jani N) Remove the redundant comment (Jan N) v5: Fixes the regression on older platforms by resetting the VRR only if HAS_VRR v6: Remove the checks from driver, add in drm core before setting VRR prop (Ville) v7: Move VRR set/reset to set/unset_edid (Ville) Cc: Jani Nikula <jani.nikula@intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Fixes: 9bc34b4 ("drm/i915/display/vrr: Reset VRR capable property on a long hpd") Signed-off-by: Manasi Navare <manasi.d.navare@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220303233222.4698-1-manasi.d.navare@intel.com (cherry picked from commit d999ad1) Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
1 parent b2d229d commit 9df1e3f

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4383,13 +4383,20 @@ intel_dp_update_420(struct intel_dp *intel_dp)
43834383
static void
43844384
intel_dp_set_edid(struct intel_dp *intel_dp)
43854385
{
4386+
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
43864387
struct intel_connector *connector = intel_dp->attached_connector;
43874388
struct edid *edid;
4389+
bool vrr_capable;
43884390

43894391
intel_dp_unset_edid(intel_dp);
43904392
edid = intel_dp_get_edid(intel_dp);
43914393
connector->detect_edid = edid;
43924394

4395+
vrr_capable = intel_vrr_is_capable(&connector->base);
4396+
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] VRR capable: %s\n",
4397+
connector->base.base.id, connector->base.name, str_yes_no(vrr_capable));
4398+
drm_connector_set_vrr_capable_property(&connector->base, vrr_capable);
4399+
43934400
intel_dp_update_dfp(intel_dp, edid);
43944401
intel_dp_update_420(intel_dp);
43954402

@@ -4422,6 +4429,9 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
44224429

44234430
intel_dp->dfp.ycbcr_444_to_420 = false;
44244431
connector->base.ycbcr_420_allowed = false;
4432+
4433+
drm_connector_set_vrr_capable_property(&connector->base,
4434+
false);
44254435
}
44264436

44274437
static int
@@ -4572,14 +4582,9 @@ static int intel_dp_get_modes(struct drm_connector *connector)
45724582
int num_modes = 0;
45734583

45744584
edid = intel_connector->detect_edid;
4575-
if (edid) {
4585+
if (edid)
45764586
num_modes = intel_connector_update_modes(connector, edid);
45774587

4578-
if (intel_vrr_is_capable(connector))
4579-
drm_connector_set_vrr_capable_property(connector,
4580-
true);
4581-
}
4582-
45834588
/* Also add fixed mode, which may or may not be present in EDID */
45844589
if (intel_dp_is_edp(intel_attached_dp(intel_connector)) &&
45854590
intel_connector->panel.fixed_mode) {

0 commit comments

Comments
 (0)