From: sashiko-bot@kernel.org
To: "Maxime Ripard" <mripard@kernel.org>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v7 32/34] drm/tidss: Implement readout support
Date: Thu, 29 Oct 2026 08:22:29 +0000 [thread overview]
Message-ID: <sashiko-outbox-188958@kernel.org> (raw)
In-Reply-To: <20261029-drm-state-readout-v7-32-25e5163d75c3@kernel.org>
Thank you for your contribution! Sashiko AI review found 6 potential issue(s) to consider:
- [High] drm/tidss: tidss_crtc_install_state() enables inactive CRTCs and leaks PM
- [High] drm/tidss: missing drm_mode_config_create_initial_state() in tidss_probe()
- [High] drm/tidss: GEM-less readout fb fails prepare_fb() and zeroes DMA address
- [Medium] drm/tidss: tidss_crtc_compare_state() checks bus config on inactive CRTCs
- [Medium] drm/tidss: plane readout incomplete state and -EINVAL trigger WARN_ON on commit
- [Medium] drm/tidss: incomplete crtc_state->plane_mask readout on partial commits
--
commit 8f81eb167182a1d35a4ac3bf95240f371e285879
Author: Maxime Ripard <mripard@kernel.org>
drm/tidss: Implement readout support
This commit implements hardware state readout and state comparison callbacks
for CRTCs, bridges, and planes in the tidss driver using the DRM atomic state
readout helpers.
> diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tidss_crtc.c
> index 3da49f77fa080..4409f8c9114bb 100644
> --- a/drivers/gpu/drm/tidss/tidss_crtc.c
> +++ b/drivers/gpu/drm/tidss/tidss_crtc.c
[ ... ]
> @@ -370,6 +374,90 @@ static struct drm_crtc_state *tidss_crtc_create_state(struct drm_crtc *crtc)
> return &tstate->base;
> }
>
> +static int tidss_crtc_readout_state(struct drm_crtc *crtc,
> + struct drm_atomic_sro_state *state,
> + struct drm_crtc_state *crtc_state)
> +{
> + struct drm_device *ddev = crtc->dev;
> + struct tidss_device *tidss = to_tidss(ddev);
> + struct dispc_device *dispc = tidss->dispc;
> + struct tidss_crtc_state *tstate = to_tidss_crtc_state(crtc_state);
> + struct tidss_crtc *tcrtc =
> + to_tidss_crtc(crtc);
> + struct drm_display_mode mode = {};
> + int ret;
> +
> + tidss_runtime_get(tidss);
> +
> + if (!dispc_vp_is_enabled(dispc, tcrtc->hw_videoport))
> + goto out;
> +
> + tstate->base.active = 1;
> + tstate->base.enable = 1;
> +
> + ret = dispc_vp_readout_mode(dispc, tcrtc->hw_videoport, &mode);
> + if (ret)
> + goto err_runtime_put;
> +
> + ret = drm_atomic_set_mode_for_crtc(&tstate->base, &mode);
> + if (WARN_ON(ret))
> + goto err_runtime_put;
> +
> + drm_mode_copy(&tstate->base.adjusted_mode, &mode);
> +
> + tstate->bus_flags = dispc_vp_get_bus_flags(dispc, tcrtc->hw_videoport);
> + ret = dispc_vp_get_bus_format(dispc, tcrtc->hw_videoport,
> + &tstate->bus_format);
> + if (ret)
> + goto err_runtime_put;
> +
> + /*
> + * The active connectors and planes will be filled by their
> + * respective readout callbacks.
> + */
[Severity: Medium]
What happens to crtc_state->plane_mask (as well as connector_mask and
encoder_mask) during post-commit verification in
drm_atomic_sro_readout_and_compare() when a blocking commit includes the CRTC
but only a subset of its active planes?
When drm_atomic_sro_readout_and_compare(commit) calls
drm_atomic_helper_sro_build_state(dev, commit) with a non-NULL commit,
drm_atomic_helper_sro_readout_planes_state() only invokes
atomic_sro_readout_state() for planes present in that commit.
If two planes are active on a CRTC and userspace performs a blocking page
flip or property update on only one of them (without changing x/y or zpos, so
tidss_atomic_check() does not call drm_atomic_add_affected_planes()),
tidss_plane_atomic_check() adds the CRTC to the commit via
drm_atomic_get_crtc_state(), but the second active plane is not in the commit.
Because tidss_crtc_readout_state() leaves crtc_state->plane_mask at 0 and
relies on tidss_plane_atomic_readout_state() to OR in drm_plane_mask(plane),
won't the untouched plane's bit be missing from the readout CRTC state's
plane_mask, causing drm_atomic_helper_crtc_compare_state() to report a
plane_mask mismatch?
> +
> +out:
> + tidss_runtime_put(tidss);
> + return 0;
> +
> +err_runtime_put:
> + tidss_runtime_put(tidss);
> + return ret;
> +}
> +
> +static void tidss_crtc_install_state(struct drm_crtc *crtc,
> + struct drm_crtc_state *crtc_state)
> +{
> + struct tidss_crtc *tcrtc = to_tidss_crtc(crtc);
> + struct drm_device *ddev = crtc->dev;
> + struct tidss_device *tidss = to_tidss(ddev);
> + int ret;
> +
> + tidss_runtime_get(tidss);
> +
> + ret = dispc_vp_enable_clk(tidss->dispc, tcrtc->hw_videoport);
> + if (ret != 0)
> + return;
> +
> + /* Turn vertical blanking interrupt reporting on. */
> + drm_crtc_vblank_on(crtc);
> +}
[Severity: High]
Should tidss_crtc_install_state() check whether crtc_state->active is set
before enabling runtime PM, the videoport clock, and vblank reporting?
When a videoport is disabled in hardware (!dispc_vp_is_enabled()),
tidss_crtc_readout_state() jumps to out and returns 0 with
crtc_state->active == false, and drm_atomic_helper_sro_readout_crtc_state()
stores that inactive state in state->crtcs[i].state.
Later, drm_atomic_sro_install_state() iterates over all CRTCs and invokes
atomic_sro_install_state() for every non-NULL crtc_state:
drivers/gpu/drm/drm_atomic_state_readout.c:drm_atomic_sro_install_state() {
...
crtc_state = state->crtcs[i].state;
if (!crtc_state)
continue;
if (crtc_funcs->atomic_sro_install_state)
crtc_funcs->atomic_sro_install_state(crtc, crtc_state);
...
}
For an inactive CRTC, won't tidss_crtc_install_state() unconditionally call
tidss_runtime_get(), dispc_vp_enable_clk(), and drm_crtc_vblank_on(), leaking
both the runtime PM reference and the videoport clock enable count because
crtc->state->active is false (so tidss_crtc_atomic_disable() will not run to
release them)?
Also, if dispc_vp_enable_clk() returns a non-zero error in
tidss_crtc_install_state(), doesn't the early return leak the runtime PM
reference acquired by tidss_runtime_get(tidss)?
> +
> +static bool tidss_crtc_compare_state(struct drm_crtc *crtc,
> + struct drm_printer *p,
> + struct drm_crtc_state *expected,
> + struct drm_crtc_state *actual)
> +{
> + struct tidss_crtc_state *t_expected = to_tidss_crtc_state(expected);
> + struct tidss_crtc_state *t_actual = to_tidss_crtc_state(actual);
> + bool ret = drm_atomic_helper_crtc_compare_state(crtc, p, expected, actual);
> +
> + STATE_CHECK_U32_X(ret, p, crtc->name, t_expected, t_actual, bus_format);
> + STATE_CHECK_U32_X(ret, p, crtc->name, t_expected, t_actual, bus_flags);
> +
> + return ret;
> +}
[Severity: Medium]
Can tidss_crtc_compare_state() report false mismatches for bus_format and
bus_flags when an active CRTC is disabled?
When a CRTC is disabled in a blocking commit, tidss_crtc_duplicate_state()
copies the previous active state's non-zero bus_format and bus_flags into the
new state:
drivers/gpu/drm/tidss/tidss_crtc.c:tidss_crtc_duplicate_state() {
...
state->bus_format = current_state->bus_format;
state->bus_flags = current_state->bus_flags;
...
}
During post-commit readout in tidss_crtc_readout_state(),
!dispc_vp_is_enabled() is true and jumps to out before reading bus_flags or
bus_format, leaving them 0 in t_actual.
While drm_atomic_helper_crtc_compare_state() returns early when both
expected->active and actual->active are false:
drivers/gpu/drm/drm_atomic_state_readout_helper.c:drm_atomic_helper_crtc_compare_state() {
...
/* Both inactive, mode and properties are meaningless. */
if (!expected->active && !actual->active)
return ret;
...
}
tidss_crtc_compare_state() still checks bus_format and bus_flags
unconditionally. Should those checks be skipped when the CRTC is inactive?
> diff --git a/drivers/gpu/drm/tidss/tidss_kms.c b/drivers/gpu/drm/tidss/tidss_kms.c
> index 3b97c08c4f714..b0b69b8531111 100644
> --- a/drivers/gpu/drm/tidss/tidss_kms.c
> +++ b/drivers/gpu/drm/tidss/tidss_kms.c
[ ... ]
> @@ -133,6 +136,7 @@ static const struct drm_mode_config_funcs mode_config_funcs = {
> .fb_create = drm_gem_fb_create,
> .atomic_check = tidss_atomic_check,
> .atomic_commit = drm_atomic_helper_commit,
> + .atomic_sro_readout_state = drm_atomic_helper_sro_readout_state,
> .hw_reset = tidss_hw_reset,
> };
[Severity: High]
How are mode_config_funcs.atomic_sro_readout_state (and tidss_crtc_install_state)
and the fallback mode_config_funcs.hw_reset reached during probe?
In drivers/gpu/drm/drm_mode_config.c, atomic_sro_readout_state and hw_reset
are only invoked by drm_mode_config_create_initial_state():
drivers/gpu/drm/drm_mode_config.c:drm_mode_config_create_initial_state() {
...
if (dev->mode_config.funcs->atomic_sro_readout_state) {
ret = dev->mode_config.funcs->atomic_sro_readout_state(dev);
if (!ret)
goto out;
}
/* Reset the hardware first ... */
if (dev->mode_config.funcs->hw_reset)
dev->mode_config.funcs->hw_reset(dev);
...
}
However, tidss_probe() in drivers/gpu/drm/tidss/tidss_drv.c still calls
drm_mode_config_reset(ddev):
drivers/gpu/drm/tidss/tidss_drv.c:tidss_probe() {
...
drm_kms_helper_poll_init(ddev);
drm_mode_config_reset(ddev);
ret = drm_dev_register(ddev, 0);
...
}
Because drm_mode_config_reset() only allocates blank software states without
calling atomic_sro_readout_state or hw_reset, isn't initial state readout
(along with the hardware reset moved into tidss_hw_reset()) never executed at
probe time?
Furthermore, if tidss_probe() is updated to call
drm_mode_config_create_initial_state(ddev) after pm_runtime_enable(dev), won't
dispc_reset_hw() fail when readout falls back to hw_reset because
pm_runtime_set_active(dev) returns -EAGAIN when runtime PM is already enabled?
> diff --git a/drivers/gpu/drm/tidss/tidss_plane.c b/drivers/gpu/drm/tidss/tidss_plane.c
> index b0d5d6959b885..ebdb63f8e8f17 100644
> --- a/drivers/gpu/drm/tidss/tidss_plane.c
> +++ b/drivers/gpu/drm/tidss/tidss_plane.c
[ ... ]
> @@ -176,11 +179,186 @@ static const struct drm_plane_helper_funcs tidss_primary_plane_helper_funcs = {
> .get_scanout_buffer = drm_fb_dma_get_scanout_buffer,
> };
>
> +static const struct drm_framebuffer_funcs tidss_plane_readout_fb_funcs = {
> + .destroy = drm_gem_fb_destroy,
> +};
> +
> +static struct drm_framebuffer *tidss_plane_readout_fb(struct drm_plane *plane)
> +{
> + struct drm_device *ddev = plane->dev;
> + struct tidss_device *tidss = to_tidss(ddev);
> + struct dispc_device *dispc = tidss->dispc;
> + struct tidss_plane *tplane = to_tidss_plane(plane);
> + const struct drm_format_info *info;
> + struct drm_framebuffer *fb;
> + int ret;
> +
> + fb = kzalloc_obj(*fb);
> + if (!fb)
> + return ERR_PTR(-ENOMEM);
> +
> + fb->dev = plane->dev;
> +
> + info = dispc_plane_get_current_format(dispc, tplane->hw_plane_id);
> + if (IS_ERR(info)) {
> + ret = PTR_ERR(info);
> + goto err_free_fb;
> + }
> +
> + // TODO: Figure out YUV and multiplanar formats, along with
> + // the color encoding and range
> + if (info->is_yuv) {
> + ret = -EINVAL;
> + goto err_free_fb;
> + }
> +
> + fb->format = info;
> +
> + dispc_plane_get_picture_size(dispc, tplane->hw_plane_id, &fb->width,
> + &fb->height);
> +
> + /*
> + * A pixel increment of 1 means that the DMA engine fetches every
> + * pixel of the source buffer. Any other value means that
> + * horizontal decimation is enabled, and the buffer geometry
> + * cannot be reconstructed from the registers.
> + */
> + if (dispc_plane_get_pixel_inc(dispc, tplane->hw_plane_id) != 1) {
> + ret = -EINVAL;
> + goto err_free_fb;
> + }
> +
> + /*
> + * The row increment register holds the extra bytes between the
> + * end of a row of the picture and the beginning of the next one,
> + * which includes any padding the firmware might have programmed.
> + */
> + fb->pitches[0] = fb->width * (drm_format_info_bpp(info, 0) / 8) +
> + dispc_plane_get_row_inc(dispc, tplane->hw_plane_id) - 1;
> +
> + /*
> + * TODO: The DMA base address has the offsets baked in, and there
> + * is no backing buffer to recover them from.
> + */
> + fb->offsets[0] = 0;
> +
> + ret = drm_framebuffer_init(plane->dev, fb, &tidss_plane_readout_fb_funcs);
> + if (ret) {
> + kfree(fb);
> + return ERR_PTR(ret);
> + }
> +
> + return fb;
> +
> +err_free_fb:
> + kfree(fb);
> + return ERR_PTR(ret);
> +}
[Severity: High]
What happens on a subsequent atomic commit if a plane still references the
framebuffer created by tidss_plane_readout_fb() (for example, when updating
plane properties or when tidss_atomic_check() adds affected planes on the
CRTC)?
Because tidss_plane_readout_fb() allocates fb with fb->obj[0] == NULL and
neither tidss_plane_helper_funcs nor tidss_primary_plane_helper_funcs sets a
custom .prepare_fb callback, drm_atomic_helper_prepare_planes() defaults to
drm_gem_plane_helper_prepare_fb() on this DRIVER_GEM driver. Won't
drm_gem_fb_get_obj(state->fb, 0) trigger drm_WARN_ON_ONCE(dev, !fb->obj[plane])
and fail the commit with -EINVAL?
In addition, if dispc_plane_setup() is called while state->fb is a GEM-less
readout framebuffer:
drivers/gpu/drm/tidss/tidss_dispc.c:dispc_plane_setup() {
...
dma_addr_t dma_addr = drm_fb_dma_get_gem_addr(state->fb, state, 0);
...
dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_0, dma_addr & 0xffffffff);
dispc_vid_write(dispc, hw_plane, DISPC_VID_BA_EXT_0, (u64)dma_addr >> 32);
...
}
drm_fb_dma_get_gem_addr() returns 0 when fb->obj[0] is NULL, which would
overwrite DISPC_VID_BA_0 and DISPC_VID_BA_EXT_0 with 0x0.
> +
> +static struct drm_crtc *tidss_plane_readout_crtc(struct drm_plane *plane)
> +{
> + struct drm_device *dev = plane->dev;
> +
> + /* TODO: Add support for multiple CRTCs */
> + if (dev->num_crtcs != 1)
> + return ERR_PTR(-EINVAL);
> +
> + return list_first_entry(&dev->mode_config.crtc_list, struct drm_crtc, head);
> +}
> +
> +static int tidss_plane_atomic_readout_state(struct drm_plane *plane,
> + struct drm_atomic_sro_state *state,
> + struct drm_plane_state *plane_state)
> +{
[ ... ]
> + dispc_plane_get_size(dispc, tplane->hw_plane_id, &plane_state->crtc_w,
> + &plane_state->crtc_h);
> +
> + // TODO: Handle crtc_x/crtc_x/src_x/src_y
> + // crtc_x/crtc_y are handled by DISPC_OVR_ATTRIBUTES / OVR1_DSS_ATTRIBUTES
> +
> + // TODO: Handle zpos, see DISPC_OVR_ATTRIBUTES / OVR1_DSS_ATTRIBUTES
> +
> + plane_state->src.x1 = 0;
> + plane_state->src.x2 = plane_state->src_w;
> + plane_state->src.y1 = 0;
> + plane_state->src.y2 = plane_state->src_h;
> + plane_state->dst.x1 = 0;
> + plane_state->dst.x2 = plane_state->crtc_w;
> + plane_state->dst.y1 = 0;
> + plane_state->dst.y2 = plane_state->crtc_h;
[Severity: Medium]
Won't the unimplemented cases in tidss_plane_readout_fb(),
tidss_plane_readout_crtc(), and tidss_plane_atomic_readout_state() trigger
kernel warnings and state mismatch errors during normal runtime commits?
When all bridges and connectors in the pipeline implement readout callbacks,
drm_atomic_sro_device_can_readout() returns true and every blocking atomic
commit runs drm_atomic_sro_readout_and_compare() in commit_tail().
If userspace commits a YUV plane (info->is_yuv), enables horizontal
decimation (dispc_plane_get_pixel_inc() != 1), or runs on a multi-CRTC SoC
(dev->num_crtcs != 1), tidss_plane_atomic_readout_state() returns -EINVAL,
which triggers drm_WARN_ON(dev, ret) in
drm_atomic_helper_sro_readout_plane_state() and WARN_ON(IS_ERR(readout_state))
in drm_atomic_sro_readout_and_compare().
Similarly, if a blocking commit positions a plane at non-zero crtc_x/crtc_y or
src_x/src_y, or uses a non-zero zpos/normalized_zpos, leaving those fields at
0 in tidss_plane_atomic_readout_state() will cause
drm_atomic_helper_plane_compare_state() to log state mismatch errors on every
such commit.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261029-drm-state-readout-v7-0-25e5163d75c3@kernel.org?part=32
next prev parent reply other threads:[~2026-10-29 8:22 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 7:33 [PATCH v7 00/34] drm: Implement state readout support Maxime Ripard
2026-10-29 7:33 ` [PATCH v7 01/34] drm/bridge-helper: Don't unlock the connection mutex after a backoff Maxime Ripard
2026-10-29 7:51 ` sashiko-bot
2026-10-29 7:33 ` [PATCH v7 02/34] drm/tests: hdmi-state-helper: Handle EDEADLK in the 420-only test Maxime Ripard
2026-10-29 7:33 ` [PATCH v7 03/34] drm/tests: hdmi-state-helper: Handle EDEADLK in the color format test Maxime Ripard
2026-10-29 7:33 ` [PATCH v7 04/34] drm/atomic: Fix private obj error handling Maxime Ripard
2026-10-29 7:57 ` sashiko-bot
2026-10-29 7:33 ` [PATCH v7 05/34] drm/atomic: Add drm_private_obj name Maxime Ripard
2026-10-29 7:56 ` sashiko-bot
2026-10-29 7:33 ` [PATCH v7 06/34] drm/bridge: Switch print_state to use bridge name Maxime Ripard
2026-10-29 7:33 ` [PATCH v7 07/34] drm/bridge: Add drm_private_obj_is_bridge() Maxime Ripard
2026-10-29 7:33 ` [PATCH v7 08/34] drm/fb-dma-helper: Handle framebuffers without a GEM object Maxime Ripard
2026-10-29 7:33 ` [PATCH v7 09/34] drm/atomic: Export drm_atomic_*_print_state Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 10/34] drm/atomic_sro: Create drm_atomic_sro_state container Maxime Ripard
2026-10-29 7:50 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 11/34] drm/atomic_sro: Create kernel parameter to force or disable readout Maxime Ripard
2026-10-29 7:46 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 12/34] drm/atomic_sro: Add atomic state readout infrastructure Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 13/34] drm/atomic_sro: Add function to install state into drm objects Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 14/34] drm/atomic_sro: Create documentation Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 15/34] drm/bridge: Handle bridges with hardware state readout Maxime Ripard
2026-10-29 7:59 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 16/34] drm/mode-config: Read out hardware state in drm_mode_config_create_state Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 17/34] drm/atomic_sro: Provide helpers to implement hardware state readout Maxime Ripard
2026-10-29 8:02 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 18/34] drm/mode-config: Introduce hw_reset hook Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 19/34] drm/modeset-helper: Add drm_mode_config_helper_hw_reset() Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 20/34] drm/atomic_helper: Compare actual and readout states once the commit is done Maxime Ripard
2026-10-29 8:05 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 21/34] drm/atomic-state-helper: Provide comparison macros Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 22/34] drm/atomic-state-helper: Provide atomic_compare_state helpers Maxime Ripard
2026-10-29 8:07 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 23/34] drm/atomic-helper: Document State Read-Out as a state initialization approach Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 24/34] drm/tests: kunit: Add a drm_printer helper Maxime Ripard
2026-10-29 7:56 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 25/34] drm/tests: Add tests for the atomic state readout Maxime Ripard
2026-10-29 8:03 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 26/34] drm/encoder: Create atomic_sro_get_current_crtc hook Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 27/34] drm/bridge: display-connector: Implement readout support Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 28/34] drm/bridge_connector: Implement hw readout for connector Maxime Ripard
2026-10-29 8:04 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 29/34] drm/tidss: crtc: Add atomic_print_state implementation Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 30/34] drm/tidss: dispc: Improve mode checking logs Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 31/34] drm/tidss: Implement hw_reset Maxime Ripard
2026-10-29 8:09 ` sashiko-bot
2026-10-29 7:34 ` [PATCH v7 32/34] drm/tidss: Implement readout support Maxime Ripard
2026-10-29 8:22 ` sashiko-bot [this message]
2026-10-29 7:34 ` [PATCH v7 33/34] drm/tidss: encoder: Implement atomic_sro_get_current_crtc Maxime Ripard
2026-10-29 7:34 ` [PATCH v7 34/34] drm/bridge: sii902x: Implement hw state readout Maxime Ripard
2026-10-29 8:12 ` sashiko-bot
2026-10-29 15:20 ` [PATCH v7 00/34] drm: Implement state readout support Tomi Valkeinen
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=sashiko-outbox-188958@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=mripard@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox