forked from Minki/linux
drm/doc: Drop :c:func: markup
Kernel sphinx has learned how to do that in
commit d74b0d31dd
Author: Jonathan Corbet <corbet@lwn.net>
Date: Thu Apr 25 07:55:07 2019 -0600
Docs: An initial automarkup extension for sphinx
Unfortunately it hasn't learned that yet for structures, so we're
stuck with the :c:type: noise for now still.
Reviewed-by: Thierry Reding <treding@nvidia.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191204101933.861169-1-daniel.vetter@ffwll.ch
This commit is contained in:
parent
0380c6846a
commit
6acc942c5e
@ -24,9 +24,9 @@ Driver Initialization
|
|||||||
At the core of every DRM driver is a :c:type:`struct drm_driver
|
At the core of every DRM driver is a :c:type:`struct drm_driver
|
||||||
<drm_driver>` structure. Drivers typically statically initialize
|
<drm_driver>` structure. Drivers typically statically initialize
|
||||||
a drm_driver structure, and then pass it to
|
a drm_driver structure, and then pass it to
|
||||||
:c:func:`drm_dev_alloc()` to allocate a device instance. After the
|
drm_dev_alloc() to allocate a device instance. After the
|
||||||
device instance is fully initialized it can be registered (which makes
|
device instance is fully initialized it can be registered (which makes
|
||||||
it accessible from userspace) using :c:func:`drm_dev_register()`.
|
it accessible from userspace) using drm_dev_register().
|
||||||
|
|
||||||
The :c:type:`struct drm_driver <drm_driver>` structure
|
The :c:type:`struct drm_driver <drm_driver>` structure
|
||||||
contains static information that describes the driver and features it
|
contains static information that describes the driver and features it
|
||||||
|
@ -3,7 +3,7 @@ Kernel Mode Setting (KMS)
|
|||||||
=========================
|
=========================
|
||||||
|
|
||||||
Drivers must initialize the mode setting core by calling
|
Drivers must initialize the mode setting core by calling
|
||||||
:c:func:`drm_mode_config_init()` on the DRM device. The function
|
drm_mode_config_init() on the DRM device. The function
|
||||||
initializes the :c:type:`struct drm_device <drm_device>`
|
initializes the :c:type:`struct drm_device <drm_device>`
|
||||||
mode_config field and never fails. Once done, mode configuration must
|
mode_config field and never fails. Once done, mode configuration must
|
||||||
be setup by initializing the following fields.
|
be setup by initializing the following fields.
|
||||||
@ -181,8 +181,7 @@ Setting`_). The somewhat surprising part here is that properties are not
|
|||||||
directly instantiated on each object, but free-standing mode objects themselves,
|
directly instantiated on each object, but free-standing mode objects themselves,
|
||||||
represented by :c:type:`struct drm_property <drm_property>`, which only specify
|
represented by :c:type:`struct drm_property <drm_property>`, which only specify
|
||||||
the type and value range of a property. Any given property can be attached
|
the type and value range of a property. Any given property can be attached
|
||||||
multiple times to different objects using :c:func:`drm_object_attach_property()
|
multiple times to different objects using drm_object_attach_property().
|
||||||
<drm_object_attach_property>`.
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_mode_object.h
|
.. kernel-doc:: include/drm/drm_mode_object.h
|
||||||
:internal:
|
:internal:
|
||||||
@ -274,7 +273,7 @@ Locking of atomic state structures is internally using :c:type:`struct
|
|||||||
drm_modeset_lock <drm_modeset_lock>`. As a general rule the locking shouldn't be
|
drm_modeset_lock <drm_modeset_lock>`. As a general rule the locking shouldn't be
|
||||||
exposed to drivers, instead the right locks should be automatically acquired by
|
exposed to drivers, instead the right locks should be automatically acquired by
|
||||||
any function that duplicates or peeks into a state, like e.g.
|
any function that duplicates or peeks into a state, like e.g.
|
||||||
:c:func:`drm_atomic_get_crtc_state()`. Locking only protects the software data
|
drm_atomic_get_crtc_state(). Locking only protects the software data
|
||||||
structure, ordering of committing state changes to hardware is sequenced using
|
structure, ordering of committing state changes to hardware is sequenced using
|
||||||
:c:type:`struct drm_crtc_commit <drm_crtc_commit>`.
|
:c:type:`struct drm_crtc_commit <drm_crtc_commit>`.
|
||||||
|
|
||||||
|
@ -149,19 +149,19 @@ struct :c:type:`struct drm_gem_object <drm_gem_object>`.
|
|||||||
To create a GEM object, a driver allocates memory for an instance of its
|
To create a GEM object, a driver allocates memory for an instance of its
|
||||||
specific GEM object type and initializes the embedded struct
|
specific GEM object type and initializes the embedded struct
|
||||||
:c:type:`struct drm_gem_object <drm_gem_object>` with a call
|
:c:type:`struct drm_gem_object <drm_gem_object>` with a call
|
||||||
to :c:func:`drm_gem_object_init()`. The function takes a pointer
|
to drm_gem_object_init(). The function takes a pointer
|
||||||
to the DRM device, a pointer to the GEM object and the buffer object
|
to the DRM device, a pointer to the GEM object and the buffer object
|
||||||
size in bytes.
|
size in bytes.
|
||||||
|
|
||||||
GEM uses shmem to allocate anonymous pageable memory.
|
GEM uses shmem to allocate anonymous pageable memory.
|
||||||
:c:func:`drm_gem_object_init()` will create an shmfs file of the
|
drm_gem_object_init() will create an shmfs file of the
|
||||||
requested size and store it into the struct :c:type:`struct
|
requested size and store it into the struct :c:type:`struct
|
||||||
drm_gem_object <drm_gem_object>` filp field. The memory is
|
drm_gem_object <drm_gem_object>` filp field. The memory is
|
||||||
used as either main storage for the object when the graphics hardware
|
used as either main storage for the object when the graphics hardware
|
||||||
uses system memory directly or as a backing store otherwise.
|
uses system memory directly or as a backing store otherwise.
|
||||||
|
|
||||||
Drivers are responsible for the actual physical pages allocation by
|
Drivers are responsible for the actual physical pages allocation by
|
||||||
calling :c:func:`shmem_read_mapping_page_gfp()` for each page.
|
calling shmem_read_mapping_page_gfp() for each page.
|
||||||
Note that they can decide to allocate pages when initializing the GEM
|
Note that they can decide to allocate pages when initializing the GEM
|
||||||
object, or to delay allocation until the memory is needed (for instance
|
object, or to delay allocation until the memory is needed (for instance
|
||||||
when a page fault occurs as a result of a userspace memory access or
|
when a page fault occurs as a result of a userspace memory access or
|
||||||
@ -170,20 +170,18 @@ when the driver needs to start a DMA transfer involving the memory).
|
|||||||
Anonymous pageable memory allocation is not always desired, for instance
|
Anonymous pageable memory allocation is not always desired, for instance
|
||||||
when the hardware requires physically contiguous system memory as is
|
when the hardware requires physically contiguous system memory as is
|
||||||
often the case in embedded devices. Drivers can create GEM objects with
|
often the case in embedded devices. Drivers can create GEM objects with
|
||||||
no shmfs backing (called private GEM objects) by initializing them with
|
no shmfs backing (called private GEM objects) by initializing them with a call
|
||||||
a call to :c:func:`drm_gem_private_object_init()` instead of
|
to drm_gem_private_object_init() instead of drm_gem_object_init(). Storage for
|
||||||
:c:func:`drm_gem_object_init()`. Storage for private GEM objects
|
private GEM objects must be managed by drivers.
|
||||||
must be managed by drivers.
|
|
||||||
|
|
||||||
GEM Objects Lifetime
|
GEM Objects Lifetime
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
All GEM objects are reference-counted by the GEM core. References can be
|
All GEM objects are reference-counted by the GEM core. References can be
|
||||||
acquired and release by :c:func:`calling drm_gem_object_get()` and
|
acquired and release by calling drm_gem_object_get() and drm_gem_object_put()
|
||||||
:c:func:`drm_gem_object_put()` respectively. The caller must hold the
|
respectively. The caller must hold the :c:type:`struct drm_device <drm_device>`
|
||||||
:c:type:`struct drm_device <drm_device>` struct_mutex lock when calling
|
struct_mutex lock when calling drm_gem_object_get(). As a convenience, GEM
|
||||||
:c:func:`drm_gem_object_get()`. As a convenience, GEM provides
|
provides drm_gem_object_put_unlocked() functions that can be called without
|
||||||
:c:func:`drm_gem_object_put_unlocked()` functions that can be called without
|
|
||||||
holding the lock.
|
holding the lock.
|
||||||
|
|
||||||
When the last reference to a GEM object is released the GEM core calls
|
When the last reference to a GEM object is released the GEM core calls
|
||||||
@ -194,7 +192,7 @@ free the GEM object and all associated resources.
|
|||||||
void (\*gem_free_object) (struct drm_gem_object \*obj); Drivers are
|
void (\*gem_free_object) (struct drm_gem_object \*obj); Drivers are
|
||||||
responsible for freeing all GEM object resources. This includes the
|
responsible for freeing all GEM object resources. This includes the
|
||||||
resources created by the GEM core, which need to be released with
|
resources created by the GEM core, which need to be released with
|
||||||
:c:func:`drm_gem_object_release()`.
|
drm_gem_object_release().
|
||||||
|
|
||||||
GEM Objects Naming
|
GEM Objects Naming
|
||||||
------------------
|
------------------
|
||||||
@ -210,13 +208,11 @@ to the GEM object in other standard or driver-specific ioctls. Closing a
|
|||||||
DRM file handle frees all its GEM handles and dereferences the
|
DRM file handle frees all its GEM handles and dereferences the
|
||||||
associated GEM objects.
|
associated GEM objects.
|
||||||
|
|
||||||
To create a handle for a GEM object drivers call
|
To create a handle for a GEM object drivers call drm_gem_handle_create(). The
|
||||||
:c:func:`drm_gem_handle_create()`. The function takes a pointer
|
function takes a pointer to the DRM file and the GEM object and returns a
|
||||||
to the DRM file and the GEM object and returns a locally unique handle.
|
locally unique handle. When the handle is no longer needed drivers delete it
|
||||||
When the handle is no longer needed drivers delete it with a call to
|
with a call to drm_gem_handle_delete(). Finally the GEM object associated with a
|
||||||
:c:func:`drm_gem_handle_delete()`. Finally the GEM object
|
handle can be retrieved by a call to drm_gem_object_lookup().
|
||||||
associated with a handle can be retrieved by a call to
|
|
||||||
:c:func:`drm_gem_object_lookup()`.
|
|
||||||
|
|
||||||
Handles don't take ownership of GEM objects, they only take a reference
|
Handles don't take ownership of GEM objects, they only take a reference
|
||||||
to the object that will be dropped when the handle is destroyed. To
|
to the object that will be dropped when the handle is destroyed. To
|
||||||
@ -258,7 +254,7 @@ The mmap system call can't be used directly to map GEM objects, as they
|
|||||||
don't have their own file handle. Two alternative methods currently
|
don't have their own file handle. Two alternative methods currently
|
||||||
co-exist to map GEM objects to userspace. The first method uses a
|
co-exist to map GEM objects to userspace. The first method uses a
|
||||||
driver-specific ioctl to perform the mapping operation, calling
|
driver-specific ioctl to perform the mapping operation, calling
|
||||||
:c:func:`do_mmap()` under the hood. This is often considered
|
do_mmap() under the hood. This is often considered
|
||||||
dubious, seems to be discouraged for new GEM-enabled drivers, and will
|
dubious, seems to be discouraged for new GEM-enabled drivers, and will
|
||||||
thus not be described here.
|
thus not be described here.
|
||||||
|
|
||||||
@ -267,23 +263,22 @@ The second method uses the mmap system call on the DRM file handle. void
|
|||||||
offset); DRM identifies the GEM object to be mapped by a fake offset
|
offset); DRM identifies the GEM object to be mapped by a fake offset
|
||||||
passed through the mmap offset argument. Prior to being mapped, a GEM
|
passed through the mmap offset argument. Prior to being mapped, a GEM
|
||||||
object must thus be associated with a fake offset. To do so, drivers
|
object must thus be associated with a fake offset. To do so, drivers
|
||||||
must call :c:func:`drm_gem_create_mmap_offset()` on the object.
|
must call drm_gem_create_mmap_offset() on the object.
|
||||||
|
|
||||||
Once allocated, the fake offset value must be passed to the application
|
Once allocated, the fake offset value must be passed to the application
|
||||||
in a driver-specific way and can then be used as the mmap offset
|
in a driver-specific way and can then be used as the mmap offset
|
||||||
argument.
|
argument.
|
||||||
|
|
||||||
The GEM core provides a helper method :c:func:`drm_gem_mmap()` to
|
The GEM core provides a helper method drm_gem_mmap() to
|
||||||
handle object mapping. The method can be set directly as the mmap file
|
handle object mapping. The method can be set directly as the mmap file
|
||||||
operation handler. It will look up the GEM object based on the offset
|
operation handler. It will look up the GEM object based on the offset
|
||||||
value and set the VMA operations to the :c:type:`struct drm_driver
|
value and set the VMA operations to the :c:type:`struct drm_driver
|
||||||
<drm_driver>` gem_vm_ops field. Note that
|
<drm_driver>` gem_vm_ops field. Note that drm_gem_mmap() doesn't map memory to
|
||||||
:c:func:`drm_gem_mmap()` doesn't map memory to userspace, but
|
userspace, but relies on the driver-provided fault handler to map pages
|
||||||
relies on the driver-provided fault handler to map pages individually.
|
individually.
|
||||||
|
|
||||||
To use :c:func:`drm_gem_mmap()`, drivers must fill the struct
|
To use drm_gem_mmap(), drivers must fill the struct :c:type:`struct drm_driver
|
||||||
:c:type:`struct drm_driver <drm_driver>` gem_vm_ops field
|
<drm_driver>` gem_vm_ops field with a pointer to VM operations.
|
||||||
with a pointer to VM operations.
|
|
||||||
|
|
||||||
The VM operations is a :c:type:`struct vm_operations_struct <vm_operations_struct>`
|
The VM operations is a :c:type:`struct vm_operations_struct <vm_operations_struct>`
|
||||||
made up of several fields, the more interesting ones being:
|
made up of several fields, the more interesting ones being:
|
||||||
@ -298,9 +293,8 @@ made up of several fields, the more interesting ones being:
|
|||||||
|
|
||||||
|
|
||||||
The open and close operations must update the GEM object reference
|
The open and close operations must update the GEM object reference
|
||||||
count. Drivers can use the :c:func:`drm_gem_vm_open()` and
|
count. Drivers can use the drm_gem_vm_open() and drm_gem_vm_close() helper
|
||||||
:c:func:`drm_gem_vm_close()` helper functions directly as open
|
functions directly as open and close handlers.
|
||||||
and close handlers.
|
|
||||||
|
|
||||||
The fault operation handler is responsible for mapping individual pages
|
The fault operation handler is responsible for mapping individual pages
|
||||||
to userspace when a page fault occurs. Depending on the memory
|
to userspace when a page fault occurs. Depending on the memory
|
||||||
@ -312,12 +306,12 @@ Drivers that want to map the GEM object upfront instead of handling page
|
|||||||
faults can implement their own mmap file operation handler.
|
faults can implement their own mmap file operation handler.
|
||||||
|
|
||||||
For platforms without MMU the GEM core provides a helper method
|
For platforms without MMU the GEM core provides a helper method
|
||||||
:c:func:`drm_gem_cma_get_unmapped_area`. The mmap() routines will call
|
drm_gem_cma_get_unmapped_area(). The mmap() routines will call this to get a
|
||||||
this to get a proposed address for the mapping.
|
proposed address for the mapping.
|
||||||
|
|
||||||
To use :c:func:`drm_gem_cma_get_unmapped_area`, drivers must fill the
|
To use drm_gem_cma_get_unmapped_area(), drivers must fill the struct
|
||||||
struct :c:type:`struct file_operations <file_operations>` get_unmapped_area
|
:c:type:`struct file_operations <file_operations>` get_unmapped_area field with
|
||||||
field with a pointer on :c:func:`drm_gem_cma_get_unmapped_area`.
|
a pointer on drm_gem_cma_get_unmapped_area().
|
||||||
|
|
||||||
More detailed information about get_unmapped_area can be found in
|
More detailed information about get_unmapped_area can be found in
|
||||||
Documentation/nommu-mmap.txt
|
Documentation/nommu-mmap.txt
|
||||||
|
Loading…
Reference in New Issue
Block a user