Pass struct drm_vblank_crtc * to drm_vblank_get(), drm_vblank_put(), and
drm_vblank_count(). They'll figure out the vblank pointer as the first
thing anyway, so it's handy to pass it when available. We can also rely
on vblank having a valid pipe, and can reduce the number of checks we
do.

Rename the functions to drm_vblank_crtc_*() naming. Directly convert the
call sites that already have the vblank pointer available.

v2: Use drm_vblank_crtc_* naming (Thomas)

Reviewed-by: Thomas Zimmermann <[email protected]>
Signed-off-by: Jani Nikula <[email protected]>
---
 drivers/gpu/drm/drm_internal.h    |  6 +--
 drivers/gpu/drm/drm_vblank.c      | 69 +++++++++++++++++++------------
 drivers/gpu/drm/drm_vblank_work.c | 12 +++---
 3 files changed, 51 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index f893b1e3a596..6e7ac5b16d92 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -112,9 +112,9 @@ static inline bool drm_vblank_passed(u64 seq, u64 ref)
 }
 
 void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
-int drm_vblank_get(struct drm_device *dev, unsigned int pipe);
-void drm_vblank_put(struct drm_device *dev, unsigned int pipe);
-u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
+int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank);
+void drm_vblank_crtc_put(struct drm_vblank_crtc *vblank);
+u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank);
 
 /* drm_vblank_work.c */
 static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 498fc91450e6..aeb931c825ca 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -384,14 +384,10 @@ static void drm_update_vblank_count(struct drm_device 
*dev, unsigned int pipe,
        store_vblank(dev, pipe, diff, t_vblank, cur_vblank);
 }
 
-u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
+u64 drm_vblank_crtc_count(struct drm_vblank_crtc *vblank)
 {
-       struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
        u64 count;
 
-       if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
-               return 0;
-
        count = atomic64_read(&vblank->count);
 
        /*
@@ -406,6 +402,14 @@ u64 drm_vblank_count(struct drm_device *dev, unsigned int 
pipe)
        return count;
 }
 
+static u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe)
+{
+       if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+               return 0;
+
+       return drm_vblank_crtc_count(drm_vblank_crtc(dev, pipe));
+}
+
 /**
  * drm_crtc_accurate_vblank_count - retrieve the master vblank counter
  * @crtc: which counter to retrieve
@@ -1210,18 +1214,16 @@ static int drm_vblank_enable(struct drm_device *dev, 
unsigned int pipe)
        return ret;
 }
 
-int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
+int drm_vblank_crtc_get(struct drm_vblank_crtc *vblank)
 {
-       struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+       struct drm_device *dev = vblank->dev;
+       int pipe = vblank->pipe;
        unsigned long irqflags;
        int ret = 0;
 
        if (!drm_dev_has_vblank(dev))
                return -EINVAL;
 
-       if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
-               return -EINVAL;
-
        spin_lock_irqsave(&dev->vbl_lock, irqflags);
        /* Going from 0->1 means we have to enable interrupts again */
        if (atomic_add_return(1, &vblank->refcount) == 1) {
@@ -1237,6 +1239,14 @@ int drm_vblank_get(struct drm_device *dev, unsigned int 
pipe)
        return ret;
 }
 
+static int drm_vblank_get(struct drm_device *dev, unsigned int pipe)
+{
+       if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+               return -EINVAL;
+
+       return drm_vblank_crtc_get(drm_vblank_crtc(dev, pipe));
+}
+
 /**
  * drm_crtc_vblank_get - get a reference count on vblank events
  * @crtc: which CRTC to own
@@ -1253,14 +1263,11 @@ int drm_crtc_vblank_get(struct drm_crtc *crtc)
 }
 EXPORT_SYMBOL(drm_crtc_vblank_get);
 
-void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
+void drm_vblank_crtc_put(struct drm_vblank_crtc *vblank)
 {
-       struct drm_vblank_crtc *vblank = drm_vblank_crtc(dev, pipe);
+       struct drm_device *dev = vblank->dev;
        int vblank_offdelay = vblank->config.offdelay_ms;
 
-       if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
-               return;
-
        if (drm_WARN_ON(dev, atomic_read(&vblank->refcount) == 0))
                return;
 
@@ -1276,6 +1283,14 @@ void drm_vblank_put(struct drm_device *dev, unsigned int 
pipe)
        }
 }
 
+static void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
+{
+       if (drm_WARN_ON(dev, pipe >= dev->num_crtcs))
+               return;
+
+       drm_vblank_crtc_put(drm_vblank_crtc(dev, pipe));
+}
+
 /**
  * drm_crtc_vblank_put - give up ownership of vblank events
  * @crtc: which counter to give up
@@ -1308,20 +1323,20 @@ int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
        int ret;
        u64 last;
 
-       ret = drm_vblank_get(dev, pipe);
+       ret = drm_vblank_crtc_get(vblank);
        if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n",
                     pipe, ret))
                return ret;
 
-       last = drm_vblank_count(dev, pipe);
+       last = drm_vblank_crtc_count(vblank);
 
        ret = wait_event_timeout(vblank->queue,
-                                last != drm_vblank_count(dev, pipe),
+                                last != drm_vblank_crtc_count(vblank),
                                 msecs_to_jiffies(1000));
 
        drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe);
 
-       drm_vblank_put(dev, pipe);
+       drm_vblank_crtc_put(vblank);
 
        return ret ? 0 : -ETIMEDOUT;
 }
@@ -1368,7 +1383,7 @@ void drm_crtc_vblank_off(struct drm_crtc *crtc)
        wake_up(&vblank->queue);
 
        /*
-        * Prevent subsequent drm_vblank_get() from re-enabling
+        * Prevent subsequent drm_vblank_crtc_get() from re-enabling
         * the vblank interrupt by bumping the refcount.
         */
        if (!vblank->inmodeset) {
@@ -1424,7 +1439,7 @@ void drm_crtc_vblank_reset(struct drm_crtc *crtc)
 
        spin_lock_irq(&dev->vbl_lock);
        /*
-        * Prevent subsequent drm_vblank_get() from enabling the vblank
+        * Prevent subsequent drm_vblank_crtc_get() from enabling the vblank
         * interrupt by bumping the refcount.
         */
        if (!vblank->inmodeset) {
@@ -1497,7 +1512,7 @@ void drm_crtc_vblank_on_config(struct drm_crtc *crtc,
 
        vblank->config = *config;
 
-       /* Drop our private "prevent drm_vblank_get" refcount */
+       /* Drop our private "prevent drm_vblank_crtc_get" refcount */
        if (vblank->inmodeset) {
                atomic_dec(&vblank->refcount);
                vblank->inmodeset = 0;
@@ -1639,9 +1654,9 @@ static int drm_queue_vblank_event(struct drm_device *dev, 
unsigned int pipe,
 
        /*
         * drm_crtc_vblank_off() might have been called after we called
-        * drm_vblank_get(). drm_crtc_vblank_off() holds event_lock around the
+        * drm_vblank_crtc_get(). drm_crtc_vblank_off() holds event_lock around 
the
         * vblank disable, so no need for further locking.  The reference from
-        * drm_vblank_get() protects against vblank disable from another source.
+        * drm_vblank_crtc_get() protects against vblank disable from another 
source.
         */
        if (!READ_ONCE(vblank->enabled)) {
                ret = -EINVAL;
@@ -1667,7 +1682,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, 
unsigned int pipe,
                send_vblank_event(dev, e, seq, now);
                vblwait->reply.sequence = seq;
        } else {
-               /* drm_handle_vblank_events will call drm_vblank_put */
+               /* drm_handle_vblank_events will call drm_vblank_crtc_put */
                list_add_tail(&e->base.link, &dev->vblank_event_list);
                vblwait->reply.sequence = req_seq;
        }
@@ -1830,7 +1845,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void 
*data,
 
        if (flags & _DRM_VBLANK_EVENT) {
                /* must hold on to the vblank ref until the event fires
-                * drm_vblank_put will be called asynchronously
+                * drm_vblank_crtc_put will be called asynchronously
                 */
                return drm_queue_vblank_event(dev, pipe, req_seq, vblwait, 
file_priv);
        }
@@ -2148,7 +2163,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, 
void *data,
                send_vblank_event(dev, e, seq, now);
                queue_seq->sequence = seq;
        } else {
-               /* drm_handle_vblank_events will call drm_vblank_put */
+               /* drm_handle_vblank_events will call drm_vblank_crtc_put */
                list_add_tail(&e->base.link, &dev->vblank_event_list);
                queue_seq->sequence = req_seq;
        }
diff --git a/drivers/gpu/drm/drm_vblank_work.c 
b/drivers/gpu/drm/drm_vblank_work.c
index 70f0199251ea..52158f85c855 100644
--- a/drivers/gpu/drm/drm_vblank_work.c
+++ b/drivers/gpu/drm/drm_vblank_work.c
@@ -58,7 +58,7 @@ void drm_handle_vblank_works(struct drm_vblank_crtc *vblank)
                        continue;
 
                list_del_init(&work->node);
-               drm_vblank_put(vblank->dev, vblank->pipe);
+               drm_vblank_crtc_put(vblank);
                kthread_queue_work(vblank->worker, &work->base);
                wake = true;
        }
@@ -80,7 +80,7 @@ void drm_vblank_cancel_pending_works(struct drm_vblank_crtc 
*vblank)
 
        list_for_each_entry_safe(work, next, &vblank->pending_work, node) {
                list_del_init(&work->node);
-               drm_vblank_put(vblank->dev, vblank->pipe);
+               drm_vblank_crtc_put(vblank);
        }
 
        wake_up_all(&vblank->work_wait_queue);
@@ -129,7 +129,7 @@ int drm_vblank_work_schedule(struct drm_vblank_work *work,
                goto out;
 
        if (list_empty(&work->node)) {
-               ret = drm_vblank_get(dev, vblank->pipe);
+               ret = drm_vblank_crtc_get(vblank);
                if (ret < 0)
                        goto out;
        } else if (work->count == count) {
@@ -140,7 +140,7 @@ int drm_vblank_work_schedule(struct drm_vblank_work *work,
        }
 
        work->count = count;
-       cur_vbl = drm_vblank_count(dev, vblank->pipe);
+       cur_vbl = drm_vblank_crtc_count(vblank);
        passed = drm_vblank_passed(cur_vbl, count);
        if (passed)
                drm_dbg_core(dev,
@@ -148,7 +148,7 @@ int drm_vblank_work_schedule(struct drm_vblank_work *work,
                             vblank->pipe, count, cur_vbl);
 
        if (!nextonmiss && passed) {
-               drm_vblank_put(dev, vblank->pipe);
+               drm_vblank_crtc_put(vblank);
                ret = kthread_queue_work(vblank->worker, &work->base);
 
                if (rescheduling) {
@@ -193,7 +193,7 @@ bool drm_vblank_work_cancel_sync(struct drm_vblank_work 
*work)
        spin_lock_irq(&dev->event_lock);
        if (!list_empty(&work->node)) {
                list_del_init(&work->node);
-               drm_vblank_put(vblank->dev, vblank->pipe);
+               drm_vblank_crtc_put(vblank);
                ret = true;
        }
 
-- 
2.47.3

Reply via email to