drm/vblank: Switch drm_driver->get_vblank_timestamp to return a bool
There's really no reason for anything more: - Calling this while the crtc vblank stuff isn't set up is a driver bug. Those places alrready DRM_ERROR. - Calling this when the crtc is off is either a driver bug (calling drm_crtc_handle_vblank at the wrong time) or a core bug (for anything else). Again, we DRM_ERROR. - EINVAL is checked at higher levels already, and if we'd use struct drm_crtc * instead of (dev, pipe) it would be real obvious that those are again core bugs. The only valid failure mode is crap hardware that couldn't sample a useful timestamp, to ask the core to just grab a not-so-accurate timestamp. Bool is perfectly fine for that. v2: Also fix up the one caller, I lost that in the shuffling (Jani). v3: Fixup commit message (Neil). Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Mario Kleiner <mario.kleiner@tuebingen.mpg.de> Cc: Eric Anholt <eric@anholt.net> Cc: Rob Clark <robdclark@gmail.com> Cc: linux-arm-msm@vger.kernel.org Cc: freedreno@lists.freedesktop.org Cc: Alex Deucher <alexander.deucher@amd.com> Cc: Christian König <christian.koenig@amd.com> Cc: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com> Acked-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170509140329.24114-1-daniel.vetter@ffwll.ch
This commit is contained in:
parent
315f0242aa
commit
d673c02c4b
|
@ -1910,10 +1910,10 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon);
|
|||
u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
|
||||
int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
|
||||
void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
|
||||
int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
bool amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
long amdgpu_kms_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
|
|
|
@ -945,19 +945,19 @@ void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe)
|
|||
*
|
||||
* Gets the timestamp on the requested crtc based on the
|
||||
* scanout position. (all asics).
|
||||
* Returns postive status flags on success, negative error on failure.
|
||||
* Returns true on success, false on failure.
|
||||
*/
|
||||
int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
bool amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
|
||||
if (pipe >= dev->num_crtcs) {
|
||||
DRM_ERROR("Invalid crtc %u\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get associated drm_crtc: */
|
||||
|
@ -966,7 +966,7 @@ int amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
|||
/* This can occur on driver load if some component fails to
|
||||
* initialize completely and driver is unloaded */
|
||||
DRM_ERROR("Uninitialized crtc %d\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Helper routine in DRM core does all the work: */
|
||||
|
|
|
@ -724,43 +724,32 @@ EXPORT_SYMBOL(drm_calc_timestamping_constants);
|
|||
* active. Higher level code is expected to handle this.
|
||||
*
|
||||
* Returns:
|
||||
* Negative value on error, failure or if not supported in current
|
||||
* video mode:
|
||||
*
|
||||
* -EINVAL Invalid CRTC.
|
||||
* -EAGAIN Temporary unavailable, e.g., called before initial modeset.
|
||||
* -ENOTSUPP Function not supported in current display mode.
|
||||
* -EIO Failed, e.g., due to failed scanout position query.
|
||||
*
|
||||
* Returns or'ed positive status flags on success:
|
||||
*
|
||||
* DRM_VBLANKTIME_SCANOUTPOS_METHOD - Signal this method used for timestamping.
|
||||
* DRM_VBLANKTIME_INVBL - Timestamp taken while scanout was in vblank interval.
|
||||
*
|
||||
* Returns true on success, and false on failure, i.e. when no accurate
|
||||
* timestamp could be acquired.
|
||||
*/
|
||||
int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
||||
unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags,
|
||||
const struct drm_display_mode *mode)
|
||||
bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
||||
unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags,
|
||||
const struct drm_display_mode *mode)
|
||||
{
|
||||
struct timeval tv_etime;
|
||||
ktime_t stime, etime;
|
||||
unsigned int vbl_status;
|
||||
int ret = DRM_VBLANKTIME_SCANOUTPOS_METHOD;
|
||||
int vpos, hpos, i;
|
||||
int delta_ns, duration_ns;
|
||||
|
||||
if (pipe >= dev->num_crtcs) {
|
||||
DRM_ERROR("Invalid crtc %u\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Scanout position query not supported? Should not happen. */
|
||||
if (!dev->driver->get_scanout_position) {
|
||||
DRM_ERROR("Called from driver w/o get_scanout_position()!?\n");
|
||||
return -EIO;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If mode timing undefined, just return as no-op:
|
||||
|
@ -768,7 +757,7 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
|||
*/
|
||||
if (mode->crtc_clock == 0) {
|
||||
DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe);
|
||||
return -EAGAIN;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get current scanout position with system timestamp.
|
||||
|
@ -792,7 +781,7 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
|||
if (!(vbl_status & DRM_SCANOUTPOS_VALID)) {
|
||||
DRM_DEBUG("crtc %u : scanoutpos query failed [0x%x].\n",
|
||||
pipe, vbl_status);
|
||||
return -EIO;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Compute uncertainty in timestamp of scanout position query. */
|
||||
|
@ -836,7 +825,7 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
|||
(long)vblank_time->tv_sec, (long)vblank_time->tv_usec,
|
||||
duration_ns/1000, i);
|
||||
|
||||
return ret;
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos);
|
||||
|
||||
|
@ -872,25 +861,23 @@ static bool
|
|||
drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
|
||||
struct timeval *tvblank, unsigned flags)
|
||||
{
|
||||
int ret;
|
||||
bool ret = false;
|
||||
|
||||
/* Define requested maximum error on timestamps (nanoseconds). */
|
||||
int max_error = (int) drm_timestamp_precision * 1000;
|
||||
|
||||
/* Query driver if possible and precision timestamping enabled. */
|
||||
if (dev->driver->get_vblank_timestamp && (max_error > 0)) {
|
||||
if (dev->driver->get_vblank_timestamp && (max_error > 0))
|
||||
ret = dev->driver->get_vblank_timestamp(dev, pipe, &max_error,
|
||||
tvblank, flags);
|
||||
if (ret > 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* GPU high precision timestamp query unsupported or failed.
|
||||
* Return current monotonic/gettimeofday timestamp as best estimate.
|
||||
*/
|
||||
*tvblank = get_drm_timestamp();
|
||||
if (!ret)
|
||||
*tvblank = get_drm_timestamp();
|
||||
|
||||
return false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -964,7 +964,7 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
|
|||
return position;
|
||||
}
|
||||
|
||||
static int i915_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
|
||||
static bool i915_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
|
@ -974,19 +974,19 @@ static int i915_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
|
|||
|
||||
if (pipe >= INTEL_INFO(dev_priv)->num_pipes) {
|
||||
DRM_ERROR("Invalid crtc %u\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get drm_crtc to timestamp: */
|
||||
crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
|
||||
if (crtc == NULL) {
|
||||
DRM_ERROR("Invalid crtc %u\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!crtc->base.hwmode.crtc_clock) {
|
||||
DRM_DEBUG_KMS("crtc %u is disabled\n", pipe);
|
||||
return -EBUSY;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Helper routine in DRM core does all the work: */
|
||||
|
|
|
@ -592,23 +592,23 @@ static int mdp5_get_scanoutpos(struct drm_device *dev, unsigned int pipe,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int mdp5_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
static bool mdp5_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
{
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
if (pipe < 0 || pipe >= priv->num_crtcs) {
|
||||
DRM_ERROR("Invalid crtc %d\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
crtc = priv->crtcs[pipe];
|
||||
if (!crtc) {
|
||||
DRM_ERROR("Invalid crtc %d\n", pipe);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
|
||||
|
|
|
@ -156,7 +156,7 @@ nouveau_display_scanoutpos(struct drm_device *dev, unsigned int pipe,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bool
|
||||
nouveau_display_vblstamp(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error, struct timeval *time, unsigned flags)
|
||||
{
|
||||
|
@ -174,7 +174,7 @@ nouveau_display_vblstamp(struct drm_device *dev, unsigned int pipe,
|
|||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -71,8 +71,8 @@ void nouveau_display_vblank_disable(struct drm_device *, unsigned int);
|
|||
int nouveau_display_scanoutpos(struct drm_device *, unsigned int,
|
||||
unsigned int, int *, int *, ktime_t *,
|
||||
ktime_t *, const struct drm_display_mode *);
|
||||
int nouveau_display_vblstamp(struct drm_device *, unsigned int, int *,
|
||||
struct timeval *, unsigned);
|
||||
bool nouveau_display_vblstamp(struct drm_device *, unsigned int, int *,
|
||||
struct timeval *, unsigned);
|
||||
|
||||
int nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
||||
struct drm_pending_vblank_event *event,
|
||||
|
|
|
@ -115,10 +115,10 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
|
|||
u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
|
||||
int radeon_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
|
||||
void radeon_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
|
||||
int radeon_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
bool radeon_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
|
||||
int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
|
||||
void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
|
||||
|
|
|
@ -869,25 +869,25 @@ void radeon_disable_vblank_kms(struct drm_device *dev, int crtc)
|
|||
*
|
||||
* Gets the timestamp on the requested crtc based on the
|
||||
* scanout position. (all asics).
|
||||
* Returns postive status flags on success, negative error on failure.
|
||||
* Returns true on success, false on failure.
|
||||
*/
|
||||
int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
bool radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
{
|
||||
struct drm_crtc *drmcrtc;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
|
||||
if (crtc < 0 || crtc >= dev->num_crtcs) {
|
||||
DRM_ERROR("Invalid crtc %d\n", crtc);
|
||||
return -EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get associated drm_crtc: */
|
||||
drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
|
||||
if (!drmcrtc)
|
||||
return -EINVAL;
|
||||
return false;
|
||||
|
||||
/* Helper routine in DRM core does all the work: */
|
||||
return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
|
||||
|
|
|
@ -270,7 +270,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
|
||||
bool vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
|
||||
int *max_error, struct timeval *vblank_time,
|
||||
unsigned flags)
|
||||
{
|
||||
|
|
|
@ -493,7 +493,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id,
|
|||
unsigned int flags, int *vpos, int *hpos,
|
||||
ktime_t *stime, ktime_t *etime,
|
||||
const struct drm_display_mode *mode);
|
||||
int vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
|
||||
bool vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
|
||||
int *max_error, struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
|
||||
|
|
|
@ -322,7 +322,6 @@ struct pci_controller;
|
|||
|
||||
/* Flags and return codes for get_vblank_timestamp() driver function. */
|
||||
#define DRM_CALLED_FROM_VBLIRQ 1
|
||||
#define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0)
|
||||
|
||||
/* get_scanout_position() return flags */
|
||||
#define DRM_SCANOUTPOS_VALID (1 << 0)
|
||||
|
|
|
@ -316,11 +316,10 @@ struct drm_driver {
|
|||
*
|
||||
* Returns:
|
||||
*
|
||||
* Zero if timestamping isn't supported in current display mode or a
|
||||
* negative number on failure. A positive status code on success,
|
||||
* which describes how the vblank_time timestamp was computed.
|
||||
* True on success, false on failure, which means the core should
|
||||
* fallback to a simple timestamp taken in drm_crtc_handle_vblank().
|
||||
*/
|
||||
int (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe,
|
||||
bool (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe,
|
||||
int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags);
|
||||
|
|
|
@ -153,11 +153,11 @@ void drm_crtc_vblank_on(struct drm_crtc *crtc);
|
|||
void drm_vblank_cleanup(struct drm_device *dev);
|
||||
u32 drm_accurate_vblank_count(struct drm_crtc *crtc);
|
||||
|
||||
int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
||||
unsigned int pipe, int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags,
|
||||
const struct drm_display_mode *mode);
|
||||
bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
|
||||
unsigned int pipe, int *max_error,
|
||||
struct timeval *vblank_time,
|
||||
unsigned flags,
|
||||
const struct drm_display_mode *mode);
|
||||
void drm_calc_timestamping_constants(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode);
|
||||
|
||||
|
|
Loading…
Reference in New Issue