drm: Add API for capturing frame CRCs
Adds files and directories to debugfs for controlling and reading frame CRCs, per CRTC: dri/0/crtc-0/crc dri/0/crtc-0/crc/control dri/0/crtc-0/crc/data Drivers can implement the set_crc_source callback() in drm_crtc_funcs to start and stop generating frame CRCs and can add entries to the output by calling drm_crtc_add_crc_entry. v2: - Lots of good fixes suggested by Thierry. - Added documentation. - Changed the debugfs layout. - Moved to allocate the entries circular queue once when frame generation gets enabled for the first time. v3: - Use the control file just to select the source, and start and stop capture when the data file is opened and closed, respectively. - Make variable the number of CRC values per entry, per source. - Allocate entries queue each time we start capturing as now there isn't a fixed number of CRC values per entry. - Store the frame counter in the data file as a 8-digit hex number. - For sources that cannot provide useful frame numbers, place XXXXXXXX in the frame field. v4: - Build only if CONFIG_DEBUG_FS is enabled. - Use memdup_user_nul. - Consolidate calculation of the size of an entry in a helper. - Add 0x prefix to hex numbers in the data file. - Remove unnecessary snprintf and strlen usage in read callback. v5: - Made the crcs array in drm_crtc_crc_entry fixed-size - Lots of other smaller improvements suggested by Emil Velikov v7: - Move definition of drm_debugfs_crtc_crc_add to drm_internal.h v8: - Call debugfs_remove_recursive when we fail to create the minor device v9: - Register the debugfs directory for a crtc from drm_crtc_register_all() v10: - Don't let debugfs failures interrupt CRTC registration (Emil Velikov) v11: - Remove extra brace that broke compilation. Sorry! Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Acked-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1475767268-14379-3-git-send-email-tomeu.vizoso@collabora.com
This commit is contained in:

committed by
Daniel Vetter

parent
865afb1194
commit
9edbf1fa60
@@ -47,6 +47,7 @@
|
||||
#include <drm/drm_plane.h>
|
||||
#include <drm/drm_blend.h>
|
||||
#include <drm/drm_color_mgmt.h>
|
||||
#include <drm/drm_debugfs_crc.h>
|
||||
|
||||
struct drm_device;
|
||||
struct drm_mode_set;
|
||||
@@ -569,6 +570,30 @@ struct drm_crtc_funcs {
|
||||
* before data structures are torndown.
|
||||
*/
|
||||
void (*early_unregister)(struct drm_crtc *crtc);
|
||||
|
||||
/**
|
||||
* @set_crc_source:
|
||||
*
|
||||
* Changes the source of CRC checksums of frames at the request of
|
||||
* userspace, typically for testing purposes. The sources available are
|
||||
* specific of each driver and a %NULL value indicates that CRC
|
||||
* generation is to be switched off.
|
||||
*
|
||||
* When CRC generation is enabled, the driver should call
|
||||
* drm_crtc_add_crc_entry() at each frame, providing any information
|
||||
* that characterizes the frame contents in the crcN arguments, as
|
||||
* provided from the configured source. Drivers must accept a "auto"
|
||||
* source name that will select a default source for this CRTC.
|
||||
*
|
||||
* This callback is optional if the driver does not support any CRC
|
||||
* generation functionality.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
* 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int (*set_crc_source)(struct drm_crtc *crtc, const char *source,
|
||||
size_t *values_cnt);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -685,6 +710,22 @@ struct drm_crtc {
|
||||
* context.
|
||||
*/
|
||||
struct drm_modeset_acquire_ctx *acquire_ctx;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
/**
|
||||
* @debugfs_entry:
|
||||
*
|
||||
* Debugfs directory for this CRTC.
|
||||
*/
|
||||
struct dentry *debugfs_entry;
|
||||
|
||||
/**
|
||||
* @crc:
|
||||
*
|
||||
* Configuration settings of CRC capture.
|
||||
*/
|
||||
struct drm_crtc_crc crc;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user