Skip to content

Commit

Permalink
drm/i915: Use intel_panel_mode_valid() for DSI/LVDS/(s)DVO
Browse files Browse the repository at this point in the history
All fixed mode panels should behave the same way when it comes to mode
filtering. Reuse the intel_panel_mode_valid() for all of them.

This changes the behaviour to match what we do for eDP, ie.
reject anything that doesn't exactly match the fixed mode
dimensions. Users can still manually provide different
sized modes which will be handled by the panel fitter just
as before. The difference is that we can no longer report
funny modes in the connector's mode list.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210923200109.4459-3-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
  • Loading branch information
Ville Syrjälä committed Sep 30, 2021
1 parent 0824360 commit 8a567b1
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 22 deletions.
11 changes: 7 additions & 4 deletions drivers/gpu/drm/i915/display/intel_dsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <drm/drm_mipi_dsi.h>
#include "intel_dsi.h"
#include "intel_panel.h"

int intel_dsi_bitrate(const struct intel_dsi *intel_dsi)
{
Expand Down Expand Up @@ -67,10 +68,12 @@ enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector,
return MODE_NO_DBLESCAN;

if (fixed_mode) {
if (mode->hdisplay > fixed_mode->hdisplay)
return MODE_PANEL;
if (mode->vdisplay > fixed_mode->vdisplay)
return MODE_PANEL;
enum drm_mode_status status;

status = intel_panel_mode_valid(intel_connector, mode);
if (status != MODE_OK)
return status;

if (fixed_mode->clock > max_dotclk)
return MODE_CLOCK_HIGH;
}
Expand Down
14 changes: 8 additions & 6 deletions drivers/gpu/drm/i915/display/intel_dvo.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,10 @@ static enum drm_mode_status
intel_dvo_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode)
{
struct intel_dvo *intel_dvo = intel_attached_dvo(to_intel_connector(connector));
struct intel_connector *intel_connector = to_intel_connector(connector);
struct intel_dvo *intel_dvo = intel_attached_dvo(intel_connector);
const struct drm_display_mode *fixed_mode =
to_intel_connector(connector)->panel.fixed_mode;
intel_connector->panel.fixed_mode;
int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
int target_clock = mode->clock;

Expand All @@ -235,10 +236,11 @@ intel_dvo_mode_valid(struct drm_connector *connector,
/* XXX: Validate clock range */

if (fixed_mode) {
if (mode->hdisplay > fixed_mode->hdisplay)
return MODE_PANEL;
if (mode->vdisplay > fixed_mode->vdisplay)
return MODE_PANEL;
enum drm_mode_status status;

status = intel_panel_mode_valid(intel_connector, mode);
if (status != MODE_OK)
return status;

target_clock = fixed_mode->clock;
}
Expand Down
10 changes: 6 additions & 4 deletions drivers/gpu/drm/i915/display/intel_lvds.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,13 +389,15 @@ intel_lvds_mode_valid(struct drm_connector *connector,
struct intel_connector *intel_connector = to_intel_connector(connector);
struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
int max_pixclk = to_i915(connector->dev)->max_dotclk_freq;
enum drm_mode_status status;

if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
return MODE_NO_DBLESCAN;
if (mode->hdisplay > fixed_mode->hdisplay)
return MODE_PANEL;
if (mode->vdisplay > fixed_mode->vdisplay)
return MODE_PANEL;

status = intel_panel_mode_valid(intel_connector, mode);
if (status != MODE_OK)
return status;

if (fixed_mode->clock > max_pixclk)
return MODE_CLOCK_HIGH;

Expand Down
12 changes: 4 additions & 8 deletions drivers/gpu/drm/i915/display/intel_sdvo.c
Original file line number Diff line number Diff line change
Expand Up @@ -1873,7 +1873,6 @@ intel_sdvo_mode_valid(struct drm_connector *connector,
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
return MODE_NO_DBLESCAN;


if (clock > max_dotclk)
return MODE_CLOCK_HIGH;

Expand All @@ -1890,14 +1889,11 @@ intel_sdvo_mode_valid(struct drm_connector *connector,
return MODE_CLOCK_HIGH;

if (IS_LVDS(intel_sdvo_connector)) {
const struct drm_display_mode *fixed_mode =
intel_sdvo_connector->base.panel.fixed_mode;

if (mode->hdisplay > fixed_mode->hdisplay)
return MODE_PANEL;
enum drm_mode_status status;

if (mode->vdisplay > fixed_mode->vdisplay)
return MODE_PANEL;
status = intel_panel_mode_valid(&intel_sdvo_connector->base, mode);
if (status != MODE_OK)
return status;
}

return MODE_OK;
Expand Down

0 comments on commit 8a567b1

Please sign in to comment.