Loading drivers/gpu/drm/drm_irq.c +9 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,9 @@ void drm_vblank_cleanup(struct drm_device *dev) dev->num_crtcs, DRM_MEM_DRIVER); drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs, DRM_MEM_DRIVER); drm_free(dev->last_vblank_wait, sizeof(*dev->last_vblank_wait) * dev->num_crtcs, DRM_MEM_DRIVER); drm_free(dev->vblank_inmodeset, sizeof(*dev->vblank_inmodeset) * dev->num_crtcs, DRM_MEM_DRIVER); Loading Loading @@ -161,6 +164,11 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) if (!dev->last_vblank) goto err; dev->last_vblank_wait = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER); if (!dev->last_vblank_wait) goto err; dev->vblank_inmodeset = drm_calloc(num_crtcs, sizeof(int), DRM_MEM_DRIVER); if (!dev->vblank_inmodeset) Loading Loading @@ -642,6 +650,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, } else { DRM_DEBUG("waiting on vblank count %d, crtc %d\n", vblwait->request.sequence, crtc); dev->last_vblank_wait[crtc] = vblwait->request.sequence; DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ, ((drm_vblank_count(dev, crtc) - vblwait->request.sequence) <= (1 << 23))); Loading drivers/gpu/drm/drm_proc.c +63 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ static int drm_queues_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_bufs_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_vblank_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_gem_name_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_gem_object_info(char *buf, char **start, off_t offset, Loading @@ -72,6 +74,7 @@ static struct drm_proc_list { {"clients", drm_clients_info, 0}, {"queues", drm_queues_info, 0}, {"bufs", drm_bufs_info, 0}, {"vblank", drm_vblank_info, 0}, {"gem_names", drm_gem_name_info, DRIVER_GEM}, {"gem_objects", drm_gem_object_info, DRIVER_GEM}, #if DRM_DEBUG_CODE Loading Loading @@ -457,6 +460,66 @@ static int drm_bufs_info(char *buf, char **start, off_t offset, int request, return ret; } /** * Called when "/proc/dri/.../vblank" is read. * * \param buf output buffer. * \param start start of output data. * \param offset requested start offset. * \param request requested number of bytes. * \param eof whether there is no more data to return. * \param data private data. * \return number of written bytes. */ static int drm__vblank_info(char *buf, char **start, off_t offset, int request, int *eof, void *data) { struct drm_minor *minor = (struct drm_minor *) data; struct drm_device *dev = minor->dev; int len = 0; int crtc; if (offset > DRM_PROC_LIMIT) { *eof = 1; return 0; } *start = &buf[offset]; *eof = 0; for (crtc = 0; crtc < dev->num_crtcs; crtc++) { DRM_PROC_PRINT("CRTC %d enable: %d\n", crtc, atomic_read(&dev->vblank_refcount[crtc])); DRM_PROC_PRINT("CRTC %d counter: %d\n", crtc, drm_vblank_count(dev, crtc)); DRM_PROC_PRINT("CRTC %d last wait: %d\n", crtc, dev->last_vblank_wait[crtc]); DRM_PROC_PRINT("CRTC %d in modeset: %d\n", crtc, dev->vblank_inmodeset[crtc]); } if (len > request + offset) return request; *eof = 1; return len - offset; } /** * Simply calls _vblank_info() while holding the drm_device::struct_mutex lock. */ static int drm_vblank_info(char *buf, char **start, off_t offset, int request, int *eof, void *data) { struct drm_minor *minor = (struct drm_minor *) data; struct drm_device *dev = minor->dev; int ret; mutex_lock(&dev->struct_mutex); ret = drm__vblank_info(buf, start, offset, request, eof, data); mutex_unlock(&dev->struct_mutex); return ret; } /** * Called when "/proc/dri/.../clients" is read. * Loading include/drm/drmP.h +1 −0 Original line number Diff line number Diff line Loading @@ -911,6 +911,7 @@ struct drm_device { int *vblank_enabled; /* so we don't call enable more than once per disable */ int *vblank_inmodeset; /* Display driver is setting mode */ u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ struct timer_list vblank_disable_timer; u32 max_vblank_count; /**< size of vblank counter register */ Loading Loading
drivers/gpu/drm/drm_irq.c +9 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,9 @@ void drm_vblank_cleanup(struct drm_device *dev) dev->num_crtcs, DRM_MEM_DRIVER); drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs, DRM_MEM_DRIVER); drm_free(dev->last_vblank_wait, sizeof(*dev->last_vblank_wait) * dev->num_crtcs, DRM_MEM_DRIVER); drm_free(dev->vblank_inmodeset, sizeof(*dev->vblank_inmodeset) * dev->num_crtcs, DRM_MEM_DRIVER); Loading Loading @@ -161,6 +164,11 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs) if (!dev->last_vblank) goto err; dev->last_vblank_wait = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER); if (!dev->last_vblank_wait) goto err; dev->vblank_inmodeset = drm_calloc(num_crtcs, sizeof(int), DRM_MEM_DRIVER); if (!dev->vblank_inmodeset) Loading Loading @@ -642,6 +650,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, } else { DRM_DEBUG("waiting on vblank count %d, crtc %d\n", vblwait->request.sequence, crtc); dev->last_vblank_wait[crtc] = vblwait->request.sequence; DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ, ((drm_vblank_count(dev, crtc) - vblwait->request.sequence) <= (1 << 23))); Loading
drivers/gpu/drm/drm_proc.c +63 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ static int drm_queues_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_bufs_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_vblank_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_gem_name_info(char *buf, char **start, off_t offset, int request, int *eof, void *data); static int drm_gem_object_info(char *buf, char **start, off_t offset, Loading @@ -72,6 +74,7 @@ static struct drm_proc_list { {"clients", drm_clients_info, 0}, {"queues", drm_queues_info, 0}, {"bufs", drm_bufs_info, 0}, {"vblank", drm_vblank_info, 0}, {"gem_names", drm_gem_name_info, DRIVER_GEM}, {"gem_objects", drm_gem_object_info, DRIVER_GEM}, #if DRM_DEBUG_CODE Loading Loading @@ -457,6 +460,66 @@ static int drm_bufs_info(char *buf, char **start, off_t offset, int request, return ret; } /** * Called when "/proc/dri/.../vblank" is read. * * \param buf output buffer. * \param start start of output data. * \param offset requested start offset. * \param request requested number of bytes. * \param eof whether there is no more data to return. * \param data private data. * \return number of written bytes. */ static int drm__vblank_info(char *buf, char **start, off_t offset, int request, int *eof, void *data) { struct drm_minor *minor = (struct drm_minor *) data; struct drm_device *dev = minor->dev; int len = 0; int crtc; if (offset > DRM_PROC_LIMIT) { *eof = 1; return 0; } *start = &buf[offset]; *eof = 0; for (crtc = 0; crtc < dev->num_crtcs; crtc++) { DRM_PROC_PRINT("CRTC %d enable: %d\n", crtc, atomic_read(&dev->vblank_refcount[crtc])); DRM_PROC_PRINT("CRTC %d counter: %d\n", crtc, drm_vblank_count(dev, crtc)); DRM_PROC_PRINT("CRTC %d last wait: %d\n", crtc, dev->last_vblank_wait[crtc]); DRM_PROC_PRINT("CRTC %d in modeset: %d\n", crtc, dev->vblank_inmodeset[crtc]); } if (len > request + offset) return request; *eof = 1; return len - offset; } /** * Simply calls _vblank_info() while holding the drm_device::struct_mutex lock. */ static int drm_vblank_info(char *buf, char **start, off_t offset, int request, int *eof, void *data) { struct drm_minor *minor = (struct drm_minor *) data; struct drm_device *dev = minor->dev; int ret; mutex_lock(&dev->struct_mutex); ret = drm__vblank_info(buf, start, offset, request, eof, data); mutex_unlock(&dev->struct_mutex); return ret; } /** * Called when "/proc/dri/.../clients" is read. * Loading
include/drm/drmP.h +1 −0 Original line number Diff line number Diff line Loading @@ -911,6 +911,7 @@ struct drm_device { int *vblank_enabled; /* so we don't call enable more than once per disable */ int *vblank_inmodeset; /* Display driver is setting mode */ u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ struct timer_list vblank_disable_timer; u32 max_vblank_count; /**< size of vblank counter register */ Loading