On 10/22/24 00:09, Dmitry Baryshkov wrote: > On Mon, 21 Oct 2024 at 20:07, Aradhya Bhatia <aradhya.bhatia@xxxxxxxxx> wrote: >> >> Hi Dmitry, >> >> Thank you for reviewing the patches! >> >> On 10/20/24 17:27, Dmitry Baryshkov wrote: >>> On Sun, Oct 20, 2024 at 01:35:30AM +0530, Aradhya Bhatia wrote: >>>> From: Aradhya Bhatia <a-bhatia1@xxxxxx> >>>> >>>> The cdns-dsi controller requires that it be turned on completely before >>>> the input DPI's source has begun streaming[0]. Not having that, allows >>>> for a small window before cdns-dsi enable and after cdns-dsi disable >>>> where the previous entity (in this case tidss's videoport) to continue >>>> streaming DPI video signals. This small window where cdns-dsi is >>>> disabled but is still receiving signals causes the input FIFO of >>>> cdns-dsi to get corrupted. This causes the colors to shift on the output >>>> display. The colors can either shift by one color component (R->G, G->B, >>>> B->R), or by two color components (R->B, G->R, B->G). >>>> >>>> Since tidss's videoport starts streaming via crtc enable hooks, we need >>>> cdns-dsi to be up and running before that. Now that the bridges are >>>> pre_enabled before crtc is enabled, and post_disabled after crtc is >>>> disabled, use the pre_enable and post_disable hooks to get cdns-dsi >>>> ready and running before the tidss videoport to get pass the color shift >>>> issues. >>>> >>> >>> Not being an expert in the TI DSS driver, would it be more proper to >>> handle that in the TI driver instead? I mean, sending out DPI signals >>> isn't a part of the CRTC setup, it's a job of the encoder. >> >> I haven't done a feasibility analysis of moving the CRTC bits of TIDSS >> into the encoder, but even if it were possible, it wouldn't solve the >> issue. >> >> The bridge_enable() sequence gets called _after_ the encoder has been >> enabled - causing the TIDSS's DPI (enabled from encoder) to still be >> up and running before the DSI has had a chance to be ready. > > But then you can move CDSI setup to pre_enable, so that all setup > happens before encoder's (= DPI) being enabled. > > Ah! I did not realize that you were suggesting against moving _bridge_pre_enable() to before crtc_enable(). I think, despite its initial complexity, it is a good idea to move the _bridge_pre_enable() before the crtc_enable(). The boundary between an encoder and a CRTC in the modern display hardware seems to have blurred a bit. Maybe the tidss / cdns-dsi is a unique case (only for now), but of course, tidss is not the only one generating the DPI signal from the CRTC. And bridges should be allowed an option to get _some_ configuration done before the CRTC and encoder are up and running, and I think that's where the re-ordering is of the essence. My initial version did suggest creating a new API[0], "_early_enable()" that allowed _pre_enable() to remain where it is, all the while allowing the bridges to have the option of configuring before the signals start getting generated in the pipeline. That idea was then translated into the current one. Regards Aradhya [0]: https://lore.kernel.org/all/20240511153051.1355825-7-a-bhatia1@xxxxxx/