drm/vblank: Switch drm_driver->get_vblank_timestamp to return a bool
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 9 May 2017 14:03:25 +0000 (16:03 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 10 May 2017 08:21:08 +0000 (10:21 +0200)
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
14 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
drivers/gpu/drm/drm_irq.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_kms.c
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_drv.h
include/drm/drmP.h
include/drm/drm_drv.h
include/drm/drm_irq.h

index 6a8129949333e9e395d8e5d5b78469c639438b27..7b4f808afff9a659caa0b6bf306a5b8367e329b0 100644 (file)
@@ -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);
 
index 832be632478f0b36795eefec37a937cb014eb28e..a1b97809305e3d9cda3d221d826fb12eba0d4f88 100644 (file)
@@ -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: */
index 8c866cac62dd27740823532ff87c192ecd6a47fa..677b37b0372b95b4ea8a7c7d77eda3a8c9c3fd34 100644 (file)
@@ -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;
 }
 
 /**
index fd97fe00cd0d2ad00e1c7258eeb51ecf0f60d4c1..315e6876fa855301419a75c765a1ef27d84e15d7 100644 (file)
@@ -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: */
index d3d6b4cae1e6c86f1fa461b16dda05d649c1c0e8..ffeb34bee3af2d55772c7efa2aa20760f5d4a06c 100644 (file)
@@ -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,
index 21b10f9840c95e29cd177e9e36d93b8d6155b48d..f1e36f70755dd585acddc00657cac4f41717b5f5 100644 (file)
@@ -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
index e1d772d394887eb91cbc09672169ccd7becf2393..c6bfe533a6414cff5ce507a3edb412b50f4ccd5e 100644 (file)
@@ -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,
index 93d45aa5c3d4f73bb421c5e4f2a844ef56f6752a..caa0b1cc4269b19d601f9f76fc298da06b32ef0d 100644 (file)
@@ -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);
index e3e7cb1d10a2941d1790d36a9f5250f70aeb78cd..535969d74f64f306176a385eecf2600d561a1354 100644 (file)
@@ -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,
index d86c8cce318270a0e34b09c3a1713d48e1a4ff0b..f506525a1066deb33a42893cb1aeba5788fec41e 100644 (file)
@@ -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)
 {
index 92eb7d811bf211e992dc69fdacc1505e180c5522..d1c53a5d0923ce32de7df0875468012661b3411a 100644 (file)
@@ -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);
 
index e1daa4f343cd466d6405c27eec89b904a2ce2617..a1b19bf45fb3e2ad42e320d5cc44dbd1c222187d 100644 (file)
@@ -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)
index d0b5f363bfa12c2aec69c791fe5c1f7336b6744f..da78e248d9d81ddfbd9e451e4a58d84fc7e2c5c7 100644 (file)
@@ -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);
index cf0be6594c8c7bb8c1774a2b43d68ea087bf64c5..f0d5ccf9b282b1c3fda898a0f599acd30f8f554b 100644 (file)
@@ -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);