Skip to content

Commit

Permalink
drm/modes: Parse overscan properties
Browse files Browse the repository at this point in the history
Properly configuring the overscan properties might be needed for the
initial setup of the framebuffer for display that still have overscan.
Let's allow for more properties on the kernel command line to setup each
margin.

Reviewed-by: Noralf Trønnes <[email protected]>
Signed-off-by: Maxime Ripard <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/e481f1628e3768ca49226ec2115cfa4dfcbd5e4c.1560783090.git-series.maxime.ripard@bootlin.com
  • Loading branch information
mripard committed Jun 19, 2019
1 parent 22045e8 commit 3d46a30
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Documentation/fb/modedb.txt
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ Options can also be passed after the mode, using commas as separator.

Valid options are:

- margin_top, margin_bottom, margin_left, margin_right (integer):
Number of pixels in the margins, typically to deal with overscan on TVs
- reflect_x (boolean): Perform an axial symmetry on the X axis
- reflect_y (boolean): Perform an axial symmetry on the Y axis
- rotate (integer): Rotate the initial framebuffer by x
Expand Down
44 changes: 44 additions & 0 deletions drivers/gpu/drm/drm_modes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1609,6 +1609,50 @@ static int drm_mode_parse_cmdline_options(char *str, size_t len,
} else if (!strncmp(option, "reflect_y", delim - option)) {
rotation |= DRM_MODE_REFLECT_Y;
sep = delim;
} else if (!strncmp(option, "margin_right", delim - option)) {
const char *value = delim + 1;
unsigned int margin;

margin = simple_strtol(value, &sep, 10);

/* Make sure we have parsed something */
if (sep == value)
return -EINVAL;

mode->tv_margins.right = margin;
} else if (!strncmp(option, "margin_left", delim - option)) {
const char *value = delim + 1;
unsigned int margin;

margin = simple_strtol(value, &sep, 10);

/* Make sure we have parsed something */
if (sep == value)
return -EINVAL;

mode->tv_margins.left = margin;
} else if (!strncmp(option, "margin_top", delim - option)) {
const char *value = delim + 1;
unsigned int margin;

margin = simple_strtol(value, &sep, 10);

/* Make sure we have parsed something */
if (sep == value)
return -EINVAL;

mode->tv_margins.top = margin;
} else if (!strncmp(option, "margin_bottom", delim - option)) {
const char *value = delim + 1;
unsigned int margin;

margin = simple_strtol(value, &sep, 10);

/* Make sure we have parsed something */
if (sep == value)
return -EINVAL;

mode->tv_margins.bottom = margin;
} else {
return -EINVAL;
}
Expand Down
5 changes: 5 additions & 0 deletions include/drm/drm_connector.h
Original file line number Diff line number Diff line change
Expand Up @@ -1054,6 +1054,11 @@ struct drm_cmdline_mode {
* DRM_MODE_ROTATE_0 and DRM_MODE_ROTATE_180.
*/
unsigned int rotation_reflection;

/**
* @tv_margins: TV margins to apply to the mode.
*/
struct drm_connector_tv_margins tv_margins;
};

/**
Expand Down

0 comments on commit 3d46a30

Please sign in to comment.