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->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-<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