From: Thomas Zimmermann <tzimmermann@suse.de>
To: airlied@linux.ie, daniel@ffwll.ch, kraxel@redhat.com,
maarten.lankhorst@linux.intel.com, mripard@kernel.org,
hdegoede@redhat.com, david@lechnology.com, noralf@tronnes.org,
sean@poorly.run, oleksandr_andrushchenko@epam.com,
sam@ravnborg.org, laurent.pinchart@ideasonboard.com,
emil.velikov@collabora.com
Cc: xen-devel@lists.xenproject.org,
Thomas Zimmermann <tzimmermann@suse.de>,
dri-devel@lists.freedesktop.org,
virtualization@lists.linux-foundation.org
Subject: [PATCH v4 01/15] drm: Initialize struct drm_crtc_state.no_vblank from device settings
Date: Thu, 23 Jan 2020 10:21:09 +0100 [thread overview]
Message-ID: <20200123092123.28368-2-tzimmermann@suse.de> (raw)
In-Reply-To: <20200123092123.28368-1-tzimmermann@suse.de>
At the end of a commit, atomic helpers can generate a VBLANK event
automatically. Originally implemented for writeback connectors, the
functionality can be used by any driver and/or hardware without proper
VBLANK interrupt.
The patch updates the documentation to make this behaviour official:
settings struct drm_crtc_state.no_vblank to true enables automatic
VBLANK generation.
The new interface drm_dev_has_vblank() returns true if vblanking has
been initialized for a device, or false otherwise. This function will
be useful when initializing no_vblank in the CRTC state.
Atomic modesetting helper set the initial value of no_vblank in
drm_atomic_helper_check_modeset(). If vblanking has been initialized
for a device, no_blank is disabled. Otherwise it's enabled. Hence,
atomic helpers will automatically send out VBLANK events with any
driver that did not initialize vblanking.
v4:
* replace drm_crtc_has_vblank() with drm_dev_has_vblank()
* add drm_dev_crtc_has_vblank() in this patch
* move driver changes into separate patches
v3:
* squash all related changes patches into this patch
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
drivers/gpu/drm/drm_atomic_helper.c | 10 +++++++++-
drivers/gpu/drm/drm_vblank.c | 28 ++++++++++++++++++++++++++++
include/drm/drm_crtc.h | 27 ++++++++++++++++++++-------
include/drm/drm_simple_kms_helper.h | 7 +++++--
include/drm/drm_vblank.h | 1 +
5 files changed, 63 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index 4511c2e07bb9..d7b73cd89b79 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -583,6 +583,7 @@ mode_valid(struct drm_atomic_state *state)
* &drm_crtc_state.connectors_changed is set when a connector is added or
* removed from the CRTC. &drm_crtc_state.active_changed is set when
* &drm_crtc_state.active changes, which is used for DPMS.
+ * &drm_crtc_state.no_vblank is set from the result of drm_dev_has_vblank().
* See also: drm_atomic_crtc_needs_modeset()
*
* IMPORTANT:
@@ -649,6 +650,11 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
return -EINVAL;
}
+
+ if (drm_dev_has_vblank(dev))
+ new_crtc_state->no_vblank = false;
+ else
+ new_crtc_state->no_vblank = true;
}
ret = handle_conflicting_encoders(state, false);
@@ -2215,7 +2221,9 @@ EXPORT_SYMBOL(drm_atomic_helper_wait_for_dependencies);
* when a job is queued, and any change to the pipeline that does not touch the
* connector is leading to timeouts when calling
* drm_atomic_helper_wait_for_vblanks() or
- * drm_atomic_helper_wait_for_flip_done().
+ * drm_atomic_helper_wait_for_flip_done(). In addition to writeback
+ * connectors, this function can also fake VBLANK events for CRTCs without
+ * VBLANK interrupt.
*
* This is part of the atomic helper support for nonblocking commits, see
* drm_atomic_helper_setup_commit() for an overview.
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 1659b13b178c..433dec6230b1 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -69,6 +69,12 @@
* &drm_driver.max_vblank_count. In that case the vblank core only disables the
* vblanks after a timer has expired, which can be configured through the
* ``vblankoffdelay`` module parameter.
+ *
+ * Drivers for hardware without support for vertical-blanking interrupts
+ * must not call drm_vblank_init(). For such drivers, atomic helpers will
+ * automatically generate vblank events as part of the display update. This
+ * functionality also can be controlled by the driver by enabling and disabling
+ * struct drm_crtc_state.no_vblank.
*/
/* Retry timestamp calculation up to 3 times to satisfy
@@ -501,6 +507,28 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
}
EXPORT_SYMBOL(drm_vblank_init);
+/**
+ * drm_dev_has_vblank - test if vblanking has been initialized for
+ * a device
+ * @dev: the device
+ *
+ * Drivers may call this function to test if vblank support is
+ * initialized for a device. For most hardware this means that vblanking
+ * can also be enabled.
+ *
+ * Atomic helpers use this function to initialize
+ * &drm_crtc_state.no_vblank. See also drm_atomic_helper_check_modeset().
+ *
+ * Returns:
+ * True if vblanking has been initialized for the given device, false
+ * otherwise.
+ */
+bool drm_dev_has_vblank(const struct drm_device *dev)
+{
+ return dev->num_crtcs != 0;
+}
+EXPORT_SYMBOL(drm_dev_has_vblank);
+
/**
* drm_crtc_vblank_waitqueue - get vblank waitqueue for the CRTC
* @crtc: which CRTC's vblank waitqueue to retrieve
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 5e9b15a0e8c5..5363e31c9abe 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -174,12 +174,22 @@ struct drm_crtc_state {
* @no_vblank:
*
* Reflects the ability of a CRTC to send VBLANK events. This state
- * usually depends on the pipeline configuration, and the main usuage
- * is CRTCs feeding a writeback connector operating in oneshot mode.
- * In this case the VBLANK event is only generated when a job is queued
- * to the writeback connector, and we want the core to fake VBLANK
- * events when this part of the pipeline hasn't changed but others had
- * or when the CRTC and connectors are being disabled.
+ * usually depends on the pipeline configuration. If set to true, DRM
+ * atomic helpers will sendout a fake VBLANK event during display
+ * updates.
+ *
+ * One usage is for drivers and/or hardware without support for VBLANK
+ * interrupts. Such drivers typically do not initialize vblanking
+ * (i.e., call drm_vblank_init() wit the number of CRTCs). For CRTCs
+ * without initialized vblanking, the field is initialized to true and
+ * a VBLANK event will be send out on each update of the display
+ * pipeline.
+ *
+ * Another usage is CRTCs feeding a writeback connector operating in
+ * oneshot mode. In this case the VBLANK event is only generated when
+ * a job is queued to the writeback connector, and we want the core
+ * to fake VBLANK events when this part of the pipeline hasn't changed
+ * but others had or when the CRTC and connectors are being disabled.
*
* __drm_atomic_helper_crtc_duplicate_state() will not reset the value
* from the current state, the CRTC driver is then responsible for
@@ -335,7 +345,10 @@ struct drm_crtc_state {
* - Events for disabled CRTCs are not allowed, and drivers can ignore
* that case.
*
- * This can be handled by the drm_crtc_send_vblank_event() function,
+ * For very simple hardware without VBLANK interrupt, enabling
+ * &struct drm_crtc_state.no_vblank makes DRM's atomic commit helpers
+ * send the event at an appropriate time. For more complex hardware this
+ * can be handled by the drm_crtc_send_vblank_event() function,
* which the driver should call on the provided event upon completion of
* the atomic commit. Note that if the driver supports vblank signalling
* and timestamping the vblank counters and timestamps must agree with
diff --git a/include/drm/drm_simple_kms_helper.h b/include/drm/drm_simple_kms_helper.h
index 15afee9cf049..e253ba7bea9d 100644
--- a/include/drm/drm_simple_kms_helper.h
+++ b/include/drm/drm_simple_kms_helper.h
@@ -100,8 +100,11 @@ struct drm_simple_display_pipe_funcs {
* This is the function drivers should submit the
* &drm_pending_vblank_event from. Using either
* drm_crtc_arm_vblank_event(), when the driver supports vblank
- * interrupt handling, or drm_crtc_send_vblank_event() directly in case
- * the hardware lacks vblank support entirely.
+ * interrupt handling, or drm_crtc_send_vblank_event() for more
+ * complex case. In case the hardware lacks vblank support entirely,
+ * drivers can set &struct drm_crtc_state.no_vblank in
+ * &struct drm_simple_display_pipe_funcs.check and let DRM's
+ * atomic helper fake a vblank event.
*/
void (*update)(struct drm_simple_display_pipe *pipe,
struct drm_plane_state *old_plane_state);
diff --git a/include/drm/drm_vblank.h b/include/drm/drm_vblank.h
index c16c44052b3d..94275e93fd27 100644
--- a/include/drm/drm_vblank.h
+++ b/include/drm/drm_vblank.h
@@ -206,6 +206,7 @@ struct drm_vblank_crtc {
};
int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs);
+bool drm_dev_has_vblank(const struct drm_device *dev);
u64 drm_crtc_vblank_count(struct drm_crtc *crtc);
u64 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
ktime_t *vblanktime);
--
2.24.1
next prev parent reply other threads:[~2020-01-23 9:21 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-23 9:21 [PATCH v4 00/15] Use no_vblank property for drivers without VBLANK Thomas Zimmermann
2020-01-23 9:21 ` Thomas Zimmermann [this message]
2020-01-27 9:40 ` [PATCH v4 01/15] drm: Initialize struct drm_crtc_state.no_vblank from device settings Daniel Vetter
2020-01-27 18:12 ` Emil Velikov
2020-01-27 18:42 ` Thomas Zimmermann
2020-01-28 15:14 ` Daniel Vetter
2020-01-23 9:21 ` [PATCH v4 02/15] drm/arc: Remove sending of vblank event Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 03/15] drm/ast: Don't set struct drm_crtc_state.no_vblank explictly Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 04/15] drm/bochs: Remove sending of vblank event Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 05/15] drm/cirrus: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 06/15] drm/gm12u320: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 07/15] drm/ili9225: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 08/15] drm/mipi-dbi: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 09/15] drm/qxl: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 10/15] drm/repaper: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 11/15] drm/st7586: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 12/15] drm/udl: Don't set struct drm_crtc_state.no_vblank explictly Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 13/15] drm/vboxvideo: Remove sending of vblank event Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 14/15] drm/virtio: " Thomas Zimmermann
2020-01-23 9:21 ` [PATCH v4 15/15] drm/xen: Explicitly disable automatic " Thomas Zimmermann
2020-01-27 9:47 ` Daniel Vetter
2020-01-27 9:53 ` Oleksandr Andrushchenko
2020-01-27 11:59 ` Thomas Zimmermann
2020-01-27 12:10 ` Oleksandr Andrushchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200123092123.28368-2-tzimmermann@suse.de \
--to=tzimmermann@suse.de \
--cc=airlied@linux.ie \
--cc=daniel@ffwll.ch \
--cc=david@lechnology.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=emil.velikov@collabora.com \
--cc=hdegoede@redhat.com \
--cc=kraxel@redhat.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=noralf@tronnes.org \
--cc=oleksandr_andrushchenko@epam.com \
--cc=sam@ravnborg.org \
--cc=sean@poorly.run \
--cc=virtualization@lists.linux-foundation.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).