From: sashiko-bot@kernel.org
To: "Cristian Ciocaltea" <cristian.ciocaltea@collabora.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v8 07/39] drm/display: hdmi: Add HDMI 2.0 scrambling management helpers
Date: Thu, 02 Jul 2026 15:13:04 +0000 [thread overview]
Message-ID: <20260702151304.E286F1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260702-dw-hdmi-qp-scramb-v8-7-d79890d00b6a@collabora.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] The `scdc_work` delayed work item is initialized but never explicitly canceled during connector cleanup, risking a Use-After-Free.
- [High] The SCDC configuration helpers attempt to execute I2C transfers without verifying that `connector->ddc` is not NULL, leading to a NULL pointer dereference.
- [High] The newly added HDMI scrambling helpers invoke sleeping functions in atomic context.
- [Medium] The SCDC scrambling monitor delayed work fails to reschedule itself under normal conditions or upon recovery failure, breaking the intended periodic polling.
--
commit 8b2652a7b68d13a84c5a135061f33fe6fdd00be1
Author: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
drm/display: hdmi: Add HDMI 2.0 scrambling management helpers
Add helpers to manage the full lifecycle of HDMI 2.0 SCDC scrambling on
both source and sink sides:
- drm_hdmi_mode_needs_scrambling(): checks whether a mode, bits per
component and output format combination requires scrambling, which is
needed when the resulting TMDS character rate exceeds the HDMI 1.3
maximum of 340 MHz
- drm_connector_hdmi_enable_scrambling(): configures SCDC scrambling and
high TMDS clock ratio and starts a periodic work item that monitors
the sink's SCDC scrambling status, retrying setup when the sink loses
state
- drm_connector_hdmi_disable_scrambling(): tears down scrambling on both
sides and cancels the monitoring work
- drm_connector_hdmi_sync_scdc(): triggers a CRTC reset on reconnection
to restore SCDC state lost during sink disconnects within an active
display pipeline
> diff --git a/drivers/gpu/drm/display/drm_hdmi_helper.c b/drivers/gpu/drm/display/drm_hdmi_helper.c
> index 5cb0b033b1713..7c96cccf683d4 100644
> --- a/drivers/gpu/drm/display/drm_hdmi_helper.c
> +++ b/drivers/gpu/drm/display/drm_hdmi_helper.c
[ ... ]
> +static int drm_scdc_try_scrambling_setup(struct drm_connector *connector)
> +{
> + bool done;
> +
> + done = drm_scdc_set_high_tmds_clock_ratio(connector, true);
> + if (!done)
> + return -EIO;
> +
> + done = drm_scdc_set_scrambling(connector, true);
> + if (!done)
> + return -EIO;
> +
> + if (READ_ONCE(connector->hdmi.scrambler_enabled))
> + schedule_delayed_work(&connector->hdmi.scdc_work,
> + msecs_to_jiffies(DRM_HDMI_SCDC_POLL_DELAY_MS));
> +
> + return 0;
> +}
> +
> +static void drm_scdc_monitor_scrambler(struct drm_connector *connector)
> +{
> + if (READ_ONCE(connector->hdmi.scrambler_enabled) &&
> + !drm_scdc_get_scrambling_status(connector))
> + drm_scdc_try_scrambling_setup(connector);
> +}
[Severity: Medium]
Does this periodic monitoring loop stop unintentionally?
If drm_scdc_get_scrambling_status() returns true to indicate normal status,
or if drm_scdc_try_scrambling_setup() fails and returns early without
rescheduling, the delayed work is never scheduled again.
This appears to break the intended periodic polling loop in both the
success and persistent-failure paths.
[Severity: High]
Is the scdc_work delayed work item explicitly cancelled when the connector
is destroyed?
If a connector is destroyed abruptly while the work is pending, it seems
drm_connector_cleanup() will clear the connector structure using memset
without first calling cancel_delayed_work_sync(&connector->hdmi.scdc_work).
Could this leave a corrupted entry in the timer list, leading to a panic
when the timer fires?
[ ... ]
> +int drm_connector_hdmi_enable_scrambling(struct drm_connector *connector,
> + const struct drm_connector_state *conn_state)
> +{
> + struct drm_connector_hdmi *hdmi = &connector->hdmi;
> + struct drm_device *dev = connector->dev;
> + int ret;
> +
> + if (!conn_state)
> + return -EINVAL;
> +
> + if (!conn_state->hdmi.scrambler_needed)
> + return 0;
> +
> + if (!hdmi->scrambler_supported) {
> + drm_dbg_kms(dev, "Source doesn't support scrambling.\n");
> + return -EINVAL;
> + }
> +
> + if (!drm_scdc_sink_supports_scrambling(connector)) {
> + drm_dbg_kms(dev, "Sink doesn't support scrambling.\n");
> + return -EINVAL;
> + }
[Severity: High]
Is it possible for connector->ddc to be NULL here?
If an EDID advertising SCDC is forced on a connector that physically lacks
an I2C DDC bus, drm_scdc_sink_supports_scrambling() might pass because it
only checks the EDID capabilities.
This would lead to a NULL pointer dereference when I2C transfers are
attempted later in the function.
> +
> + drm_dbg_kms(dev, "Enabling scrambling\n");
> +
> + hdmi->scdc_cb = drm_scdc_monitor_scrambler;
> + WRITE_ONCE(hdmi->scrambler_enabled, true);
> +
> + ret = drm_scdc_try_scrambling_setup(connector);
> + if (!ret)
> + ret = hdmi->funcs->scrambler_enable(connector);
> +
> + if (ret) {
> + WRITE_ONCE(hdmi->scrambler_enabled, false);
> + cancel_delayed_work_sync(&hdmi->scdc_work);
[Severity: High]
Are sleeping functions being called from an atomic context here?
These scrambling helpers appear to be invoked from encoder and bridge
atomic enable/disable paths where sleeping is strictly forbidden.
However, drm_scdc_try_scrambling_setup() indirectly uses usleep_range(),
and cancel_delayed_work_sync() can also sleep.
Could this cause deadlocks or system instability during modesets?
[ ... ]
> +int drm_connector_hdmi_disable_scrambling(struct drm_connector *connector)
> +{
> + struct drm_connector_hdmi *hdmi = &connector->hdmi;
> + struct drm_device *dev = connector->dev;
> +
> + if (!READ_ONCE(hdmi->scrambler_enabled))
> + return 0;
> +
> + drm_dbg_kms(dev, "Disabling scrambling\n");
> +
> + WRITE_ONCE(hdmi->scrambler_enabled, false);
> + cancel_delayed_work_sync(&hdmi->scdc_work);
[Severity: High]
Could this cancel_delayed_work_sync() call sleep in an atomic disable path?
Like the enable path, this disable helper uses a synchronization function
that can sleep. This violates the requirement that atomic disable callbacks
must not sleep.
[ ... ]
> +int drm_connector_hdmi_sync_scdc(struct drm_connector *connector, bool plugged,
> + struct drm_modeset_acquire_ctx *ctx)
> +{
> + struct drm_connector_hdmi *hdmi = &connector->hdmi;
> + struct drm_device *dev = connector->dev;
> + struct drm_connector_state *conn_state;
> + struct drm_crtc *crtc;
> + u8 config;
> + int ret;
[ ... ]
> + if (!drm_scdc_sink_supports_scrambling(connector))
> + return 0;
> +
> + if (conn_state->commit &&
> + !try_wait_for_completion(&conn_state->commit->hw_done))
> + return 0;
> +
> + ret = drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config);
[Severity: High]
Does this code need to verify connector->ddc before using it?
Similar to the enable path, if the connector lacks a physical I2C bus but
SCDC is supported by the EDID, reading from connector->ddc here without
a NULL check will result in a kernel panic.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260702-dw-hdmi-qp-scramb-v8-0-d79890d00b6a@collabora.com?part=7
next prev parent reply other threads:[~2026-07-02 15:13 UTC|newest]
Thread overview: 157+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-02 14:46 [PATCH v8 00/39] Add HDMI 2.0 support to DW HDMI QP TX Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 01/39] video/hdmi: Introduce HDMI version enum Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-03 13:55 ` Dmitry Baryshkov
2026-07-03 13:55 ` Dmitry Baryshkov
2026-07-07 11:54 ` Maxime Ripard
2026-07-07 11:54 ` Maxime Ripard
2026-07-02 14:46 ` [PATCH v8 02/39] drm/connector: Add caps-based HDMI connector init helper Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:02 ` sashiko-bot
2026-07-03 14:05 ` Dmitry Baryshkov
2026-07-03 14:05 ` Dmitry Baryshkov
2026-07-03 19:31 ` Cristian Ciocaltea
2026-07-03 19:31 ` Cristian Ciocaltea
2026-07-07 16:10 ` Maxime Ripard
2026-07-07 16:10 ` Maxime Ripard
2026-07-08 10:11 ` Cristian Ciocaltea
2026-07-08 10:11 ` Cristian Ciocaltea
2026-07-10 10:27 ` Cristian Ciocaltea
2026-07-10 10:27 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 03/39] drm/display: bridge_connector: Pass HDMI capabilities through caps struct Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-03 14:19 ` Dmitry Baryshkov
2026-07-03 14:19 ` Dmitry Baryshkov
2026-07-03 19:55 ` Cristian Ciocaltea
2026-07-03 19:55 ` Cristian Ciocaltea
2026-07-08 6:46 ` Maxime Ripard
2026-07-08 6:46 ` Maxime Ripard
2026-07-08 10:19 ` Cristian Ciocaltea
2026-07-08 10:19 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 04/39] drm/connector: Add HDMI 2.0 scrambler infrastructure Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:04 ` sashiko-bot
2026-07-03 14:34 ` Dmitry Baryshkov
2026-07-03 14:34 ` Dmitry Baryshkov
2026-07-03 20:54 ` Cristian Ciocaltea
2026-07-03 20:54 ` Cristian Ciocaltea
2026-07-07 12:30 ` Maxime Ripard
2026-07-07 12:30 ` Maxime Ripard
2026-07-08 10:34 ` Cristian Ciocaltea
2026-07-08 10:34 ` Cristian Ciocaltea
2026-07-09 19:25 ` Cristian Ciocaltea
2026-07-09 19:25 ` Cristian Ciocaltea
2026-07-13 8:50 ` Maxime Ripard
2026-07-13 8:50 ` Maxime Ripard
2026-07-13 10:23 ` Cristian Ciocaltea
2026-07-13 10:23 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 05/39] drm/display: scdc-helper: Add macro for connector-prefixed debug messages Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 06/39] drm/display: scdc-helper: Add helper to set SCDC version information Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-07 15:40 ` Maxime Ripard
2026-07-07 15:40 ` Maxime Ripard
2026-07-02 14:46 ` [PATCH v8 07/39] drm/display: hdmi: Add HDMI 2.0 scrambling management helpers Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:13 ` sashiko-bot [this message]
2026-07-02 14:46 ` [PATCH v8 08/39] drm/display: hdmi: Advertise SCDC source version when scrambling Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-07 15:26 ` Maxime Ripard
2026-07-07 15:26 ` Maxime Ripard
2026-07-02 14:46 ` [PATCH v8 09/39] drm/display: hdmi-state-helper: Add fallback TMDS rate validation Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:05 ` sashiko-bot
2026-07-07 11:23 ` Maxime Ripard
2026-07-07 11:23 ` Maxime Ripard
2026-07-08 10:39 ` Cristian Ciocaltea
2026-07-08 10:39 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 10/39] drm/display: hdmi-state-helper: Sync SCDC state on hotplug Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:04 ` sashiko-bot
2026-07-07 11:31 ` Maxime Ripard
2026-07-07 11:31 ` Maxime Ripard
2026-07-08 11:21 ` Cristian Ciocaltea
2026-07-08 11:21 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 11/39] drm/display: hdmi-state-helper: Set HDMI scrambling requirement Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:14 ` sashiko-bot
2026-07-07 11:34 ` Maxime Ripard
2026-07-07 11:34 ` Maxime Ripard
2026-07-02 14:46 ` [PATCH v8 12/39] drm/bridge: Remove redundant error check in drm_bridge_helper_reset_crtc() Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:05 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 13/39] drm/bridge: Add bridge ops for source-side HDMI 2.0 scrambling Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 14/39] drm/display: bridge_connector: Use cached connector status in .get_modes() Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 15/39] drm/display: bridge_connector: Switch to .detect_ctx() connector helper Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 16/39] drm/display: bridge_connector: Wire up HDMI 2.0 scrambler callbacks Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 17/39] drm/bridge: dw-hdmi-qp: Rate limit i2c read error messages Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 18/39] drm/bridge: dw-hdmi-qp: Provide .{enable|disable}_hpd() PHY ops Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 19/39] drm/bridge: dw-hdmi-qp: Add HDMI 2.0 SCDC scrambling support Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:08 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 20/39] drm/bridge: dw-hdmi-qp: Provide dw_hdmi_qp_hpd_notify() helper Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:03 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 21/39] drm/rockchip: dw_hdmi_qp: Add missing newlines in dev_err_probe() messages Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 22/39] drm/rockchip: dw_hdmi_qp: Use local dev variable consistently in bind() Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:03 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 23/39] drm/rockchip: dw_hdmi_qp: Drop unnecessary #include Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 24/39] drm/rockchip: dw_hdmi_qp: Defer HPD IRQ enable until after connector setup Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:11 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 25/39] drm/rockchip: dw_hdmi_qp: Mask RK3576 HPD IRQ in io_init Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 26/39] drm/rockchip: dw_hdmi_qp: Implement .{enable|disable}_hpd() PHY ops Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:13 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 27/39] drm/rockchip: dw_hdmi_qp: Use dw_hdmi_qp_hpd_notify() for HPD reports Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:15 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 28/39] drm/bridge: dw-hdmi-qp: Drop unused .setup_hpd() phy op Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 29/39] drm/vc4: hdmi: Use common TMDS char rate constants Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 30/39] drm/vc4: hdmi: Switch to drm_hdmi_mode_needs_scrambling() Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-07 12:43 ` Maxime Ripard
2026-07-07 12:43 ` Maxime Ripard
2026-07-02 14:46 ` [PATCH v8 31/39] drm/vc4: hdmi: Convert to common SCDC scrambling infrastructure Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:16 ` sashiko-bot
2026-07-07 15:36 ` Maxime Ripard
2026-07-07 15:36 ` Maxime Ripard
2026-07-08 12:53 ` Cristian Ciocaltea
2026-07-08 12:53 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 32/39] drm/tests: connector: Add HDMI caps-based init coverage Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:10 ` sashiko-bot
2026-07-02 14:46 ` [PATCH v8 33/39] drm/tests: connector: Add HDMI source-side scrambler coverage Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 34/39] drm/tests: hdmi_state_helper: Use drmm_connector_hdmi_init_with_caps() Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 35/39] drm/tests: hdmi_state_helper: Add max_tmds_char_rate fallback tests Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 36/39] drm/tests: edid: Add 4K@60Hz EDID with 600MHz TMDS Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 37/39] drm/tests: hdmi_state_helper: Cover source-side scrambling decision Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 38/39] drm/tests: edid: Fix conformity for 1080p+4K YUV420 200MHz EDID Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 14:46 ` [PATCH v8 39/39] drm/tests: edid: Fix conformity for 4K RGB/YUV 340MHz EDID Cristian Ciocaltea
2026-07-02 14:46 ` Cristian Ciocaltea
2026-07-02 15:31 ` [PATCH v8 00/39] Add HDMI 2.0 support to DW HDMI QP TX Cristian Ciocaltea
2026-07-02 15:31 ` Cristian Ciocaltea
2026-07-06 8:33 ` Maud Spierings
2026-07-06 8:33 ` Maud Spierings
2026-07-08 16:07 ` Cristian Ciocaltea
2026-07-08 16:07 ` Cristian Ciocaltea
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260702151304.E286F1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=cristian.ciocaltea@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.