Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- ---
- drivers/gpu/drm/drm_modes.c | 134 ++++++++++++++++++++++++++++++++++----------
- include/drm/drm_modes.h | 9 +++
- 2 files changed, 112 insertions(+), 31 deletions(-)
- diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
- index 4a3f68a33844..8128dbb098be 100644
- --- a/drivers/gpu/drm/drm_modes.c
- +++ b/drivers/gpu/drm/drm_modes.c
- @@ -940,17 +940,68 @@ struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
- }
- EXPORT_SYMBOL(drm_mode_duplicate);
- +static bool drm_mode_match_timings(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- +{
- + return mode1->hdisplay == mode2->hdisplay &&
- + mode1->hsync_start == mode2->hsync_start &&
- + mode1->hsync_end == mode2->hsync_end &&
- + mode1->htotal == mode2->htotal &&
- + mode1->hskew == mode2->hskew &&
- + mode1->vdisplay == mode2->vdisplay &&
- + mode1->vsync_start == mode2->vsync_start &&
- + mode1->vsync_end == mode2->vsync_end &&
- + mode1->vtotal == mode2->vtotal &&
- + mode1->vscan == mode2->vscan;
- +}
- +
- +static bool drm_mode_match_clock(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- +{
- + /*
- + * do clock check convert to PICOS
- + * so fb modes get matched the same
- + */
- + if (mode1->clock && mode2->clock)
- + return KHZ2PICOS(mode1->clock) == KHZ2PICOS(mode2->clock);
- + else
- + return mode1->clock == mode2->clock;
- +}
- +
- +static bool drm_mode_match_flags(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- +{
- + return (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) ==
- + (mode2->flags & ~DRM_MODE_FLAG_3D_MASK);
- +}
- +
- +static bool drm_mode_match_3d_flags(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- +{
- + return (mode1->flags & DRM_MODE_FLAG_3D_MASK) ==
- + (mode2->flags & DRM_MODE_FLAG_3D_MASK);
- +}
- +
- +static bool drm_mode_match_aspect_ratio(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- +{
- + return mode1->picture_aspect_ratio == mode2->picture_aspect_ratio;
- +}
- +
- /**
- - * drm_mode_equal - test modes for equality
- + * drm_mode_match - test modes for (partial) equality
- * @mode1: first mode
- * @mode2: second mode
- + * @match_flags: which parts need to match (DRM_MODE_MATCH_*)
- *
- * Check to see if @mode1 and @mode2 are equivalent.
- *
- * Returns:
- - * True if the modes are equal, false otherwise.
- + * True if the modes are (partially) equal, false otherwise.
- */
- -bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2)
- +bool drm_mode_match(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2,
- + unsigned int match_flags)
- {
- if (!mode1 && !mode2)
- return true;
- @@ -958,15 +1009,48 @@ bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_displ
- if (!mode1 || !mode2)
- return false;
- - /* do clock check convert to PICOS so fb modes get matched
- - * the same */
- - if (mode1->clock && mode2->clock) {
- - if (KHZ2PICOS(mode1->clock) != KHZ2PICOS(mode2->clock))
- - return false;
- - } else if (mode1->clock != mode2->clock)
- + if (match_flags & DRM_MODE_MATCH_TIMINGS &&
- + !drm_mode_match_timings(mode1, mode2))
- + return false;
- +
- + if (match_flags & DRM_MODE_MATCH_CLOCK &&
- + !drm_mode_match_clock(mode1, mode2))
- + return false;
- +
- + if (match_flags & DRM_MODE_MATCH_FLAGS &&
- + !drm_mode_match_flags(mode1, mode2))
- + return false;
- +
- + if (match_flags & DRM_MODE_MATCH_3D_FLAGS &&
- + !drm_mode_match_3d_flags(mode1, mode2))
- return false;
- - return drm_mode_equal_no_clocks(mode1, mode2);
- + if (match_flags & DRM_MODE_MATCH_ASPECT_RATIO &&
- + !drm_mode_match_aspect_ratio(mode1, mode2))
- + return false;
- +
- + return true;
- +}
- +EXPORT_SYMBOL(drm_mode_match);
- +
- +/**
- + * drm_mode_equal - test modes for equality
- + * @mode1: first mode
- + * @mode2: second mode
- + *
- + * Check to see if @mode1 and @mode2 are equivalent.
- + *
- + * Returns:
- + * True if the modes are equal, false otherwise.
- + */
- +bool drm_mode_equal(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- +{
- + return drm_mode_match(mode1, mode2,
- + DRM_MODE_MATCH_TIMINGS |
- + DRM_MODE_MATCH_CLOCK |
- + DRM_MODE_MATCH_FLAGS |
- + DRM_MODE_MATCH_3D_FLAGS);
- }
- EXPORT_SYMBOL(drm_mode_equal);
- @@ -981,13 +1065,13 @@ EXPORT_SYMBOL(drm_mode_equal);
- * Returns:
- * True if the modes are equal, false otherwise.
- */
- -bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2)
- +bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2)
- {
- - if ((mode1->flags & DRM_MODE_FLAG_3D_MASK) !=
- - (mode2->flags & DRM_MODE_FLAG_3D_MASK))
- - return false;
- -
- - return drm_mode_equal_no_clocks_no_stereo(mode1, mode2);
- + return drm_mode_match(mode1, mode2,
- + DRM_MODE_MATCH_TIMINGS |
- + DRM_MODE_MATCH_FLAGS |
- + DRM_MODE_MATCH_3D_FLAGS);
- }
- EXPORT_SYMBOL(drm_mode_equal_no_clocks);
- @@ -1005,21 +1089,9 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks);
- bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
- const struct drm_display_mode *mode2)
- {
- - if (mode1->hdisplay == mode2->hdisplay &&
- - mode1->hsync_start == mode2->hsync_start &&
- - mode1->hsync_end == mode2->hsync_end &&
- - mode1->htotal == mode2->htotal &&
- - mode1->hskew == mode2->hskew &&
- - mode1->vdisplay == mode2->vdisplay &&
- - mode1->vsync_start == mode2->vsync_start &&
- - mode1->vsync_end == mode2->vsync_end &&
- - mode1->vtotal == mode2->vtotal &&
- - mode1->vscan == mode2->vscan &&
- - (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) ==
- - (mode2->flags & ~DRM_MODE_FLAG_3D_MASK))
- - return true;
- -
- - return false;
- + return drm_mode_match(mode1, mode2,
- + DRM_MODE_MATCH_TIMINGS |
- + DRM_MODE_MATCH_FLAGS);
- }
- EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo);
- diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
- index 9f3421c8efcd..839eb9c3a029 100644
- --- a/include/drm/drm_modes.h
- +++ b/include/drm/drm_modes.h
- @@ -150,6 +150,12 @@ enum drm_mode_status {
- #define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF
- +#define DRM_MODE_MATCH_TIMINGS (1 << 0)
- +#define DRM_MODE_MATCH_CLOCK (1 << 1)
- +#define DRM_MODE_MATCH_FLAGS (1 << 2)
- +#define DRM_MODE_MATCH_3D_FLAGS (1 << 3)
- +#define DRM_MODE_MATCH_ASPECT_RATIO (1 << 4)
- +
- /**
- * struct drm_display_mode - DRM kernel-internal display mode structure
- * @hdisplay: horizontal display size
- @@ -493,6 +499,9 @@ void drm_mode_copy(struct drm_display_mode *dst,
- const struct drm_display_mode *src);
- struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
- const struct drm_display_mode *mode);
- +bool drm_mode_match(const struct drm_display_mode *mode1,
- + const struct drm_display_mode *mode2,
- + unsigned int match_flags);
- bool drm_mode_equal(const struct drm_display_mode *mode1,
- const struct drm_display_mode *mode2);
- bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1,
- From patchwork Mon Nov 13 17:04:21 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [04/10] drm/edid: Use drm_mode_match_no_clocks_no_stereo() for
- consistentcy
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188038
- Message-Id: <20171113170427.4150-5-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: intel-gfx@lists.freedesktop.org
- Date: Mon, 13 Nov 2017 19:04:21 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- Use drm_mode_equal_no_clocks_no_stereo() in
- drm_match_hdmi_mode_clock_tolerance() for consistency as we
- also use it in drm_match_hdmi_mode() and the cea mode matching
- functions.
- This doesn't actually change anything since the input mode
- comes from detailed timings and we match it against
- edid_4k_modes[] which. So none of those modes can have stereo
- flags set.
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- ---
- drivers/gpu/drm/drm_edid.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
- diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
- index 9ada0ccf50df..b575c4b5a313 100644
- --- a/drivers/gpu/drm/drm_edid.c
- +++ b/drivers/gpu/drm/drm_edid.c
- @@ -3020,7 +3020,7 @@ static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_
- abs(to_match->clock - clock2) > clock_tolerance)
- continue;
- - if (drm_mode_equal_no_clocks(to_match, hdmi_mode))
- + if (drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode))
- return vic;
- }
- From patchwork Mon Nov 13 17:04:22 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [05/10] drm/edid: Fix up edid_cea_modes[] formatting
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188039
- Message-Id: <20171113170427.4150-6-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: intel-gfx@lists.freedesktop.org
- Date: Mon, 13 Nov 2017 19:04:22 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- Fix up a bunch of bad indentation and insconsistent comments
- in edid_cea_modes[].
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- ---
- drivers/gpu/drm/drm_edid.c | 84 +++++++++++++++++++++++-----------------------
- 1 file changed, 42 insertions(+), 42 deletions(-)
- diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
- index b575c4b5a313..7220b8f9a7e8 100644
- --- a/drivers/gpu/drm/drm_edid.c
- +++ b/drivers/gpu/drm/drm_edid.c
- @@ -685,43 +685,43 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
- 2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 6 - 720(1440)x480i@60Hz */
- { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
- 801, 858, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 7 - 720(1440)x480i@60Hz */
- { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
- 801, 858, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 8 - 720(1440)x240@60Hz */
- { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
- 801, 858, 0, 240, 244, 247, 262, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 9 - 720(1440)x240@60Hz */
- { DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, 720, 739,
- 801, 858, 0, 240, 244, 247, 262, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 10 - 2880x480i@60Hz */
- { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
- 3204, 3432, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 11 - 2880x480i@60Hz */
- { DRM_MODE("2880x480i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
- 3204, 3432, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 12 - 2880x240@60Hz */
- { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
- @@ -767,43 +767,43 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
- 2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 21 - 720(1440)x576i@50Hz */
- { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
- 795, 864, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 22 - 720(1440)x576i@50Hz */
- { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
- 795, 864, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 23 - 720(1440)x288@50Hz */
- { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
- 795, 864, 0, 288, 290, 293, 312, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 24 - 720(1440)x288@50Hz */
- { DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, 720, 732,
- 795, 864, 0, 288, 290, 293, 312, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 25 - 2880x576i@50Hz */
- { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
- 3180, 3456, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 26 - 2880x576i@50Hz */
- { DRM_MODE("2880x576i", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
- 3180, 3456, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 27 - 2880x288@50Hz */
- { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
- @@ -869,13 +869,13 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
- 2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 40 - 1920x1080i@100Hz */
- { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
- 2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 41 - 1280x720@100Hz */
- { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
- @@ -896,19 +896,19 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
- 795, 864, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 45 - 720(1440)x576i@100Hz */
- { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
- 795, 864, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 46 - 1920x1080i@120Hz */
- { DRM_MODE("1920x1080i", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
- 2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
- - DRM_MODE_FLAG_INTERLACE),
- + DRM_MODE_FLAG_INTERLACE),
- .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 47 - 1280x720@120Hz */
- { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
- @@ -929,13 +929,13 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
- 801, 858, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 51 - 720(1440)x480i@120Hz */
- { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 27000, 720, 739,
- 801, 858, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 52 - 720x576@200Hz */
- { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
- @@ -951,13 +951,13 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
- 795, 864, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 55 - 720(1440)x576i@200Hz */
- { DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
- 795, 864, 0, 576, 580, 586, 625, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 200, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 56 - 720x480@240Hz */
- { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
- @@ -973,13 +973,13 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
- 801, 858, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_4_3, },
- /* 59 - 720(1440)x480i@240Hz */
- { DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 54000, 720, 739,
- 801, 858, 0, 480, 488, 494, 525, 0,
- DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
- - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK),
- .vrefresh = 240, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 60 - 1280x720@24Hz */
- { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
- @@ -1000,12 +1000,12 @@ static const struct drm_display_mode edid_cea_modes[] = {
- { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
- 2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- - .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- + .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 64 - 1920x1080@100Hz */
- { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
- 2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- - .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- + .vrefresh = 100, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- /* 65 - 1280x720@24Hz */
- { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
- 3080, 3300, 0, 720, 725, 730, 750, 0,
- @@ -1146,77 +1146,77 @@ static const struct drm_display_mode edid_cea_modes[] = {
- 3152, 3300, 0, 1080, 1084, 1089, 1250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 120, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
- - /* 93 - 3840x2160p@24Hz 16:9 */
- + /* 93 - 3840x2160@24Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
- 5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- - /* 94 - 3840x2160p@25Hz 16:9 */
- + /* 94 - 3840x2160@25Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
- 4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- - /* 95 - 3840x2160p@30Hz 16:9 */
- + /* 95 - 3840x2160@30Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
- 4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- - /* 96 - 3840x2160p@50Hz 16:9 */
- + /* 96 - 3840x2160@50Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
- 4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- - /* 97 - 3840x2160p@60Hz 16:9 */
- + /* 97 - 3840x2160@60Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
- 4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9, },
- - /* 98 - 4096x2160p@24Hz 256:135 */
- + /* 98 - 4096x2160@24Hz */
- { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5116,
- 5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
- - /* 99 - 4096x2160p@25Hz 256:135 */
- + /* 99 - 4096x2160@25Hz */
- { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 5064,
- 5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
- - /* 100 - 4096x2160p@30Hz 256:135 */
- + /* 100 - 4096x2160@30Hz */
- { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 297000, 4096, 4184,
- 4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
- - /* 101 - 4096x2160p@50Hz 256:135 */
- + /* 101 - 4096x2160@50Hz */
- { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 5064,
- 5152, 5280, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
- - /* 102 - 4096x2160p@60Hz 256:135 */
- + /* 102 - 4096x2160@60Hz */
- { DRM_MODE("4096x2160", DRM_MODE_TYPE_DRIVER, 594000, 4096, 4184,
- 4272, 4400, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 60, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135, },
- - /* 103 - 3840x2160p@24Hz 64:27 */
- + /* 103 - 3840x2160@24Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 5116,
- 5204, 5500, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 24, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
- - /* 104 - 3840x2160p@25Hz 64:27 */
- + /* 104 - 3840x2160@25Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4896,
- 4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 25, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
- - /* 105 - 3840x2160p@30Hz 64:27 */
- + /* 105 - 3840x2160@30Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 297000, 3840, 4016,
- 4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 30, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
- - /* 106 - 3840x2160p@50Hz 64:27 */
- + /* 106 - 3840x2160@50Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4896,
- 4984, 5280, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- .vrefresh = 50, .picture_aspect_ratio = HDMI_PICTURE_ASPECT_64_27, },
- - /* 107 - 3840x2160p@60Hz 64:27 */
- + /* 107 - 3840x2160@60Hz */
- { DRM_MODE("3840x2160", DRM_MODE_TYPE_DRIVER, 594000, 3840, 4016,
- 4104, 4400, 0, 2160, 2168, 2178, 2250, 0,
- DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC),
- From patchwork Mon Nov 13 17:04:23 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [06/10] drm/edid: Fix cea mode aspect ratio handling
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188044
- Message-Id: <20171113170427.4150-7-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: Jose Abreu <Jose.Abreu@synopsys.com>, "Lin, Jia" <lin.a.jia@intel.com>,
- intel-gfx@lists.freedesktop.org, Daniel Vetter <daniel.vetter@ffwll.ch>
- Date: Mon, 13 Nov 2017 19:04:23 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- commit 6dffd431e229 ("drm: Add aspect ratio parsing in DRM layer")
- cause us to not send out any VICs in the AVI infoframes. That commit
- was since reverted, but if and when we add aspect ratio handing back
- we need to be more careful.
- Let's handle this by considering the aspect ratio as a requirement
- for cea mode matching only if the passed in mode actually has a
- non-zero aspect ratio field. This will keep userspace that doesn't
- provide an aspect ratio working as before by matching it to the
- first otherwise equal cea mode. And once userspace starts to
- provide the aspect ratio it will be considerd a hard requirement
- for the match.
- Also change the hdmi mode matching to use drm_mode_match() for
- consistency, but we don't match on aspect ratio there since the
- spec doesn't list a specific aspect ratio for those modes.
- Cc: Shashank Sharma <shashank.sharma@intel.com>
- Cc: "Lin, Jia" <lin.a.jia@intel.com>
- Cc: Akashdeep Sharma <akashdeep.sharma@intel.com>
- Cc: Jim Bride <jim.bride@linux.intel.com>
- Cc: Jose Abreu <Jose.Abreu@synopsys.com>
- Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
- Cc: Emil Velikov <emil.l.velikov@gmail.com>
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- ---
- drivers/gpu/drm/drm_edid.c | 18 ++++++++++++++----
- 1 file changed, 14 insertions(+), 4 deletions(-)
- diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
- index 7220b8f9a7e8..00aa98f3e55d 100644
- --- a/drivers/gpu/drm/drm_edid.c
- +++ b/drivers/gpu/drm/drm_edid.c
- @@ -2903,11 +2903,15 @@ cea_mode_alternate_timings(u8 vic, struct drm_display_mode *mode)
- static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_match,
- unsigned int clock_tolerance)
- {
- + unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
- u8 vic;
- if (!to_match->clock)
- return 0;
- + if (to_match->picture_aspect_ratio)
- + match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
- +
- for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) {
- struct drm_display_mode cea_mode = edid_cea_modes[vic];
- unsigned int clock1, clock2;
- @@ -2921,7 +2925,7 @@ static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_m
- continue;
- do {
- - if (drm_mode_equal_no_clocks_no_stereo(to_match, &cea_mode))
- + if (drm_mode_match(to_match, &cea_mode, match_flags))
- return vic;
- } while (cea_mode_alternate_timings(vic, &cea_mode));
- }
- @@ -2938,11 +2942,15 @@ static u8 drm_match_cea_mode_clock_tolerance(const struct drm_display_mode *to_m
- */
- u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
- {
- + unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
- u8 vic;
- if (!to_match->clock)
- return 0;
- + if (to_match->picture_aspect_ratio)
- + match_flags |= DRM_MODE_MATCH_ASPECT_RATIO;
- +
- for (vic = 1; vic < ARRAY_SIZE(edid_cea_modes); vic++) {
- struct drm_display_mode cea_mode = edid_cea_modes[vic];
- unsigned int clock1, clock2;
- @@ -2956,7 +2964,7 @@ u8 drm_match_cea_mode(const struct drm_display_mode *to_match)
- continue;
- do {
- - if (drm_mode_equal_no_clocks_no_stereo(to_match, &cea_mode))
- + if (drm_mode_match(to_match, &cea_mode, match_flags))
- return vic;
- } while (cea_mode_alternate_timings(vic, &cea_mode));
- }
- @@ -3003,6 +3011,7 @@ hdmi_mode_alternate_clock(const struct drm_display_mode *hdmi_mode)
- static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_match,
- unsigned int clock_tolerance)
- {
- + unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
- u8 vic;
- if (!to_match->clock)
- @@ -3020,7 +3029,7 @@ static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_
- abs(to_match->clock - clock2) > clock_tolerance)
- continue;
- - if (drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode))
- + if (drm_mode_match(to_match, hdmi_mode, match_flags))
- return vic;
- }
- @@ -3037,6 +3046,7 @@ static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_
- */
- static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
- {
- + unsigned int match_flags = DRM_MODE_MATCH_TIMINGS | DRM_MODE_MATCH_FLAGS;
- u8 vic;
- if (!to_match->clock)
- @@ -3052,7 +3062,7 @@ static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
- if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) ||
- KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) &&
- - drm_mode_equal_no_clocks_no_stereo(to_match, hdmi_mode))
- + drm_mode_match(to_match, hdmi_mode, match_flags))
- return vic;
- }
- return 0;
- From patchwork Mon Nov 13 17:04:24 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [07/10] drm/edid: Don't send bogus aspect ratios in AVI infoframes
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188049
- Message-Id: <20171113170427.4150-8-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: Jose Abreu <Jose.Abreu@synopsys.com>,
- Daniel Vetter <daniel.vetter@ffwll.ch>, intel-gfx@lists.freedesktop.org
- Date: Mon, 13 Nov 2017 19:04:24 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- If the user mode would specify an aspect ratio other than 4:3 or 16:9
- we now silently ignore it. Maybe a better apporoach is to return an
- error? Let's try that.
- Also we must be careful that we don't try to send illegal picture
- aspect in the infoframe as it's only capable of signalling none,
- 4:3, and 16:9. Currently we're sending these bogus infoframes
- whenever the cea mode specifies some other aspect ratio.
- Cc: Shashank Sharma <shashank.sharma@intel.com>
- Cc: Sean Paul <seanpaul@chromium.org>
- Cc: Jose Abreu <Jose.Abreu@synopsys.com>
- Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
- Cc: Emil Velikov <emil.l.velikov@gmail.com>
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- Reviewed-by: Shashank Sharma <shashank.sharma@intel.com>
- ---
- drivers/gpu/drm/drm_edid.c | 23 +++++++++++++++++------
- 1 file changed, 17 insertions(+), 6 deletions(-)
- diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
- index 00aa98f3e55d..bafb3ee4ea97 100644
- --- a/drivers/gpu/drm/drm_edid.c
- +++ b/drivers/gpu/drm/drm_edid.c
- @@ -4786,6 +4786,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
- const struct drm_display_mode *mode,
- bool is_hdmi2_sink)
- {
- + enum hdmi_picture_aspect picture_aspect;
- int err;
- if (!frame || !mode)
- @@ -4828,13 +4829,23 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
- * Populate picture aspect ratio from either
- * user input (if specified) or from the CEA mode list.
- */
- - if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_4_3 ||
- - mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_16_9)
- - frame->picture_aspect = mode->picture_aspect_ratio;
- - else if (frame->video_code > 0)
- - frame->picture_aspect = drm_get_cea_aspect_ratio(
- - frame->video_code);
- + picture_aspect = mode->picture_aspect_ratio;
- + if (picture_aspect == HDMI_PICTURE_ASPECT_NONE)
- + picture_aspect = drm_get_cea_aspect_ratio(frame->video_code);
- + /*
- + * The infoframe can't convey anything but none, 4:3
- + * and 16:9, so if the user has asked for anything else
- + * we can only satisfy it by specifying the right VIC.
- + */
- + if (picture_aspect > HDMI_PICTURE_ASPECT_16_9) {
- + if (picture_aspect !=
- + drm_get_cea_aspect_ratio(frame->video_code))
- + return -EINVAL;
- + picture_aspect = HDMI_PICTURE_ASPECT_NONE;
- + }
- +
- + frame->picture_aspect = picture_aspect;
- frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
- frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
- From patchwork Mon Nov 13 17:04:25 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [08/10] video/hdmi: Reject illegal picture aspect ratios
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188051
- Message-Id: <20171113170427.4150-9-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: Jose Abreu <Jose.Abreu@synopsys.com>, "Lin, Jia" <lin.a.jia@intel.com>,
- intel-gfx@lists.freedesktop.org, Hans Verkuil <hans.verkuil@cisco.com>,
- Daniel Vetter <daniel.vetter@ffwll.ch>, linux-media@vger.kernel.org
- Date: Mon, 13 Nov 2017 19:04:25 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- AVI infoframe can only carry none, 4:3, or 16:9 picture aspect
- ratios. Return an error if the user asked for something different.
- Cc: Shashank Sharma <shashank.sharma@intel.com>
- Cc: "Lin, Jia" <lin.a.jia@intel.com>
- Cc: Akashdeep Sharma <akashdeep.sharma@intel.com>
- Cc: Jim Bride <jim.bride@linux.intel.com>
- Cc: Jose Abreu <Jose.Abreu@synopsys.com>
- Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
- Cc: Emil Velikov <emil.l.velikov@gmail.com>
- Cc: Thierry Reding <thierry.reding@gmail.com>
- Cc: Hans Verkuil <hans.verkuil@cisco.com>
- Cc: linux-media@vger.kernel.org
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- Reviewed-by: Jose Abreu <joabreu@synopsys.com>
- ---
- drivers/video/hdmi.c | 3 +++
- 1 file changed, 3 insertions(+)
- diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
- index 111a0ab6280a..38716eb50408 100644
- --- a/drivers/video/hdmi.c
- +++ b/drivers/video/hdmi.c
- @@ -93,6 +93,9 @@ ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
- if (size < length)
- return -ENOSPC;
- + if (frame->picture_aspect > HDMI_PICTURE_ASPECT_16_9)
- + return -EINVAL;
- +
- memset(buffer, 0, size);
- ptr[0] = frame->type;
- From patchwork Mon Nov 13 17:04:26 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [09/10] video/hdmi: Constify 'buffer' to the unpack functions
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188048
- Message-Id: <20171113170427.4150-10-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: intel-gfx@lists.freedesktop.org, Hans Verkuil <hans.verkuil@cisco.com>,
- linux-media@vger.kernel.org
- Date: Mon, 13 Nov 2017 19:04:26 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- The unpack functions just read from the passed in buffer,
- so make it const.
- Cc: Thierry Reding <thierry.reding@gmail.com>
- Cc: Hans Verkuil <hans.verkuil@cisco.com>
- Cc: linux-media@vger.kernel.org
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- ---
- drivers/video/hdmi.c | 23 ++++++++++++-----------
- include/linux/hdmi.h | 3 ++-
- 2 files changed, 14 insertions(+), 12 deletions(-)
- diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
- index 38716eb50408..65b915ea4936 100644
- --- a/drivers/video/hdmi.c
- +++ b/drivers/video/hdmi.c
- @@ -31,7 +31,7 @@
- #define hdmi_log(fmt, ...) dev_printk(level, dev, fmt, ##__VA_ARGS__)
- -static u8 hdmi_infoframe_checksum(u8 *ptr, size_t size)
- +static u8 hdmi_infoframe_checksum(const u8 *ptr, size_t size)
- {
- u8 csum = 0;
- size_t i;
- @@ -1016,9 +1016,9 @@ EXPORT_SYMBOL(hdmi_infoframe_log);
- * Returns 0 on success or a negative error code on failure.
- */
- static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame,
- - void *buffer)
- + const void *buffer)
- {
- - u8 *ptr = buffer;
- + const u8 *ptr = buffer;
- int ret;
- if (ptr[0] != HDMI_INFOFRAME_TYPE_AVI ||
- @@ -1079,9 +1079,9 @@ static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame,
- * Returns 0 on success or a negative error code on failure.
- */
- static int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *frame,
- - void *buffer)
- + const void *buffer)
- {
- - u8 *ptr = buffer;
- + const u8 *ptr = buffer;
- int ret;
- if (ptr[0] != HDMI_INFOFRAME_TYPE_SPD ||
- @@ -1117,9 +1117,9 @@ static int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *frame,
- * Returns 0 on success or a negative error code on failure.
- */
- static int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *frame,
- - void *buffer)
- + const void *buffer)
- {
- - u8 *ptr = buffer;
- + const u8 *ptr = buffer;
- int ret;
- if (ptr[0] != HDMI_INFOFRAME_TYPE_AUDIO ||
- @@ -1163,9 +1163,9 @@ static int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *frame,
- */
- static int
- hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- - void *buffer)
- + const void *buffer)
- {
- - u8 *ptr = buffer;
- + const u8 *ptr = buffer;
- size_t length;
- int ret;
- u8 hdmi_video_format;
- @@ -1234,10 +1234,11 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- *
- * Returns 0 on success or a negative error code on failure.
- */
- -int hdmi_infoframe_unpack(union hdmi_infoframe *frame, void *buffer)
- +int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
- + const void *buffer)
- {
- int ret;
- - u8 *ptr = buffer;
- + const u8 *ptr = buffer;
- switch (ptr[0]) {
- case HDMI_INFOFRAME_TYPE_AVI:
- diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
- index d271ff23984f..d3816170c062 100644
- --- a/include/linux/hdmi.h
- +++ b/include/linux/hdmi.h
- @@ -332,7 +332,8 @@ union hdmi_infoframe {
- ssize_t
- hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
- -int hdmi_infoframe_unpack(union hdmi_infoframe *frame, void *buffer);
- +int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
- + const void *buffer);
- void hdmi_infoframe_log(const char *level, struct device *dev,
- union hdmi_infoframe *frame);
- From patchwork Mon Nov 13 17:04:27 2017
- Content-Type: text/plain; charset="utf-8"
- MIME-Version: 1.0
- Content-Transfer-Encoding: 8bit
- Subject: [10/10] video/hdmi: Pass buffer size to infoframe unpack functions
- From: Ville Syrjala <ville.syrjala@linux.intel.com>
- X-Patchwork-Id: 188053
- Message-Id: <20171113170427.4150-11-ville.syrjala@linux.intel.com>
- To: dri-devel@lists.freedesktop.org
- Cc: intel-gfx@lists.freedesktop.org, Hans Verkuil <hans.verkuil@cisco.com>,
- linux-media@vger.kernel.org
- Date: Mon, 13 Nov 2017 19:04:27 +0200
- From: Ville Syrjälä <ville.syrjala@linux.intel.com>
- To make sure the infoframe unpack functions don't end up examining
- stack garbage or oopsing, let's pass in the size of the buffer.
- Cc: Thierry Reding <thierry.reding@gmail.com>
- Cc: Hans Verkuil <hans.verkuil@cisco.com>
- Cc: linux-media@vger.kernel.org
- Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
- ---
- drivers/media/i2c/adv7511.c | 2 +-
- drivers/media/i2c/adv7604.c | 2 +-
- drivers/media/i2c/adv7842.c | 2 +-
- drivers/media/i2c/tc358743.c | 2 +-
- drivers/video/hdmi.c | 51 ++++++++++++++++++++++++++++++++------------
- include/linux/hdmi.h | 2 +-
- 6 files changed, 42 insertions(+), 19 deletions(-)
- diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511.c
- index 2817bafc67bf..dec09c18ea34 100644
- --- a/drivers/media/i2c/adv7511.c
- +++ b/drivers/media/i2c/adv7511.c
- @@ -562,7 +562,7 @@ static void log_infoframe(struct v4l2_subdev *sd, const struct adv7511_cfg_read_
- buffer[3] = 0;
- buffer[3] = hdmi_infoframe_checksum(buffer, len + 4);
- - if (hdmi_infoframe_unpack(&frame, buffer) < 0) {
- + if (hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)) < 0) {
- v4l2_err(sd, "%s: unpack of %s infoframe failed\n", __func__, cri->desc);
- return;
- }
- diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
- index f289b8aca1da..8500438af0d3 100644
- --- a/drivers/media/i2c/adv7604.c
- +++ b/drivers/media/i2c/adv7604.c
- @@ -2429,7 +2429,7 @@ static int adv76xx_read_infoframe(struct v4l2_subdev *sd, int index,
- buffer[i + 3] = infoframe_read(sd,
- adv76xx_cri[index].payload_addr + i);
- - if (hdmi_infoframe_unpack(frame, buffer) < 0) {
- + if (hdmi_infoframe_unpack(frame, buffer, sizeof(buffer)) < 0) {
- v4l2_err(sd, "%s: unpack of %s infoframe failed\n", __func__,
- adv76xx_cri[index].desc);
- return -ENOENT;
- diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c
- index 65f34e7e146f..fd5d5e84dcbf 100644
- --- a/drivers/media/i2c/adv7842.c
- +++ b/drivers/media/i2c/adv7842.c
- @@ -2576,7 +2576,7 @@ static void log_infoframe(struct v4l2_subdev *sd, struct adv7842_cfg_read_infofr
- for (i = 0; i < len; i++)
- buffer[i + 3] = infoframe_read(sd, cri->payload_addr + i);
- - if (hdmi_infoframe_unpack(&frame, buffer) < 0) {
- + if (hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)) < 0) {
- v4l2_err(sd, "%s: unpack of %s infoframe failed\n", __func__, cri->desc);
- return;
- }
- diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
- index e6f5c363ccab..f6a5ebffd9c6 100644
- --- a/drivers/media/i2c/tc358743.c
- +++ b/drivers/media/i2c/tc358743.c
- @@ -453,7 +453,7 @@ static void print_avi_infoframe(struct v4l2_subdev *sd)
- i2c_rd(sd, PK_AVI_0HEAD, buffer, HDMI_INFOFRAME_SIZE(AVI));
- - if (hdmi_infoframe_unpack(&frame, buffer) < 0) {
- + if (hdmi_infoframe_unpack(&frame, buffer, sizeof(buffer)) < 0) {
- v4l2_err(sd, "%s: unpack of AVI infoframe failed\n", __func__);
- return;
- }
- diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
- index 65b915ea4936..b5d491014b0b 100644
- --- a/drivers/video/hdmi.c
- +++ b/drivers/video/hdmi.c
- @@ -1005,8 +1005,9 @@ EXPORT_SYMBOL(hdmi_infoframe_log);
- /**
- * hdmi_avi_infoframe_unpack() - unpack binary buffer to a HDMI AVI infoframe
- - * @buffer: source buffer
- * @frame: HDMI AVI infoframe
- + * @buffer: source buffer
- + * @size: size of buffer
- *
- * Unpacks the information contained in binary @buffer into a structured
- * @frame of the HDMI Auxiliary Video (AVI) information frame.
- @@ -1016,11 +1017,14 @@ EXPORT_SYMBOL(hdmi_infoframe_log);
- * Returns 0 on success or a negative error code on failure.
- */
- static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame,
- - const void *buffer)
- + const void *buffer, size_t size)
- {
- const u8 *ptr = buffer;
- int ret;
- + if (size < HDMI_INFOFRAME_SIZE(AVI))
- + return -EINVAL;
- +
- if (ptr[0] != HDMI_INFOFRAME_TYPE_AVI ||
- ptr[1] != 2 ||
- ptr[2] != HDMI_AVI_INFOFRAME_SIZE)
- @@ -1068,8 +1072,9 @@ static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame,
- /**
- * hdmi_spd_infoframe_unpack() - unpack binary buffer to a HDMI SPD infoframe
- - * @buffer: source buffer
- * @frame: HDMI SPD infoframe
- + * @buffer: source buffer
- + * @size: size of buffer
- *
- * Unpacks the information contained in binary @buffer into a structured
- * @frame of the HDMI Source Product Description (SPD) information frame.
- @@ -1079,11 +1084,14 @@ static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame,
- * Returns 0 on success or a negative error code on failure.
- */
- static int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *frame,
- - const void *buffer)
- + const void *buffer, size_t size)
- {
- const u8 *ptr = buffer;
- int ret;
- + if (size < HDMI_INFOFRAME_SIZE(SPD))
- + return -EINVAL;
- +
- if (ptr[0] != HDMI_INFOFRAME_TYPE_SPD ||
- ptr[1] != 1 ||
- ptr[2] != HDMI_SPD_INFOFRAME_SIZE) {
- @@ -1106,8 +1114,9 @@ static int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *frame,
- /**
- * hdmi_audio_infoframe_unpack() - unpack binary buffer to a HDMI AUDIO infoframe
- - * @buffer: source buffer
- * @frame: HDMI Audio infoframe
- + * @buffer: source buffer
- + * @size: size of buffer
- *
- * Unpacks the information contained in binary @buffer into a structured
- * @frame of the HDMI Audio information frame.
- @@ -1117,11 +1126,14 @@ static int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *frame,
- * Returns 0 on success or a negative error code on failure.
- */
- static int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *frame,
- - const void *buffer)
- + const void *buffer, size_t size)
- {
- const u8 *ptr = buffer;
- int ret;
- + if (size < HDMI_INFOFRAME_SIZE(AUDIO))
- + return -EINVAL;
- +
- if (ptr[0] != HDMI_INFOFRAME_TYPE_AUDIO ||
- ptr[1] != 1 ||
- ptr[2] != HDMI_AUDIO_INFOFRAME_SIZE) {
- @@ -1151,8 +1163,9 @@ static int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *frame,
- /**
- * hdmi_vendor_infoframe_unpack() - unpack binary buffer to a HDMI vendor infoframe
- - * @buffer: source buffer
- * @frame: HDMI Vendor infoframe
- + * @buffer: source buffer
- + * @size: size of buffer
- *
- * Unpacks the information contained in binary @buffer into a structured
- * @frame of the HDMI Vendor information frame.
- @@ -1163,7 +1176,7 @@ static int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *frame,
- */
- static int
- hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- - const void *buffer)
- + const void *buffer, size_t size)
- {
- const u8 *ptr = buffer;
- size_t length;
- @@ -1171,6 +1184,9 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- u8 hdmi_video_format;
- struct hdmi_vendor_infoframe *hvf = &frame->hdmi;
- + if (size < HDMI_INFOFRAME_HEADER_SIZE)
- + return -EINVAL;
- +
- if (ptr[0] != HDMI_INFOFRAME_TYPE_VENDOR ||
- ptr[1] != 1 ||
- (ptr[2] != 4 && ptr[2] != 5 && ptr[2] != 6))
- @@ -1178,6 +1194,9 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- length = ptr[2];
- + if (size < HDMI_INFOFRAME_HEADER_SIZE + length)
- + return -EINVAL;
- +
- if (hdmi_infoframe_checksum(buffer,
- HDMI_INFOFRAME_HEADER_SIZE + length) != 0)
- return -EINVAL;
- @@ -1224,8 +1243,9 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- /**
- * hdmi_infoframe_unpack() - unpack binary buffer to a HDMI infoframe
- - * @buffer: source buffer
- * @frame: HDMI infoframe
- + * @buffer: source buffer
- + * @size: size of buffer
- *
- * Unpacks the information contained in binary buffer @buffer into a structured
- * @frame of a HDMI infoframe.
- @@ -1235,23 +1255,26 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
- * Returns 0 on success or a negative error code on failure.
- */
- int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
- - const void *buffer)
- + const void *buffer, size_t size)
- {
- int ret;
- const u8 *ptr = buffer;
- + if (size < HDMI_INFOFRAME_HEADER_SIZE)
- + return -EINVAL;
- +
- switch (ptr[0]) {
- case HDMI_INFOFRAME_TYPE_AVI:
- - ret = hdmi_avi_infoframe_unpack(&frame->avi, buffer);
- + ret = hdmi_avi_infoframe_unpack(&frame->avi, buffer, size);
- break;
- case HDMI_INFOFRAME_TYPE_SPD:
- - ret = hdmi_spd_infoframe_unpack(&frame->spd, buffer);
- + ret = hdmi_spd_infoframe_unpack(&frame->spd, buffer, size);
- break;
- case HDMI_INFOFRAME_TYPE_AUDIO:
- - ret = hdmi_audio_infoframe_unpack(&frame->audio, buffer);
- + ret = hdmi_audio_infoframe_unpack(&frame->audio, buffer, size);
- break;
- case HDMI_INFOFRAME_TYPE_VENDOR:
- - ret = hdmi_vendor_any_infoframe_unpack(&frame->vendor, buffer);
- + ret = hdmi_vendor_any_infoframe_unpack(&frame->vendor, buffer, size);
- break;
- default:
- ret = -EINVAL;
- diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
- index d3816170c062..a577d4ae2570 100644
- --- a/include/linux/hdmi.h
- +++ b/include/linux/hdmi.h
- @@ -333,7 +333,7 @@ union hdmi_infoframe {
- ssize_t
- hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
- int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
- - const void *buffer);
- + const void *buffer, size_t size);
- void hdmi_infoframe_log(const char *level, struct device *dev,
- union hdmi_infoframe *frame);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement