1<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Mode Setting</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"><link rel="home" href="index.html" title="Linux GPU Driver Developer's Guide"><link rel="up" href="drmInternals.html" title="Chapter 2. DRM Internals"><link rel="prev" href="API-struct-drm-gem-cma-object.html" title="struct drm_gem_cma_object"><link rel="next" href="API-drm-mode-is-stereo.html" title="drm_mode_is_stereo"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Mode Setting</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="API-struct-drm-gem-cma-object.html">Prev</a> </td><th width="60%" align="center">Chapter 2. DRM Internals</th><td width="20%" align="right"> <a accesskey="n" href="API-drm-mode-is-stereo.html">Next</a></td></tr></table><hr></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="drm-mode-setting"></a>Mode Setting</h2></div></div></div><div class="toc"><dl class="toc"><dt><span class="sect2"><a href="drm-mode-setting.html#id-1.3.4.7.4">Display Modes Function Reference</a></span></dt><dt><span class="sect2"><a href="drm-mode-setting.html#id-1.3.4.7.5">Atomic Mode Setting Function Reference</a></span></dt><dt><span class="sect2"><a href="drm-mode-setting.html#id-1.3.4.7.6">Frame Buffer Creation</a></span></dt><dt><span class="sect2"><a href="drm-mode-setting.html#id-1.3.4.7.7">Dumb Buffer Objects</a></span></dt><dt><span class="sect2"><a href="drm-mode-setting.html#id-1.3.4.7.8">Output Polling</a></span></dt><dt><span class="sect2"><a href="drm-mode-setting.html#id-1.3.4.7.9">Locking</a></span></dt></dl></div><p>
2      Drivers must initialize the mode setting core by calling
3      <code class="function"><a class="link" href="API-drm-mode-config-init.html" title="drm_mode_config_init">drm_mode_config_init</a></code> on the DRM device. The function
4      initializes the <span class="structname">drm_device</span>
5      <em class="structfield"><code>mode_config</code></em> field and never fails. Once done,
6      mode configuration must be setup by initializing the following fields.
7    </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><pre class="synopsis">int min_width, min_height;
8int max_width, max_height;</pre><p>
9	  Minimum and maximum width and height of the frame buffers in pixel
10	  units.
11	</p></li><li class="listitem"><pre class="synopsis">struct drm_mode_config_funcs *funcs;</pre><p>Mode setting functions.</p></li></ul></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id-1.3.4.7.4"></a>Display Modes Function Reference</h3></div></div></div><div class="toc"><dl class="toc"><dt><span class="refentrytitle"><a href="API-drm-mode-is-stereo.html"><span class="phrase">drm_mode_is_stereo</span></a></span><span class="refpurpose"> — 
12  check for stereo mode flags
13 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-debug-printmodeline.html"><span class="phrase">drm_mode_debug_printmodeline</span></a></span><span class="refpurpose"> — 
14  print a mode to dmesg
15 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-create.html"><span class="phrase">drm_mode_create</span></a></span><span class="refpurpose"> — 
16     create a new display mode
17 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-destroy.html"><span class="phrase">drm_mode_destroy</span></a></span><span class="refpurpose"> — 
18     remove a mode
19 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-probed-add.html"><span class="phrase">drm_mode_probed_add</span></a></span><span class="refpurpose"> — 
20     add a mode to a connector's probed_mode list
21 </span></dt><dt><span class="refentrytitle"><a href="API-drm-cvt-mode.html"><span class="phrase">drm_cvt_mode</span></a></span><span class="refpurpose"> — 
22     create a modeline based on the CVT algorithm
23 </span></dt><dt><span class="refentrytitle"><a href="API-drm-gtf-mode-complex.html"><span class="phrase">drm_gtf_mode_complex</span></a></span><span class="refpurpose"> — 
24     create the modeline based on the full GTF algorithm
25 </span></dt><dt><span class="refentrytitle"><a href="API-drm-gtf-mode.html"><span class="phrase">drm_gtf_mode</span></a></span><span class="refpurpose"> — 
26     create the modeline based on the GTF algorithm
27 </span></dt><dt><span class="refentrytitle"><a href="API-drm-display-mode-from-videomode.html"><span class="phrase">drm_display_mode_from_videomode</span></a></span><span class="refpurpose"> — 
28     fill in <em class="parameter"><code>dmode</code></em> using <em class="parameter"><code>vm</code></em>,
29 </span></dt><dt><span class="refentrytitle"><a href="API-drm-display-mode-to-videomode.html"><span class="phrase">drm_display_mode_to_videomode</span></a></span><span class="refpurpose"> — 
30     fill in <em class="parameter"><code>vm</code></em> using <em class="parameter"><code>dmode</code></em>,
31 </span></dt><dt><span class="refentrytitle"><a href="API-of-get-drm-display-mode.html"><span class="phrase">of_get_drm_display_mode</span></a></span><span class="refpurpose"> — 
32     get a drm_display_mode from devicetree
33 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-set-name.html"><span class="phrase">drm_mode_set_name</span></a></span><span class="refpurpose"> — 
34     set the name on a mode
35 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-vrefresh.html"><span class="phrase">drm_mode_vrefresh</span></a></span><span class="refpurpose"> — 
36     get the vrefresh of a mode
37 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-set-crtcinfo.html"><span class="phrase">drm_mode_set_crtcinfo</span></a></span><span class="refpurpose"> — 
38     set CRTC modesetting timing parameters
39 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-copy.html"><span class="phrase">drm_mode_copy</span></a></span><span class="refpurpose"> — 
40     copy the mode
41 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-duplicate.html"><span class="phrase">drm_mode_duplicate</span></a></span><span class="refpurpose"> — 
42     allocate and duplicate an existing mode
43 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-equal.html"><span class="phrase">drm_mode_equal</span></a></span><span class="refpurpose"> — 
44     test modes for equality
45 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-equal-no-clocks-no-stereo.html"><span class="phrase">drm_mode_equal_no_clocks_no_stereo</span></a></span><span class="refpurpose"> — 
46     test modes for equality
47 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-validate-basic.html"><span class="phrase">drm_mode_validate_basic</span></a></span><span class="refpurpose"> — 
48     make sure the mode is somewhat sane
49 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-validate-size.html"><span class="phrase">drm_mode_validate_size</span></a></span><span class="refpurpose"> — 
50     make sure modes adhere to size constraints
51 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-prune-invalid.html"><span class="phrase">drm_mode_prune_invalid</span></a></span><span class="refpurpose"> — 
52     remove invalid modes from mode list
53 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-sort.html"><span class="phrase">drm_mode_sort</span></a></span><span class="refpurpose"> — 
54     sort mode list
55 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-connector-list-update.html"><span class="phrase">drm_mode_connector_list_update</span></a></span><span class="refpurpose"> — 
56     update the mode list for the connector
57 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-parse-command-line-for-connector.html"><span class="phrase">drm_mode_parse_command_line_for_connector</span></a></span><span class="refpurpose"> — 
58     parse command line modeline for connector
59 </span></dt><dt><span class="refentrytitle"><a href="API-drm-mode-create-from-cmdline-mode.html"><span class="phrase">drm_mode_create_from_cmdline_mode</span></a></span><span class="refpurpose"> — 
60     convert a command line modeline into a DRM display mode
61 </span></dt></dl></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id-1.3.4.7.5"></a>Atomic Mode Setting Function Reference</h3></div></div></div><div class="toc"><dl class="toc"><dt><span class="refentrytitle"><a href="API-drm-atomic-state-default-release.html"><span class="phrase">drm_atomic_state_default_release</span></a></span><span class="refpurpose"> — 
62  release memory initialized by drm_atomic_state_init
63 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-state-init.html"><span class="phrase">drm_atomic_state_init</span></a></span><span class="refpurpose"> — 
64     init new atomic state
65 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-state-alloc.html"><span class="phrase">drm_atomic_state_alloc</span></a></span><span class="refpurpose"> — 
66     allocate atomic state
67 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-state-default-clear.html"><span class="phrase">drm_atomic_state_default_clear</span></a></span><span class="refpurpose"> — 
68     clear base atomic state
69 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-state-clear.html"><span class="phrase">drm_atomic_state_clear</span></a></span><span class="refpurpose"> — 
70     clear state object
71 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-state-free.html"><span class="phrase">drm_atomic_state_free</span></a></span><span class="refpurpose"> — 
72     free all memory for an atomic state
73 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-get-crtc-state.html"><span class="phrase">drm_atomic_get_crtc_state</span></a></span><span class="refpurpose"> — 
74     get crtc state
75 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-set-mode-for-crtc.html"><span class="phrase">drm_atomic_set_mode_for_crtc</span></a></span><span class="refpurpose"> — 
76     set mode for CRTC
77 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-set-mode-prop-for-crtc.html"><span class="phrase">drm_atomic_set_mode_prop_for_crtc</span></a></span><span class="refpurpose"> — 
78     set mode for CRTC
79 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-crtc-set-property.html"><span class="phrase">drm_atomic_crtc_set_property</span></a></span><span class="refpurpose"> — 
80     set property on CRTC
81 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-get-plane-state.html"><span class="phrase">drm_atomic_get_plane_state</span></a></span><span class="refpurpose"> — 
82     get plane state
83 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-plane-set-property.html"><span class="phrase">drm_atomic_plane_set_property</span></a></span><span class="refpurpose"> — 
84     set property on plane
85 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-get-connector-state.html"><span class="phrase">drm_atomic_get_connector_state</span></a></span><span class="refpurpose"> — 
86     get connector state
87 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-connector-set-property.html"><span class="phrase">drm_atomic_connector_set_property</span></a></span><span class="refpurpose"> — 
88     set property on connector.
89 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-set-crtc-for-plane.html"><span class="phrase">drm_atomic_set_crtc_for_plane</span></a></span><span class="refpurpose"> — 
90     set crtc for plane
91 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-set-fb-for-plane.html"><span class="phrase">drm_atomic_set_fb_for_plane</span></a></span><span class="refpurpose"> — 
92     set framebuffer for plane
93 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-set-crtc-for-connector.html"><span class="phrase">drm_atomic_set_crtc_for_connector</span></a></span><span class="refpurpose"> — 
94     set crtc for connector
95 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-add-affected-connectors.html"><span class="phrase">drm_atomic_add_affected_connectors</span></a></span><span class="refpurpose"> — 
96     add connectors for crtc
97 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-add-affected-planes.html"><span class="phrase">drm_atomic_add_affected_planes</span></a></span><span class="refpurpose"> — 
98     add planes for crtc
99 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-connectors-for-crtc.html"><span class="phrase">drm_atomic_connectors_for_crtc</span></a></span><span class="refpurpose"> — 
100     count number of connected outputs
101 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-legacy-backoff.html"><span class="phrase">drm_atomic_legacy_backoff</span></a></span><span class="refpurpose"> — 
102     locking backoff for legacy ioctls
103 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-check-only.html"><span class="phrase">drm_atomic_check_only</span></a></span><span class="refpurpose"> — 
104     check whether a given config would work
105 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-commit.html"><span class="phrase">drm_atomic_commit</span></a></span><span class="refpurpose"> — 
106     commit configuration atomically
107 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-async-commit.html"><span class="phrase">drm_atomic_async_commit</span></a></span><span class="refpurpose"> — 
108     atomic<span class="structname">async</span> configuration commit
109 </span></dt><dt><span class="refentrytitle"><a href="API-drm-atomic-clean-old-fb.html"><span class="phrase">drm_atomic_clean_old_fb</span></a></span><span class="refpurpose"> — 
110     - Unset old_fb pointers and set plane-&gt;fb pointers.
111 </span></dt></dl></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id-1.3.4.7.6"></a>Frame Buffer Creation</h3></div></div></div><pre class="synopsis">struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
112				     struct drm_file *file_priv,
113				     struct drm_mode_fb_cmd2 *mode_cmd);</pre><p>
114        Frame buffers are abstract memory objects that provide a source of
115        pixels to scanout to a CRTC. Applications explicitly request the
116        creation of frame buffers through the DRM_IOCTL_MODE_ADDFB(2) ioctls and
117        receive an opaque handle that can be passed to the KMS CRTC control,
118        plane configuration and page flip functions.
119      </p><p>
120        Frame buffers rely on the underneath memory manager for low-level memory
121        operations. When creating a frame buffer applications pass a memory
122        handle (or a list of memory handles for multi-planar formats) through
123	the <em class="parameter"><code>drm_mode_fb_cmd2</code></em> argument. For drivers using
124	GEM as their userspace buffer management interface this would be a GEM
125	handle.  Drivers are however free to use their own backing storage object
126	handles, e.g. vmwgfx directly exposes special TTM handles to userspace
127	and so expects TTM handles in the create ioctl and not GEM handles.
128      </p><p>
129        Drivers must first validate the requested frame buffer parameters passed
130        through the mode_cmd argument. In particular this is where invalid
131        sizes, pixel formats or pitches can be caught.
132      </p><p>
133        If the parameters are deemed valid, drivers then create, initialize and
134        return an instance of struct <span class="structname">drm_framebuffer</span>.
135        If desired the instance can be embedded in a larger driver-specific
136	structure. Drivers must fill its <em class="structfield"><code>width</code></em>,
137	<em class="structfield"><code>height</code></em>, <em class="structfield"><code>pitches</code></em>,
138        <em class="structfield"><code>offsets</code></em>, <em class="structfield"><code>depth</code></em>,
139        <em class="structfield"><code>bits_per_pixel</code></em> and
140        <em class="structfield"><code>pixel_format</code></em> fields from the values passed
141        through the <em class="parameter"><code>drm_mode_fb_cmd2</code></em> argument. They
142        should call the <code class="function"><a class="link" href="API-drm-helper-mode-fill-fb-struct.html" title="drm_helper_mode_fill_fb_struct">drm_helper_mode_fill_fb_struct</a></code>
143        helper function to do so.
144      </p><p>
145	The initialization of the new framebuffer instance is finalized with a
146	call to <code class="function"><a class="link" href="API-drm-framebuffer-init.html" title="drm_framebuffer_init">drm_framebuffer_init</a></code> which takes a pointer
147	to DRM frame buffer operations (struct
148	<span class="structname">drm_framebuffer_funcs</span>). Note that this function
149	publishes the framebuffer and so from this point on it can be accessed
150	concurrently from other threads. Hence it must be the last step in the
151	driver's framebuffer initialization sequence. Frame buffer operations
152	are
153        </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><pre class="synopsis">int (*create_handle)(struct drm_framebuffer *fb,
154		     struct drm_file *file_priv, unsigned int *handle);</pre><p>
155              Create a handle to the frame buffer underlying memory object. If
156              the frame buffer uses a multi-plane format, the handle will
157              reference the memory object associated with the first plane.
158            </p><p>
159              Drivers call <code class="function"><a class="link" href="API-drm-gem-handle-create.html" title="drm_gem_handle_create">drm_gem_handle_create</a></code> to create
160              the handle.
161            </p></li><li class="listitem"><pre class="synopsis">void (*destroy)(struct drm_framebuffer *framebuffer);</pre><p>
162              Destroy the frame buffer object and frees all associated
163              resources. Drivers must call
164              <code class="function"><a class="link" href="API-drm-framebuffer-cleanup.html" title="drm_framebuffer_cleanup">drm_framebuffer_cleanup</a></code> to free resources
165              allocated by the DRM core for the frame buffer object, and must
166              make sure to unreference all memory objects associated with the
167              frame buffer. Handles created by the
168              <code class="methodname">create_handle</code> operation are released by
169              the DRM core.
170            </p></li><li class="listitem"><pre class="synopsis">int (*dirty)(struct drm_framebuffer *framebuffer,
171	     struct drm_file *file_priv, unsigned flags, unsigned color,
172	     struct drm_clip_rect *clips, unsigned num_clips);</pre><p>
173              This optional operation notifies the driver that a region of the
174              frame buffer has changed in response to a DRM_IOCTL_MODE_DIRTYFB
175              ioctl call.
176            </p></li></ul></div><p>
177      </p><p>
178	The lifetime of a drm framebuffer is controlled with a reference count,
179	drivers can grab additional references with
180	<code class="function"><a class="link" href="API-drm-framebuffer-reference.html" title="drm_framebuffer_reference">drm_framebuffer_reference</a></code>and drop them
181	again with <code class="function"><a class="link" href="API-drm-framebuffer-unreference.html" title="drm_framebuffer_unreference">drm_framebuffer_unreference</a></code>. For
182	driver-private framebuffers for which the last reference is never
183	dropped (e.g. for the fbdev framebuffer when the struct
184	<span class="structname">drm_framebuffer</span> is embedded into the fbdev
185	helper struct) drivers can manually clean up a framebuffer at module
186	unload time with
187	<code class="function"><a class="link" href="API-drm-framebuffer-unregister-private.html" title="drm_framebuffer_unregister_private">drm_framebuffer_unregister_private</a></code>.
188      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id-1.3.4.7.7"></a>Dumb Buffer Objects</h3></div></div></div><p>
189	The KMS API doesn't standardize backing storage object creation and
190	leaves it to driver-specific ioctls. Furthermore actually creating a
191	buffer object even for GEM-based drivers is done through a
192	driver-specific ioctl - GEM only has a common userspace interface for
193	sharing and destroying objects. While not an issue for full-fledged
194	graphics stacks that include device-specific userspace components (in
195	libdrm for instance), this limit makes DRM-based early boot graphics
196	unnecessarily complex.
197      </p><p>
198        Dumb objects partly alleviate the problem by providing a standard
199        API to create dumb buffers suitable for scanout, which can then be used
200        to create KMS frame buffers.
201      </p><p>
202        To support dumb objects drivers must implement the
203        <code class="methodname">dumb_create</code>,
204        <code class="methodname">dumb_destroy</code> and
205        <code class="methodname">dumb_map_offset</code> operations.
206      </p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><pre class="synopsis">int (*dumb_create)(struct drm_file *file_priv, struct drm_device *dev,
207                   struct drm_mode_create_dumb *args);</pre><p>
208            The <code class="methodname">dumb_create</code> operation creates a driver
209	    object (GEM or TTM handle) suitable for scanout based on the
210	    width, height and depth from the struct
211	    <span class="structname">drm_mode_create_dumb</span> argument. It fills the
212	    argument's <em class="structfield"><code>handle</code></em>,
213	    <em class="structfield"><code>pitch</code></em> and <em class="structfield"><code>size</code></em>
214	    fields with a handle for the newly created object and its line
215            pitch and size in bytes.
216          </p></li><li class="listitem"><pre class="synopsis">int (*dumb_destroy)(struct drm_file *file_priv, struct drm_device *dev,
217                    uint32_t handle);</pre><p>
218            The <code class="methodname">dumb_destroy</code> operation destroys a dumb
219            object created by <code class="methodname">dumb_create</code>.
220          </p></li><li class="listitem"><pre class="synopsis">int (*dumb_map_offset)(struct drm_file *file_priv, struct drm_device *dev,
221                       uint32_t handle, uint64_t *offset);</pre><p>
222            The <code class="methodname">dumb_map_offset</code> operation associates an
223            mmap fake offset with the object given by the handle and returns
224            it. Drivers must use the
225            <code class="function"><a class="link" href="API-drm-gem-create-mmap-offset.html" title="drm_gem_create_mmap_offset">drm_gem_create_mmap_offset</a></code> function to
226            associate the fake offset as described in
227            <a class="xref" href="drm-memory-management.html#drm-gem-objects-mapping" title="GEM Objects Mapping">the section called “GEM Objects Mapping”</a>.
228          </p></li></ul></div><p>
229        Note that dumb objects may not be used for gpu acceleration, as has been
230	attempted on some ARM embedded platforms. Such drivers really must have
231	a hardware-specific ioctl to allocate suitable buffer objects.
232      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id-1.3.4.7.8"></a>Output Polling</h3></div></div></div><pre class="synopsis">void (*output_poll_changed)(struct drm_device *dev);</pre><p>
233        This operation notifies the driver that the status of one or more
234        connectors has changed. Drivers that use the fb helper can just call the
235        <code class="function"><a class="link" href="API-drm-fb-helper-hotplug-event.html" title="drm_fb_helper_hotplug_event">drm_fb_helper_hotplug_event</a></code> function to handle this
236        operation.
237      </p></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="id-1.3.4.7.9"></a>Locking</h3></div></div></div><p>
238        Beside some lookup structures with their own locking (which is hidden
239	behind the interface functions) most of the modeset state is protected
240	by the <code class="code">dev-&lt;mode_config.lock</code> mutex and additionally
241	per-crtc locks to allow cursor updates, pageflips and similar operations
242	to occur concurrently with background tasks like output detection.
243	Operations which cross domains like a full modeset always grab all
244	locks. Drivers there need to protect resources shared between crtcs with
245	additional locking. They also need to be careful to always grab the
246	relevant crtc locks if a modset functions touches crtc state, e.g. for
247	load detection (which does only grab the <code class="code">mode_config.lock</code>
248	to allow concurrent screen updates on live crtcs).
249      </p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="API-struct-drm-gem-cma-object.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="drmInternals.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="API-drm-mode-is-stereo.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"><span class="phrase">struct drm_gem_cma_object</span> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> <span class="phrase">drm_mode_is_stereo</span></td></tr></table></div></body></html>
250