Commit e379814b authored by Jani Nikula's avatar Jani Nikula

drm/edid: pass a timing pointer to is_display_descriptor()

Use struct member access instead of direct offsets to avoid lots of
casts all over the place.

Use BUILD_BUG_ON() for sanity check.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarEmil Velikov <emil.l.velikov@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ccc54b45ea628874c0290dd64114da6cefff1819.1648477901.git.jani.nikula@intel.com
parent 73091e4f
...@@ -2331,10 +2331,15 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, ...@@ -2331,10 +2331,15 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
} }
EXPORT_SYMBOL(drm_mode_find_dmt); EXPORT_SYMBOL(drm_mode_find_dmt);
static bool is_display_descriptor(const u8 d[18], u8 tag) static bool is_display_descriptor(const struct detailed_timing *descriptor, u8 type)
{ {
return d[0] == 0x00 && d[1] == 0x00 && BUILD_BUG_ON(offsetof(typeof(*descriptor), pixel_clock) != 0);
d[2] == 0x00 && d[3] == tag; BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.pad1) != 2);
BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.type) != 3);
return descriptor->pixel_clock == 0 &&
descriptor->data.other_data.pad1 == 0 &&
descriptor->data.other_data.type == type;
} }
static bool is_detailed_timing_descriptor(const u8 d[18]) static bool is_detailed_timing_descriptor(const u8 d[18])
...@@ -2405,7 +2410,7 @@ is_rb(struct detailed_timing *t, void *data) ...@@ -2405,7 +2410,7 @@ is_rb(struct detailed_timing *t, void *data)
{ {
u8 *r = (u8 *)t; u8 *r = (u8 *)t;
if (!is_display_descriptor(r, EDID_DETAIL_MONITOR_RANGE)) if (!is_display_descriptor(t, EDID_DETAIL_MONITOR_RANGE))
return; return;
if (r[10] == DRM_EDID_CVT_SUPPORT_FLAG && r[15] & 0x10) if (r[10] == DRM_EDID_CVT_SUPPORT_FLAG && r[15] & 0x10)
...@@ -2431,7 +2436,7 @@ find_gtf2(struct detailed_timing *t, void *data) ...@@ -2431,7 +2436,7 @@ find_gtf2(struct detailed_timing *t, void *data)
{ {
u8 *r = (u8 *)t; u8 *r = (u8 *)t;
if (!is_display_descriptor(r, EDID_DETAIL_MONITOR_RANGE)) if (!is_display_descriptor(t, EDID_DETAIL_MONITOR_RANGE))
return; return;
if (r[10] == 0x02) if (r[10] == 0x02)
...@@ -2987,7 +2992,7 @@ do_inferred_modes(struct detailed_timing *timing, void *c) ...@@ -2987,7 +2992,7 @@ do_inferred_modes(struct detailed_timing *timing, void *c)
struct detailed_non_pixel *data = &timing->data.other_data; struct detailed_non_pixel *data = &timing->data.other_data;
struct detailed_data_monitor_range *range = &data->data.range; struct detailed_data_monitor_range *range = &data->data.range;
if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_MONITOR_RANGE)) if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
return; return;
closure->modes += drm_dmt_modes_for_range(closure->connector, closure->modes += drm_dmt_modes_for_range(closure->connector,
...@@ -3067,7 +3072,7 @@ do_established_modes(struct detailed_timing *timing, void *c) ...@@ -3067,7 +3072,7 @@ do_established_modes(struct detailed_timing *timing, void *c)
{ {
struct detailed_mode_closure *closure = c; struct detailed_mode_closure *closure = c;
if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_EST_TIMINGS)) if (!is_display_descriptor(timing, EDID_DETAIL_EST_TIMINGS))
return; return;
closure->modes += drm_est3_modes(closure->connector, timing); closure->modes += drm_est3_modes(closure->connector, timing);
...@@ -3122,7 +3127,7 @@ do_standard_modes(struct detailed_timing *timing, void *c) ...@@ -3122,7 +3127,7 @@ do_standard_modes(struct detailed_timing *timing, void *c)
struct edid *edid = closure->edid; struct edid *edid = closure->edid;
int i; int i;
if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_STD_MODES)) if (!is_display_descriptor(timing, EDID_DETAIL_STD_MODES))
return; return;
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
...@@ -3231,7 +3236,7 @@ do_cvt_mode(struct detailed_timing *timing, void *c) ...@@ -3231,7 +3236,7 @@ do_cvt_mode(struct detailed_timing *timing, void *c)
{ {
struct detailed_mode_closure *closure = c; struct detailed_mode_closure *closure = c;
if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_CVT_3BYTE)) if (!is_display_descriptor(timing, EDID_DETAIL_CVT_3BYTE))
return; return;
closure->modes += drm_cvt_modes(closure->connector, timing); closure->modes += drm_cvt_modes(closure->connector, timing);
...@@ -4491,7 +4496,7 @@ drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db) ...@@ -4491,7 +4496,7 @@ drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db)
static void static void
monitor_name(struct detailed_timing *t, void *data) monitor_name(struct detailed_timing *t, void *data)
{ {
if (!is_display_descriptor((const u8 *)t, EDID_DETAIL_MONITOR_NAME)) if (!is_display_descriptor(t, EDID_DETAIL_MONITOR_NAME))
return; return;
*(u8 **)data = t->data.other_data.data.str.str; *(u8 **)data = t->data.other_data.data.str.str;
...@@ -5221,7 +5226,7 @@ void get_monitor_range(struct detailed_timing *timing, ...@@ -5221,7 +5226,7 @@ void get_monitor_range(struct detailed_timing *timing,
const struct detailed_non_pixel *data = &timing->data.other_data; const struct detailed_non_pixel *data = &timing->data.other_data;
const struct detailed_data_monitor_range *range = &data->data.range; const struct detailed_data_monitor_range *range = &data->data.range;
if (!is_display_descriptor((const u8 *)timing, EDID_DETAIL_MONITOR_RANGE)) if (!is_display_descriptor(timing, EDID_DETAIL_MONITOR_RANGE))
return; return;
/* /*
......
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