Commit d21d7a9d authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Check sink deep color capabilitis during HDMI .mode_valid()

Currently HDMI .mode_valid() only checks whether the source can do
deep color. Let's check whether the sink can do it as well.

Cc: Werner Sembach <wse@tuxedocomputers.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210511160532.21446-5-ville.syrjala@linux.intel.comReviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
parent 41828125
...@@ -1904,10 +1904,10 @@ static bool intel_hdmi_bpc_possible(struct drm_connector *connector, ...@@ -1904,10 +1904,10 @@ static bool intel_hdmi_bpc_possible(struct drm_connector *connector,
} }
static enum drm_mode_status static enum drm_mode_status
intel_hdmi_mode_clock_valid(struct intel_hdmi *hdmi, int clock, bool has_hdmi_sink) intel_hdmi_mode_clock_valid(struct drm_connector *connector, int clock,
bool has_hdmi_sink, bool ycbcr420_output)
{ {
struct drm_device *dev = intel_hdmi_to_dev(hdmi); struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
struct drm_i915_private *dev_priv = to_i915(dev);
enum drm_mode_status status; enum drm_mode_status status;
/* check if we can do 8bpc */ /* check if we can do 8bpc */
...@@ -1916,12 +1916,14 @@ intel_hdmi_mode_clock_valid(struct intel_hdmi *hdmi, int clock, bool has_hdmi_si ...@@ -1916,12 +1916,14 @@ intel_hdmi_mode_clock_valid(struct intel_hdmi *hdmi, int clock, bool has_hdmi_si
if (has_hdmi_sink) { if (has_hdmi_sink) {
/* if we can't do 8bpc we may still be able to do 12bpc */ /* if we can't do 8bpc we may still be able to do 12bpc */
if (status != MODE_OK && !HAS_GMCH(dev_priv)) if (status != MODE_OK &&
intel_hdmi_bpc_possible(connector, 12, has_hdmi_sink, ycbcr420_output))
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 12), status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 12),
true, has_hdmi_sink); true, has_hdmi_sink);
/* if we can't do 8,12bpc we may still be able to do 10bpc */ /* if we can't do 8,12bpc we may still be able to do 10bpc */
if (status != MODE_OK && DISPLAY_VER(dev_priv) >= 11) if (status != MODE_OK &&
intel_hdmi_bpc_possible(connector, 10, has_hdmi_sink, ycbcr420_output))
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 10), status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 10),
true, has_hdmi_sink); true, has_hdmi_sink);
} }
...@@ -1961,7 +1963,7 @@ intel_hdmi_mode_valid(struct drm_connector *connector, ...@@ -1961,7 +1963,7 @@ intel_hdmi_mode_valid(struct drm_connector *connector,
if (ycbcr_420_only) if (ycbcr_420_only)
clock /= 2; clock /= 2;
status = intel_hdmi_mode_clock_valid(hdmi, clock, has_hdmi_sink); status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, ycbcr_420_only);
if (status != MODE_OK) { if (status != MODE_OK) {
if (ycbcr_420_only || if (ycbcr_420_only ||
!connector->ycbcr_420_allowed || !connector->ycbcr_420_allowed ||
...@@ -1969,7 +1971,7 @@ intel_hdmi_mode_valid(struct drm_connector *connector, ...@@ -1969,7 +1971,7 @@ intel_hdmi_mode_valid(struct drm_connector *connector,
return status; return status;
clock /= 2; clock /= 2;
status = intel_hdmi_mode_clock_valid(hdmi, clock, has_hdmi_sink); status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, true);
if (status != MODE_OK) if (status != MODE_OK)
return status; return status;
} }
......
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