All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liu Ying <victor.liu@nxp.com>
To: Esben Haabendal <esben@geanix.com>
Cc: "Andrzej Hajda" <andrzej.hajda@intel.com>,
	"Neil Armstrong" <neil.armstrong@linaro.org>,
	"Robert Foss" <rfoss@kernel.org>,
	"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
	"Jonas Karlman" <jonas@kwiboo.se>,
	"Jernej Skrabec" <jernej.skrabec@gmail.com>,
	"Luca Ceresoli" <luca.ceresoli@bootlin.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Guido Günther" <agx@sigxcpu.org>,
	"Fabio Estevam" <festevam@gmail.com>,
	"Robert Chiras" <robert.chiras@nxp.com>,
	"Sam Ravnborg" <sam@ravnborg.org>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	"Oliver F. Brown" <oliver.brown@oss.nxp.com>
Subject: Re: [PATCH RESEND v4 4/4] drm/bridge: nwl-dsi: Correct MIPI DSI horizontal sync timing
Date: Fri, 16 Oct 2026 18:12:27 +0800	[thread overview]
Message-ID: <atH4i_KcmccKb8Ge@raspi> (raw)
In-Reply-To: <20261014-nwl-dsi-fixes-v4-4-b9138ea5e12c@geanix.com>

On Wed, Oct 14, 2026 at 09:44:45AM +0200, Esben Haabendal wrote:
> The NWL MIPI Host controller registers specifies the horizontal front
> porch, sync pulse, and back porch in DSI packet payload size in bytes (ie.
> not in pixel clocks).
> 
> The calculation for this is (mostly) described in section 13.6.3.5.1.2 of
> the i.MX 8M Dual/8M QuadLite/8M Quad Applications Processors Reference
> Manual (rev. 3.1). The formula shown there does not take packet header size
> into account though.
> 
> The formula implemented here converts the hfp, hsa, and hbp to DSI packet
> bytes and then subtracts the number of packet header bytes.
> 
> It is worth noting that these values only needs to match approximately,
> according to the reference manual.
> 
> Based on commit in NXP vendor tree
> commit f2a61699749d ("LF-7981-4: drm/bridge: nwl-dsi: Correct MIPI DSI horizontal sync timing")
> 
> Signed-off-by: Esben Haabendal <esben@geanix.com>
> Cc: Robert Chiras <robert.chiras@nxp.com>
> Cc: Oliver F. Brown <oliver.brown@oss.nxp.com>

Worth a Fixes tag?

> ---
>  drivers/gpu/drm/bridge/nwl-dsi.c | 60 ++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 57 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/bridge/nwl-dsi.c b/drivers/gpu/drm/bridge/nwl-dsi.c
> index f3f4334136c0..eb604733eea0 100644
> --- a/drivers/gpu/drm/bridge/nwl-dsi.c
> +++ b/drivers/gpu/drm/bridge/nwl-dsi.c
> @@ -22,6 +22,7 @@
>  #include <linux/reset.h>
>  #include <linux/sys_soc.h>
>  #include <linux/time64.h>
> +#include <linux/math64.h>

Sort the header files alphabetically.

>  
>  #include <drm/drm_atomic_state_helper.h>
>  #include <drm/drm_bridge.h>
> @@ -264,6 +265,9 @@ static int nwl_dsi_config_dpi(struct nwl_dsi *dsi)
>  	bool burst_mode;
>  	int hfront_porch, hback_porch, vfront_porch, vback_porch;
>  	int hsync_len, vsync_len;
> +	int hfp, hbp, hsa;
> +	u64 hs_clk_rate, pclk_rate;
> +	int h_blank, pkt_hdr_len, pkt_len;
>  
>  	hfront_porch = dsi->mode.hsync_start - dsi->mode.hdisplay;
>  	hsync_len = dsi->mode.hsync_end - dsi->mode.hsync_start;
> @@ -317,9 +321,59 @@ static int nwl_dsi_config_dpi(struct nwl_dsi *dsi)
>  			      dsi->mode.hdisplay);
>  	}
>  
> -	nwl_dsi_write(dsi, NWL_DSI_HFP, hfront_porch);
> -	nwl_dsi_write(dsi, NWL_DSI_HBP, hback_porch);
> -	nwl_dsi_write(dsi, NWL_DSI_HSA, hsync_len);
> +	hs_clk_rate = dsi->phy_cfg.mipi_dphy.hs_clk_rate;
> +	pclk_rate = (u64)dsi->mode.clock * 1000;
> +	DRM_DEV_DEBUG_DRIVER(dsi->dev, "hs_clk_rate: %llu Hz\n", hs_clk_rate);
> +
> +	/*
> +	 * Calculate the bytes needed, according to the RM formula:
> +	 * Time of DPI event = time to transmit x number of bytes on the DSI interface
> +	 * dpi_event_size * dpi_pclk_period = dsi_bytes * 8 * hs_bit_period / num_lanes
> +	 * ===>
> +	 * dsi_bytes = dpi_event_size * dpi_pclk_period * num_lanes / (8 * hs_bit_period)
> +	 * ===> (substituting period = 1 / rate)
> +	 * dsi_bytes = dpi_event_size * num_lanes * hs_clk_rate / (8 * dpi_pclk_rate)
> +	 */
> +	hfp = DIV64_U64_ROUND_UP((u64)hfront_porch * dsi->lanes * hs_clk_rate, 8 * pclk_rate);
> +	hbp = DIV64_U64_ROUND_UP((u64)hback_porch * dsi->lanes * hs_clk_rate, 8 * pclk_rate);
> +	hsa = DIV64_U64_ROUND_UP((u64)hsync_len * dsi->lanes * hs_clk_rate, 8 * pclk_rate);
> +
> +	/* Make sure horizontal blankins are even numbers */

s/blankins/blankings/

> +	hfp = roundup(hfp, 2);
> +	hbp = roundup(hbp, 2);
> +	hsa = roundup(hsa, 2);
> +
> +	/*
> +	 * We need to subtract the packet header length: 32
> +	 * In order to make sure we don't get negative values,
> +	 * subtract a proportional value to the total length of the
> +	 * horizontal blanking duration.
> +	 */
> +	h_blank = hfp + hbp + hsa;
> +
> +	if (h_blank) {
> +		pkt_len = min(hfp, roundup(((hfp * 100 / h_blank) * 32) / 100, 2));
> +		pkt_hdr_len = pkt_len;
> +		hfp -= pkt_len;
> +
> +		pkt_len = min(hbp, roundup(((hbp * 100 / h_blank) * 32) / 100, 2));
> +		pkt_hdr_len += pkt_len;
> +		hbp -= pkt_len;
> +
> +		pkt_len = min(hsa, 32 - pkt_hdr_len);
> +		pkt_hdr_len += pkt_len;
> +		hsa -= pkt_len;
> +		if (pkt_hdr_len != 32)
> +			dev_warn(dsi->dev,
> +				 "Unable to subtract packet header length fully: %d left\n",
> +				 32 - pkt_hdr_len);
> +	}
> +
> +	DRM_DEV_DEBUG_DRIVER(dsi->dev, "Register values: hfp=%d hbp=%d hsa=%d\n", hfp, hbp, hsa);
> +
> +	nwl_dsi_write(dsi, NWL_DSI_HFP, hfp);
> +	nwl_dsi_write(dsi, NWL_DSI_HBP, hbp);
> +	nwl_dsi_write(dsi, NWL_DSI_HSA, hsa);
>  
>  	nwl_dsi_write(dsi, NWL_DSI_ENABLE_MULT_PKTS, 0x0);
>  	nwl_dsi_write(dsi, NWL_DSI_BLLP_MODE, 0x1);
> 
> -- 
> 2.56.0
> 

Not sure if the fix is 100% correct, but it is a correct direction to
change the blanking packet payload size from in pixel clocks to in bytes,
so better than no fix:
Acked-by: Liu Ying <victor.liu@nxp.com>

-- 
Regards,
Liu Ying

      parent reply	other threads:[~2026-10-16 10:11 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-14  7:44 [PATCH RESEND v4 0/4] drm/bridge: nwl-dsi: Various fixes Esben Haabendal
2026-10-14  7:44 ` [PATCH RESEND v4 1/4] drm/bridge: nwl-dsi: Cleanup endpoint mux control selection Esben Haabendal
2026-10-14  7:44 ` [PATCH RESEND v4 2/4] drm/bridge: nwl-dsi: Limit LCDIF specific sync override Esben Haabendal
2026-10-15 13:54   ` Luca Ceresoli
2026-10-14  7:44 ` [PATCH RESEND v4 3/4] drm/bridge: nwl-dsi: Correct auto-insert EOTP behavior Esben Haabendal
2026-10-15 13:54   ` Luca Ceresoli
2026-10-14  7:44 ` [PATCH RESEND v4 4/4] drm/bridge: nwl-dsi: Correct MIPI DSI horizontal sync timing Esben Haabendal
2026-10-15 13:54   ` Luca Ceresoli
2026-10-15 15:18     ` Frank Li
2026-10-16 10:12   ` Liu Ying [this message]

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=atH4i_KcmccKb8Ge@raspi \
    --to=victor.liu@nxp.com \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=agx@sigxcpu.org \
    --cc=airlied@gmail.com \
    --cc=andrzej.hajda@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=esben@geanix.com \
    --cc=festevam@gmail.com \
    --cc=jernej.skrabec@gmail.com \
    --cc=jonas@kwiboo.se \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luca.ceresoli@bootlin.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=neil.armstrong@linaro.org \
    --cc=oliver.brown@oss.nxp.com \
    --cc=rfoss@kernel.org \
    --cc=robert.chiras@nxp.com \
    --cc=sam@ravnborg.org \
    --cc=simona@ffwll.ch \
    --cc=tzimmermann@suse.de \
    /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.