drm: Update connector documentation
- Shuffle docs from drm-kms.rst into the structure docs where it makes sense. - Put the remaining bits into a new overview section. One thing I've changed is around probing: Old docs says that you _must_ use the probe helpers, which isn't correct. Helpers are always optional. v2: Review from Sean. Cc: Sean Paul <seanpaul@chromium.org> Reviewed-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1471034937-651-17-git-send-email-daniel.vetter@ffwll.ch
This commit is contained in:
Родитель
e15c8f4b6e
Коммит
ae2a6da876
|
@ -110,8 +110,14 @@ Display Modes Function Reference
|
|||
.. kernel-doc:: drivers/gpu/drm/drm_modes.c
|
||||
:export:
|
||||
|
||||
Connector Display Sink Abstraction
|
||||
==================================
|
||||
Connector Abstraction
|
||||
=====================
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/drm_connector.c
|
||||
:doc: overview
|
||||
|
||||
Connector Functions Reference
|
||||
-----------------------------
|
||||
|
||||
.. kernel-doc:: include/drm/drm_connector.h
|
||||
:internal:
|
||||
|
@ -232,166 +238,6 @@ encoders unattached at initialization time. Applications (or the fbdev
|
|||
compatibility layer when implemented) are responsible for attaching the
|
||||
encoders they want to use to a CRTC.
|
||||
|
||||
Connectors (:c:type:`struct drm_connector <drm_connector>`)
|
||||
-----------------------------------------------------------
|
||||
|
||||
A connector is the final destination for pixel data on a device, and
|
||||
usually connects directly to an external display device like a monitor
|
||||
or laptop panel. A connector can only be attached to one encoder at a
|
||||
time. The connector is also the structure where information about the
|
||||
attached display is kept, so it contains fields for display data, EDID
|
||||
data, DPMS & connection status, and information about modes supported on
|
||||
the attached displays.
|
||||
|
||||
Connector Initialization
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Finally a KMS driver must create, initialize, register and attach at
|
||||
least one :c:type:`struct drm_connector <drm_connector>`
|
||||
instance. The instance is created as other KMS objects and initialized
|
||||
by setting the following fields.
|
||||
|
||||
interlace_allowed
|
||||
Whether the connector can handle interlaced modes.
|
||||
|
||||
doublescan_allowed
|
||||
Whether the connector can handle doublescan.
|
||||
|
||||
display_info
|
||||
Display information is filled from EDID information when a display
|
||||
is detected. For non hot-pluggable displays such as flat panels in
|
||||
embedded systems, the driver should initialize the
|
||||
display_info.width_mm and display_info.height_mm fields with the
|
||||
physical size of the display.
|
||||
|
||||
polled
|
||||
Connector polling mode, a combination of
|
||||
|
||||
DRM_CONNECTOR_POLL_HPD
|
||||
The connector generates hotplug events and doesn't need to be
|
||||
periodically polled. The CONNECT and DISCONNECT flags must not
|
||||
be set together with the HPD flag.
|
||||
|
||||
DRM_CONNECTOR_POLL_CONNECT
|
||||
Periodically poll the connector for connection.
|
||||
|
||||
DRM_CONNECTOR_POLL_DISCONNECT
|
||||
Periodically poll the connector for disconnection.
|
||||
|
||||
Set to 0 for connectors that don't support connection status
|
||||
discovery.
|
||||
|
||||
The connector is then registered with a call to
|
||||
:c:func:`drm_connector_init()` with a pointer to the connector
|
||||
functions and a connector type, and exposed through sysfs with a call to
|
||||
:c:func:`drm_connector_register()`.
|
||||
|
||||
Supported connector types are
|
||||
|
||||
- DRM_MODE_CONNECTOR_VGA
|
||||
- DRM_MODE_CONNECTOR_DVII
|
||||
- DRM_MODE_CONNECTOR_DVID
|
||||
- DRM_MODE_CONNECTOR_DVIA
|
||||
- DRM_MODE_CONNECTOR_Composite
|
||||
- DRM_MODE_CONNECTOR_SVIDEO
|
||||
- DRM_MODE_CONNECTOR_LVDS
|
||||
- DRM_MODE_CONNECTOR_Component
|
||||
- DRM_MODE_CONNECTOR_9PinDIN
|
||||
- DRM_MODE_CONNECTOR_DisplayPort
|
||||
- DRM_MODE_CONNECTOR_HDMIA
|
||||
- DRM_MODE_CONNECTOR_HDMIB
|
||||
- DRM_MODE_CONNECTOR_TV
|
||||
- DRM_MODE_CONNECTOR_eDP
|
||||
- DRM_MODE_CONNECTOR_VIRTUAL
|
||||
|
||||
Connectors must be attached to an encoder to be used. For devices that
|
||||
map connectors to encoders 1:1, the connector should be attached at
|
||||
initialization time with a call to
|
||||
:c:func:`drm_mode_connector_attach_encoder()`. The driver must
|
||||
also set the :c:type:`struct drm_connector <drm_connector>`
|
||||
encoder field to point to the attached encoder.
|
||||
|
||||
Finally, drivers must initialize the connectors state change detection
|
||||
with a call to :c:func:`drm_kms_helper_poll_init()`. If at least
|
||||
one connector is pollable but can't generate hotplug interrupts
|
||||
(indicated by the DRM_CONNECTOR_POLL_CONNECT and
|
||||
DRM_CONNECTOR_POLL_DISCONNECT connector flags), a delayed work will
|
||||
automatically be queued to periodically poll for changes. Connectors
|
||||
that can generate hotplug interrupts must be marked with the
|
||||
DRM_CONNECTOR_POLL_HPD flag instead, and their interrupt handler must
|
||||
call :c:func:`drm_helper_hpd_irq_event()`. The function will
|
||||
queue a delayed work to check the state of all connectors, but no
|
||||
periodic polling will be done.
|
||||
|
||||
Connector Operations
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Note**
|
||||
|
||||
Unless otherwise state, all operations are mandatory.
|
||||
|
||||
DPMS
|
||||
''''
|
||||
|
||||
void (\*dpms)(struct drm_connector \*connector, int mode);
|
||||
The DPMS operation sets the power state of a connector. The mode
|
||||
argument is one of
|
||||
|
||||
- DRM_MODE_DPMS_ON
|
||||
|
||||
- DRM_MODE_DPMS_STANDBY
|
||||
|
||||
- DRM_MODE_DPMS_SUSPEND
|
||||
|
||||
- DRM_MODE_DPMS_OFF
|
||||
|
||||
In all but DPMS_ON mode the encoder to which the connector is attached
|
||||
should put the display in low-power mode by driving its signals
|
||||
appropriately. If more than one connector is attached to the encoder
|
||||
care should be taken not to change the power state of other displays as
|
||||
a side effect. Low-power mode should be propagated to the encoders and
|
||||
CRTCs when all related connectors are put in low-power mode.
|
||||
|
||||
Modes
|
||||
'''''
|
||||
|
||||
int (\*fill_modes)(struct drm_connector \*connector, uint32_t
|
||||
max_width, uint32_t max_height);
|
||||
Fill the mode list with all supported modes for the connector. If the
|
||||
``max_width`` and ``max_height`` arguments are non-zero, the
|
||||
implementation must ignore all modes wider than ``max_width`` or higher
|
||||
than ``max_height``.
|
||||
|
||||
The connector must also fill in this operation its display_info
|
||||
width_mm and height_mm fields with the connected display physical size
|
||||
in millimeters. The fields should be set to 0 if the value isn't known
|
||||
or is not applicable (for instance for projector devices).
|
||||
|
||||
Connection Status
|
||||
'''''''''''''''''
|
||||
|
||||
The connection status is updated through polling or hotplug events when
|
||||
supported (see ?). The status value is reported to userspace through
|
||||
ioctls and must not be used inside the driver, as it only gets
|
||||
initialized by a call to :c:func:`drm_mode_getconnector()` from
|
||||
userspace.
|
||||
|
||||
enum drm_connector_status (\*detect)(struct drm_connector
|
||||
\*connector, bool force);
|
||||
Check to see if anything is attached to the connector. The ``force``
|
||||
parameter is set to false whilst polling or to true when checking the
|
||||
connector due to user request. ``force`` can be used by the driver to
|
||||
avoid expensive, destructive operations during automated probing.
|
||||
|
||||
Return connector_status_connected if something is connected to the
|
||||
connector, connector_status_disconnected if nothing is connected and
|
||||
connector_status_unknown if the connection state isn't known.
|
||||
|
||||
Drivers should only return connector_status_connected if the
|
||||
connection status has really been probed as connected. Connectors that
|
||||
can't detect the connection status, or failed connection status probes,
|
||||
should return connector_status_unknown.
|
||||
|
||||
Cleanup
|
||||
-------
|
||||
|
||||
|
|
|
@ -27,6 +27,37 @@
|
|||
#include "drm_crtc_internal.h"
|
||||
#include "drm_internal.h"
|
||||
|
||||
/**
|
||||
* DOC: overview
|
||||
*
|
||||
* In DRM connectors are the general abstraction for display sinks, and include
|
||||
* als fixed panels or anything else that can display pixels in some form. As
|
||||
* opposed to all other KMS objects representing hardware (like CRTC, encoder or
|
||||
* plane abstractions) connectors can be hotplugged and unplugged at runtime.
|
||||
* Hence they are reference-counted using drm_connector_reference() and
|
||||
* drm_connector_unreference().
|
||||
*
|
||||
* KMS driver must create, initialize, register and attach at a struct
|
||||
* &drm_connector for each such sink. The instance is created as other KMS
|
||||
* objects and initialized by setting the following fields.
|
||||
*
|
||||
* The connector is then registered with a call to drm_connector_init() with a
|
||||
* pointer to the connector functions and a connector type, and exposed through
|
||||
* sysfs with a call to drm_connector_register().
|
||||
*
|
||||
* Connectors must be attached to an encoder to be used. For devices that map
|
||||
* connectors to encoders 1:1, the connector should be attached at
|
||||
* initialization time with a call to drm_mode_connector_attach_encoder(). The
|
||||
* driver must also set the struct &drm_connector encoder field to point to the
|
||||
* attached encoder.
|
||||
*
|
||||
* For connectors which are not fixed (like built-in panels) the driver needs to
|
||||
* support hotplug notifications. The simplest way to do that is by using the
|
||||
* probe helpers, see drm_kms_helper_poll_init() for connectors which don't have
|
||||
* hardware support for hotplug interrupts. Connectors with hardware hotplug
|
||||
* support can instead use e.g. drm_helper_hpd_irq_event().
|
||||
*/
|
||||
|
||||
struct drm_conn_prop_enum_list {
|
||||
int type;
|
||||
const char *name;
|
||||
|
@ -77,7 +108,7 @@ void drm_connector_ida_destroy(void)
|
|||
* drm_connector_get_cmdline_mode - reads the user's cmdline mode
|
||||
* @connector: connector to quwery
|
||||
*
|
||||
* The kernel supports per-connector configration of its consoles through
|
||||
* The kernel supports per-connector configuration of its consoles through
|
||||
* use of the video= parameter. This function parses that option and
|
||||
* extracts the user's specified mode (or enable/disable status) for a
|
||||
* particular connector. This is typically only used during the early fbdev
|
||||
|
|
|
@ -42,9 +42,36 @@ enum drm_connector_force {
|
|||
DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
|
||||
};
|
||||
|
||||
/**
|
||||
* enum drm_connector_status - status for a &drm_connector
|
||||
*
|
||||
* This enum is used to track the connector status. There are no separate
|
||||
* #defines for the uapi!
|
||||
*/
|
||||
enum drm_connector_status {
|
||||
/**
|
||||
* @connector_status_connected: The connector is definitely connected to
|
||||
* a sink device, and can be enabled.
|
||||
*/
|
||||
connector_status_connected = 1,
|
||||
/**
|
||||
* @connector_status_disconnected: The connector isn't connected to a
|
||||
* sink device which can be autodetect. For digital outputs like DP or
|
||||
* HDMI (which can be realiable probed) this means there's really
|
||||
* nothing there. It is driver-dependent whether a connector with this
|
||||
* status can be lit up or not.
|
||||
*/
|
||||
connector_status_disconnected = 2,
|
||||
/**
|
||||
* @connector_status_unknown: The connector's status could not be
|
||||
* reliably detected. This happens when probing would either cause
|
||||
* flicker (like load-detection when the connector is in use), or when a
|
||||
* hardware resource isn't available (like when load-detection needs a
|
||||
* free CRTC). It should be possible to light up the connector with one
|
||||
* of the listed fallback modes. For default configuration userspace
|
||||
* should only try to light up connectors with unknown status when
|
||||
* there's not connector with @connector_status_connected.
|
||||
*/
|
||||
connector_status_unknown = 3,
|
||||
};
|
||||
|
||||
|
@ -416,11 +443,9 @@ struct drm_cmdline_mode {
|
|||
* @modes: modes available on this connector (from fill_modes() + user)
|
||||
* @status: one of the drm_connector_status enums (connected, not, or unknown)
|
||||
* @probed_modes: list of modes derived directly from the display
|
||||
* @display_info: information about attached display (e.g. from EDID)
|
||||
* @funcs: connector control functions
|
||||
* @edid_blob_ptr: DRM property containing EDID if present
|
||||
* @properties: property tracking for this connector
|
||||
* @polled: a DRM_CONNECTOR_POLL_<foo> value for core driven polling
|
||||
* @dpms: current dpms state
|
||||
* @helper_private: mid-layer private data
|
||||
* @cmdline_mode: mode line parsed from the kernel cmdline for this connector
|
||||
|
@ -485,6 +510,13 @@ struct drm_connector {
|
|||
/* these are modes added by probing with DDC or the BIOS */
|
||||
struct list_head probed_modes;
|
||||
|
||||
/**
|
||||
* @display_info: Display information is filled from EDID information
|
||||
* when a display is detected. For non hot-pluggable displays such as
|
||||
* flat panels in embedded systems, the driver should initialize the
|
||||
* display_info.width_mm and display_info.height_mm fields with the
|
||||
* physical size of the display.
|
||||
*/
|
||||
struct drm_display_info display_info;
|
||||
const struct drm_connector_funcs *funcs;
|
||||
|
||||
|
@ -519,7 +551,26 @@ struct drm_connector {
|
|||
/* DACs should rarely do this without a lot of testing */
|
||||
#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
|
||||
|
||||
uint8_t polled; /* DRM_CONNECTOR_POLL_* */
|
||||
/**
|
||||
* @polled:
|
||||
*
|
||||
* Connector polling mode, a combination of
|
||||
*
|
||||
* DRM_CONNECTOR_POLL_HPD
|
||||
* The connector generates hotplug events and doesn't need to be
|
||||
* periodically polled. The CONNECT and DISCONNECT flags must not
|
||||
* be set together with the HPD flag.
|
||||
*
|
||||
* DRM_CONNECTOR_POLL_CONNECT
|
||||
* Periodically poll the connector for connection.
|
||||
*
|
||||
* DRM_CONNECTOR_POLL_DISCONNECT
|
||||
* Periodically poll the connector for disconnection.
|
||||
*
|
||||
* Set to 0 for connectors that don't support connection status
|
||||
* discovery.
|
||||
*/
|
||||
uint8_t polled;
|
||||
|
||||
/* requested DPMS state */
|
||||
int dpms;
|
||||
|
|
Загрузка…
Ссылка в новой задаче