Skip to content

Commit c5ee234

Browse files
committed
drm/i915: Implement static DRRS
Let's start supporting static DRRS by trying to match the refresh rate the user has requested, assuming the panel supports suitable timings. For now we stick to just our current two timings: - fixed_mode: the panel's preferred mode - downclock_mode: the lowest refresh rate mode we found Some panels may support more timings than that, but we'll have to convert our fixed_mode/downclock_mode pointers into a full list before we can handle that. v2: Rebase due to intel_panel_get_modes() Reviewed-by: Jani Nikula <[email protected]> #v1 Signed-off-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent c2f1215 commit c5ee234

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ intel_drrs_init(struct intel_connector *connector,
390390
return NULL;
391391
}
392392

393-
if (dev_priv->vbt.drrs_type != DRRS_TYPE_SEAMLESS) {
393+
if (dev_priv->vbt.drrs_type == DRRS_TYPE_NONE) {
394394
drm_dbg_kms(&dev_priv->drm,
395395
"[CONNECTOR:%d:%s] DRRS not supported according to VBT\n",
396396
connector->base.base.id, connector->base.name);

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,30 @@ const struct drm_display_mode *
5555
intel_panel_fixed_mode(struct intel_connector *connector,
5656
const struct drm_display_mode *mode)
5757
{
58-
return connector->panel.fixed_mode;
58+
const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;
59+
const struct drm_display_mode *downclock_mode = connector->panel.downclock_mode;
60+
61+
/* pick the one that is closer in terms of vrefresh */
62+
/* FIXME make this a a list of modes so we can have more than two */
63+
if (fixed_mode && downclock_mode &&
64+
abs(drm_mode_vrefresh(downclock_mode) - drm_mode_vrefresh(mode)) <
65+
abs(drm_mode_vrefresh(fixed_mode) - drm_mode_vrefresh(mode)))
66+
return downclock_mode;
67+
else
68+
return fixed_mode;
5969
}
6070

6171
const struct drm_display_mode *
6272
intel_panel_downclock_mode(struct intel_connector *connector,
6373
const struct drm_display_mode *adjusted_mode)
6474
{
65-
return connector->panel.downclock_mode;
75+
const struct drm_display_mode *downclock_mode = connector->panel.downclock_mode;
76+
77+
if (downclock_mode &&
78+
drm_mode_vrefresh(downclock_mode) < drm_mode_vrefresh(adjusted_mode))
79+
return downclock_mode;
80+
else
81+
return NULL;
6682
}
6783

6884
int intel_panel_get_modes(struct intel_connector *connector)
@@ -80,6 +96,17 @@ int intel_panel_get_modes(struct intel_connector *connector)
8096
}
8197
}
8298

99+
if (connector->panel.downclock_mode) {
100+
struct drm_display_mode *mode;
101+
102+
mode = drm_mode_duplicate(connector->base.dev,
103+
connector->panel.downclock_mode);
104+
if (mode) {
105+
drm_mode_probed_add(&connector->base, mode);
106+
num_modes++;
107+
}
108+
}
109+
83110
return num_modes;
84111
}
85112

0 commit comments

Comments
 (0)