Re: [PATCH] drm/omap: dsi: avoid sending bta sync all the time in writes

From: Ivaylo Dimitrov

Date: Thu May 28 2026 - 10:59:23 EST


Applied against 6.18.31, no dice :)

[ 11.617523] [drm] Initialized pvr 1.17.4948957 for 56000000.gpu on minor 0
[ 11.674652] omapdss_dss 58000000.dss: bound 58001000.dispc (ops dispc_component_ops [omapdrm])
[ 11.775085] omapdss_dss 58000000.dss: bound 58001000.dispc (ops dsi_vc_flush_receive_data [omapdrm])
[ 12.222930] omapdss_dss 58000000.dss: bound 58001000.dispc (ops dsi_vc_flush_receive_data [omapdrm])
[ 12.245117] omapdss_dss 58000000.dss: bound 58001000.dispc (ops dsi_vc_flush_receive_data [omapdrm])
[ 12.247375] omapdss_dss 58000000.dss: bound 58004000.encoder (ops dsi_vc_flush_receive_data [omapdrm])
[ 12.249267] omapdss_dss 58000000.dss: bound 58006000.encoder (ops dsi_vc_flush_receive_data [omapdrm])
[ 12.284729] [drm] Initialized omapdrm 1.0.0 for omapdrm.0 on minor 1
[ 12.311981] [drm] Enabling DMM ywrap scrolling
[ 12.770385] omapdrm omapdrm.0: atomic complete timeout (pipe 0)!
[ 22.901306] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 22.901306] omapdrm omapdrm.0: [drm] *ERROR* [CRTC:67:crtc-0] commit wait timed out
[ 33.131256] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 33.131378] omapdrm omapdrm.0: [drm] *ERROR* [CONNECTOR:66:DSI-1] commit wait timed out
[ 43.371307] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 43.371398] omapdrm omapdrm.0: [drm] *ERROR* [PLANE:34:plane-0] commit wait timed out
[ 43.631408] omapdrm omapdrm.0: atomic complete timeout (pipe 0)!
[ 43.692504] omapdrm omapdrm.0: [drm] fb0: omapdrmdrmfb frame buffer device
[ 54.251342] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 54.251464] omapdrm omapdrm.0: [drm] *ERROR* [CRTC:67:crtc-0] commit wait timed out
[ 64.491302] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 64.491424] omapdrm omapdrm.0: [drm] *ERROR* [CONNECTOR:66:DSI-1] commit wait timed out
[ 74.731323] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 74.731445] omapdrm omapdrm.0: [drm] *ERROR* [PLANE:34:plane-0] commit wait timed out
[ 74.991363] omapdrm omapdrm.0: atomic complete timeout (pipe 0)!
[ 85.621307] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 85.621398] omapdrm omapdrm.0: [drm] *ERROR* [CRTC:67:crtc-0] commit wait timed out
[ 95.851287] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 95.851379] omapdrm omapdrm.0: [drm] *ERROR* [CONNECTOR:66:DSI-1] commit wait timed out
[ 106.101257] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 106.101440] omapdrm omapdrm.0: [drm] *ERROR* [PLANE:34:plane-0] commit wait timed out
[ 106.371459] omapdrm omapdrm.0: atomic complete timeout (pipe 0)!
[ 106.961334] omapdrm omapdrm.0: atomic complete timeout (pipe 0)!
[ 141.301269] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 141.301269] omapdrm omapdrm.0: [drm] *ERROR* [CRTC:67:crtc-0] commit wait timed out
[ 151.531280] omapdrm omapdrm.0: [drm] *ERROR* flip_done timed out
[ 151.531402] omapdrm omapdrm.0: [drm] *ERROR* [CONNECTOR:66:DSI-1] commit wait timed out


On 28.05.26 г. 13:16 ч., akemnade@xxxxxxxxxx wrote:
From: Andreas Kemnade <andreas@xxxxxxxxxxxx>

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.

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 <andreas@xxxxxxxxxxxx>
---
This was not tested on any command mode display, which IMHO should be
done. So droid4 folks: please give it a try
---
drivers/gpu/drm/omapdrm/dss/dsi.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 27fe7bca9e2cf..98362b0157023 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -2194,6 +2194,7 @@ 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;
@@ -2205,17 +2206,30 @@ static int dsi_vc_write_common(struct omap_dss_device *dssdev, int vc,
if (r < 0)
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.
- */
+ /* wait for IRQ for long packet transmission confirmation */
+ r = dsi_register_isr_vc(dsi, vc, dsi_completion_handler,
+ &completion, DSI_VC_IRQ_PACKET_SENT);
+ if (r)
+ return r;
- r = dsi_vc_send_bta_sync(dssdev, vc);
- if (r) {
- DSSERR("bta sync failed\n");
+ if (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: find out if more needs to be done for MIPI_DIS_MSG_REQ_ACK */
+
+ 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;
+ }
}
/* RX_FIFO_NOT_EMPTY */

---
base-commit: e7ae89a0c97ce2b68b0983cd01eda67cf373517d
change-id: 20260528-vm-upstr-c8e7634ebf56

Best regards,
--
Andreas Kemnade <akemnade@xxxxxxxxxx>