atomic modesetting for drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state...

19
1 Atomic Modesetting for Drivers Daniel Vetter, Intel OTC

Upload: others

Post on 03-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

1

Atomic Modesetting for Drivers

Daniel Vetter, Intel OTC

Page 2: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

2

Anatomy of an Atomic Modeset

1. Build up new state

2. Compute derived state and check the update

3. Commit the new state to the hardware, possibly asynchronously

Page 3: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

3

State Building● per-object states structures tracked in struct drm_atomic_state

● ­>atomic_duplicate/destroy_* per-object

● ­>atomic_set/get_property only for private properties

● start with pure helpers, subclass as needed

Page 4: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

4

State Checking● global ­>atomic_check entry point

● plus big modular helper library

● helper supports legacy ­>mode_fixup and new ­>atomic_check hooks

● read the kerneldoc!

Page 5: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

5

State Precomputing&Checking● often check and commit need to compute the same values,

e.g. DP link settings

➔ subclass state structures and store derived state for reuse in the commit phase

● almosts everything ends up being subclassed, tons of examples

Page 6: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

6

Cross-State Structures Checking● ­>atomic_check hooks can look at any other state

● always use provided functions and check errors to avoid wait/wound mutex headaches and unecessary serialization

● CONFIG_DEBUG_WW_MUTEX_SLOWPATH

● overwrite global ­>atomic_check if needed

● tons of examples already

Page 7: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

7

Handling Global State● for shared resources across CRTCs

● use driver-private w/w mutex or dev­>mode_config­>connection_mutex

● ­>atomic_state_alloc/clear/free to subclass global struct drm_atomic_state

● currently only i915: display core clock, shared PLLs, ...

Page 8: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

8

State Committing● global ­>atomic_commit entry point

● commit not allowed to fail due to invalid state

● core guarantees to call ­>atomic_check first

● helpers by default optimized for backwards compat

● modular helpers to accomodate more drivers, read docs!

Page 9: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

9

Helper Design● plane updates orthogonal to modeset changes

● no parital enables/disable, reducing complexity

● DPMS implemented entirely in helpers

● lots of old hooks depracated, most others optional

● legacy state updated by default, but can be ignored

➔ much fewer boilerplate required

Page 10: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

10

Atomic Commit Flow● ­>prepare_fb for memory alloc, pinning

● swap new state into objects (must be done synchronously)

● wait for fences and buffers

● actual hardware commit, built from helpers and driver code

● wait for vblank

● ­>cleanup_fb to for memory release, unpin

Page 11: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

11

Hardware Commit Helpers● CRTC, encoders and bridges for modesets with just

enable/disable hooks

● 3-phase plane updates:

1. CRTC ­>atomic_begin for vblank evade, blocking updates

2. per-plane ­>atomic_update/disable

3.CRTC ­>atomic_flush to set GO bit, unblock updates

Page 12: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

12

Bootstrapping Atomic State● atomic updates always incremental

● assume that software state perfectly matches hardware

● driver load and resume need to ensure matching state, use ­>reset hooks

● need not actually reset, hardware state readout for fastboot also possible

Page 13: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

13

Legacy Entry Points● helpers to implement them with atomic for all of them

● allows drivers to keep old features that don't make sense to port to atomic around

Page 14: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

14

Ongoing for 4.4● suspend/resume helpers

● atomic fbdev

● active_only plane update helpers

● better support for runtime PM in general

Page 15: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

15

Future Work● generic async commit

● state readout for fastboot à la i915

● more helpers as use-cases crop up …

● generic validation tests in i-g-t perhaps

Page 16: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

16

KMS Extensions● easy to do with properties

● color manager, plane blending, ...

● should put them into core drm state structures to avoid property proliferation

● same rules as any other kernel ABI

Page 17: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

17

Android Support?● just fences missing, but:

● hardware composer wants per-buffer relase fence, even before the next flip is scheduled

➔ trivial fencing deadlock

● … and no one has an open-source atomic hwc

Page 18: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

18

Documentation

● conversion HOWTO for legacy drivers: http://blog.ffwll.ch/2014/11/atomic-modeset-support-for-kms-drivers.html

● LWN design overview: https://lwn.net/Articles/653071/ https://lwn.net/Articles/653466/

● DRM DocBook: https://01.org/linuxgraphics/gfx-docs/drm/

Page 19: Atomic Modesetting for Drivers - freedesktop.orgdanvet/presentations/xdc-2015.pdfdrm_atomic_state >atomic ... driver load and resume need to ensure matching state, use >reset hooks

19

Q & A