···4949 int request, int *eof, void *data);5050static int drm_bufs_info(char *buf, char **start, off_t offset,5151 int request, int *eof, void *data);5252+static int drm_vblank_info(char *buf, char **start, off_t offset,5353+ int request, int *eof, void *data);5254static int drm_gem_name_info(char *buf, char **start, off_t offset,5355 int request, int *eof, void *data);5456static int drm_gem_object_info(char *buf, char **start, off_t offset,···7472 {"clients", drm_clients_info, 0},7573 {"queues", drm_queues_info, 0},7674 {"bufs", drm_bufs_info, 0},7575+ {"vblank", drm_vblank_info, 0},7776 {"gem_names", drm_gem_name_info, DRIVER_GEM},7877 {"gem_objects", drm_gem_object_info, DRIVER_GEM},7978#if DRM_DEBUG_CODE···456453457454 mutex_lock(&dev->struct_mutex);458455 ret = drm__bufs_info(buf, start, offset, request, eof, data);456456+ mutex_unlock(&dev->struct_mutex);457457+ return ret;458458+}459459+460460+/**461461+ * Called when "/proc/dri/.../vblank" is read.462462+ *463463+ * \param buf output buffer.464464+ * \param start start of output data.465465+ * \param offset requested start offset.466466+ * \param request requested number of bytes.467467+ * \param eof whether there is no more data to return.468468+ * \param data private data.469469+ * \return number of written bytes.470470+ */471471+static int drm__vblank_info(char *buf, char **start, off_t offset, int request,472472+ int *eof, void *data)473473+{474474+ struct drm_minor *minor = (struct drm_minor *) data;475475+ struct drm_device *dev = minor->dev;476476+ int len = 0;477477+ int crtc;478478+479479+ if (offset > DRM_PROC_LIMIT) {480480+ *eof = 1;481481+ return 0;482482+ }483483+484484+ *start = &buf[offset];485485+ *eof = 0;486486+487487+ for (crtc = 0; crtc < dev->num_crtcs; crtc++) {488488+ DRM_PROC_PRINT("CRTC %d enable: %d\n",489489+ crtc, atomic_read(&dev->vblank_refcount[crtc]));490490+ DRM_PROC_PRINT("CRTC %d counter: %d\n",491491+ crtc, drm_vblank_count(dev, crtc));492492+ DRM_PROC_PRINT("CRTC %d last wait: %d\n",493493+ crtc, dev->last_vblank_wait[crtc]);494494+ DRM_PROC_PRINT("CRTC %d in modeset: %d\n",495495+ crtc, dev->vblank_inmodeset[crtc]);496496+ }497497+498498+ if (len > request + offset)499499+ return request;500500+ *eof = 1;501501+ return len - offset;502502+}503503+504504+/**505505+ * Simply calls _vblank_info() while holding the drm_device::struct_mutex lock.506506+ */507507+static int drm_vblank_info(char *buf, char **start, off_t offset, int request,508508+ int *eof, void *data)509509+{510510+ struct drm_minor *minor = (struct drm_minor *) data;511511+ struct drm_device *dev = minor->dev;512512+ int ret;513513+514514+ mutex_lock(&dev->struct_mutex);515515+ ret = drm__vblank_info(buf, start, offset, request, eof, data);459516 mutex_unlock(&dev->struct_mutex);460517 return ret;461518}
+1
include/drm/drmP.h
···911911 int *vblank_enabled; /* so we don't call enable more than912912 once per disable */913913 int *vblank_inmodeset; /* Display driver is setting mode */914914+ u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */914915 struct timer_list vblank_disable_timer;915916916917 u32 max_vblank_count; /**< size of vblank counter register */