Re: [PATCH v2 5/6] drm/panel: st7703: Drive XBD599 panel at higher clock rate

From: Frank Oltmanns
Date: Mon Feb 12 2024 - 08:39:47 EST

On 2024-02-11 at 16:42:43 +0100, Frank Oltmanns <frank@xxxxxxxxxxxx> wrote:
> On 2024-02-08 at 20:05:08 +0100, Maxime Ripard <mripard@xxxxxxxxxx> wrote:
>> [[PGP Signed Part:Undecided]]
>> Hi Frank,
>> On Mon, Feb 05, 2024 at 04:22:28PM +0100, Frank Oltmanns wrote:
>>> This panel is used in the pinephone that runs on a Allwinner A64 SOC.
>>> The SOC requires pll-mipi to run at more than 500 MHz.
>>> This is the relevant clock tree:
>>> pll-mipi
>>> tcon0
>>> tcon-data-clock
>>> tcon-data-clock has to run at 1/4 the DSI per-lane bit rate. The XBD599
>>> has 24 bpp and 4 lanes. Therefore, the resulting requested
>>> tcon-data-clock rate is:
>>> crtc_clock * 1000 * (24 / 4) / 4
>>> tcon-data-clock runs at tcon0 / 4 (fixed divisor), so it requests a
>>> parent rate of
>>> 4 * (crtc_clock * 1000 * (24 / 4) / 4)
>>> Since tcon0 is a ccu_mux, the rate of tcon0 equals the rate of pll-mipi.
>>> pll-mipi's constraint to run at 500MHz or higher forces us to have a
>>> crtc_clock >= 83333 kHz if we want a 60 Hz vertical refresh rate.
>>> Change [hv]sync_(start|end) so that we reach a clock rate of 83502 kHz
>>> so that it is high enough to align with pll-pipi limits.
>>> Signed-off-by: Frank Oltmanns <frank@xxxxxxxxxxxx>
>> That commit log is great, but it's kind of off-topic. It's a panel
>> driver, it can be used on any MIPI-DSI controller, the only relevant
>> information there should be the panel timings required in the datasheet.
>> The PLL setup is something for the MIPI-DSI driver to adjust, not for
>> the panel to care for.
> I absolutely agree. It even was the reason for my submission of a
> sunxi-ng patch series last year that was accepted, to make pll-mipi more
> flexible. :)
> The only remaining option I currently see for adjusting the sunxi-ng
> driver to further accomodate the panel, is trying to use a higher
> divisor than 4 for calculating tcon-data-clock from tcon0. I remember
> reading a discussion about this, but as far as I remember that proposal
> was rejected (by you, IIRC).
> While I appreciate other suggestion as well, I'll look into options for
> using a different divisor than 4.

I tried the following:
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c
@@ -391,7 +391,7 @@ static void sun4i_tcon0_mode_set_cpu(struct sun4i_tcon *tcon,
* dclk is required to run at 1/4 the DSI per-lane bit rate.
tcon->dclk_min_div = SUN6I_DSI_TCON_DIV;
- tcon->dclk_max_div = SUN6I_DSI_TCON_DIV;
+ tcon->dclk_max_div = 127;
clk_set_rate(tcon->dclk, mode->crtc_clock * 1000 * (bpp / lanes)

On the pinephone, this selects a divisor of 6 resulting in a 25% frame
drop. I.e., unless I'm missing something using a divisor other than 4 is
not an option. This also matches your report from 2019: "Well, it's also
breaking another panel." [1]

I can currently see the following options:

a. Drive PLL-MIPI outside spec and panel within spec (current situation,
but missing a small patch [2] that fixes the crtc_clock and nothing
else) and live with the fact that some pinephones will run

b. Drive PLL-MIPI and panel within spec and shove data into the panel at
a too high rate (i.e., apply the rest of this series but not this
specific patch). This seems to mostly work, but hasn't seen any long
term testing. Short term testing showed that this approach results in
a slight but noticable unsmooth scrolling behavior.

c. Drive PLL-MIPI within spec and panel outside spec (i.e., apply a
future version of the whole series). This has been tested for over a
month on three devices that I know of. There are no reports of panels
not working with the suggested parameters.

All options require additional work on the GPU rate which is currently
being discussed in a parallel thread of this series. Unless somebody
comes up with a better idea, I will pause working on fixing PLL-MIPI and
focus on the GPU instead. While I doubt it, maybe fixing the GPU is
sufficient and continuing to drive PLL-MIPI outside spec proves to be


Best regards,

> Best regards,
> Frank
>> Maxime
>> [[End of PGP Signed Part]]