]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/vblank: Switch to bool in_vblank_irq in get_vblank_timestamp
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 9 May 2017 14:03:26 +0000 (16:03 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 10 May 2017 08:21:17 +0000 (10:21 +0200)
It's overkill to have a flag parameter which is essentially used just
as a boolean. This takes care of core + adjusting drivers.

Adjusting the scanout position callback is a bit harder, since radeon
also supplies it's own driver-private flags in there.

v2: Fixup misplaced hunks (Neil).

v3: kbuild says v1 was better ...

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: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170509140329.24114-2-daniel.vetter@ffwll.ch
13 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/drm_drv.h
include/drm/drm_irq.h

index 7b4f808afff9a659caa0b6bf306a5b8367e329b0..0ce8292d97c0383a5b5c052c1dbc19a151d40fd3 100644 (file)
@@ -1913,7 +1913,7 @@ void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
 bool amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
                                     int *max_error,
                                     struct timeval *vblank_time,
-                                    unsigned flags);
+                                    bool in_vblank_irq);
 long amdgpu_kms_compat_ioctl(struct file *filp, unsigned int cmd,
                             unsigned long arg);
 
index a1b97809305e3d9cda3d221d826fb12eba0d4f88..babd969a63d1306aabc6e01e635956cf436a1471 100644 (file)
@@ -941,7 +941,7 @@ void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe)
  * @crtc: crtc to get the timestamp for
  * @max_error: max error
  * @vblank_time: time value
- * @flags: flags passed to the driver
+ * @in_vblank_irq: called from drm_handle_vblank()
  *
  * Gets the timestamp on the requested crtc based on the
  * scanout position.  (all asics).
@@ -950,7 +950,7 @@ void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe)
 bool amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
                                     int *max_error,
                                     struct timeval *vblank_time,
-                                    unsigned flags)
+                                    bool in_vblank_irq)
 {
        struct drm_crtc *crtc;
        struct amdgpu_device *adev = dev->dev_private;
@@ -971,7 +971,7 @@ bool amdgpu_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
 
        /* Helper routine in DRM core does all the work: */
        return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
-                                                    vblank_time, flags,
+                                                    vblank_time, in_vblank_irq,
                                                     &crtc->hwmode);
 }
 
index 677b37b0372b95b4ea8a7c7d77eda3a8c9c3fd34..fba6a842f4cd4ac1c1a19405f00dcd0cb9015eca 100644 (file)
@@ -54,7 +54,7 @@
 
 static bool
 drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
-                         struct timeval *tvblank, unsigned flags);
+                         struct timeval *tvblank, bool in_vblank_irq);
 
 static unsigned int drm_timestamp_precision = 20;  /* Default to 20 usecs. */
 
@@ -138,7 +138,7 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe
         */
        do {
                cur_vblank = __get_vblank_counter(dev, pipe);
-               rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, 0);
+               rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, false);
        } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0);
 
        /*
@@ -171,7 +171,7 @@ static void drm_reset_vblank_timestamp(struct drm_device *dev, unsigned int pipe
  * device vblank fields.
  */
 static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
-                                   unsigned long flags)
+                                   bool in_vblank_irq)
 {
        struct drm_vblank_crtc *vblank = &dev->vblank[pipe];
        u32 cur_vblank, diff;
@@ -194,7 +194,7 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
         */
        do {
                cur_vblank = __get_vblank_counter(dev, pipe);
-               rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, flags);
+               rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, in_vblank_irq);
        } while (cur_vblank != __get_vblank_counter(dev, pipe) && --count > 0);
 
        if (dev->max_vblank_count != 0) {
@@ -214,13 +214,13 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
                 */
                diff = DIV_ROUND_CLOSEST_ULL(diff_ns, framedur_ns);
 
-               if (diff == 0 && flags & DRM_CALLED_FROM_VBLIRQ)
+               if (diff == 0 && in_vblank_irq)
                        DRM_DEBUG_VBL("crtc %u: Redundant vblirq ignored."
                                      " diff_ns = %lld, framedur_ns = %d)\n",
                                      pipe, (long long) diff_ns, framedur_ns);
        } else {
                /* some kind of default for drivers w/o accurate vbl timestamping */
-               diff = (flags & DRM_CALLED_FROM_VBLIRQ) != 0;
+               diff = in_vblank_irq ? 1 : 0;
        }
 
        /*
@@ -253,7 +253,7 @@ static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe,
         * Otherwise reinitialize delayed at next vblank interrupt and assign 0
         * for now, to mark the vblanktimestamp as invalid.
         */
-       if (!rc && (flags & DRM_CALLED_FROM_VBLIRQ) == 0)
+       if (!rc && in_vblank_irq)
                t_vblank = (struct timeval) {0, 0};
 
        store_vblank(dev, pipe, diff, &t_vblank, cur_vblank);
@@ -291,7 +291,7 @@ u32 drm_accurate_vblank_count(struct drm_crtc *crtc)
 
        spin_lock_irqsave(&dev->vblank_time_lock, flags);
 
-       drm_update_vblank_count(dev, pipe, 0);
+       drm_update_vblank_count(dev, pipe, false);
        vblank = drm_vblank_count(dev, pipe);
 
        spin_unlock_irqrestore(&dev->vblank_time_lock, flags);
@@ -349,7 +349,7 @@ static void vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
         * this time. This makes the count account for the entire time
         * between drm_crtc_vblank_on() and drm_crtc_vblank_off().
         */
-       drm_update_vblank_count(dev, pipe, 0);
+       drm_update_vblank_count(dev, pipe, false);
 
        spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
 }
@@ -700,9 +700,10 @@ EXPORT_SYMBOL(drm_calc_timestamping_constants);
  * @max_error: Desired maximum allowable error in timestamps (nanosecs)
  *             On return contains true maximum error of timestamp
  * @vblank_time: Pointer to struct timeval which should receive the timestamp
- * @flags: Flags to pass to driver:
- *         0 = Default,
- *         DRM_CALLED_FROM_VBLIRQ = If function is called from vbl IRQ handler
+ * @in_vblank_irq:
+ *     True when called from drm_crtc_handle_vblank().  Some drivers
+ *     need to apply some workarounds for gpu-specific vblank irq quirks
+ *     if flag is set.
  * @mode: mode which defines the scanout timings
  *
  * Implements calculation of exact vblank timestamps from given drm_display_mode
@@ -732,7 +733,7 @@ bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
                                           unsigned int pipe,
                                           int *max_error,
                                           struct timeval *vblank_time,
-                                          unsigned flags,
+                                          bool in_vblank_irq,
                                           const struct drm_display_mode *mode)
 {
        struct timeval tv_etime;
@@ -740,6 +741,7 @@ bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
        unsigned int vbl_status;
        int vpos, hpos, i;
        int delta_ns, duration_ns;
+       unsigned flags = in_vblank_irq ? DRM_CALLED_FROM_VBLIRQ : 0;
 
        if (pipe >= dev->num_crtcs) {
                DRM_ERROR("Invalid crtc %u\n", pipe);
@@ -843,9 +845,10 @@ static struct timeval get_drm_timestamp(void)
  * @dev: DRM device
  * @pipe: index of CRTC whose vblank timestamp to retrieve
  * @tvblank: Pointer to target struct timeval which should receive the timestamp
- * @flags: Flags to pass to driver:
- *         0 = Default,
- *         DRM_CALLED_FROM_VBLIRQ = If function is called from vbl IRQ handler
+ * @in_vblank_irq:
+ *     True when called from drm_crtc_handle_vblank().  Some drivers
+ *     need to apply some workarounds for gpu-specific vblank irq quirks
+ *     if flag is set.
  *
  * Fetches the system timestamp corresponding to the time of the most recent
  * vblank interval on specified CRTC. May call into kms-driver to
@@ -859,7 +862,7 @@ static struct timeval get_drm_timestamp(void)
  */
 static bool
 drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
-                         struct timeval *tvblank, unsigned flags)
+                         struct timeval *tvblank, bool in_vblank_irq)
 {
        bool ret = false;
 
@@ -869,7 +872,7 @@ drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe,
        /* Query driver if possible and precision timestamping enabled. */
        if (dev->driver->get_vblank_timestamp && (max_error > 0))
                ret = dev->driver->get_vblank_timestamp(dev, pipe, &max_error,
-                                                       tvblank, flags);
+                                                       tvblank, in_vblank_irq);
 
        /* GPU high precision timestamp query unsupported or failed.
         * Return current monotonic/gettimeofday timestamp as best estimate.
@@ -1747,7 +1750,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
                return false;
        }
 
-       drm_update_vblank_count(dev, pipe, DRM_CALLED_FROM_VBLIRQ);
+       drm_update_vblank_count(dev, pipe, true);
 
        spin_unlock(&dev->vblank_time_lock);
 
index 315e6876fa855301419a75c765a1ef27d84e15d7..ae09c29662a17fcfa6fa4a88ed7e2be107488d8f 100644 (file)
@@ -967,7 +967,7 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
 static bool i915_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
                              int *max_error,
                              struct timeval *vblank_time,
-                             unsigned flags)
+                             bool in_vblank_irq)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *crtc;
@@ -991,7 +991,7 @@ static bool i915_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
 
        /* Helper routine in DRM core does all the work: */
        return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
-                                                    vblank_time, flags,
+                                                    vblank_time, in_vblank_irq,
                                                     &crtc->base.hwmode);
 }
 
index ffeb34bee3af2d55772c7efa2aa20760f5d4a06c..07e2b1335f65b31be9feb23deb9f55ea8c5f4e9f 100644 (file)
@@ -595,7 +595,7 @@ static int mdp5_get_scanoutpos(struct drm_device *dev, unsigned int pipe,
 static bool mdp5_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
                                      int *max_error,
                                      struct timeval *vblank_time,
-                                     unsigned flags)
+                                     bool in_vblank_irq)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_crtc *crtc;
@@ -612,7 +612,7 @@ static bool mdp5_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
        }
 
        return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
-                                                    vblank_time, flags,
+                                                    vblank_time, in_vblank_irq,
                                                     &crtc->mode);
 }
 
index f1e36f70755dd585acddc00657cac4f41717b5f5..2d28ef57f2bfdf5467ac349e0907c971f592fc86 100644 (file)
@@ -158,7 +158,7 @@ nouveau_display_scanoutpos(struct drm_device *dev, unsigned int pipe,
 
 bool
 nouveau_display_vblstamp(struct drm_device *dev, unsigned int pipe,
-                        int *max_error, struct timeval *time, unsigned flags)
+                        int *max_error, struct timeval *time, bool in_vblank_irq)
 {
        struct drm_crtc *crtc;
 
@@ -170,7 +170,8 @@ nouveau_display_vblstamp(struct drm_device *dev, unsigned int pipe,
                        else
                                mode = &crtc->hwmode;
                        return drm_calc_vbltimestamp_from_scanoutpos(dev,
-                                       pipe, max_error, time, flags, mode);
+                                       pipe, max_error, time, in_vblank_irq,
+                                       mode);
                }
        }
 
index c6bfe533a6414cff5ce507a3edb412b50f4ccd5e..8ec86259c5ac14c5070c929c416b16e18a6a4acb 100644 (file)
@@ -72,7 +72,7 @@ int  nouveau_display_scanoutpos(struct drm_device *, unsigned int,
                                unsigned int, int *, int *, ktime_t *,
                                ktime_t *, const struct drm_display_mode *);
 bool  nouveau_display_vblstamp(struct drm_device *, unsigned int, int *,
-                              struct timeval *, unsigned);
+                              struct timeval *, bool);
 
 int  nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
                            struct drm_pending_vblank_event *event,
index caa0b1cc4269b19d601f9f76fc298da06b32ef0d..88fc791ec8fb88ef1fb9187e794a285cb19a4b23 100644 (file)
@@ -118,7 +118,7 @@ void radeon_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
 bool radeon_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
                                     int *max_error,
                                     struct timeval *vblank_time,
-                                    unsigned flags);
+                                    bool in_vblank_irq);
 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 535969d74f64f306176a385eecf2600d561a1354..5bccdeae0773cd372117cc5f201a28f6f6bc09cd 100644 (file)
@@ -874,7 +874,7 @@ void radeon_disable_vblank_kms(struct drm_device *dev, int crtc)
 bool radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
                                     int *max_error,
                                     struct timeval *vblank_time,
-                                    unsigned flags)
+                                    bool in_vblank_irq)
 {
        struct drm_crtc *drmcrtc;
        struct radeon_device *rdev = dev->dev_private;
@@ -891,7 +891,7 @@ bool radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
 
        /* Helper routine in DRM core does all the work: */
        return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
-                                                    vblank_time, flags,
+                                                    vblank_time, in_vblank_irq,
                                                     &drmcrtc->hwmode);
 }
 
index f506525a1066deb33a42893cb1aeba5788fec41e..6ed53d2867c4821f7065f57f75846cb2d6b40335 100644 (file)
@@ -272,14 +272,14 @@ int vc4_crtc_get_scanoutpos(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)
+                                 bool in_vblank_irq)
 {
        struct drm_crtc *crtc = drm_crtc_from_index(dev, crtc_id);
        struct drm_crtc_state *state = crtc->state;
 
        /* Helper routine in DRM core does all the work: */
        return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc_id, max_error,
-                                                    vblank_time, flags,
+                                                    vblank_time, in_vblank_irq,
                                                     &state->adjusted_mode);
 }
 
index d1c53a5d0923ce32de7df0875468012661b3411a..d192f7e5c1ebf6f3d90ddbb438bc4ba7c15a0755 100644 (file)
@@ -495,7 +495,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id,
                            const struct drm_display_mode *mode);
 bool vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
                                  int *max_error, struct timeval *vblank_time,
-                                 unsigned flags);
+                                 bool in_vblank_irq);
 
 /* vc4_debugfs.c */
 int vc4_debugfs_init(struct drm_minor *minor);
index da78e248d9d81ddfbd9e451e4a58d84fc7e2c5c7..a97dbc1eeccd39f3cea0d6373415aeb29408fdb5 100644 (file)
@@ -241,8 +241,10 @@ struct drm_driver {
         *     DRM device.
         * pipe:
         *     Id of the crtc to query.
-        * flags:
-        *     Flags from the caller (DRM_CALLED_FROM_VBLIRQ or 0).
+        * in_vblank_irq:
+        *     True when called from drm_crtc_handle_vblank().  Some drivers
+        *     need to apply some workarounds for gpu-specific vblank irq quirks
+        *     if flag is set.
         * vpos:
         *     Target location for current vertical scanout position.
         * hpos:
@@ -308,11 +310,10 @@ struct drm_driver {
         *     Returns true upper bound on error for timestamp.
         * vblank_time:
         *     Target location for returned vblank timestamp.
-        * flags:
-        *     0 = Defaults, no special treatment needed.
-        *     DRM_CALLED_FROM_VBLIRQ = Function is called from vblank
-        *     irq handler. Some drivers need to apply some workarounds
-        *     for gpu-specific vblank irq quirks if flag is set.
+        * in_vblank_irq:
+        *     True when called from drm_crtc_handle_vblank().  Some drivers
+        *     need to apply some workarounds for gpu-specific vblank irq quirks
+        *     if flag is set.
         *
         * Returns:
         *
@@ -322,7 +323,7 @@ struct drm_driver {
        bool (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe,
                                     int *max_error,
                                     struct timeval *vblank_time,
-                                    unsigned flags);
+                                    bool in_vblank_irq);
 
        /* these have to be filled in */
 
index f0d5ccf9b282b1c3fda898a0f599acd30f8f554b..445406efb8dc463b30c994647a7878194e04174b 100644 (file)
@@ -156,7 +156,7 @@ u32 drm_accurate_vblank_count(struct drm_crtc *crtc);
 bool drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
                                           unsigned int pipe, int *max_error,
                                           struct timeval *vblank_time,
-                                          unsigned flags,
+                                          bool in_vblank_irq,
                                           const struct drm_display_mode *mode);
 void drm_calc_timestamping_constants(struct drm_crtc *crtc,
                                     const struct drm_display_mode *mode);