Commit 80ecb5d7 authored by Yaroslav Bolyukin's avatar Yaroslav Bolyukin Committed by Jani Nikula

drm/edid: Support type 7 timings

Per VESA DisplayID Standard v2.0: Type VII Timing – Detailed Timing Data

Definitions were already provided as type I, but not used
Signed-off-by: default avatarYaroslav Bolyukin <iam@lach.pw>
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220123191955.57994-1-iam@lach.pw
parent a34b14a2
...@@ -5433,7 +5433,8 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi ...@@ -5433,7 +5433,8 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
} }
static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev, static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
struct displayid_detailed_timings_1 *timings) struct displayid_detailed_timings_1 *timings,
bool type_7)
{ {
struct drm_display_mode *mode; struct drm_display_mode *mode;
unsigned pixel_clock = (timings->pixel_clock[0] | unsigned pixel_clock = (timings->pixel_clock[0] |
...@@ -5454,7 +5455,8 @@ static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *d ...@@ -5454,7 +5455,8 @@ static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *d
if (!mode) if (!mode)
return NULL; return NULL;
mode->clock = pixel_clock * 10; /* resolution is kHz for type VII, and 10 kHz for type I */
mode->clock = type_7 ? pixel_clock : pixel_clock * 10;
mode->hdisplay = hactive; mode->hdisplay = hactive;
mode->hsync_start = mode->hdisplay + hsync; mode->hsync_start = mode->hdisplay + hsync;
mode->hsync_end = mode->hsync_start + hsync_width; mode->hsync_end = mode->hsync_start + hsync_width;
...@@ -5485,6 +5487,7 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector, ...@@ -5485,6 +5487,7 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
int num_timings; int num_timings;
struct drm_display_mode *newmode; struct drm_display_mode *newmode;
int num_modes = 0; int num_modes = 0;
bool type_7 = block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING;
/* blocks must be multiple of 20 bytes length */ /* blocks must be multiple of 20 bytes length */
if (block->num_bytes % 20) if (block->num_bytes % 20)
return 0; return 0;
...@@ -5493,7 +5496,7 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector, ...@@ -5493,7 +5496,7 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
for (i = 0; i < num_timings; i++) { for (i = 0; i < num_timings; i++) {
struct displayid_detailed_timings_1 *timings = &det->timings[i]; struct displayid_detailed_timings_1 *timings = &det->timings[i];
newmode = drm_mode_displayid_detailed(connector->dev, timings); newmode = drm_mode_displayid_detailed(connector->dev, timings, type_7);
if (!newmode) if (!newmode)
continue; continue;
...@@ -5512,7 +5515,8 @@ static int add_displayid_detailed_modes(struct drm_connector *connector, ...@@ -5512,7 +5515,8 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
displayid_iter_edid_begin(edid, &iter); displayid_iter_edid_begin(edid, &iter);
displayid_iter_for_each(block, &iter) { displayid_iter_for_each(block, &iter) {
if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING) if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
num_modes += add_displayid_detailed_1_modes(connector, block); num_modes += add_displayid_detailed_1_modes(connector, block);
} }
displayid_iter_end(&iter); displayid_iter_end(&iter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment