Commit 6b5c029d authored by Paul Kocialkowski's avatar Paul Kocialkowski Committed by Maxime Ripard

drm/vc4: Add a debugfs entry to disable/enable the load tracker

In order to test whether the load tracker is working as expected, we
need the ability to compare the commit result with the underrun
indication. With the load tracker always enabled, commits that are
expected to trigger an underrun are always rejected, so userspace
cannot get the actual underrun indication from the hardware.

Add a debugfs entry to disable/enable the load tracker, so that a DRM
commit expected to trigger an underrun can go through with the load
tracker disabled. The underrun indication is then available to
userspace and can be checked against the commit result with the load
tracker enabled.
Signed-off-by: default avatarPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Reviewed-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@bootlin.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190220155124.25022-4-paul.kocialkowski@bootlin.com
parent 4686da83
...@@ -36,6 +36,15 @@ static const struct drm_info_list vc4_debugfs_list[] = { ...@@ -36,6 +36,15 @@ static const struct drm_info_list vc4_debugfs_list[] = {
int int
vc4_debugfs_init(struct drm_minor *minor) vc4_debugfs_init(struct drm_minor *minor)
{ {
struct vc4_dev *vc4 = to_vc4_dev(minor->dev);
struct dentry *dentry;
dentry = debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR,
minor->debugfs_root,
&vc4->load_tracker_enabled);
if (!dentry)
return -ENOMEM;
return drm_debugfs_create_files(vc4_debugfs_list, VC4_DEBUGFS_ENTRIES, return drm_debugfs_create_files(vc4_debugfs_list, VC4_DEBUGFS_ENTRIES,
minor->debugfs_root, minor); minor->debugfs_root, minor);
} }
...@@ -195,6 +195,9 @@ struct vc4_dev { ...@@ -195,6 +195,9 @@ struct vc4_dev {
int power_refcount; int power_refcount;
/* Set to true when the load tracker is active. */
bool load_tracker_enabled;
/* Mutex controlling the power refcount. */ /* Mutex controlling the power refcount. */
struct mutex power_lock; struct mutex power_lock;
......
...@@ -439,6 +439,10 @@ static int vc4_load_tracker_atomic_check(struct drm_atomic_state *state) ...@@ -439,6 +439,10 @@ static int vc4_load_tracker_atomic_check(struct drm_atomic_state *state)
} }
} }
/* Don't check the load when the tracker is disabled. */
if (!vc4->load_tracker_enabled)
return 0;
/* The absolute limit is 2Gbyte/sec, but let's take a margin to let /* The absolute limit is 2Gbyte/sec, but let's take a margin to let
* the system work when other blocks are accessing the memory. * the system work when other blocks are accessing the memory.
*/ */
...@@ -511,6 +515,11 @@ int vc4_kms_load(struct drm_device *dev) ...@@ -511,6 +515,11 @@ int vc4_kms_load(struct drm_device *dev)
struct vc4_load_tracker_state *load_state; struct vc4_load_tracker_state *load_state;
int ret; int ret;
/* Start with the load tracker enabled. Can be disabled through the
* debugfs load_tracker file.
*/
vc4->load_tracker_enabled = true;
sema_init(&vc4->async_modeset, 1); sema_init(&vc4->async_modeset, 1);
/* Set support for vblank irq fast disable, before drm_vblank_init() */ /* Set support for vblank irq fast disable, before drm_vblank_init() */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment