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
It's now in a much better state than the v1 was, but there's still some
notable things broken:
- Bridges do not read their input and output bus formats and flags
- The tidss_crtc_state fields are not read properly at the moment
either.
- It looks like, when left unattended, we get some atomic_flush
WARN eventually, maybe because of something broken around
hotplugging and the monitor shutting itself down?
- If readout is disabled for any reason, the hardware isn't reset
anymore.
The main thing works though: 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 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 (30):
drm/atomic: Fix unused but set warning in state iterator macros
drm/atomic_helper: Skip over NULL private_obj pointers
drm/atomic-state-helper: Remove memset in
__drm_atomic_helper_bridge_reset()
drm/atomic: Convert drm_priv_to_bridge_state to container_of_const
drm/atomic: Add drm_private_obj name
drm/bridge: Add drm_private_obj_is_bridge()
drm/bridge: Implement atomic_print_state
drm/atomic: Export drm_atomic_*_print_state
drm/atomic: Only call atomic_destroy_state on a !NULL pointer
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/mode-config: Introduce hw_reset hook
drm/atomic_sro: Provide helpers to implement hardware state readout
drm/atomic_helper: Pass nonblock to commit_tail
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/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: dispc: Improve mode checking logs
drm/tidss: Switch to drm_mode_config_create_initial_state()
drm/tidss: Implement readout support
drm/tidss: encoder: Implement atomic_sro_get_current_crtc
drm/bridge: sii902x: Implement hw state readout
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 | 15 +
drivers/gpu/drm/bridge/sii902x.c | 72 +-
drivers/gpu/drm/display/drm_bridge_connector.c | 31 +
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 | 46 +-
drivers/gpu/drm/drm_atomic_helper.c | 46 +-
drivers/gpu/drm/drm_atomic_sro.c | 854 +++++++++++++++++++++
drivers/gpu/drm/drm_atomic_sro_helper.c | 676 ++++++++++++++++
drivers/gpu/drm/drm_atomic_state_helper.c | 3 +-
drivers/gpu/drm/drm_bridge.c | 133 +++-
drivers/gpu/drm/drm_internal.h | 12 +
drivers/gpu/drm/drm_mode_config.c | 51 +-
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 | 93 +++
drivers/gpu/drm/tidss/tidss_dispc.c | 296 ++++++-
drivers/gpu/drm/tidss/tidss_dispc.h | 15 +
drivers/gpu/drm/tidss/tidss_drv.c | 6 +-
drivers/gpu/drm/tidss/tidss_encoder.c | 37 +-
drivers/gpu/drm/tidss/tidss_kms.c | 14 +-
drivers/gpu/drm/tidss/tidss_plane.c | 154 ++++
drivers/gpu/drm/vc4/vc4_kms.c | 3 +
include/drm/drm_atomic.h | 144 +++-
include/drm/drm_atomic_sro.h | 59 ++
include/drm/drm_atomic_sro_helper.h | 275 +++++++
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_vtables.h | 23 +
include/drm/drm_plane.h | 69 ++
40 files changed, 3354 insertions(+), 86 deletions(-)
---
base-commit: 4c85094a73431c26d5774aa74e422fc6bb94a7d5
change-id: 20250730-drm-state-readout-108f089c1c30
Best regards,
--
Maxime Ripard <[email protected]>