On Wed, Aug 12, 2015 at 05:00:31PM +0200, Thierry Reding wrote: > From: Thierry Reding <treding@xxxxxxxxxx> > > Name all references to the pipe number (CRTC index) consistently to make > it easier to distinguish which is a pipe number and which is a pointer > to struct drm_crtc. > > While at it also make all references to the pipe number unsigned because > there is no longer any reason why it should ever be negative. > > Signed-off-by: Thierry Reding <treding@xxxxxxxxxx> There's 2 "int crtc" and one "int pipe" (without the unsigned) left after this patch. Can you please do a follow-up? Applied this meanwhile. -Daniel > --- > drivers/gpu/drm/drm_irq.c | 316 +++++++++++++++++++++++----------------------- > include/drm/drmP.h | 32 ++--- > 2 files changed, 175 insertions(+), 173 deletions(-) > > diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c > index a957b9618e85..f42459b2862d 100644 > --- a/drivers/gpu/drm/drm_irq.c > +++ b/drivers/gpu/drm/drm_irq.c > @@ -43,8 +43,8 @@ > #include <linux/export.h> > > /* Access macro for slots in vblank timestamp ringbuffer. */ > -#define vblanktimestamp(dev, crtc, count) \ > - ((dev)->vblank[crtc].time[(count) % DRM_VBLANKTIME_RBSIZE]) > +#define vblanktimestamp(dev, pipe, count) \ > + ((dev)->vblank[pipe].time[(count) % DRM_VBLANKTIME_RBSIZE]) > > /* Retry timestamp calculation up to 3 times to satisfy > * drm_timestamp_precision before giving up. > @@ -57,7 +57,7 @@ > #define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000 > > static bool > -drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, > +drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe, > struct timeval *tvblank, unsigned flags); > > static unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */ > @@ -107,7 +107,7 @@ static void store_vblank(struct drm_device *dev, int crtc, > /** > * drm_update_vblank_count - update the master vblank counter > * @dev: DRM device > - * @crtc: counter to update > + * @pipe: counter to update > * > * Call back into the driver to update the appropriate vblank counter > * (specified by @crtc). Deal with wraparound, if it occurred, and > @@ -120,9 +120,9 @@ static void store_vblank(struct drm_device *dev, int crtc, > * Note: caller must hold dev->vbl_lock since this reads & writes > * device vblank fields. > */ > -static void drm_update_vblank_count(struct drm_device *dev, int crtc) > +static void drm_update_vblank_count(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > u32 cur_vblank, diff; > bool rc; > struct timeval t_vblank; > @@ -140,21 +140,21 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc) > * corresponding vblank timestamp. > */ > do { > - cur_vblank = dev->driver->get_vblank_counter(dev, crtc); > - rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0); > - } while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc)); > + cur_vblank = dev->driver->get_vblank_counter(dev, pipe); > + rc = drm_get_last_vbltimestamp(dev, pipe, &t_vblank, 0); > + } while (cur_vblank != dev->driver->get_vblank_counter(dev, pipe)); > > /* Deal with counter wrap */ > diff = cur_vblank - vblank->last; > if (cur_vblank < vblank->last) { > diff += dev->max_vblank_count + 1; > > - DRM_DEBUG("last_vblank[%d]=0x%x, cur_vblank=0x%x => diff=0x%x\n", > - crtc, vblank->last, cur_vblank, diff); > + DRM_DEBUG("last_vblank[%u]=0x%x, cur_vblank=0x%x => diff=0x%x\n", > + pipe, vblank->last, cur_vblank, diff); > } > > - DRM_DEBUG("updating vblank count on crtc %d, missed %d\n", > - crtc, diff); > + DRM_DEBUG("updating vblank count on crtc %u, missed %d\n", > + pipe, diff); > > if (diff == 0) > return; > @@ -167,7 +167,7 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc) > if (!rc) > t_vblank = (struct timeval) {0, 0}; > > - store_vblank(dev, crtc, diff, &t_vblank); > + store_vblank(dev, pipe, diff, &t_vblank); > } > > /* > @@ -176,9 +176,9 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc) > * are preserved, even if there are any spurious vblank irq's after > * disable. > */ > -static void vblank_disable_and_save(struct drm_device *dev, int crtc) > +static void vblank_disable_and_save(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > unsigned long irqflags; > u32 vblcount; > s64 diff_ns; > @@ -206,8 +206,8 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc) > * vblank interrupt is disabled. > */ > if (!vblank->enabled && > - drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0)) { > - drm_update_vblank_count(dev, crtc); > + drm_get_last_vbltimestamp(dev, pipe, &tvblank, 0)) { > + drm_update_vblank_count(dev, pipe); > spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); > return; > } > @@ -218,7 +218,7 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc) > * hardware potentially runtime suspended. > */ > if (vblank->enabled) { > - dev->driver->disable_vblank(dev, crtc); > + dev->driver->disable_vblank(dev, pipe); > vblank->enabled = false; > } > > @@ -235,9 +235,9 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc) > * delayed gpu counter increment. > */ > do { > - vblank->last = dev->driver->get_vblank_counter(dev, crtc); > - vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0); > - } while (vblank->last != dev->driver->get_vblank_counter(dev, crtc) && (--count) && vblrc); > + vblank->last = dev->driver->get_vblank_counter(dev, pipe); > + vblrc = drm_get_last_vbltimestamp(dev, pipe, &tvblank, 0); > + } while (vblank->last != dev->driver->get_vblank_counter(dev, pipe) && (--count) && vblrc); > > if (!count) > vblrc = 0; > @@ -247,7 +247,7 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc) > */ > vblcount = vblank->count; > diff_ns = timeval_to_ns(&tvblank) - > - timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); > + timeval_to_ns(&vblanktimestamp(dev, pipe, vblcount)); > > /* If there is at least 1 msec difference between the last stored > * timestamp and tvblank, then we are currently executing our > @@ -262,7 +262,7 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc) > * hope for the best. > */ > if (vblrc && (abs64(diff_ns) > 1000000)) > - store_vblank(dev, crtc, 1, &tvblank); > + store_vblank(dev, pipe, 1, &tvblank); > > spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); > } > @@ -271,16 +271,16 @@ static void vblank_disable_fn(unsigned long arg) > { > struct drm_vblank_crtc *vblank = (void *)arg; > struct drm_device *dev = vblank->dev; > + unsigned int pipe = vblank->pipe; > unsigned long irqflags; > - int crtc = vblank->crtc; > > if (!dev->vblank_disable_allowed) > return; > > spin_lock_irqsave(&dev->vbl_lock, irqflags); > if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) { > - DRM_DEBUG("disabling vblank on crtc %d\n", crtc); > - vblank_disable_and_save(dev, crtc); > + DRM_DEBUG("disabling vblank on crtc %u\n", pipe); > + vblank_disable_and_save(dev, pipe); > } > spin_unlock_irqrestore(&dev->vbl_lock, irqflags); > } > @@ -293,14 +293,14 @@ static void vblank_disable_fn(unsigned long arg) > */ > void drm_vblank_cleanup(struct drm_device *dev) > { > - int crtc; > + unsigned int pipe; > > /* Bail if the driver didn't call drm_vblank_init() */ > if (dev->num_crtcs == 0) > return; > > - for (crtc = 0; crtc < dev->num_crtcs; crtc++) { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + for (pipe = 0; pipe < dev->num_crtcs; pipe++) { > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > > WARN_ON(vblank->enabled && > drm_core_check_feature(dev, DRIVER_MODESET)); > @@ -316,17 +316,18 @@ EXPORT_SYMBOL(drm_vblank_cleanup); > > /** > * drm_vblank_init - initialize vblank support > - * @dev: drm_device > - * @num_crtcs: number of crtcs supported by @dev > + * @dev: DRM device > + * @num_crtcs: number of CRTCs supported by @dev > * > * This function initializes vblank support for @num_crtcs display pipelines. > * > * Returns: > * Zero on success or a negative error code on failure. > */ > -int drm_vblank_init(struct drm_device *dev, int num_crtcs) > +int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs) > { > - int i, ret = -ENOMEM; > + int ret = -ENOMEM; > + unsigned int i; > > spin_lock_init(&dev->vbl_lock); > spin_lock_init(&dev->vblank_time_lock); > @@ -341,7 +342,7 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) > struct drm_vblank_crtc *vblank = &dev->vblank[i]; > > vblank->dev = dev; > - vblank->crtc = i; > + vblank->pipe = i; > init_waitqueue_head(&vblank->queue); > setup_timer(&vblank->disable_timer, vblank_disable_fn, > (unsigned long)vblank); > @@ -624,17 +625,17 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc, > if (mode->flags & DRM_MODE_FLAG_INTERLACE) > framedur_ns /= 2; > } else > - DRM_ERROR("crtc %d: Can't calculate constants, dotclock = 0!\n", > + DRM_ERROR("crtc %u: Can't calculate constants, dotclock = 0!\n", > crtc->base.id); > > crtc->pixeldur_ns = pixeldur_ns; > crtc->linedur_ns = linedur_ns; > crtc->framedur_ns = framedur_ns; > > - DRM_DEBUG("crtc %d: hwmode: htotal %d, vtotal %d, vdisplay %d\n", > + DRM_DEBUG("crtc %u: hwmode: htotal %d, vtotal %d, vdisplay %d\n", > crtc->base.id, mode->crtc_htotal, > mode->crtc_vtotal, mode->crtc_vdisplay); > - DRM_DEBUG("crtc %d: clock %d kHz framedur %d linedur %d, pixeldur %d\n", > + DRM_DEBUG("crtc %u: clock %d kHz framedur %d linedur %d, pixeldur %d\n", > crtc->base.id, dotclock, framedur_ns, > linedur_ns, pixeldur_ns); > } > @@ -643,7 +644,7 @@ EXPORT_SYMBOL(drm_calc_timestamping_constants); > /** > * drm_calc_vbltimestamp_from_scanoutpos - precise vblank timestamp helper > * @dev: DRM device > - * @crtc: Which CRTC's vblank timestamp to retrieve > + * @pipe: index of CRTC whose vblank timestamp to retrieve > * @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 > @@ -686,7 +687,8 @@ EXPORT_SYMBOL(drm_calc_timestamping_constants); > * DRM_VBLANKTIME_INVBL - Timestamp taken while scanout was in vblank interval. > * > */ > -int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, > +int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, > + unsigned int pipe, > int *max_error, > struct timeval *vblank_time, > unsigned flags, > @@ -700,8 +702,8 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, > int framedur_ns, linedur_ns, pixeldur_ns, delta_ns, duration_ns; > bool invbl; > > - if (crtc < 0 || crtc >= dev->num_crtcs) { > - DRM_ERROR("Invalid crtc %d\n", crtc); > + if (pipe >= dev->num_crtcs) { > + DRM_ERROR("Invalid crtc %u\n", pipe); > return -EINVAL; > } > > @@ -720,7 +722,7 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, > * Happens during initial modesetting of a crtc. > */ > if (framedur_ns == 0) { > - DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc); > + DRM_DEBUG("crtc %u: Noop due to uninitialized mode.\n", pipe); > return -EAGAIN; > } > > @@ -736,13 +738,13 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, > * Get vertical and horizontal scanout position vpos, hpos, > * and bounding timestamps stime, etime, pre/post query. > */ > - vbl_status = dev->driver->get_scanout_position(dev, crtc, flags, &vpos, > + vbl_status = dev->driver->get_scanout_position(dev, pipe, flags, &vpos, > &hpos, &stime, &etime); > > /* Return as no-op if scanout query unsupported or failed. */ > if (!(vbl_status & DRM_SCANOUTPOS_VALID)) { > - DRM_DEBUG("crtc %d : scanoutpos query failed [%d].\n", > - crtc, vbl_status); > + DRM_DEBUG("crtc %u : scanoutpos query failed [%d].\n", > + pipe, vbl_status); > return -EIO; > } > > @@ -756,8 +758,8 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, > > /* Noisy system timing? */ > if (i == DRM_TIMESTAMP_MAXRETRIES) { > - DRM_DEBUG("crtc %d: Noisy timestamp %d us > %d us [%d reps].\n", > - crtc, duration_ns/1000, *max_error/1000, i); > + DRM_DEBUG("crtc %u: Noisy timestamp %d us > %d us [%d reps].\n", > + pipe, duration_ns/1000, *max_error/1000, i); > } > > /* Return upper bound of timestamp precision error. */ > @@ -790,8 +792,8 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, > etime = ktime_sub_ns(etime, delta_ns); > *vblank_time = ktime_to_timeval(etime); > > - DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n", > - crtc, (int)vbl_status, hpos, vpos, > + DRM_DEBUG("crtc %u : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n", > + pipe, (int)vbl_status, hpos, vpos, > (long)tv_etime.tv_sec, (long)tv_etime.tv_usec, > (long)vblank_time->tv_sec, (long)vblank_time->tv_usec, > duration_ns/1000, i); > @@ -816,7 +818,7 @@ static struct timeval get_drm_timestamp(void) > * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent > * vblank interval > * @dev: DRM device > - * @crtc: which CRTC's vblank timestamp to retrieve > + * @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, > @@ -833,7 +835,7 @@ static struct timeval get_drm_timestamp(void) > * True if timestamp is considered to be very precise, false otherwise. > */ > static bool > -drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, > +drm_get_last_vbltimestamp(struct drm_device *dev, unsigned int pipe, > struct timeval *tvblank, unsigned flags) > { > int ret; > @@ -843,7 +845,7 @@ drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, > > /* Query driver if possible and precision timestamping enabled. */ > if (dev->driver->get_vblank_timestamp && (max_error > 0)) { > - ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error, > + ret = dev->driver->get_vblank_timestamp(dev, pipe, &max_error, > tvblank, flags); > if (ret > 0) > return true; > @@ -860,7 +862,7 @@ drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, > /** > * drm_vblank_count - retrieve "cooked" vblank counter value > * @dev: DRM device > - * @crtc: which counter to retrieve > + * @pipe: index of CRTC for which to retrieve the counter > * > * Fetches the "cooked" vblank count value that represents the number of > * vblank events since the system was booted, including lost events due to > @@ -871,11 +873,11 @@ drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, > * Returns: > * The software vblank counter. > */ > -u32 drm_vblank_count(struct drm_device *dev, int crtc) > +u32 drm_vblank_count(struct drm_device *dev, int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return 0; > return vblank->count; > } > @@ -901,11 +903,10 @@ u32 drm_crtc_vblank_count(struct drm_crtc *crtc) > EXPORT_SYMBOL(drm_crtc_vblank_count); > > /** > - * drm_vblank_count_and_time - retrieve "cooked" vblank counter value > - * and the system timestamp corresponding to that vblank counter value. > - * > + * drm_vblank_count_and_time - retrieve "cooked" vblank counter value and the > + * system timestamp corresponding to that vblank counter value. > * @dev: DRM device > - * @crtc: which counter to retrieve > + * @pipe: index of CRTC whose counter to retrieve > * @vblanktime: Pointer to struct timeval to receive the vblank timestamp. > * > * Fetches the "cooked" vblank count value that represents the number of > @@ -913,13 +914,13 @@ EXPORT_SYMBOL(drm_crtc_vblank_count); > * modesetting activity. Returns corresponding system timestamp of the time > * of the vblank interval that corresponds to the current vblank counter value. > */ > -u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, > +u32 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe, > struct timeval *vblanktime) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > u32 cur_vblank; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return 0; > > /* > @@ -930,7 +931,7 @@ u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, > do { > cur_vblank = vblank->count; > smp_rmb(); > - *vblanktime = vblanktimestamp(dev, crtc, cur_vblank); > + *vblanktime = vblanktimestamp(dev, pipe, cur_vblank); > smp_rmb(); > } while (cur_vblank != vblank->count); > > @@ -957,7 +958,7 @@ static void send_vblank_event(struct drm_device *dev, > /** > * drm_send_vblank_event - helper to send vblank event after pageflip > * @dev: DRM device > - * @crtc: CRTC in question > + * @pipe: CRTC index > * @e: the event to send > * > * Updates sequence # and timestamp on event, and sends it to userspace. > @@ -965,20 +966,20 @@ static void send_vblank_event(struct drm_device *dev, > * > * This is the legacy version of drm_crtc_send_vblank_event(). > */ > -void drm_send_vblank_event(struct drm_device *dev, int crtc, > - struct drm_pending_vblank_event *e) > +void drm_send_vblank_event(struct drm_device *dev, unsigned int pipe, > + struct drm_pending_vblank_event *e) > { > struct timeval now; > unsigned int seq; > > if (dev->num_crtcs > 0) { > - seq = drm_vblank_count_and_time(dev, crtc, &now); > + seq = drm_vblank_count_and_time(dev, pipe, &now); > } else { > seq = 0; > > now = get_drm_timestamp(); > } > - e->pipe = crtc; > + e->pipe = pipe; > send_vblank_event(dev, e, seq, &now); > } > EXPORT_SYMBOL(drm_send_vblank_event); > @@ -1003,11 +1004,11 @@ EXPORT_SYMBOL(drm_crtc_send_vblank_event); > /** > * drm_vblank_enable - enable the vblank interrupt on a CRTC > * @dev: DRM device > - * @crtc: CRTC in question > + * @pipe: CRTC index > */ > -static int drm_vblank_enable(struct drm_device *dev, int crtc) > +static int drm_vblank_enable(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > int ret = 0; > > assert_spin_locked(&dev->vbl_lock); > @@ -1022,13 +1023,13 @@ static int drm_vblank_enable(struct drm_device *dev, int crtc) > * timestamps. Filtercode in drm_handle_vblank() will > * prevent double-accounting of same vblank interval. > */ > - ret = dev->driver->enable_vblank(dev, crtc); > - DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); > + ret = dev->driver->enable_vblank(dev, pipe); > + DRM_DEBUG("enabling vblank on crtc %u, ret: %d\n", pipe, ret); > if (ret) > atomic_dec(&vblank->refcount); > else { > vblank->enabled = true; > - drm_update_vblank_count(dev, crtc); > + drm_update_vblank_count(dev, pipe); > } > } > > @@ -1040,7 +1041,7 @@ static int drm_vblank_enable(struct drm_device *dev, int crtc) > /** > * drm_vblank_get - get a reference count on vblank events > * @dev: DRM device > - * @crtc: which CRTC to own > + * @pipe: index of CRTC to own > * > * Acquire a reference count on vblank events to avoid having them disabled > * while in use. > @@ -1050,22 +1051,22 @@ static int drm_vblank_enable(struct drm_device *dev, int crtc) > * Returns: > * Zero on success, nonzero on failure. > */ > -int drm_vblank_get(struct drm_device *dev, int crtc) > +int drm_vblank_get(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > unsigned long irqflags; > int ret = 0; > > if (!dev->num_crtcs) > return -EINVAL; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(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) { > - ret = drm_vblank_enable(dev, crtc); > + ret = drm_vblank_enable(dev, pipe); > } else { > if (!vblank->enabled) { > atomic_dec(&vblank->refcount); > @@ -1097,20 +1098,20 @@ int drm_crtc_vblank_get(struct drm_crtc *crtc) > EXPORT_SYMBOL(drm_crtc_vblank_get); > > /** > - * drm_vblank_put - give up ownership of vblank events > + * drm_vblank_put - release ownership of vblank events > * @dev: DRM device > - * @crtc: which counter to give up > + * @pipe: index of CRTC to release > * > * Release ownership of a given vblank counter, turning off interrupts > * if possible. Disable interrupts after drm_vblank_offdelay milliseconds. > * > * This is the legacy version of drm_crtc_vblank_put(). > */ > -void drm_vblank_put(struct drm_device *dev, int crtc) > +void drm_vblank_put(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return; > > if (WARN_ON(atomic_read(&vblank->refcount) == 0)) > @@ -1147,33 +1148,34 @@ EXPORT_SYMBOL(drm_crtc_vblank_put); > /** > * drm_wait_one_vblank - wait for one vblank > * @dev: DRM device > - * @crtc: crtc index > + * @pipe: CRTC index > * > * This waits for one vblank to pass on @crtc, using the irq driver interfaces. > * It is a failure to call this when the vblank irq for @crtc is disabled, e.g. > * due to lack of driver support or because the crtc is off. > */ > -void drm_wait_one_vblank(struct drm_device *dev, int crtc) > +void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe) > { > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > int ret; > u32 last; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return; > > - ret = drm_vblank_get(dev, crtc); > - if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", crtc, ret)) > + ret = drm_vblank_get(dev, pipe); > + if (WARN(ret, "vblank not available on crtc %i, ret=%i\n", pipe, ret)) > return; > > - last = drm_vblank_count(dev, crtc); > + last = drm_vblank_count(dev, pipe); > > - ret = wait_event_timeout(dev->vblank[crtc].queue, > - last != drm_vblank_count(dev, crtc), > + ret = wait_event_timeout(vblank->queue, > + last != drm_vblank_count(dev, pipe), > msecs_to_jiffies(100)); > > - WARN(ret == 0, "vblank wait timed out on crtc %i\n", crtc); > + WARN(ret == 0, "vblank wait timed out on crtc %i\n", pipe); > > - drm_vblank_put(dev, crtc); > + drm_vblank_put(dev, pipe); > } > EXPORT_SYMBOL(drm_wait_one_vblank); > > @@ -1194,7 +1196,7 @@ EXPORT_SYMBOL(drm_crtc_wait_one_vblank); > /** > * drm_vblank_off - disable vblank events on a CRTC > * @dev: DRM device > - * @crtc: CRTC in question > + * @pipe: CRTC index > * > * Drivers can use this function to shut down the vblank interrupt handling when > * disabling a crtc. This function ensures that the latest vblank frame count is > @@ -1205,21 +1207,21 @@ EXPORT_SYMBOL(drm_crtc_wait_one_vblank); > * > * This is the legacy version of drm_crtc_vblank_off(). > */ > -void drm_vblank_off(struct drm_device *dev, int crtc) > +void drm_vblank_off(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > struct drm_pending_vblank_event *e, *t; > struct timeval now; > unsigned long irqflags; > unsigned int seq; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return; > > spin_lock_irqsave(&dev->event_lock, irqflags); > > spin_lock(&dev->vbl_lock); > - vblank_disable_and_save(dev, crtc); > + vblank_disable_and_save(dev, pipe); > wake_up(&vblank->queue); > > /* > @@ -1233,16 +1235,16 @@ void drm_vblank_off(struct drm_device *dev, int crtc) > spin_unlock(&dev->vbl_lock); > > /* Send any queued vblank events, lest the natives grow disquiet */ > - seq = drm_vblank_count_and_time(dev, crtc, &now); > + seq = drm_vblank_count_and_time(dev, pipe, &now); > > list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { > - if (e->pipe != crtc) > + if (e->pipe != pipe) > continue; > DRM_DEBUG("Sending premature vblank event on disable: \ > wanted %d, current %d\n", > e->event.sequence, seq); > list_del(&e->base.link); > - drm_vblank_put(dev, e->pipe); > + drm_vblank_put(dev, pipe); > send_vblank_event(dev, e, seq, &now); > } > spin_unlock_irqrestore(&dev->event_lock, irqflags); > @@ -1303,7 +1305,7 @@ EXPORT_SYMBOL(drm_crtc_vblank_reset); > /** > * drm_vblank_on - enable vblank events on a CRTC > * @dev: DRM device > - * @crtc: CRTC in question > + * @pipe: CRTC index > * > * This functions restores the vblank interrupt state captured with > * drm_vblank_off() again. Note that calls to drm_vblank_on() and > @@ -1312,12 +1314,12 @@ EXPORT_SYMBOL(drm_crtc_vblank_reset); > * > * This is the legacy version of drm_crtc_vblank_on(). > */ > -void drm_vblank_on(struct drm_device *dev, int crtc) > +void drm_vblank_on(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > unsigned long irqflags; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return; > > spin_lock_irqsave(&dev->vbl_lock, irqflags); > @@ -1335,7 +1337,7 @@ void drm_vblank_on(struct drm_device *dev, int crtc) > * vblank counter value before and after a modeset > */ > vblank->last = > - (dev->driver->get_vblank_counter(dev, crtc) - 1) & > + (dev->driver->get_vblank_counter(dev, pipe) - 1) & > dev->max_vblank_count; > /* > * re-enable interrupts if there are users left, or the > @@ -1343,7 +1345,7 @@ void drm_vblank_on(struct drm_device *dev, int crtc) > */ > if (atomic_read(&vblank->refcount) != 0 || > (!dev->vblank_disable_immediate && drm_vblank_offdelay == 0)) > - WARN_ON(drm_vblank_enable(dev, crtc)); > + WARN_ON(drm_vblank_enable(dev, pipe)); > spin_unlock_irqrestore(&dev->vbl_lock, irqflags); > } > EXPORT_SYMBOL(drm_vblank_on); > @@ -1368,7 +1370,7 @@ EXPORT_SYMBOL(drm_crtc_vblank_on); > /** > * drm_vblank_pre_modeset - account for vblanks across mode sets > * @dev: DRM device > - * @crtc: CRTC in question > + * @pipe: CRTC index > * > * Account for vblank events across mode setting events, which will likely > * reset the hardware frame counter. > @@ -1388,15 +1390,15 @@ EXPORT_SYMBOL(drm_crtc_vblank_on); > * Drivers must call drm_vblank_post_modeset() when re-enabling the same crtc > * again. > */ > -void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) > +void drm_vblank_pre_modeset(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > > /* vblank is not initialized (IRQ not installed ?), or has been freed */ > if (!dev->num_crtcs) > return; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return; > > /* > @@ -1408,7 +1410,7 @@ void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) > */ > if (!vblank->inmodeset) { > vblank->inmodeset = 0x1; > - if (drm_vblank_get(dev, crtc) == 0) > + if (drm_vblank_get(dev, pipe) == 0) > vblank->inmodeset |= 0x2; > } > } > @@ -1417,21 +1419,21 @@ EXPORT_SYMBOL(drm_vblank_pre_modeset); > /** > * drm_vblank_post_modeset - undo drm_vblank_pre_modeset changes > * @dev: DRM device > - * @crtc: CRTC in question > + * @pipe: CRTC index > * > * This function again drops the temporary vblank reference acquired in > * drm_vblank_pre_modeset. > */ > -void drm_vblank_post_modeset(struct drm_device *dev, int crtc) > +void drm_vblank_post_modeset(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > unsigned long irqflags; > > /* vblank is not initialized (IRQ not installed ?), or has been freed */ > if (!dev->num_crtcs) > return; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return; > > if (vblank->inmodeset) { > @@ -1440,7 +1442,7 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc) > spin_unlock_irqrestore(&dev->vbl_lock, irqflags); > > if (vblank->inmodeset & 0x2) > - drm_vblank_put(dev, crtc); > + drm_vblank_put(dev, pipe); > > vblank->inmodeset = 0; > } > @@ -1462,7 +1464,7 @@ int drm_modeset_ctl(struct drm_device *dev, void *data, > struct drm_file *file_priv) > { > struct drm_modeset_ctl *modeset = data; > - unsigned int crtc; > + unsigned int pipe; > > /* If drm_vblank_init() hasn't been called yet, just no-op */ > if (!dev->num_crtcs) > @@ -1472,16 +1474,16 @@ int drm_modeset_ctl(struct drm_device *dev, void *data, > if (drm_core_check_feature(dev, DRIVER_MODESET)) > return 0; > > - crtc = modeset->crtc; > - if (crtc >= dev->num_crtcs) > + pipe = modeset->crtc; > + if (pipe >= dev->num_crtcs) > return -EINVAL; > > switch (modeset->cmd) { > case _DRM_PRE_MODESET: > - drm_vblank_pre_modeset(dev, crtc); > + drm_vblank_pre_modeset(dev, pipe); > break; > case _DRM_POST_MODESET: > - drm_vblank_post_modeset(dev, crtc); > + drm_vblank_post_modeset(dev, pipe); > break; > default: > return -EINVAL; > @@ -1490,7 +1492,7 @@ int drm_modeset_ctl(struct drm_device *dev, void *data, > return 0; > } > > -static int drm_queue_vblank_event(struct drm_device *dev, int pipe, > +static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe, > union drm_wait_vblank *vblwait, > struct drm_file *file_priv) > { > @@ -1544,7 +1546,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe, > vblwait->reply.sequence = vblwait->request.sequence; > } > > - DRM_DEBUG("event on vblank count %d, current %d, crtc %d\n", > + DRM_DEBUG("event on vblank count %d, current %d, crtc %u\n", > vblwait->request.sequence, seq, pipe); > > trace_drm_vblank_event_queued(current->pid, pipe, > @@ -1593,7 +1595,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, > struct drm_vblank_crtc *vblank; > union drm_wait_vblank *vblwait = data; > int ret; > - unsigned int flags, seq, crtc, high_crtc; > + unsigned int flags, seq, pipe, high_pipe; > > if (!dev->irq_enabled) > return -EINVAL; > @@ -1612,22 +1614,22 @@ int drm_wait_vblank(struct drm_device *dev, void *data, > } > > flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; > - high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK); > - if (high_crtc) > - crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT; > + high_pipe = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK); > + if (high_pipe) > + pipe = high_pipe >> _DRM_VBLANK_HIGH_CRTC_SHIFT; > else > - crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; > - if (crtc >= dev->num_crtcs) > + pipe = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; > + if (pipe >= dev->num_crtcs) > return -EINVAL; > > - vblank = &dev->vblank[crtc]; > + vblank = &dev->vblank[pipe]; > > - ret = drm_vblank_get(dev, crtc); > + ret = drm_vblank_get(dev, pipe); > if (ret) { > DRM_DEBUG("failed to acquire vblank counter, %d\n", ret); > return ret; > } > - seq = drm_vblank_count(dev, crtc); > + seq = drm_vblank_count(dev, pipe); > > switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) { > case _DRM_VBLANK_RELATIVE: > @@ -1644,7 +1646,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, > /* must hold on to the vblank ref until the event fires > * drm_vblank_put will be called asynchronously > */ > - return drm_queue_vblank_event(dev, crtc, vblwait, file_priv); > + return drm_queue_vblank_event(dev, pipe, vblwait, file_priv); > } > > if ((flags & _DRM_VBLANK_NEXTONMISS) && > @@ -1652,11 +1654,11 @@ int drm_wait_vblank(struct drm_device *dev, void *data, > vblwait->request.sequence = seq + 1; > } > > - DRM_DEBUG("waiting on vblank count %d, crtc %d\n", > - vblwait->request.sequence, crtc); > + DRM_DEBUG("waiting on vblank count %d, crtc %u\n", > + vblwait->request.sequence, pipe); > vblank->last_wait = vblwait->request.sequence; > DRM_WAIT_ON(ret, vblank->queue, 3 * HZ, > - (((drm_vblank_count(dev, crtc) - > + (((drm_vblank_count(dev, pipe) - > vblwait->request.sequence) <= (1 << 23)) || > !vblank->enabled || > !dev->irq_enabled)); > @@ -1664,7 +1666,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, > if (ret != -EINTR) { > struct timeval now; > > - vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now); > + vblwait->reply.sequence = drm_vblank_count_and_time(dev, pipe, &now); > vblwait->reply.tval_sec = now.tv_sec; > vblwait->reply.tval_usec = now.tv_usec; > > @@ -1675,11 +1677,11 @@ int drm_wait_vblank(struct drm_device *dev, void *data, > } > > done: > - drm_vblank_put(dev, crtc); > + drm_vblank_put(dev, pipe); > return ret; > } > > -static void drm_handle_vblank_events(struct drm_device *dev, int crtc) > +static void drm_handle_vblank_events(struct drm_device *dev, unsigned int pipe) > { > struct drm_pending_vblank_event *e, *t; > struct timeval now; > @@ -1687,10 +1689,10 @@ static void drm_handle_vblank_events(struct drm_device *dev, int crtc) > > assert_spin_locked(&dev->event_lock); > > - seq = drm_vblank_count_and_time(dev, crtc, &now); > + seq = drm_vblank_count_and_time(dev, pipe, &now); > > list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) { > - if (e->pipe != crtc) > + if (e->pipe != pipe) > continue; > if ((seq - e->event.sequence) > (1<<23)) > continue; > @@ -1699,26 +1701,26 @@ static void drm_handle_vblank_events(struct drm_device *dev, int crtc) > e->event.sequence, seq); > > list_del(&e->base.link); > - drm_vblank_put(dev, e->pipe); > + drm_vblank_put(dev, pipe); > send_vblank_event(dev, e, seq, &now); > } > > - trace_drm_vblank_event(crtc, seq); > + trace_drm_vblank_event(pipe, seq); > } > > /** > * drm_handle_vblank - handle a vblank event > * @dev: DRM device > - * @crtc: where this event occurred > + * @pipe: index of CRTC where this event occurred > * > * Drivers should call this routine in their vblank interrupt handlers to > * update the vblank counter and send any signals that may be pending. > * > * This is the legacy version of drm_crtc_handle_vblank(). > */ > -bool drm_handle_vblank(struct drm_device *dev, int crtc) > +bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe) > { > - struct drm_vblank_crtc *vblank = &dev->vblank[crtc]; > + struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; > u32 vblcount; > s64 diff_ns; > struct timeval tvblank; > @@ -1727,7 +1729,7 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc) > if (WARN_ON_ONCE(!dev->num_crtcs)) > return false; > > - if (WARN_ON(crtc >= dev->num_crtcs)) > + if (WARN_ON(pipe >= dev->num_crtcs)) > return false; > > spin_lock_irqsave(&dev->event_lock, irqflags); > @@ -1751,11 +1753,11 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc) > > /* Get current timestamp and count. */ > vblcount = vblank->count; > - drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ); > + drm_get_last_vbltimestamp(dev, pipe, &tvblank, DRM_CALLED_FROM_VBLIRQ); > > /* Compute time difference to timestamp of last vblank */ > diff_ns = timeval_to_ns(&tvblank) - > - timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount)); > + timeval_to_ns(&vblanktimestamp(dev, pipe, vblcount)); > > /* Update vblank timestamp and count if at least > * DRM_REDUNDANT_VBLIRQ_THRESH_NS nanoseconds > @@ -1767,15 +1769,15 @@ bool drm_handle_vblank(struct drm_device *dev, int crtc) > * ignore those for accounting. > */ > if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) > - store_vblank(dev, crtc, 1, &tvblank); > + store_vblank(dev, pipe, 1, &tvblank); > else > - DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n", > - crtc, (int) diff_ns); > + DRM_DEBUG("crtc %u: Redundant vblirq ignored. diff_ns = %d\n", > + pipe, (int) diff_ns); > > spin_unlock(&dev->vblank_time_lock); > > wake_up(&vblank->queue); > - drm_handle_vblank_events(dev, crtc); > + drm_handle_vblank_events(dev, pipe); > > spin_unlock_irqrestore(&dev->event_lock, irqflags); > > diff --git a/include/drm/drmP.h b/include/drm/drmP.h > index 5908848d86b3..020afa343dff 100644 > --- a/include/drm/drmP.h > +++ b/include/drm/drmP.h > @@ -681,7 +681,7 @@ struct drm_minor { > > struct drm_pending_vblank_event { > struct drm_pending_event base; > - int pipe; > + unsigned int pipe; > struct drm_event_vblank event; > }; > > @@ -700,7 +700,7 @@ struct drm_vblank_crtc { > /* for wraparound handling */ > u32 last_wait; /* Last vblank seqno waited per CRTC */ > unsigned int inmodeset; /* Display driver is setting mode */ > - int crtc; /* crtc index */ > + unsigned int pipe; /* crtc index */ > bool enabled; /* so we don't call enable more than > once per disable */ > }; > @@ -920,34 +920,34 @@ void drm_clflush_virt_range(void *addr, unsigned long length); > extern int drm_irq_install(struct drm_device *dev, int irq); > extern int drm_irq_uninstall(struct drm_device *dev); > > -extern int drm_vblank_init(struct drm_device *dev, int num_crtcs); > +extern int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs); > extern int drm_wait_vblank(struct drm_device *dev, void *data, > struct drm_file *filp); > -extern u32 drm_vblank_count(struct drm_device *dev, int crtc); > +extern u32 drm_vblank_count(struct drm_device *dev, int pipe); > extern u32 drm_crtc_vblank_count(struct drm_crtc *crtc); > -extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, > +extern u32 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe, > struct timeval *vblanktime); > -extern void drm_send_vblank_event(struct drm_device *dev, int crtc, > - struct drm_pending_vblank_event *e); > +extern void drm_send_vblank_event(struct drm_device *dev, unsigned int pipe, > + struct drm_pending_vblank_event *e); > extern void drm_crtc_send_vblank_event(struct drm_crtc *crtc, > struct drm_pending_vblank_event *e); > -extern bool drm_handle_vblank(struct drm_device *dev, int crtc); > +extern bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe); > extern bool drm_crtc_handle_vblank(struct drm_crtc *crtc); > -extern int drm_vblank_get(struct drm_device *dev, int crtc); > -extern void drm_vblank_put(struct drm_device *dev, int crtc); > +extern int drm_vblank_get(struct drm_device *dev, unsigned int pipe); > +extern void drm_vblank_put(struct drm_device *dev, unsigned int pipe); > extern int drm_crtc_vblank_get(struct drm_crtc *crtc); > extern void drm_crtc_vblank_put(struct drm_crtc *crtc); > -extern void drm_wait_one_vblank(struct drm_device *dev, int crtc); > +extern void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe); > extern void drm_crtc_wait_one_vblank(struct drm_crtc *crtc); > -extern void drm_vblank_off(struct drm_device *dev, int crtc); > -extern void drm_vblank_on(struct drm_device *dev, int crtc); > +extern void drm_vblank_off(struct drm_device *dev, unsigned int pipe); > +extern void drm_vblank_on(struct drm_device *dev, unsigned int pipe); > extern void drm_crtc_vblank_off(struct drm_crtc *crtc); > extern void drm_crtc_vblank_reset(struct drm_crtc *crtc); > extern void drm_crtc_vblank_on(struct drm_crtc *crtc); > extern void drm_vblank_cleanup(struct drm_device *dev); > > extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, > - int crtc, int *max_error, > + unsigned int pipe, int *max_error, > struct timeval *vblank_time, > unsigned flags, > const struct drm_crtc *refcrtc, > @@ -968,8 +968,8 @@ static inline wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc > } > > /* Modesetting support */ > -extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); > -extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc); > +extern void drm_vblank_pre_modeset(struct drm_device *dev, unsigned int pipe); > +extern void drm_vblank_post_modeset(struct drm_device *dev, unsigned int pipe); > > /* Stub support (drm_stub.h) */ > extern struct drm_master *drm_master_get(struct drm_master *master); > -- > 2.4.5 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel