Hi Dave, On Wed, Feb 16, 2022 at 04:59:42PM +0000, Dave Stevenson wrote: > Hi All > > Hopefully I've cc'ed all those that have bashed this problem around previously, > or are otherwise linked to DRM bridges. > > There have been numerous discussions around how DSI support is currently broken > as it doesn't support initialising the PHY to LP-11 and potentially the clock > lane to HS prior to configuring the DSI peripheral. There is no op where the > interface is initialised but HS video isn't also being sent. > Currently you have: > - peripheral pre_enable (host not initialised yet) > - host pre_enable > - encoder enable > - host enable > - peripheral enable (video already running) > > vc4 and exynos currently implement the DSI host as an encoder, and split the > bridge_chain. This fails if you want to switch to being a bridge and/or use > atomic calls as the state of all the elements split off are not added by > drm_atomic_add_encoder_bridges. > > dw-mipi-dsi[1] and now msm[2] use the mode_set hook to initialise the PHY, so > the bridge/panel pre_enable can send commands. In their post_disable they then > call the downstream bridge/panel post_disable op manually so that shutdown > commands can be sent before shutting down the PHY. Nothing handles that fact, > so the framework then continues down the bridge chain and calls the post_disable > again, so we get unbalanced panel prepare/unprepare calls being reported [3]. > > There have been patches[4] proposing reversing the entire direction of > pre_enable and post_disable, but that risks driving voltage into devices that > have yet to be powered up. > There have been discussions about adding either a pre_pre_enable, or adding a > DSI host_op to initialise the host[5]. Both require significant reworking to all > existing drivers in moving initialisation phases. > We have patches that look like they may well be addressing race conditions in > starting up a DSI peripheral[6]. > > This patch takes a hybrid of the two: an optional reversing of the order for > specific links within the bridge chain within pre_enable and post_disable done > within the drm_bridge framework. > I'm more than happy to move where the flag exists in structures (currently as > DRM_BRIDGE_OP_UPSTREAM_FIRST in drm_bridge_ops, but it isn't an op), but does > this solve the problem posed? If not, then can you describe the actual scenario > it doesn't cover? > A DSI peripheral can set the flag to get the DSI host initialised first, and > therefore it has a stable LP-11 state before pre_enable. Likewise the peripheral > can still send shutdown commands prior to the DSI host being shut down in > post_disable. It also handles the case where there are multiple devices in the > chain that all want their upstream bridge enabled first, so should there be a > DSI mux between host and peripheral, then it can still get the host to the > correct state. > > An example tree is at [7] which is drm-misc-next with these patches and then a > conversion of vc4_dsi to use the atomic bridge functions (will be upstreamed > once we're over this hurdle). It is working happily with the Toshiba TC358762 on > a Raspberry Pi 7" panel. > The same approach but on our vendor 5.15 tree[8] has also been tested > successfully on a TI SN65DSI83 and LVDS panel. > > Whilst here, I've also documented the expected behaviour of DSI hosts and > peripherals to aid those who come along after. I'd still like the review of someone with a bit more knowledge in the bridge framework, but it is Acked-by: Maxime Ripard <maxime@xxxxxxxxxx> Thanks! Maxime
Attachment:
signature.asc
Description: PGP signature