Display: mainline msm has no continuous-splash handoff, so &mdss hangs the boot #19
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ABL hands the kernel a live display: a 2560x1600 x8r8g8b8 stride-10240 dual-DSI scanout of
cont_splash_memat0x9c400000, still running. Mainline's DRM/MSM stack has no concept of this and programs the hardware as if it were off. Enabling&mdsstherefore hangs roughly half of all boots.This is the substantive half of #17 (the other half, dispcc rewriting the display PLLs, corrupts the panel but does not hang the system).
Evidence
From #17's bisect, on an otherwise-identical image:
&mdssoff, dispcc/videocc/gpucc blacklisted&mdssoff&mdssonIt is a hang, not a crash: afterwards TWRP reports
reset_reason=NPONwithreset_klog,reset_summary,auto_commentandreset_tzlogall empty. Samsung's layer records resets; a hang that gets power-cycled out of leaves nothing behind. The panel console is the only window into it.What mainline is missing
cont_splashappears in zero files underdrivers/gpu/drm/msm/in 6.17. No detection, no adoption, no skip.Downstream (
drivers/gpu/drm/msm/dsi-staging/dsi_display.c,dsi_display_splash_res_init()) does all four:dsi_display_get_cont_splash_status()→hw->ops.get_cont_splash_status(hw), per-ctrl.dsi_display_clk_ctrl(..., DSI_ALL_CLKS, DSI_CLK_ON)anddsi_pwr_enable_regulator(). It takes references; it does not program.dsi_config_host_engine_state_for_cont_splash(), never the reverse.dsi_panel_bl_handoff().And the panel ON sequence is explicitly skipped (
samsung_lego/ss_dsi_panel_common.c:2689):Mainline instead reprograms the DSI host and PHY and then resets the panel underneath the running scanout.
Worth being clear that our panel driver is not at fault:
ana38401_prepare()does a correct cold init (reset asserted 70 ms, released, wait fortcon_rdy). A correct cold init is simply the wrong operation to perform on hardware that is already running, and nothing in mainline tells it otherwise.Routes
A. Quiesce before probe (smaller). Shut the DSI/DPU down cleanly before mainline touches them, so the existing cold-init path runs from a known-off state — which is the case mainline actually supports. Costs the bootloader splash and the
gtsfbearlycon from that point on, but #6 already established that a brief black frame is unavoidable here, so little is lost. Open question: where the shutdown lives, since U-Boot has no DSI driver (it only writes into the framebuffer ABL set up), so it likely has to be early Linux.B. Implement adoption (larger, upstreamable). Port the cont_splash concept — detect, vote, sync state, skip panel init. This is what downstream does and what a proper fix looks like. Considerably more work, touches dpu/dsi/panel, and arguably belongs upstream rather than in our tree.
Route A is the pragmatic unblock for a usable device; route B is the real fix.
Why it matters
Display and GPU are both gated on this, and it is the reason the device currently runs with the display disabled. It is also why the flaky boot taxed the project for weeks before being identified (#17).
Related: #17 (bisect and dispcc), #6 (splash continuity — already concluded that true downstream-style continuous splash is impossible without this), #10 and #12 (same panel driver).