Commit 5d844091 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/scdc-helper: Pimp SCDC debugs

Include the device and connector information in the SCDC
debugs. Makes it easier to figure out who did what.

v2: Rely on connector->ddc (Maxime)

Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Cc: Neil Armstrong <neil.armstrong@linaro.org>
Cc: Robert Foss <rfoss@kernel.org>
Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
Cc: Jonas Karlman <jonas@kwiboo.se>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Emma Anholt <emma@anholt.net>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: intel-gfx@lists.freedesktop.org
Cc: linux-tegra@vger.kernel.org
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230403223652.18848-1-ville.syrjala@linux.intel.comReviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Acked-by: default avatarMaxime Ripard <maxime@cerno.tech>
Reviewed-by: default avatarAndrzej Hajda <andrzej.hajda@intel.com>
Acked-by: default avatarThierry Reding <treding@nvidia.com>
parent ee4cce0a
...@@ -1426,9 +1426,9 @@ void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi, ...@@ -1426,9 +1426,9 @@ void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi,
/* Control for TMDS Bit Period/TMDS Clock-Period Ratio */ /* Control for TMDS Bit Period/TMDS Clock-Period Ratio */
if (dw_hdmi_support_scdc(hdmi, display)) { if (dw_hdmi_support_scdc(hdmi, display)) {
if (mtmdsclock > HDMI14_MAX_TMDSCLK) if (mtmdsclock > HDMI14_MAX_TMDSCLK)
drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 1); drm_scdc_set_high_tmds_clock_ratio(&hdmi->connector, 1);
else else
drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 0); drm_scdc_set_high_tmds_clock_ratio(&hdmi->connector, 0);
} }
} }
EXPORT_SYMBOL_GPL(dw_hdmi_set_high_tmds_clock_ratio); EXPORT_SYMBOL_GPL(dw_hdmi_set_high_tmds_clock_ratio);
...@@ -2116,7 +2116,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi, ...@@ -2116,7 +2116,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
min_t(u8, bytes, SCDC_MIN_SOURCE_VERSION)); min_t(u8, bytes, SCDC_MIN_SOURCE_VERSION));
/* Enabled Scrambling in the Sink */ /* Enabled Scrambling in the Sink */
drm_scdc_set_scrambling(hdmi->ddc, 1); drm_scdc_set_scrambling(&hdmi->connector, 1);
/* /*
* To activate the scrambler feature, you must ensure * To activate the scrambler feature, you must ensure
...@@ -2132,7 +2132,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi, ...@@ -2132,7 +2132,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
hdmi_writeb(hdmi, 0, HDMI_FC_SCRAMBLER_CTRL); hdmi_writeb(hdmi, 0, HDMI_FC_SCRAMBLER_CTRL);
hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ, hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ,
HDMI_MC_SWRSTZ); HDMI_MC_SWRSTZ);
drm_scdc_set_scrambling(hdmi->ddc, 0); drm_scdc_set_scrambling(&hdmi->connector, 0);
} }
} }
......
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <drm/display/drm_scdc_helper.h> #include <drm/display/drm_scdc_helper.h>
#include <drm/drm_connector.h>
#include <drm/drm_device.h>
#include <drm/drm_print.h> #include <drm/drm_print.h>
/** /**
...@@ -140,7 +142,7 @@ EXPORT_SYMBOL(drm_scdc_write); ...@@ -140,7 +142,7 @@ EXPORT_SYMBOL(drm_scdc_write);
/** /**
* drm_scdc_get_scrambling_status - what is status of scrambling? * drm_scdc_get_scrambling_status - what is status of scrambling?
* @adapter: I2C adapter for DDC channel * @connector: connector
* *
* Reads the scrambler status over SCDC, and checks the * Reads the scrambler status over SCDC, and checks the
* scrambling status. * scrambling status.
...@@ -148,14 +150,16 @@ EXPORT_SYMBOL(drm_scdc_write); ...@@ -148,14 +150,16 @@ EXPORT_SYMBOL(drm_scdc_write);
* Returns: * Returns:
* True if the scrambling is enabled, false otherwise. * True if the scrambling is enabled, false otherwise.
*/ */
bool drm_scdc_get_scrambling_status(struct i2c_adapter *adapter) bool drm_scdc_get_scrambling_status(struct drm_connector *connector)
{ {
u8 status; u8 status;
int ret; int ret;
ret = drm_scdc_readb(adapter, SCDC_SCRAMBLER_STATUS, &status); ret = drm_scdc_readb(connector->ddc, SCDC_SCRAMBLER_STATUS, &status);
if (ret < 0) { if (ret < 0) {
DRM_DEBUG_KMS("Failed to read scrambling status: %d\n", ret); drm_dbg_kms(connector->dev,
"[CONNECTOR:%d:%s] Failed to read scrambling status: %d\n",
connector->base.id, connector->name, ret);
return false; return false;
} }
...@@ -165,7 +169,7 @@ EXPORT_SYMBOL(drm_scdc_get_scrambling_status); ...@@ -165,7 +169,7 @@ EXPORT_SYMBOL(drm_scdc_get_scrambling_status);
/** /**
* drm_scdc_set_scrambling - enable scrambling * drm_scdc_set_scrambling - enable scrambling
* @adapter: I2C adapter for DDC channel * @connector: connector
* @enable: bool to indicate if scrambling is to be enabled/disabled * @enable: bool to indicate if scrambling is to be enabled/disabled
* *
* Writes the TMDS config register over SCDC channel, and: * Writes the TMDS config register over SCDC channel, and:
...@@ -175,14 +179,17 @@ EXPORT_SYMBOL(drm_scdc_get_scrambling_status); ...@@ -175,14 +179,17 @@ EXPORT_SYMBOL(drm_scdc_get_scrambling_status);
* Returns: * Returns:
* True if scrambling is set/reset successfully, false otherwise. * True if scrambling is set/reset successfully, false otherwise.
*/ */
bool drm_scdc_set_scrambling(struct i2c_adapter *adapter, bool enable) bool drm_scdc_set_scrambling(struct drm_connector *connector,
bool enable)
{ {
u8 config; u8 config;
int ret; int ret;
ret = drm_scdc_readb(adapter, SCDC_TMDS_CONFIG, &config); ret = drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config);
if (ret < 0) { if (ret < 0) {
DRM_DEBUG_KMS("Failed to read TMDS config: %d\n", ret); drm_dbg_kms(connector->dev,
"[CONNECTOR:%d:%s] Failed to read TMDS config: %d\n",
connector->base.id, connector->name, ret);
return false; return false;
} }
...@@ -191,9 +198,11 @@ bool drm_scdc_set_scrambling(struct i2c_adapter *adapter, bool enable) ...@@ -191,9 +198,11 @@ bool drm_scdc_set_scrambling(struct i2c_adapter *adapter, bool enable)
else else
config &= ~SCDC_SCRAMBLING_ENABLE; config &= ~SCDC_SCRAMBLING_ENABLE;
ret = drm_scdc_writeb(adapter, SCDC_TMDS_CONFIG, config); ret = drm_scdc_writeb(connector->ddc, SCDC_TMDS_CONFIG, config);
if (ret < 0) { if (ret < 0) {
DRM_DEBUG_KMS("Failed to enable scrambling: %d\n", ret); drm_dbg_kms(connector->dev,
"[CONNECTOR:%d:%s] Failed to enable scrambling: %d\n",
connector->base.id, connector->name, ret);
return false; return false;
} }
...@@ -203,7 +212,7 @@ EXPORT_SYMBOL(drm_scdc_set_scrambling); ...@@ -203,7 +212,7 @@ EXPORT_SYMBOL(drm_scdc_set_scrambling);
/** /**
* drm_scdc_set_high_tmds_clock_ratio - set TMDS clock ratio * drm_scdc_set_high_tmds_clock_ratio - set TMDS clock ratio
* @adapter: I2C adapter for DDC channel * @connector: connector
* @set: ret or reset the high clock ratio * @set: ret or reset the high clock ratio
* *
* *
...@@ -230,14 +239,17 @@ EXPORT_SYMBOL(drm_scdc_set_scrambling); ...@@ -230,14 +239,17 @@ EXPORT_SYMBOL(drm_scdc_set_scrambling);
* Returns: * Returns:
* True if write is successful, false otherwise. * True if write is successful, false otherwise.
*/ */
bool drm_scdc_set_high_tmds_clock_ratio(struct i2c_adapter *adapter, bool set) bool drm_scdc_set_high_tmds_clock_ratio(struct drm_connector *connector,
bool set)
{ {
u8 config; u8 config;
int ret; int ret;
ret = drm_scdc_readb(adapter, SCDC_TMDS_CONFIG, &config); ret = drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config);
if (ret < 0) { if (ret < 0) {
DRM_DEBUG_KMS("Failed to read TMDS config: %d\n", ret); drm_dbg_kms(connector->dev,
"[CONNECTOR:%d:%s] Failed to read TMDS config: %d\n",
connector->base.id, connector->name, ret);
return false; return false;
} }
...@@ -246,9 +258,11 @@ bool drm_scdc_set_high_tmds_clock_ratio(struct i2c_adapter *adapter, bool set) ...@@ -246,9 +258,11 @@ bool drm_scdc_set_high_tmds_clock_ratio(struct i2c_adapter *adapter, bool set)
else else
config &= ~SCDC_TMDS_BIT_CLOCK_RATIO_BY_40; config &= ~SCDC_TMDS_BIT_CLOCK_RATIO_BY_40;
ret = drm_scdc_writeb(adapter, SCDC_TMDS_CONFIG, config); ret = drm_scdc_writeb(connector->ddc, SCDC_TMDS_CONFIG, config);
if (ret < 0) { if (ret < 0) {
DRM_DEBUG_KMS("Failed to set TMDS clock ratio: %d\n", ret); drm_dbg_kms(connector->dev,
"[CONNECTOR:%d:%s] Failed to set TMDS clock ratio: %d\n",
connector->base.id, connector->name, ret);
return false; return false;
} }
......
...@@ -3988,8 +3988,8 @@ static int intel_hdmi_reset_link(struct intel_encoder *encoder, ...@@ -3988,8 +3988,8 @@ static int intel_hdmi_reset_link(struct intel_encoder *encoder,
ret = drm_scdc_readb(adapter, SCDC_TMDS_CONFIG, &config); ret = drm_scdc_readb(adapter, SCDC_TMDS_CONFIG, &config);
if (ret < 0) { if (ret < 0) {
drm_err(&dev_priv->drm, "Failed to read TMDS config: %d\n", drm_err(&dev_priv->drm, "[CONNECTOR:%d:%s] Failed to read TMDS config: %d\n",
ret); connector->base.base.id, connector->base.name, ret);
return 0; return 0;
} }
......
...@@ -2646,11 +2646,8 @@ bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder, ...@@ -2646,11 +2646,8 @@ bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
bool scrambling) bool scrambling)
{ {
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
struct drm_scrambling *sink_scrambling = struct drm_scrambling *sink_scrambling =
&connector->display_info.hdmi.scdc.scrambling; &connector->display_info.hdmi.scdc.scrambling;
struct i2c_adapter *adapter =
intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
if (!sink_scrambling->supported) if (!sink_scrambling->supported)
return true; return true;
...@@ -2661,9 +2658,8 @@ bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder, ...@@ -2661,9 +2658,8 @@ bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
str_yes_no(scrambling), high_tmds_clock_ratio ? 40 : 10); str_yes_no(scrambling), high_tmds_clock_ratio ? 40 : 10);
/* Set TMDS bit clock ratio to 1/40 or 1/10, and enable/disable scrambling */ /* Set TMDS bit clock ratio to 1/40 or 1/10, and enable/disable scrambling */
return drm_scdc_set_high_tmds_clock_ratio(adapter, return drm_scdc_set_high_tmds_clock_ratio(connector, high_tmds_clock_ratio) &&
high_tmds_clock_ratio) && drm_scdc_set_scrambling(connector, scrambling);
drm_scdc_set_scrambling(adapter, scrambling);
} }
static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port) static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
......
...@@ -2140,10 +2140,8 @@ static void tegra_sor_hdmi_disable_scrambling(struct tegra_sor *sor) ...@@ -2140,10 +2140,8 @@ static void tegra_sor_hdmi_disable_scrambling(struct tegra_sor *sor)
static void tegra_sor_hdmi_scdc_disable(struct tegra_sor *sor) static void tegra_sor_hdmi_scdc_disable(struct tegra_sor *sor)
{ {
struct i2c_adapter *ddc = sor->output.ddc; drm_scdc_set_high_tmds_clock_ratio(&sor->output.connector, false);
drm_scdc_set_scrambling(&sor->output.connector, false);
drm_scdc_set_high_tmds_clock_ratio(ddc, false);
drm_scdc_set_scrambling(ddc, false);
tegra_sor_hdmi_disable_scrambling(sor); tegra_sor_hdmi_disable_scrambling(sor);
} }
...@@ -2168,10 +2166,8 @@ static void tegra_sor_hdmi_enable_scrambling(struct tegra_sor *sor) ...@@ -2168,10 +2166,8 @@ static void tegra_sor_hdmi_enable_scrambling(struct tegra_sor *sor)
static void tegra_sor_hdmi_scdc_enable(struct tegra_sor *sor) static void tegra_sor_hdmi_scdc_enable(struct tegra_sor *sor)
{ {
struct i2c_adapter *ddc = sor->output.ddc; drm_scdc_set_high_tmds_clock_ratio(&sor->output.connector, true);
drm_scdc_set_scrambling(&sor->output.connector, true);
drm_scdc_set_high_tmds_clock_ratio(ddc, true);
drm_scdc_set_scrambling(ddc, true);
tegra_sor_hdmi_enable_scrambling(sor); tegra_sor_hdmi_enable_scrambling(sor);
} }
...@@ -2179,9 +2175,8 @@ static void tegra_sor_hdmi_scdc_enable(struct tegra_sor *sor) ...@@ -2179,9 +2175,8 @@ static void tegra_sor_hdmi_scdc_enable(struct tegra_sor *sor)
static void tegra_sor_hdmi_scdc_work(struct work_struct *work) static void tegra_sor_hdmi_scdc_work(struct work_struct *work)
{ {
struct tegra_sor *sor = container_of(work, struct tegra_sor, scdc.work); struct tegra_sor *sor = container_of(work, struct tegra_sor, scdc.work);
struct i2c_adapter *ddc = sor->output.ddc;
if (!drm_scdc_get_scrambling_status(ddc)) { if (!drm_scdc_get_scrambling_status(&sor->output.connector)) {
DRM_DEBUG_KMS("SCDC not scrambled\n"); DRM_DEBUG_KMS("SCDC not scrambled\n");
tegra_sor_hdmi_scdc_enable(sor); tegra_sor_hdmi_scdc_enable(sor);
} }
......
...@@ -885,7 +885,8 @@ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder) ...@@ -885,7 +885,8 @@ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder)
static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder) static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
struct drm_device *drm = vc4_hdmi->connector.dev; struct drm_connector *connector = &vc4_hdmi->connector;
struct drm_device *drm = connector->dev;
const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;
unsigned long flags; unsigned long flags;
int idx; int idx;
...@@ -903,8 +904,8 @@ static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder) ...@@ -903,8 +904,8 @@ static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
if (!drm_dev_enter(drm, &idx)) if (!drm_dev_enter(drm, &idx))
return; return;
drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); drm_scdc_set_high_tmds_clock_ratio(connector, true);
drm_scdc_set_scrambling(vc4_hdmi->ddc, true); drm_scdc_set_scrambling(connector, true);
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) | HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) |
...@@ -922,7 +923,8 @@ static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder) ...@@ -922,7 +923,8 @@ static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder)
static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder) static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
struct drm_device *drm = vc4_hdmi->connector.dev; struct drm_connector *connector = &vc4_hdmi->connector;
struct drm_device *drm = connector->dev;
unsigned long flags; unsigned long flags;
int idx; int idx;
...@@ -944,8 +946,8 @@ static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder) ...@@ -944,8 +946,8 @@ static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder)
~VC5_HDMI_SCRAMBLER_CTL_ENABLE); ~VC5_HDMI_SCRAMBLER_CTL_ENABLE);
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
drm_scdc_set_scrambling(vc4_hdmi->ddc, false); drm_scdc_set_scrambling(connector, false);
drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, false); drm_scdc_set_high_tmds_clock_ratio(connector, false);
drm_dev_exit(idx); drm_dev_exit(idx);
} }
...@@ -955,12 +957,13 @@ static void vc4_hdmi_scrambling_wq(struct work_struct *work) ...@@ -955,12 +957,13 @@ static void vc4_hdmi_scrambling_wq(struct work_struct *work)
struct vc4_hdmi *vc4_hdmi = container_of(to_delayed_work(work), struct vc4_hdmi *vc4_hdmi = container_of(to_delayed_work(work),
struct vc4_hdmi, struct vc4_hdmi,
scrambling_work); scrambling_work);
struct drm_connector *connector = &vc4_hdmi->connector;
if (drm_scdc_get_scrambling_status(vc4_hdmi->ddc)) if (drm_scdc_get_scrambling_status(connector))
return; return;
drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); drm_scdc_set_high_tmds_clock_ratio(connector, true);
drm_scdc_set_scrambling(vc4_hdmi->ddc, true); drm_scdc_set_scrambling(connector, true);
queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work, queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work,
msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS)); msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS));
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <drm/display/drm_scdc.h> #include <drm/display/drm_scdc.h>
struct drm_connector;
struct i2c_adapter; struct i2c_adapter;
ssize_t drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, ssize_t drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer,
...@@ -71,9 +72,9 @@ static inline int drm_scdc_writeb(struct i2c_adapter *adapter, u8 offset, ...@@ -71,9 +72,9 @@ static inline int drm_scdc_writeb(struct i2c_adapter *adapter, u8 offset,
return drm_scdc_write(adapter, offset, &value, sizeof(value)); return drm_scdc_write(adapter, offset, &value, sizeof(value));
} }
bool drm_scdc_get_scrambling_status(struct i2c_adapter *adapter); bool drm_scdc_get_scrambling_status(struct drm_connector *connector);
bool drm_scdc_set_scrambling(struct i2c_adapter *adapter, bool enable); bool drm_scdc_set_scrambling(struct drm_connector *connector, bool enable);
bool drm_scdc_set_high_tmds_clock_ratio(struct i2c_adapter *adapter, bool set); bool drm_scdc_set_high_tmds_clock_ratio(struct drm_connector *connector, bool set);
#endif #endif
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