diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
index caab791b0a6c9..6c11d77c8d022 100644
--- a/Documentation/DocBook/drm.tmpl
+++ b/Documentation/DocBook/drm.tmpl
@@ -978,10 +978,25 @@ int max_width, max_height;
If the parameters are deemed valid, drivers then create, initialize and
return an instance of struct drm_framebuffer.
If desired the instance can be embedded in a larger driver-specific
- structure. The new instance is initialized with a call to
- drm_framebuffer_init which takes a pointer to DRM
- frame buffer operations (struct
- drm_framebuffer_funcs). Frame buffer operations are
+ structure. Drivers must fill its width,
+ height, pitches,
+ offsets, depth,
+ bits_per_pixel and
+ pixel_format fields from the values passed
+ through the drm_mode_fb_cmd2 argument. They
+ should call the drm_helper_mode_fill_fb_struct
+ helper function to do so.
+
+
+
+ The initailization of the new framebuffer instance is finalized with a
+ call to drm_framebuffer_init which takes a pointer
+ to DRM frame buffer operations (struct
+ drm_framebuffer_funcs). Note that this function
+ publishes the framebuffer and so from this point on it can be accessed
+ concurrently from other threads. Hence it must be the last step in the
+ driver's framebuffer initialization sequence. Frame buffer operations
+ are
int (*create_handle)(struct drm_framebuffer *fb,
@@ -1022,16 +1037,16 @@ int max_width, max_height;
- After initializing the drm_framebuffer
- instance drivers must fill its width,
- height, pitches,
- offsets, depth,
- bits_per_pixel and
- pixel_format fields from the values passed
- through the drm_mode_fb_cmd2 argument. They
- should call the drm_helper_mode_fill_fb_struct
- helper function to do so.
-
+ The lifetime of a drm framebuffer is controlled with a reference count,
+ drivers can grab additional references with
+ drm_framebuffer_reference and drop them
+ again with drm_framebuffer_unreference. For
+ driver-private framebuffers for which the last reference is never
+ dropped (e.g. for the fbdev framebuffer when the struct
+ drm_framebuffer is embedded into the fbdev
+ helper struct) drivers can manually clean up a framebuffer at module
+ unload time with
+ drm_framebuffer_unregister_private.
Output Polling
@@ -1043,6 +1058,22 @@ int max_width, max_height;
operation.
+
+ Locking
+
+ Beside some lookup structures with their own locking (which is hidden
+ behind the interface functions) most of the modeset state is protected
+ by the dev-<mode_config.lock
mutex and additionally
+ per-crtc locks to allow cursor updates, pageflips and similar operations
+ to occur concurrently with background tasks like output detection.
+ Operations which cross domains like a full modeset always grab all
+ locks. Drivers there need to protect resources shared between crtcs with
+ additional locking. They also need to be careful to always grab the
+ relevant crtc locks if a modset functions touches crtc state, e.g. for
+ load detection (which does only grab the mode_config.lock
+ to allow concurrent screen updates on live crtcs).
+
+