Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e440301c authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm: check HDMI HFVSDB block before adding formats"

parents bd6e0c58 ffdab875
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2754,6 +2754,13 @@ enum drm_mode_status sde_hdmi_mode_valid(struct drm_connector *connector,
	if (actual != requested)
		return MODE_CLOCK_RANGE;

	/* if no format flags are present remove the mode */
	if (!(mode->flags & SDE_DRM_MODE_FLAG_FMT_MASK)) {
		SDE_HDMI_DEBUG("removing following mode from list\n");
		drm_mode_debug_printmodeline(mode);
		return MODE_BAD;
	}

	return MODE_OK;
}

+27 −0
Original line number Diff line number Diff line
@@ -366,6 +366,33 @@ struct drm_connector *connector, struct sde_edid_ctrl *edid_ctrl)
	else
		SDE_EDID_DEBUG("YCbCr420 CMDB is not present\n");

	/*
	 * As per HDMI 2.0 spec, a sink supporting any modes
	 * requiring more than 340Mhz clock rate should support
	 * SCDC as well. This is required because we need the SCDC
	 * channel to set the TMDS clock ratio. However in cases
	 * where the TV publishes such a mode in its list of modes
	 * but does not have SCDC support as per HDMI HFVSDB block
	 * remove RGB mode support from the flags. Currently, in
	 * the list of modes not having deep color support only RGB
	 * modes shall requre a clock of 340Mhz and above such as the
	 * 4K@60fps case. All other modes shall be YUV.
	 * Deep color case is handled separately while choosing the
	 * best mode in the _sde_hdmi_choose_best_format API where
	 * we enable deep color only if it satisfies both source and
	 * sink requirements. However, that API assumes that at least
	 * RGB mode is supported on the mode. Hence, it would be better
	 * to remove the format support flags while parsing the EDID
	 * itself if it doesn't satisfy the HDMI spec requirement.
	 */

	list_for_each_entry(mode, &connector->probed_modes, head) {
		if ((mode->clock > MIN_SCRAMBLER_REQ_RATE) &&
			!connector->scdc_present) {
			mode->flags &= ~DRM_MODE_FLAG_SUPPORTS_RGB;
		}
	}

	SDE_EDID_DEBUG("%s -\n", __func__);
}

+3 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -33,6 +33,8 @@
#define SDE_CEA_EXT    0x02
#define SDE_EXTENDED_TAG 0x07

#define MIN_SCRAMBLER_REQ_RATE 340000

#define SDE_DRM_MODE_FLAG_FMT_MASK (0x3 << 20)

enum extended_data_block_types {