Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: Add a debug node for vblank state.

Signed-off-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Dave Airlie <airlied@linux.ie>

authored by

Eric Anholt and committed by
Dave Airlie
fede5c91 f51c5b6e

+73
+9
drivers/gpu/drm/drm_irq.c
··· 116 116 dev->num_crtcs, DRM_MEM_DRIVER); 117 117 drm_free(dev->last_vblank, sizeof(*dev->last_vblank) * dev->num_crtcs, 118 118 DRM_MEM_DRIVER); 119 + drm_free(dev->last_vblank_wait, 120 + sizeof(*dev->last_vblank_wait) * dev->num_crtcs, 121 + DRM_MEM_DRIVER); 119 122 drm_free(dev->vblank_inmodeset, sizeof(*dev->vblank_inmodeset) * 120 123 dev->num_crtcs, DRM_MEM_DRIVER); 121 124 ··· 162 159 163 160 dev->last_vblank = drm_calloc(num_crtcs, sizeof(u32), DRM_MEM_DRIVER); 164 161 if (!dev->last_vblank) 162 + goto err; 163 + 164 + dev->last_vblank_wait = drm_calloc(num_crtcs, sizeof(u32), 165 + DRM_MEM_DRIVER); 166 + if (!dev->last_vblank_wait) 165 167 goto err; 166 168 167 169 dev->vblank_inmodeset = drm_calloc(num_crtcs, sizeof(int), ··· 650 642 } else { 651 643 DRM_DEBUG("waiting on vblank count %d, crtc %d\n", 652 644 vblwait->request.sequence, crtc); 645 + dev->last_vblank_wait[crtc] = vblwait->request.sequence; 653 646 DRM_WAIT_ON(ret, dev->vbl_queue[crtc], 3 * DRM_HZ, 654 647 ((drm_vblank_count(dev, crtc) 655 648 - vblwait->request.sequence) <= (1 << 23)));
+63
drivers/gpu/drm/drm_proc.c
··· 49 49 int request, int *eof, void *data); 50 50 static int drm_bufs_info(char *buf, char **start, off_t offset, 51 51 int request, int *eof, void *data); 52 + static int drm_vblank_info(char *buf, char **start, off_t offset, 53 + int request, int *eof, void *data); 52 54 static int drm_gem_name_info(char *buf, char **start, off_t offset, 53 55 int request, int *eof, void *data); 54 56 static int drm_gem_object_info(char *buf, char **start, off_t offset, ··· 74 72 {"clients", drm_clients_info, 0}, 75 73 {"queues", drm_queues_info, 0}, 76 74 {"bufs", drm_bufs_info, 0}, 75 + {"vblank", drm_vblank_info, 0}, 77 76 {"gem_names", drm_gem_name_info, DRIVER_GEM}, 78 77 {"gem_objects", drm_gem_object_info, DRIVER_GEM}, 79 78 #if DRM_DEBUG_CODE ··· 456 453 457 454 mutex_lock(&dev->struct_mutex); 458 455 ret = drm__bufs_info(buf, start, offset, request, eof, data); 456 + mutex_unlock(&dev->struct_mutex); 457 + return ret; 458 + } 459 + 460 + /** 461 + * Called when "/proc/dri/.../vblank" is read. 462 + * 463 + * \param buf output buffer. 464 + * \param start start of output data. 465 + * \param offset requested start offset. 466 + * \param request requested number of bytes. 467 + * \param eof whether there is no more data to return. 468 + * \param data private data. 469 + * \return number of written bytes. 470 + */ 471 + static int drm__vblank_info(char *buf, char **start, off_t offset, int request, 472 + int *eof, void *data) 473 + { 474 + struct drm_minor *minor = (struct drm_minor *) data; 475 + struct drm_device *dev = minor->dev; 476 + int len = 0; 477 + int crtc; 478 + 479 + if (offset > DRM_PROC_LIMIT) { 480 + *eof = 1; 481 + return 0; 482 + } 483 + 484 + *start = &buf[offset]; 485 + *eof = 0; 486 + 487 + for (crtc = 0; crtc < dev->num_crtcs; crtc++) { 488 + DRM_PROC_PRINT("CRTC %d enable: %d\n", 489 + crtc, atomic_read(&dev->vblank_refcount[crtc])); 490 + DRM_PROC_PRINT("CRTC %d counter: %d\n", 491 + crtc, drm_vblank_count(dev, crtc)); 492 + DRM_PROC_PRINT("CRTC %d last wait: %d\n", 493 + crtc, dev->last_vblank_wait[crtc]); 494 + DRM_PROC_PRINT("CRTC %d in modeset: %d\n", 495 + crtc, dev->vblank_inmodeset[crtc]); 496 + } 497 + 498 + if (len > request + offset) 499 + return request; 500 + *eof = 1; 501 + return len - offset; 502 + } 503 + 504 + /** 505 + * Simply calls _vblank_info() while holding the drm_device::struct_mutex lock. 506 + */ 507 + static int drm_vblank_info(char *buf, char **start, off_t offset, int request, 508 + int *eof, void *data) 509 + { 510 + struct drm_minor *minor = (struct drm_minor *) data; 511 + struct drm_device *dev = minor->dev; 512 + int ret; 513 + 514 + mutex_lock(&dev->struct_mutex); 515 + ret = drm__vblank_info(buf, start, offset, request, eof, data); 459 516 mutex_unlock(&dev->struct_mutex); 460 517 return ret; 461 518 }
+1
include/drm/drmP.h
··· 911 911 int *vblank_enabled; /* so we don't call enable more than 912 912 once per disable */ 913 913 int *vblank_inmodeset; /* Display driver is setting mode */ 914 + u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ 914 915 struct timer_list vblank_disable_timer; 915 916 916 917 u32 max_vblank_count; /**< size of vblank counter register */