Hi, Here's a series that implement what i915 calls "fastboot", ie, initializing the initial KMS state from the hardware state at boot, to skip the first modeset if the firmware already set up the display.
This series creates the infrastructure in KMS to create that state by relying on driver specific hooks. It also implements some infrastructure to check during non-blocking commits that the readout helpers work properly by reading out the state that was just committed and comparing it to what was supposed to be committed. This relies on another set of driver hooks to compare the entities states, with helpers providing the default implementation. It then implements the readout support in the TIDSS driver, and was tested with the SK-AM62 board. This board in particular is pretty interesting, since it relies on an DPI to HDMI bridge, and uses the drm_bridge_connector infrastructure. So the readout works with the current state of the art on embedded-ish platforms. Unlike the earlier RFCs, it now works fine: the state is picked up properly, doesn't trigger a modeset if what was programmed is the one the first modeset tries to pick as well, will switch properly if it isn't, etc. Let me know what you think, Maxime Signed-off-by: Maxime Ripard <[email protected]> --- Changes in v6: - Fix private_obj_init error handling - Fix bridge name lifetime - Show the bridge name in print_state - Rebase on current drm-misc-next - Link to v5: https://lore.kernel.org/r/[email protected] Changes in v5: - Implement readout for bridge/display-connector - Implement readout for tidss encoders - Fix sii902 readout implementation - Add atomic_print_state implementation to tidss crtc - Rebase over latest changes. In particular, the CRTC conversion to atomic_create_state and the introduction of crtc's hw_reset made me create a new helper and hook to trigger a device-wide hw_reset - Add a bunch of NULL pointer checks everywhere - Fix compare macros calls to __stringify - Create documentation section for sro - Fix error path in drm_atomic_sro_state_init - Improve bisectability - Link to v4: https://lore.kernel.org/r/[email protected] Changes in v4: - Dropped the HACK patch that went into the v3 resend - Hopefully the kernel.org smtp works this time - Link to v3: https://lore.kernel.org/r/[email protected] Changes in v3: - Rebase on top of the current drm-misc-next, with rename of drm_atomic_state and the various preliminary series merged. - Use drm_printf_indent when possible - Change the access mode for the atomic_readout parameter from 000 to 400 - Use drm_drv_uses_atomic_modeset() instead of drm_core_check_feature() - Introduce a hw_reset hook to deal with device hardware reset when needed (ie, SRO fails or is disabled) - Improve mode flags readout - Fix plane alpha readout - Add sii902x state readout - Link to v2: https://lore.kernel.org/r/[email protected] Changes in v2: - Get rid of patches already applied - Rebase on top of the current atomic_create_state work - Use the SRO prefix everywhere - Create our own states container structure instead of trying to plumb it into a drm_atomic_state - Make a lot more use of helpers - Add a hook to enable the hardware resources when the readout state becomes active - Move all the tidss readout code into tidss_dispc.c - Write documentation - Add drm_private_obj and drm_bridge name for easier debugging - Add drm_private_obj_is_bridge() - Link to v1: https://lore.kernel.org/r/[email protected] --- Maxime Ripard (28): drm/atomic: Fix private obj error handling drm/atomic: Add drm_private_obj name drm/bridge: Switch print_state to use bridge name drm/bridge: Add drm_private_obj_is_bridge() drm/atomic: Export drm_atomic_*_print_state drm/atomic_sro: Create drm_atomic_sro_state container drm/atomic_sro: Create kernel parameter to force or disable readout drm/atomic_sro: Add atomic state readout infrastructure drm/atomic_sro: Add function to install state into drm objects drm/atomic_sro: Create documentation drm/bridge: Handle bridges with hardware state readout drm/mode-config: Read out hardware state in drm_mode_config_create_state drm/atomic_sro: Provide helpers to implement hardware state readout drm/mode-config: Introduce hw_reset hook drm/modeset-helper: Add drm_mode_config_helper_hw_reset() drm/atomic_helper: Compare actual and readout states once the commit is done drm/atomic-state-helper: Provide comparison macros drm/atomic-state-helper: Provide atomic_compare_state helpers drm/atomic-helper: Document State Read-Out as a state initialization approach drm/encoder: Create atomic_sro_get_current_crtc hook drm/bridge: display-connector: Implement readout support drm/bridge_connector: Implement hw readout for connector drm/tidss: crtc: Add atomic_print_state implementation drm/tidss: dispc: Improve mode checking logs drm/tidss: Implement hw_reset drm/tidss: Implement readout support drm/tidss: encoder: Implement atomic_sro_get_current_crtc drm/bridge: sii902x: Implement hw state readout Documentation/gpu/drm-kms-helpers.rst | 26 + drivers/gpu/drm/Makefile | 2 + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 1 + .../drm/arm/display/komeda/komeda_private_obj.c | 8 + drivers/gpu/drm/bridge/display-connector.c | 64 ++ drivers/gpu/drm/bridge/sii902x.c | 82 +- drivers/gpu/drm/display/drm_bridge_connector.c | 35 + drivers/gpu/drm/display/drm_dp_mst_topology.c | 2 +- drivers/gpu/drm/display/drm_dp_tunnel.c | 1 + drivers/gpu/drm/drm_atomic.c | 41 +- drivers/gpu/drm/drm_atomic_helper.c | 40 + drivers/gpu/drm/drm_atomic_sro.c | 932 +++++++++++++++++++++ drivers/gpu/drm/drm_atomic_sro_helper.c | 679 +++++++++++++++ drivers/gpu/drm/drm_atomic_state_helper.c | 20 +- drivers/gpu/drm/drm_bridge.c | 116 ++- drivers/gpu/drm/drm_internal.h | 12 + drivers/gpu/drm/drm_mode_config.c | 55 +- drivers/gpu/drm/drm_modeset_helper.c | 24 + drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 1 + drivers/gpu/drm/ingenic/ingenic-ipu.c | 1 + drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 1 + drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 1 + drivers/gpu/drm/omapdrm/omap_drv.c | 1 + drivers/gpu/drm/tegra/hub.c | 1 + drivers/gpu/drm/tidss/tidss_crtc.c | 104 +++ drivers/gpu/drm/tidss/tidss_dispc.c | 334 +++++++- drivers/gpu/drm/tidss/tidss_dispc.h | 16 + drivers/gpu/drm/tidss/tidss_encoder.c | 57 ++ drivers/gpu/drm/tidss/tidss_kms.c | 20 +- drivers/gpu/drm/tidss/tidss_plane.c | 154 ++++ drivers/gpu/drm/vc4/vc4_kms.c | 3 + include/drm/drm_atomic.h | 73 +- include/drm/drm_atomic_sro.h | 59 ++ include/drm/drm_atomic_sro_helper.h | 276 ++++++ include/drm/drm_bridge.h | 87 ++ include/drm/drm_connector.h | 69 ++ include/drm/drm_crtc.h | 69 ++ include/drm/drm_encoder.h | 18 + include/drm/drm_mode_config.h | 50 ++ include/drm/drm_modeset_helper.h | 1 + include/drm/drm_modeset_helper_vtables.h | 23 + include/drm/drm_plane.h | 69 ++ 42 files changed, 3575 insertions(+), 53 deletions(-) --- base-commit: 489a8539ca6f347102c1334c2f08198abacc86c8 change-id: 20250730-drm-state-readout-108f089c1c30 Best regards, -- Maxime Ripard <[email protected]>
