Skip to content

Commit 345b7c4

Browse files
committed
drm/i915: Convert fixed_mode/downclock_mode into a list
Store the fixed_mode and downclock_mode as a real list, in preparation for exposing other supported modes as well. v2: Init the list in intel_sdvo_connector_alloc() too v3: Use list_first_entry_or_null() (Jani) Reviewed-by: Jani Nikula <[email protected]> Signed-off-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent c5ee234 commit 345b7c4

File tree

5 files changed

+50
-46
lines changed

5 files changed

+50
-46
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ int intel_connector_init(struct intel_connector *connector)
5454
__drm_atomic_helper_connector_reset(&connector->base,
5555
&conn_state->base);
5656

57+
INIT_LIST_HEAD(&connector->panel.fixed_modes);
58+
5759
return 0;
5860
}
5961

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -548,12 +548,15 @@ static void intel_encoder_info(struct seq_file *m,
548548
static void intel_panel_info(struct seq_file *m,
549549
struct intel_connector *connector)
550550
{
551-
const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;
551+
const struct drm_display_mode *fixed_mode;
552552

553-
if (!fixed_mode)
553+
if (list_empty(&connector->panel.fixed_modes))
554554
return;
555555

556-
seq_printf(m, "\tfixed mode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(fixed_mode));
556+
seq_puts(m, "\tfixed modes:\n");
557+
558+
list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head)
559+
intel_seq_print_mode(m, 2, fixed_mode);
557560
}
558561

559562
static void intel_hdcp_info(struct seq_file *m,

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,7 @@ struct intel_panel_bl_funcs {
280280
};
281281

282282
struct intel_panel {
283-
struct drm_display_mode *fixed_mode;
284-
struct drm_display_mode *downclock_mode;
283+
struct list_head fixed_modes;
285284

286285
/* backlight */
287286
struct {

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

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -48,59 +48,55 @@ bool intel_panel_use_ssc(struct drm_i915_private *i915)
4848
const struct drm_display_mode *
4949
intel_panel_preferred_fixed_mode(struct intel_connector *connector)
5050
{
51-
return connector->panel.fixed_mode;
51+
return list_first_entry_or_null(&connector->panel.fixed_modes,
52+
struct drm_display_mode, head);
5253
}
5354

5455
const struct drm_display_mode *
5556
intel_panel_fixed_mode(struct intel_connector *connector,
5657
const struct drm_display_mode *mode)
5758
{
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;
59+
const struct drm_display_mode *fixed_mode, *best_mode = NULL;
60+
int vrefresh = drm_mode_vrefresh(mode);
61+
62+
/* pick the fixed_mode that is closest in terms of vrefresh */
63+
list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) {
64+
if (!best_mode ||
65+
abs(drm_mode_vrefresh(fixed_mode) - vrefresh) <
66+
abs(drm_mode_vrefresh(best_mode) - vrefresh))
67+
best_mode = fixed_mode;
68+
}
69+
70+
return best_mode;
6971
}
7072

7173
const struct drm_display_mode *
7274
intel_panel_downclock_mode(struct intel_connector *connector,
7375
const struct drm_display_mode *adjusted_mode)
7476
{
75-
const struct drm_display_mode *downclock_mode = connector->panel.downclock_mode;
77+
const struct drm_display_mode *fixed_mode, *best_mode = NULL;
78+
int vrefresh = drm_mode_vrefresh(adjusted_mode);
79+
80+
/* pick the fixed_mode with the lowest refresh rate */
81+
list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) {
82+
if (drm_mode_vrefresh(fixed_mode) < vrefresh) {
83+
vrefresh = drm_mode_vrefresh(fixed_mode);
84+
best_mode = fixed_mode;
85+
}
86+
}
7687

77-
if (downclock_mode &&
78-
drm_mode_vrefresh(downclock_mode) < drm_mode_vrefresh(adjusted_mode))
79-
return downclock_mode;
80-
else
81-
return NULL;
88+
return best_mode;
8289
}
8390

8491
int intel_panel_get_modes(struct intel_connector *connector)
8592
{
93+
const struct drm_display_mode *fixed_mode;
8694
int num_modes = 0;
8795

88-
if (connector->panel.fixed_mode) {
89-
struct drm_display_mode *mode;
90-
91-
mode = drm_mode_duplicate(connector->base.dev,
92-
connector->panel.fixed_mode);
93-
if (mode) {
94-
drm_mode_probed_add(&connector->base, mode);
95-
num_modes++;
96-
}
97-
}
98-
99-
if (connector->panel.downclock_mode) {
96+
list_for_each_entry(fixed_mode, &connector->panel.fixed_modes, head) {
10097
struct drm_display_mode *mode;
10198

102-
mode = drm_mode_duplicate(connector->base.dev,
103-
connector->panel.downclock_mode);
99+
mode = drm_mode_duplicate(connector->base.dev, fixed_mode);
104100
if (mode) {
105101
drm_mode_probed_add(&connector->base, mode);
106102
num_modes++;
@@ -114,7 +110,8 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector)
114110
{
115111
struct drm_i915_private *i915 = to_i915(connector->base.dev);
116112

117-
if (!connector->panel.downclock_mode)
113+
if (list_empty(&connector->panel.fixed_modes) ||
114+
list_is_singular(&connector->panel.fixed_modes))
118115
return DRRS_TYPE_NONE;
119116

120117
return i915->vbt.drrs_type;
@@ -608,8 +605,10 @@ int intel_panel_init(struct intel_panel *panel,
608605
{
609606
intel_backlight_init_funcs(panel);
610607

611-
panel->fixed_mode = fixed_mode;
612-
panel->downclock_mode = downclock_mode;
608+
if (fixed_mode)
609+
list_add_tail(&fixed_mode->head, &panel->fixed_modes);
610+
if (downclock_mode)
611+
list_add_tail(&downclock_mode->head, &panel->fixed_modes);
613612

614613
return 0;
615614
}
@@ -618,13 +617,12 @@ void intel_panel_fini(struct intel_panel *panel)
618617
{
619618
struct intel_connector *intel_connector =
620619
container_of(panel, struct intel_connector, panel);
620+
struct drm_display_mode *fixed_mode, *next;
621621

622622
intel_backlight_destroy(panel);
623623

624-
if (panel->fixed_mode)
625-
drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
626-
627-
if (panel->downclock_mode)
628-
drm_mode_destroy(intel_connector->base.dev,
629-
panel->downclock_mode);
624+
list_for_each_entry_safe(fixed_mode, next, &panel->fixed_modes, head) {
625+
list_del(&fixed_mode->head);
626+
drm_mode_destroy(intel_connector->base.dev, fixed_mode);
627+
}
630628
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2747,6 +2747,8 @@ static struct intel_sdvo_connector *intel_sdvo_connector_alloc(void)
27472747
__drm_atomic_helper_connector_reset(&sdvo_connector->base.base,
27482748
&conn_state->base.base);
27492749

2750+
INIT_LIST_HEAD(&sdvo_connector->base.panel.fixed_modes);
2751+
27502752
return sdvo_connector;
27512753
}
27522754

0 commit comments

Comments
 (0)