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:
Daniel Vetter 2019-12-04 11:19:33 +01:00
parent 0380c6846a
commit 6acc942c5e
3 changed files with 36 additions and 43 deletions

View File

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

View File

@ -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>`.

View File

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