Commit 6454cb9f authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915: Check infoframe state in intel_pipe_config_compare()



Check the infoframes and infoframe enable state when comparing two
crtc states.

We'll use the infoframe logging functions from video/hdmi.c to
show the infoframes as part of the state dump.

TODO: Try to better integrate the infoframe dumps with
      drm state dumps

v2: drm_printk() is no more

Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20190225174106.2163-9-ville.syrjala@linux.intel.com
parent 0d567f1e
Loading
Loading
Loading
Loading
+48 −1
Original line number Original line Diff line number Diff line
@@ -11876,6 +11876,37 @@ intel_compare_link_m_n(const struct intel_link_m_n *m_n,
	return false;
	return false;
}
}


static bool
intel_compare_infoframe(const union hdmi_infoframe *a,
			const union hdmi_infoframe *b)
{
	return memcmp(a, b, sizeof(*a)) == 0;
}

static void
pipe_config_infoframe_err(struct drm_i915_private *dev_priv,
			  bool adjust, const char *name,
			  const union hdmi_infoframe *a,
			  const union hdmi_infoframe *b)
{
	if (adjust) {
		if ((drm_debug & DRM_UT_KMS) == 0)
			return;

		drm_dbg(DRM_UT_KMS, "mismatch in %s infoframe", name);
		drm_dbg(DRM_UT_KMS, "expected:");
		hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, a);
		drm_dbg(DRM_UT_KMS, "found");
		hdmi_infoframe_log(KERN_DEBUG, dev_priv->drm.dev, b);
	} else {
		drm_err("mismatch in %s infoframe", name);
		drm_err("expected:");
		hdmi_infoframe_log(KERN_ERR, dev_priv->drm.dev, a);
		drm_err("found");
		hdmi_infoframe_log(KERN_ERR, dev_priv->drm.dev, b);
	}
}

static void __printf(3, 4)
static void __printf(3, 4)
pipe_config_err(bool adjust, const char *name, const char *format, ...)
pipe_config_err(bool adjust, const char *name, const char *format, ...)
{
{
@@ -12059,6 +12090,16 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv,
	} \
	} \
} while (0)
} while (0)


#define PIPE_CONF_CHECK_INFOFRAME(name) do { \
	if (!intel_compare_infoframe(&current_config->infoframes.name, \
				     &pipe_config->infoframes.name)) { \
		pipe_config_infoframe_err(dev_priv, adjust, __stringify(name), \
					  &current_config->infoframes.name, \
					  &pipe_config->infoframes.name); \
		ret = false; \
	} \
} while (0)

#define PIPE_CONF_QUIRK(quirk) \
#define PIPE_CONF_QUIRK(quirk) \
	((current_config->quirks | pipe_config->quirks) & (quirk))
	((current_config->quirks | pipe_config->quirks) & (quirk))


@@ -12192,6 +12233,12 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv,


	PIPE_CONF_CHECK_I(min_voltage_level);
	PIPE_CONF_CHECK_I(min_voltage_level);


	PIPE_CONF_CHECK_X(infoframes.enable);
	PIPE_CONF_CHECK_X(infoframes.gcp);
	PIPE_CONF_CHECK_INFOFRAME(avi);
	PIPE_CONF_CHECK_INFOFRAME(spd);
	PIPE_CONF_CHECK_INFOFRAME(hdmi);

#undef PIPE_CONF_CHECK_X
#undef PIPE_CONF_CHECK_X
#undef PIPE_CONF_CHECK_I
#undef PIPE_CONF_CHECK_I
#undef PIPE_CONF_CHECK_BOOL
#undef PIPE_CONF_CHECK_BOOL