Since we try and estimate how long we require to update the registers to perform a plane update, it is of vital importance that we measure the distribution of plane updates to better guide our estimate. If we underestimate how long it takes to perform the plane update, we may slip into the next scanout frame causing a tear. If we overestimate, we may unnecessarily delay the update to the next frame, causing visible jitter. Replace the warning that we exceed some arbitrary threshold for the vblank update with a histogram for debugfs. v2: Add a per-crtc debugfs entry so that the information is easier to extract when testing individual CRTC, and so that it can be reset before a test. v3: Flip the graph on its side; creates space to label the time axis. Updates: 4684 | 1us | | 4us |******** |********** 16us |*********** |***** 66us | | 262us | | 1ms | | 4ms | | 17ms | | Min update: 5918ns Max update: 54781ns Average update: 16628ns Overruns > 250us: 0 Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1982 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> #v2 Link: https://patchwork.freedesktop.org/patch/msgid/20201202212814.26320-1-chris@chris-wilson.co.uk
63 lines
2.0 KiB
C
63 lines
2.0 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2019 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __INTEL_SPRITE_H__
|
|
#define __INTEL_SPRITE_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include "intel_display.h"
|
|
|
|
struct drm_device;
|
|
struct drm_display_mode;
|
|
struct drm_file;
|
|
struct drm_i915_private;
|
|
struct intel_crtc_state;
|
|
struct intel_plane_state;
|
|
|
|
/*
|
|
* FIXME: We should instead only take spinlocks once for the entire update
|
|
* instead of once per mmio.
|
|
*/
|
|
#if IS_ENABLED(CONFIG_PROVE_LOCKING)
|
|
#define VBLANK_EVASION_TIME_US 250
|
|
#else
|
|
#define VBLANK_EVASION_TIME_US 100
|
|
#endif
|
|
|
|
int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode,
|
|
int usecs);
|
|
struct intel_plane *intel_sprite_plane_create(struct drm_i915_private *dev_priv,
|
|
enum pipe pipe, int plane);
|
|
int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
|
|
struct drm_file *file_priv);
|
|
void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state);
|
|
void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state);
|
|
int intel_plane_check_stride(const struct intel_plane_state *plane_state);
|
|
int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state);
|
|
int chv_plane_check_rotation(const struct intel_plane_state *plane_state);
|
|
struct intel_plane *
|
|
skl_universal_plane_create(struct drm_i915_private *dev_priv,
|
|
enum pipe pipe, enum plane_id plane_id);
|
|
|
|
static inline u8 icl_hdr_plane_mask(void)
|
|
{
|
|
return BIT(PLANE_PRIMARY) |
|
|
BIT(PLANE_SPRITE0) | BIT(PLANE_SPRITE1);
|
|
}
|
|
|
|
bool icl_is_nv12_y_plane(struct drm_i915_private *dev_priv,
|
|
enum plane_id plane_id);
|
|
bool icl_is_hdr_plane(struct drm_i915_private *dev_priv, enum plane_id plane_id);
|
|
|
|
int ivb_plane_min_cdclk(const struct intel_crtc_state *crtc_state,
|
|
const struct intel_plane_state *plane_state);
|
|
int hsw_plane_min_cdclk(const struct intel_crtc_state *crtc_state,
|
|
const struct intel_plane_state *plane_state);
|
|
int vlv_plane_min_cdclk(const struct intel_crtc_state *crtc_state,
|
|
const struct intel_plane_state *plane_state);
|
|
|
|
#endif /* __INTEL_SPRITE_H__ */
|