On Tue, Mar 01, 2022 at 04:12:14PM +0800, Lee Shawn C wrote:
Try to find and parse more CEA ext blocks if edid->extensions is greater than one.
v2: split prvious patch to two. And do CEA block parsing in this one.
Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjala ville.syrjala@linux.intel.com Cc: Ankit Nautiyal ankit.k.nautiyal@intel.com Signed-off-by: Lee Shawn C shawn.c.lee@intel.com
drivers/gpu/drm/drm_edid.c | 70 +++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 375e70d9de86..e2cfde02f837 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -4319,47 +4319,53 @@ static void drm_parse_y420cmdb_bitmap(struct drm_connector *connector, static int add_cea_modes(struct drm_connector *connector, struct edid *edid) {
- const u8 *cea, *db, *hdmi = NULL, *video = NULL;
- u8 dbl, hdmi_len, video_len = 0;
- const u8 *cea; int modes = 0, ext_index = 0;
- cea = drm_find_cea_extension(edid, &ext_index);
- if (cea && cea_revision(cea) >= 3) {
int i, start, end;
- for (;;) {
cea = drm_find_cea_extension(edid, &ext_index);
if (!cea)
break;
if (cea_db_offsets(cea, &start, &end))
return 0;
if (cea && cea_revision(cea) >= 3) {
const u8 *db, *hdmi = NULL, *video = NULL;
u8 dbl, hdmi_len, video_len = 0;
int i, start, end;
This amount of indentation is pretty horrible. Pls reverse this if-clause to get rid of one level. Should also make the diff much nicer.
for_each_cea_db(cea, i, start, end) {
db = &cea[i];
dbl = cea_db_payload_len(db);
if (cea_db_offsets(cea, &start, &end))
continue;
if (cea_db_tag(db) == VIDEO_BLOCK) {
video = db + 1;
video_len = dbl;
modes += do_cea_modes(connector, video, dbl);
} else if (cea_db_is_hdmi_vsdb(db)) {
hdmi = db;
hdmi_len = dbl;
} else if (cea_db_is_y420vdb(db)) {
const u8 *vdb420 = &db[2];
/* Add 4:2:0(only) modes present in EDID */
modes += do_y420vdb_modes(connector,
vdb420,
dbl - 1);
for_each_cea_db(cea, i, start, end) {
db = &cea[i];
dbl = cea_db_payload_len(db);
if (cea_db_tag(db) == VIDEO_BLOCK) {
video = db + 1;
video_len = dbl;
modes += do_cea_modes(connector, video, dbl);
} else if (cea_db_is_hdmi_vsdb(db)) {
hdmi = db;
hdmi_len = dbl;
} else if (cea_db_is_y420vdb(db)) {
const u8 *vdb420 = &db[2];
/* Add 4:2:0(only) modes present in EDID */
modes += do_y420vdb_modes(connector,
vdb420,
dbl - 1);
} }
/*
* We parse the HDMI VSDB after having added the cea modes as we will
* be patching their flags when the sink supports stereo 3D.
*/
if (hdmi)
modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video,
} }video_len);
- /*
* We parse the HDMI VSDB after having added the cea modes as we will
* be patching their flags when the sink supports stereo 3D.
*/
- if (hdmi)
modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video,
video_len);
- return modes;
}
-- 2.31.1