Blame man/drm-kms.xml

Packit Service 103f6b
 
Packit Service 103f6b
Packit Service 103f6b
          "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
Packit Service 103f6b
Packit Service 103f6b
Packit Service 103f6b
  Written 2012 by David Herrmann <dh.herrmann@googlemail.com>
Packit Service 103f6b
  Dedicated to the Public Domain
Packit Service 103f6b
-->
Packit Service 103f6b
Packit Service 103f6b
<refentry id="drm-kms">
Packit Service 103f6b
  <refentryinfo>
Packit Service 103f6b
    <title>Direct Rendering Manager</title>
Packit Service 103f6b
    <productname>libdrm</productname>
Packit Service 103f6b
    <date>September 2012</date>
Packit Service 103f6b
    <authorgroup>
Packit Service 103f6b
      <author>
Packit Service 103f6b
        <contrib>Developer</contrib>
Packit Service 103f6b
        <firstname>David</firstname>
Packit Service 103f6b
        <surname>Herrmann</surname>
Packit Service 103f6b
        <email>dh.herrmann@googlemail.com</email>
Packit Service 103f6b
      </author>
Packit Service 103f6b
    </authorgroup>
Packit Service 103f6b
  </refentryinfo>
Packit Service 103f6b
Packit Service 103f6b
  <refmeta>
Packit Service 103f6b
    <refentrytitle>drm-kms</refentrytitle>
Packit Service 103f6b
    <manvolnum>7</manvolnum>
Packit Service 103f6b
  </refmeta>
Packit Service 103f6b
Packit Service 103f6b
  <refnamediv>
Packit Service 103f6b
    <refname>drm-kms</refname>
Packit Service 103f6b
    <refpurpose>Kernel Mode-Setting</refpurpose>
Packit Service 103f6b
  </refnamediv>
Packit Service 103f6b
Packit Service 103f6b
  <refsynopsisdiv>
Packit Service 103f6b
    <funcsynopsis>
Packit Service 103f6b
      <funcsynopsisinfo>#include <xf86drm.h></funcsynopsisinfo>
Packit Service 103f6b
      <funcsynopsisinfo>#include <xf86drmMode.h></funcsynopsisinfo>
Packit Service 103f6b
    </funcsynopsis>
Packit Service 103f6b
  </refsynopsisdiv>
Packit Service 103f6b
Packit Service 103f6b
  <refsect1>
Packit Service 103f6b
    <title>Description</title>
Packit Service 103f6b
    <para>Each DRM device provides access to manage which monitors and displays
Packit Service 103f6b
          are currently used and what frames to be displayed. This task is
Packit Service 103f6b
          called <emphasis>Kernel Mode-Setting</emphasis> (KMS). Historically,
Packit Service 103f6b
          this was done in user-space and called 
Packit Service 103f6b
          <emphasis>User-space Mode-Setting</emphasis> (UMS). Almost all
Packit Service 103f6b
          open-source drivers now provide the KMS kernel API to do this in the
Packit Service 103f6b
          kernel, however, many non-open-source binary drivers from different
Packit Service 103f6b
          vendors still do not support this. You can use
Packit Service 103f6b
          <citerefentry><refentrytitle>drmModeSettingSupported</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
          to check whether your driver supports this. To understand how KMS
Packit Service 103f6b
          works, we need to introduce 5 objects: <emphasis>CRTCs</emphasis>,
Packit Service 103f6b
          <emphasis>Planes</emphasis>, <emphasis>Encoders</emphasis>,
Packit Service 103f6b
          <emphasis>Connectors</emphasis> and
Packit Service 103f6b
          <emphasis>Framebuffers</emphasis>.
Packit Service 103f6b
Packit Service 103f6b
      <variablelist>
Packit Service 103f6b
        <varlistentry>
Packit Service 103f6b
          <term>CRTCs</term>
Packit Service 103f6b
          <listitem>
Packit Service 103f6b
            <para>A <emphasis>CRTC</emphasis> short for
Packit Service 103f6b
                  <emphasis>CRT Controller</emphasis> is an abstraction
Packit Service 103f6b
                  representing a part of the chip that contains a pointer to a
Packit Service 103f6b
                  scanout buffer. Therefore, the number of CRTCs available
Packit Service 103f6b
                  determines how many independent scanout buffers can be active
Packit Service 103f6b
                  at any given time. The CRTC structure contains several fields
Packit Service 103f6b
                  to support this: a pointer to some video memory (abstracted as
Packit Service 103f6b
                  a frame-buffer object), a list of driven connectors, a display
Packit Service 103f6b
                  mode and an (x, y) offset into the video memory to support
Packit Service 103f6b
                  panning or configurations where one piece of video memory
Packit Service 103f6b
                  spans multiple CRTCs. A CRTC is the central point where
Packit Service 103f6b
                  configuration of displays happens. You select which objects to
Packit Service 103f6b
                  use, which modes and which parameters and then configure each
Packit Service 103f6b
                  CRTC via
Packit Service 103f6b
                  <citerefentry><refentrytitle>drmModeCrtcSet</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
                  to drive the display devices.</para>
Packit Service 103f6b
          </listitem>
Packit Service 103f6b
        </varlistentry>
Packit Service 103f6b
        <varlistentry>
Packit Service 103f6b
          <term>Planes</term>
Packit Service 103f6b
          <listitem>
Packit Service 103f6b
            <para>A <emphasis>plane</emphasis> respresents an image source that
Packit Service 103f6b
                  can be blended with or overlayed on top of a CRTC during the
Packit Service 103f6b
                  scanout process. Planes are associated with a frame-buffer to
Packit Service 103f6b
                  crop a portion of the image memory (source) and optionally
Packit Service 103f6b
                  scale it to a destination size. The result is then blended
Packit Service 103f6b
                  with or overlayed on top of a CRTC. Planes are not provided by
Packit Service 103f6b
                  all hardware and the number of available planes is limited. If
Packit Service 103f6b
                  planes are not available or if not enough planes are
Packit Service 103f6b
                  available, the user should fall back to normal software
Packit Service 103f6b
                  blending (via GPU or CPU).</para>
Packit Service 103f6b
          </listitem>
Packit Service 103f6b
        </varlistentry>
Packit Service 103f6b
        <varlistentry>
Packit Service 103f6b
          <term>Encoders</term>
Packit Service 103f6b
          <listitem>
Packit Service 103f6b
            <para>An <emphasis>encoder</emphasis> takes pixel data from a CRTC
Packit Service 103f6b
                  and converts it to a format suitable for any attached
Packit Service 103f6b
                  connectors. On some devices, it may be possible to have a CRTC
Packit Service 103f6b
                  send data to more than one encoder. In that case, both
Packit Service 103f6b
                  encoders would receive data from the same scanout buffer,
Packit Service 103f6b
                  resulting in a <emphasis>cloned</emphasis> display
Packit Service 103f6b
                  configuration across the connectors attached to each
Packit Service 103f6b
                  encoder.</para>
Packit Service 103f6b
          </listitem>
Packit Service 103f6b
        </varlistentry>
Packit Service 103f6b
        <varlistentry>
Packit Service 103f6b
          <term>Connectors</term>
Packit Service 103f6b
          <listitem>
Packit Service 103f6b
            <para>A <emphasis>connector</emphasis> is the final destination of
Packit Service 103f6b
                  pixel-data on a device, and usually connects directly to an
Packit Service 103f6b
                  external display device like a monitor or laptop panel. A
Packit Service 103f6b
                  connector can only be attached to one encoder at a time. The
Packit Service 103f6b
                  connector is also the structure where information about the
Packit Service 103f6b
                  attached display is kept, so it contains fields for display
Packit Service 103f6b
                  data, <emphasis>EDID</emphasis> data,
Packit Service 103f6b
                  <emphasis>DPMS</emphasis> and
Packit Service 103f6b
                  <emphasis>connection status</emphasis>, and information about
Packit Service 103f6b
                  modes supported on the attached displays.</para>
Packit Service 103f6b
          </listitem>
Packit Service 103f6b
        </varlistentry>
Packit Service 103f6b
        <varlistentry>
Packit Service 103f6b
          <term>Framebuffers</term>
Packit Service 103f6b
          <listitem>
Packit Service 103f6b
            <para><emphasis>Framebuffers</emphasis> are abstract memory objects
Packit Service 103f6b
                  that provide a source of pixel data to scanout to a CRTC.
Packit Service 103f6b
                  Applications explicitly request the creation of framebuffers
Packit Service 103f6b
                  and can control their behavior. Framebuffers rely on the
Packit Service 103f6b
                  underneath memory manager for low-level memory operations.
Packit Service 103f6b
                  When creating a framebuffer, applications pass a memory handle
Packit Service 103f6b
                  through the API which is used as backing storage. The
Packit Service 103f6b
                  framebuffer itself is only an abstract object with no data. It
Packit Service 103f6b
                  just refers to memory buffers that must be created with the
Packit Service 103f6b
                  <citerefentry><refentrytitle>drm-memory</refentrytitle><manvolnum>7</manvolnum></citerefentry>
Packit Service 103f6b
                  API.</para>
Packit Service 103f6b
          </listitem>
Packit Service 103f6b
        </varlistentry>
Packit Service 103f6b
      </variablelist>
Packit Service 103f6b
    </para>
Packit Service 103f6b
Packit Service 103f6b
    <refsect2>
Packit Service 103f6b
      <title>Mode-Setting</title>
Packit Service 103f6b
      <para>Before mode-setting can be performed, an application needs to call
Packit Service 103f6b
            <citerefentry><refentrytitle>drmSetMaster</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            to become <emphasis>DRM-Master</emphasis>. It then has exclusive
Packit Service 103f6b
            access to the KMS API. A call to
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeGetResources</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            returns a list of <emphasis>CRTCs</emphasis>,
Packit Service 103f6b
            <emphasis>Connectors</emphasis>, <emphasis>Encoders</emphasis> and
Packit Service 103f6b
            <emphasis>Planes</emphasis>.</para>
Packit Service 103f6b
Packit Service 103f6b
      <para>Normal procedure now includes: First, you select which connectors
Packit Service 103f6b
            you want to use. Users are mostly interested in which monitor or
Packit Service 103f6b
            display-panel is active so you need to make sure to arrange them in
Packit Service 103f6b
            the correct logical order and select the correct ones to use. For
Packit Service 103f6b
            each connector, you need to find a CRTC to drive this connector. If
Packit Service 103f6b
            you want to clone output to two or more connectors, you may use a
Packit Service 103f6b
            single CRTC for all cloned connectors (if the hardware supports
Packit Service 103f6b
            this). To find a suitable CRTC, you need to iterate over the list of
Packit Service 103f6b
            encoders that are available for each connector. Each encoder
Packit Service 103f6b
            contains a list of CRTCs that it can work with and you simply select
Packit Service 103f6b
            one of these CRTCs. If you later program the CRTC to control a
Packit Service 103f6b
            connector, it automatically selects the best encoder. However, this
Packit Service 103f6b
            procedure is needed so your CRTC has at least one working encoder
Packit Service 103f6b
            for the selected connector. See the <emphasis>Examples</emphasis>
Packit Service 103f6b
            section below for more information.</para>
Packit Service 103f6b
Packit Service 103f6b
      <para>All valid modes for a connector can be retrieved with a call to
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeGetConnector</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            You need to select the mode you want to use and save it. The first
Packit Service 103f6b
            mode in the list is the default mode with the highest resolution
Packit Service 103f6b
            possible and often a suitable choice.</para>
Packit Service 103f6b
Packit Service 103f6b
      <para>After you have a working connector+CRTC+mode combination, you need
Packit Service 103f6b
            to create a framebuffer that is used for scanout. Memory buffer
Packit Service 103f6b
            allocation is driver-depedent and described in
Packit Service 103f6b
            <citerefentry><refentrytitle>drm-memory</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
Packit Service 103f6b
            You need to create a buffer big enough for your selected mode. Now
Packit Service 103f6b
            you can create a framebuffer object that uses your memory-buffer as
Packit Service 103f6b
            scanout buffer. You can do this with
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeAddFB</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            and
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeAddFB2</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
Packit Service 103f6b
Packit Service 103f6b
      <para>As a last step, you want to program your CRTC to drive your selected
Packit Service 103f6b
            connector. You can do this with a call to
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeSetCrtc</refentrytitle><manvolnum>3</manvolnum></citerefentry>.</para>
Packit Service 103f6b
    </refsect2>
Packit Service 103f6b
Packit Service 103f6b
    <refsect2>
Packit Service 103f6b
      <title>Page-Flipping</title>
Packit Service 103f6b
      <para>A call to
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeSetCrtc</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            is executed immediately and forces the CRTC to use the new scanout
Packit Service 103f6b
            buffer. If you want smooth-transitions without tearing, you probably
Packit Service 103f6b
            use double-buffering. You need to create one framebuffer object for
Packit Service 103f6b
            each buffer you use. You can then call
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeSetCrtc</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            on the next buffer to flip. If you want to synchronize your flips
Packit Service 103f6b
            with <emphasis>vertical-blanks</emphasis>, you can use
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModePageFlip</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            which schedules your page-flip for the next
Packit Service 103f6b
            <emphasis>vblank</emphasis>.</para>
Packit Service 103f6b
    </refsect2>
Packit Service 103f6b
Packit Service 103f6b
    <refsect2>
Packit Service 103f6b
      <title>Planes</title>
Packit Service 103f6b
      <para>Planes are controlled independently from CRTCs. That is, a call to
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeSetCrtc</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            does not affect planes. Instead, you need to call
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeSetPlane</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            to configure a plane. This requires the plane ID, a CRTC, a
Packit Service 103f6b
            framebuffer and offsets into the plane-framebuffer and the
Packit Service 103f6b
            CRTC-framebuffer. The CRTC then blends the content from the plane
Packit Service 103f6b
            over the CRTC framebuffer buffer during scanout. As this does not
Packit Service 103f6b
            involve any software-blending, it is way faster than traditional
Packit Service 103f6b
            blending. However, plane resources are limited. See
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeGetPlaneResources</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            for more information.</para>
Packit Service 103f6b
    </refsect2>
Packit Service 103f6b
Packit Service 103f6b
    <refsect2>
Packit Service 103f6b
      <title>Cursors</title>
Packit Service 103f6b
      <para>Similar to planes, many hardware also supports cursors. A cursor is
Packit Service 103f6b
            a very small buffer with an image that is blended over the CRTC
Packit Service 103f6b
            framebuffer. You can set a different cursor for each CRTC with
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeSetCursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            and move it on the screen with
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeMoveCursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
Packit Service 103f6b
            This allows to move the cursor on the screen without rerendering. If
Packit Service 103f6b
            no hardware cursors are supported, you need to rerender for each
Packit Service 103f6b
            frame the cursor is moved.</para>
Packit Service 103f6b
    </refsect2>
Packit Service 103f6b
Packit Service 103f6b
  </refsect1>
Packit Service 103f6b
Packit Service 103f6b
  <refsect1>
Packit Service 103f6b
    <title>Examples</title>
Packit Service 103f6b
    <para>Some examples of how basic mode-setting can be done. See the man-page
Packit Service 103f6b
          of each DRM function for more information.</para>
Packit Service 103f6b
Packit Service 103f6b
    <refsect2>
Packit Service 103f6b
      <title>CRTC/Encoder Selection</title>
Packit Service 103f6b
      <para>If you retrieved all display configuration information via
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeGetResources</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            as <structname>drmModeRes</structname> *<varname>res</varname>,
Packit Service 103f6b
            selected a connector from the list in
Packit Service 103f6b
            <varname>res</varname>-><structfield>connectors</structfield>
Packit Service 103f6b
            and retrieved the connector-information as
Packit Service 103f6b
            <structname>drmModeConnector</structname> *<varname>conn</varname>
Packit Service 103f6b
            via
Packit Service 103f6b
            <citerefentry><refentrytitle>drmModeGetConnector</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
            then this example shows, how you can find a suitable CRTC id to
Packit Service 103f6b
            drive this connector. This function takes a file-descriptor to the
Packit Service 103f6b
            DRM device (see
Packit Service 103f6b
            <citerefentry><refentrytitle>drmOpen</refentrytitle><manvolnum>3</manvolnum></citerefentry>)
Packit Service 103f6b
            as <varname>fd</varname>, a pointer to the retrieved resources as
Packit Service 103f6b
            <varname>res</varname> and a pointer to the selected connector as
Packit Service 103f6b
            <varname>conn</varname>. It returns an integer smaller than 0 on
Packit Service 103f6b
            failure, otherwise, a valid CRTC id is returned.</para>
Packit Service 103f6b
Packit Service 103f6b
<programlisting>
Packit Service 103f6b
static int modeset_find_crtc(int fd, drmModeRes *res, drmModeConnector *conn)
Packit Service 103f6b
{
Packit Service 103f6b
	drmModeEncoder *enc;
Packit Service 103f6b
	unsigned int i, j;
Packit Service 103f6b
Packit Service 103f6b
	/* iterate all encoders of this connector */
Packit Service 103f6b
	for (i = 0; i < conn->count_encoders; ++i) {
Packit Service 103f6b
		enc = drmModeGetEncoder(fd, conn->encoders[i]);
Packit Service 103f6b
		if (!enc) {
Packit Service 103f6b
			/* cannot retrieve encoder, ignoring... */
Packit Service 103f6b
			continue;
Packit Service 103f6b
		}
Packit Service 103f6b
Packit Service 103f6b
		/* iterate all global CRTCs */
Packit Service 103f6b
		for (j = 0; j < res->count_crtcs; ++j) {
Packit Service 103f6b
			/* check whether this CRTC works with the encoder */
Packit Service 103f6b
			if (!(enc->possible_crtcs & (1 << j)))
Packit Service 103f6b
				continue;
Packit Service 103f6b
Packit Service 103f6b
Packit Service 103f6b
			/* Here you need to check that no other connector
Packit Service 103f6b
			 * currently uses the CRTC with id "crtc". If you intend
Packit Service 103f6b
			 * to drive one connector only, then you can skip this
Packit Service 103f6b
			 * step. Otherwise, simply scan your list of configured
Packit Service 103f6b
			 * connectors and CRTCs whether this CRTC is already
Packit Service 103f6b
			 * used. If it is, then simply continue the search here. */
Packit Service 103f6b
			if (res->crtcs[j] "is unused") {
Packit Service 103f6b
				drmModeFreeEncoder(enc);
Packit Service 103f6b
				return res->crtcs[j];
Packit Service 103f6b
			}
Packit Service 103f6b
		}
Packit Service 103f6b
Packit Service 103f6b
		drmModeFreeEncoder(enc);
Packit Service 103f6b
	}
Packit Service 103f6b
Packit Service 103f6b
	/* cannot find a suitable CRTC */
Packit Service 103f6b
	return -ENOENT;
Packit Service 103f6b
}
Packit Service 103f6b
</programlisting>
Packit Service 103f6b
Packit Service 103f6b
    </refsect2>
Packit Service 103f6b
Packit Service 103f6b
  </refsect1>
Packit Service 103f6b
Packit Service 103f6b
  <refsect1>
Packit Service 103f6b
    <title>Reporting Bugs</title>
Packit Service 103f6b
    <para>Bugs in this manual should be reported to
Packit Service 103f6b
      https://gitlab.freedesktop.org/mesa/drm/-/issues</para>
Packit Service 103f6b
  </refsect1>
Packit Service 103f6b
Packit Service 103f6b
  <refsect1>
Packit Service 103f6b
    <title>See Also</title>
Packit Service 103f6b
    <para>
Packit Service 103f6b
      <citerefentry><refentrytitle>drm</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drm-memory</refentrytitle><manvolnum>7</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetResources</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetConnector</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetEncoder</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetCrtc</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeSetCrtc</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetFB</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeAddFB</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeAddFB2</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeRmFB</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModePageFlip</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetPlaneResources</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeGetPlane</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeSetPlane</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeSetCursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmModeMoveCursor</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmSetMaster</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmAvailable</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmCheckModesettingSupported</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
Packit Service 103f6b
      <citerefentry><refentrytitle>drmOpen</refentrytitle><manvolnum>3</manvolnum></citerefentry>
Packit Service 103f6b
    </para>
Packit Service 103f6b
  </refsect1>
Packit Service 103f6b
</refentry>