Re: [PATCH v5] drm/omap: dsi: avoid sending bta sync all the time in writes
Tomi Valkeinen <[email protected]> Wed, 29 Jul 2026 14:15:33 +0300
| Newsgroups | org.kernel.vger.linux-omap,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi,
On 25/07/2026 19:59, Andreas Kemnade wrote:
> Some chips need configuration commands to be sent first, before they can
> send data. TC358762 for example needs PPI_LPTXTIMECNT configured
> and PPI_STARTPPI set to 1 to be able to transmit anything. To be able to
> configure such chips, do not send bta sync during writes if no acks are
> requested. Instead just wait for the packet to be sent to avoid FIFO
> overflows. There might be more to do about acks, but there seem to be
> virtually no users of that flag.
>
> This came to light when fiddling with the Epson Moverio BT-200 display
> which consists of 2 TC358762 bridges with SPI funneled through
> to the unknown display chip. With that patch the bridge can be accessed,
> Reading back registers works, when the above-mentioned registers are set.
>
> In Command-Mode update, there was a nop sent, apparently the most
> relevant part was the bta sync to actually force low power mode.
>
> Video mode panel at OMAP4 (BT-200) and video mode at OMAP5 was tested.
>
> Fixes: e70965386353e ("drm/omap: dsi: simplify write function")
> Signed-off-by: Andreas Kemnade <[email protected]>
> ---
> Changes in v5:
> - send bta sync on VC_CMD again
>
> Changes in v4:
> - wait on completition on all packets (was limited to long packets only,
> because I had the wrong impression that there is no confirmation on
> these)
> - Link to v3: https://patch.msgid.link/[email protected]
>
> Changes in v3:
>
> - Link to v2: https://patch.msgid.link/[email protected]
> - fix things mentioned by claude here:
> https://lore.gitlab.freedesktop.org/drm-ai-reviews/[email protected]/
> - fix typos
> - register ISR before sending packet
> - check for RX_FIFO_NOT_EMPTY also in for short packets
>
> Changes in v2:
> - fix commandmode update, need bta sync there
> - do not wait on short packets
> - Link to v1: https://patch.msgid.link/[email protected]
> ---
> drivers/gpu/drm/omapdrm/dss/dsi.c | 53 ++++++++++++++-----------------
> 1 file changed, 24 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
> index 27fe7bca9e2cf..eb3cd0d23cae3 100644
> --- a/drivers/gpu/drm/omapdrm/dss/dsi.c
> +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
> @@ -2194,28 +2194,38 @@ static int dsi_vc_send_null(struct dsi_data *dsi, int vc, int channel)
> static int dsi_vc_write_common(struct omap_dss_device *dssdev, int vc,
> const struct mipi_dsi_msg *msg)
> {
> + DECLARE_COMPLETION_ONSTACK(completion);
> struct dsi_data *dsi = to_dsi_data(dssdev);
> int r;
>
> + /* wait for IRQ for packet transmission confirmation */
> + r = dsi_register_isr_vc(dsi, vc, dsi_completion_handler,
> + &completion, DSI_VC_IRQ_PACKET_SENT);
> + if (r)
> + return r;
> +
> if (mipi_dsi_packet_format_is_short(msg->type))
> r = dsi_vc_send_short(dsi, vc, msg);
> else
> r = dsi_vc_send_long(dsi, vc, msg);
>
> - if (r < 0)
> + if ((!r) && wait_for_completion_timeout(&completion,
> + msecs_to_jiffies(500)) == 0)
> + r = -EIO;
> +
> + dsi_unregister_isr_vc(dsi, vc, dsi_completion_handler,
> + &completion, DSI_VC_IRQ_PACKET_SENT);
> + if (r)
> return r;
>
> - /*
> - * TODO: we do not always have to do the BTA sync, for example
> - * we can improve performance by setting the update window
> - * information without sending BTA sync between the commands.
> - * In that case we can return early.
> - */
> + /* TODO: find out if more needs to be done for MIPI_DSI_MSG_REQ_ACK */
>
> - r = dsi_vc_send_bta_sync(dssdev, vc);
> - if (r) {
> - DSSERR("bta sync failed\n");
> - return r;
> + if (msg->flags & MIPI_DSI_MSG_REQ_ACK) {
> + r = dsi_vc_send_bta_sync(dssdev, vc);
> + if (r) {
> + DSSERR("bta sync failed\n");
> + return r;
> + }
> }
The dsi_vc_send_bta_sync() function does dsi_get_errors(), which we now
don't always do here. I think that might cause any errors to be left
there, which would trigger error handling on next read or write-with-bta.
_omap_dsi_host_transfer forward declaration can now be remove.
I don't have HW to test this, but other than the above, it looks
reasonable. Although I have to say, based on my past experience, it's
also very easy to break a use case =).
Tomi