123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- ===============================================
- drm/tegra NVIDIA Tegra GPU and display driver
- ===============================================
- NVIDIA Tegra SoCs support a set of display, graphics and video functions via
- the host1x controller. host1x supplies command streams, gathered from a push
- buffer provided directly by the CPU, to its clients via channels. Software,
- or blocks amongst themselves, can use syncpoints for synchronization.
- Up until, but not including, Tegra124 (aka Tegra K1) the drm/tegra driver
- supports the built-in GPU, comprised of the gr2d and gr3d engines. Starting
- with Tegra124 the GPU is based on the NVIDIA desktop GPU architecture and
- supported by the drm/nouveau driver.
- The drm/tegra driver supports NVIDIA Tegra SoC generations since Tegra20. It
- has three parts:
- - A host1x driver that provides infrastructure and access to the host1x
- services.
- - A KMS driver that supports the display controllers as well as a number of
- outputs, such as RGB, HDMI, DSI, and DisplayPort.
- - A set of custom userspace IOCTLs that can be used to submit jobs to the
- GPU and video engines via host1x.
- Driver Infrastructure
- =====================
- The various host1x clients need to be bound together into a logical device in
- order to expose their functionality to users. The infrastructure that supports
- this is implemented in the host1x driver. When a driver is registered with the
- infrastructure it provides a list of compatible strings specifying the devices
- that it needs. The infrastructure creates a logical device and scan the device
- tree for matching device nodes, adding the required clients to a list. Drivers
- for individual clients register with the infrastructure as well and are added
- to the logical host1x device.
- Once all clients are available, the infrastructure will initialize the logical
- device using a driver-provided function which will set up the bits specific to
- the subsystem and in turn initialize each of its clients.
- Similarly, when one of the clients is unregistered, the infrastructure will
- destroy the logical device by calling back into the driver, which ensures that
- the subsystem specific bits are torn down and the clients destroyed in turn.
- Host1x Infrastructure Reference
- -------------------------------
- .. kernel-doc:: include/linux/host1x.h
- .. kernel-doc:: drivers/gpu/host1x/bus.c
- :export:
- Host1x Syncpoint Reference
- --------------------------
- .. kernel-doc:: drivers/gpu/host1x/syncpt.c
- :export:
- KMS driver
- ==========
- The display hardware has remained mostly backwards compatible over the various
- Tegra SoC generations, up until Tegra186 which introduces several changes that
- make it difficult to support with a parameterized driver.
- Display Controllers
- -------------------
- Tegra SoCs have two display controllers, each of which can be associated with
- zero or more outputs. Outputs can also share a single display controller, but
- only if they run with compatible display timings. Two display controllers can
- also share a single framebuffer, allowing cloned configurations even if modes
- on two outputs don't match. A display controller is modelled as a CRTC in KMS
- terms.
- On Tegra186, the number of display controllers has been increased to three. A
- display controller can no longer drive all of the outputs. While two of these
- controllers can drive both DSI outputs and both SOR outputs, the third cannot
- drive any DSI.
- Windows
- ~~~~~~~
- A display controller controls a set of windows that can be used to composite
- multiple buffers onto the screen. While it is possible to assign arbitrary Z
- ordering to individual windows (by programming the corresponding blending
- registers), this is currently not supported by the driver. Instead, it will
- assume a fixed Z ordering of the windows (window A is the root window, that
- is, the lowest, while windows B and C are overlaid on top of window A). The
- overlay windows support multiple pixel formats and can automatically convert
- from YUV to RGB at scanout time. This makes them useful for displaying video
- content. In KMS, each window is modelled as a plane. Each display controller
- has a hardware cursor that is exposed as a cursor plane.
- Outputs
- -------
- The type and number of supported outputs varies between Tegra SoC generations.
- All generations support at least HDMI. While earlier generations supported the
- very simple RGB interfaces (one per display controller), recent generations no
- longer do and instead provide standard interfaces such as DSI and eDP/DP.
- Outputs are modelled as a composite encoder/connector pair.
- RGB/LVDS
- ~~~~~~~~
- This interface is no longer available since Tegra124. It has been replaced by
- the more standard DSI and eDP interfaces.
- HDMI
- ~~~~
- HDMI is supported on all Tegra SoCs. Starting with Tegra210, HDMI is provided
- by the versatile SOR output, which supports eDP, DP and HDMI. The SOR is able
- to support HDMI 2.0, though support for this is currently not merged.
- DSI
- ~~~
- Although Tegra has supported DSI since Tegra30, the controller has changed in
- several ways in Tegra114. Since none of the publicly available development
- boards prior to Dalmore (Tegra114) have made use of DSI, only Tegra114 and
- later are supported by the drm/tegra driver.
- eDP/DP
- ~~~~~~
- eDP was first introduced in Tegra124 where it was used to drive the display
- panel for notebook form factors. Tegra210 added support for full DisplayPort
- support, though this is currently not implemented in the drm/tegra driver.
- Userspace Interface
- ===================
- The userspace interface provided by drm/tegra allows applications to create
- GEM buffers, access and control syncpoints as well as submit command streams
- to host1x.
- GEM Buffers
- -----------
- The ``DRM_IOCTL_TEGRA_GEM_CREATE`` IOCTL is used to create a GEM buffer object
- with Tegra-specific flags. This is useful for buffers that should be tiled, or
- that are to be scanned out upside down (useful for 3D content).
- After a GEM buffer object has been created, its memory can be mapped by an
- application using the mmap offset returned by the ``DRM_IOCTL_TEGRA_GEM_MMAP``
- IOCTL.
- Syncpoints
- ----------
- The current value of a syncpoint can be obtained by executing the
- ``DRM_IOCTL_TEGRA_SYNCPT_READ`` IOCTL. Incrementing the syncpoint is achieved
- using the ``DRM_IOCTL_TEGRA_SYNCPT_INCR`` IOCTL.
- Userspace can also request blocking on a syncpoint. To do so, it needs to
- execute the ``DRM_IOCTL_TEGRA_SYNCPT_WAIT`` IOCTL, specifying the value of
- the syncpoint to wait for. The kernel will release the application when the
- syncpoint reaches that value or after a specified timeout.
- Command Stream Submission
- -------------------------
- Before an application can submit command streams to host1x it needs to open a
- channel to an engine using the ``DRM_IOCTL_TEGRA_OPEN_CHANNEL`` IOCTL. Client
- IDs are used to identify the target of the channel. When a channel is no
- longer needed, it can be closed using the ``DRM_IOCTL_TEGRA_CLOSE_CHANNEL``
- IOCTL. To retrieve the syncpoint associated with a channel, an application
- can use the ``DRM_IOCTL_TEGRA_GET_SYNCPT``.
- After opening a channel, submitting command streams is easy. The application
- writes commands into the memory backing a GEM buffer object and passes these
- to the ``DRM_IOCTL_TEGRA_SUBMIT`` IOCTL along with various other parameters,
- such as the syncpoints or relocations used in the job submission.
|