drm_proc.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* drm_proc.h -- /proc support for DRM -*- linux-c -*-
  2.  * Created: Mon Jan 11 09:48:47 1999 by faith@valinux.com
  3.  *
  4.  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
  5.  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
  6.  * All Rights Reserved.
  7.  *
  8.  * Permission is hereby granted, free of charge, to any person obtaining a
  9.  * copy of this software and associated documentation files (the "Software"),
  10.  * to deal in the Software without restriction, including without limitation
  11.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  12.  * and/or sell copies of the Software, and to permit persons to whom the
  13.  * Software is furnished to do so, subject to the following conditions:
  14.  *
  15.  * The above copyright notice and this permission notice (including the next
  16.  * paragraph) shall be included in all copies or substantial portions of the
  17.  * Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22.  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  23.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  24.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  25.  * OTHER DEALINGS IN THE SOFTWARE.
  26.  *
  27.  * Authors:
  28.  *    Rickard E. (Rik) Faith <faith@valinux.com>
  29.  *    Gareth Hughes <gareth@valinux.com>
  30.  *
  31.  * Acknowledgements:
  32.  *    Matthew J Sottek <matthew.j.sottek@intel.com> sent in a patch to fix
  33.  *    the problem with the proc files not outputting all their information.
  34.  */
  35. #define __NO_VERSION__
  36. #include "drmP.h"
  37. static int    DRM(name_info)(char *buf, char **start, off_t offset,
  38.   int request, int *eof, void *data);
  39. static int    DRM(vm_info)(char *buf, char **start, off_t offset,
  40. int request, int *eof, void *data);
  41. static int    DRM(clients_info)(char *buf, char **start, off_t offset,
  42.      int request, int *eof, void *data);
  43. static int    DRM(queues_info)(char *buf, char **start, off_t offset,
  44.     int request, int *eof, void *data);
  45. static int    DRM(bufs_info)(char *buf, char **start, off_t offset,
  46.   int request, int *eof, void *data);
  47. #if DRM_DEBUG_CODE
  48. static int    DRM(vma_info)(char *buf, char **start, off_t offset,
  49.  int request, int *eof, void *data);
  50. #endif
  51. #if __HAVE_DMA_HISTOGRAM
  52. static int    DRM(histo_info)(char *buf, char **start, off_t offset,
  53.    int request, int *eof, void *data);
  54. #endif
  55. struct drm_proc_list {
  56. const char *name;
  57. int    (*f)(char *, char **, off_t, int, int *, void *);
  58. } DRM(proc_list)[] = {
  59. { "name",    DRM(name_info)    },
  60. { "mem",     DRM(mem_info)     },
  61. { "vm",      DRM(vm_info)      },
  62. { "clients", DRM(clients_info) },
  63. { "queues",  DRM(queues_info)  },
  64. { "bufs",    DRM(bufs_info)    },
  65. #if DRM_DEBUG_CODE
  66. { "vma",     DRM(vma_info)     },
  67. #endif
  68. #if __HAVE_DMA_HISTOGRAM
  69. { "histo",   DRM(histo_info)   },
  70. #endif
  71. };
  72. #define DRM_PROC_ENTRIES (sizeof(DRM(proc_list))/sizeof(DRM(proc_list)[0]))
  73. struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev, int minor,
  74.       struct proc_dir_entry *root,
  75.       struct proc_dir_entry **dev_root)
  76. {
  77. struct proc_dir_entry *ent;
  78. int       i, j;
  79. char                  name[64];
  80. if (!minor) root = create_proc_entry("dri", S_IFDIR, NULL);
  81. if (!root) {
  82. DRM_ERROR("Cannot create /proc/drin");
  83. return NULL;
  84. }
  85. sprintf(name, "%d", minor);
  86. *dev_root = create_proc_entry(name, S_IFDIR, root);
  87. if (!*dev_root) {
  88. DRM_ERROR("Cannot create /proc/%sn", name);
  89. return NULL;
  90. }
  91. for (i = 0; i < DRM_PROC_ENTRIES; i++) {
  92. ent = create_proc_entry(DRM(proc_list)[i].name,
  93. S_IFREG|S_IRUGO, *dev_root);
  94. if (!ent) {
  95. DRM_ERROR("Cannot create /proc/dri/%s/%sn",
  96.   name, DRM(proc_list)[i].name);
  97. for (j = 0; j < i; j++)
  98. remove_proc_entry(DRM(proc_list)[i].name,
  99.   *dev_root);
  100. remove_proc_entry(name, root);
  101. if (!minor) remove_proc_entry("dri", NULL);
  102. return NULL;
  103. }
  104. ent->read_proc = DRM(proc_list)[i].f;
  105. ent->data      = dev;
  106. }
  107. return root;
  108. }
  109. int DRM(proc_cleanup)(int minor, struct proc_dir_entry *root,
  110.       struct proc_dir_entry *dev_root)
  111. {
  112. int  i;
  113. char name[64];
  114. if (!root || !dev_root) return 0;
  115. for (i = 0; i < DRM_PROC_ENTRIES; i++)
  116. remove_proc_entry(DRM(proc_list)[i].name, dev_root);
  117. sprintf(name, "%d", minor);
  118. remove_proc_entry(name, root);
  119. if (!minor) remove_proc_entry("dri", NULL);
  120. return 0;
  121. }
  122. static int DRM(name_info)(char *buf, char **start, off_t offset, int request,
  123.   int *eof, void *data)
  124. {
  125. drm_device_t *dev = (drm_device_t *)data;
  126. int          len  = 0;
  127. if (offset > DRM_PROC_LIMIT) {
  128. *eof = 1;
  129. return 0;
  130. }
  131. *start = &buf[offset];
  132. *eof   = 0;
  133. if (dev->unique) {
  134. DRM_PROC_PRINT("%s 0x%x %sn",
  135.        dev->name, dev->device, dev->unique);
  136. } else {
  137. DRM_PROC_PRINT("%s 0x%xn", dev->name, dev->device);
  138. }
  139. if (len > request + offset) return request;
  140. *eof = 1;
  141. return len - offset;
  142. }
  143. static int DRM(_vm_info)(char *buf, char **start, off_t offset, int request,
  144.  int *eof, void *data)
  145. {
  146. drm_device_t *dev = (drm_device_t *)data;
  147. int          len  = 0;
  148. drm_map_t    *map;
  149. drm_map_list_t *r_list;
  150. struct list_head *list;
  151. /* Hardcoded from _DRM_FRAME_BUFFER,
  152.                                    _DRM_REGISTERS, _DRM_SHM, and
  153.                                    _DRM_AGP. */
  154. const char   *types[] = { "FB", "REG", "SHM", "AGP" };
  155. const char   *type;
  156. int      i;
  157. if (offset > DRM_PROC_LIMIT) {
  158. *eof = 1;
  159. return 0;
  160. }
  161. *start = &buf[offset];
  162. *eof   = 0;
  163. DRM_PROC_PRINT("slot  offset       size type flags  "
  164.        "address mtrrnn");
  165. i = 0;
  166. if (dev->maplist != NULL) list_for_each(list, &dev->maplist->head) {
  167. r_list = (drm_map_list_t *)list;
  168. map = r_list->map;
  169. if(!map) continue;
  170. if (map->type < 0 || map->type > 3) type = "??";
  171. else     type = types[map->type];
  172. DRM_PROC_PRINT("%4d 0x%08lx 0x%08lx %4.4s  0x%02x 0x%08lx ",
  173.        i,
  174.        map->offset,
  175.        map->size,
  176.        type,
  177.        map->flags,
  178.        (unsigned long)map->handle);
  179. if (map->mtrr < 0) {
  180. DRM_PROC_PRINT("nonen");
  181. } else {
  182. DRM_PROC_PRINT("%4dn", map->mtrr);
  183. }
  184. i++;
  185. }
  186. if (len > request + offset) return request;
  187. *eof = 1;
  188. return len - offset;
  189. }
  190. static int DRM(vm_info)(char *buf, char **start, off_t offset, int request,
  191. int *eof, void *data)
  192. {
  193. drm_device_t *dev = (drm_device_t *)data;
  194. int      ret;
  195. down(&dev->struct_sem);
  196. ret = DRM(_vm_info)(buf, start, offset, request, eof, data);
  197. up(&dev->struct_sem);
  198. return ret;
  199. }
  200. static int DRM(_queues_info)(char *buf, char **start, off_t offset,
  201.      int request, int *eof, void *data)
  202. {
  203. drm_device_t *dev = (drm_device_t *)data;
  204. int          len  = 0;
  205. int      i;
  206. drm_queue_t  *q;
  207. if (offset > DRM_PROC_LIMIT) {
  208. *eof = 1;
  209. return 0;
  210. }
  211. *start = &buf[offset];
  212. *eof   = 0;
  213. DRM_PROC_PRINT("  ctx/flags   use   fin"
  214.        "   blk/rw/rwf  wait    flushed    queued"
  215.        "      locksnn");
  216. for (i = 0; i < dev->queue_count; i++) {
  217. q = dev->queuelist[i];
  218. atomic_inc(&q->use_count);
  219. DRM_PROC_PRINT_RET(atomic_dec(&q->use_count),
  220.    "%5d/0x%03x %5d %5d"
  221.    " %5d/%c%c/%c%c%c %5Zdn",
  222.    i,
  223.    q->flags,
  224.    atomic_read(&q->use_count),
  225.    atomic_read(&q->finalization),
  226.    atomic_read(&q->block_count),
  227.    atomic_read(&q->block_read) ? 'r' : '-',
  228.    atomic_read(&q->block_write) ? 'w' : '-',
  229.    waitqueue_active(&q->read_queue) ? 'r':'-',
  230.    waitqueue_active(&q->write_queue) ? 'w':'-',
  231.    waitqueue_active(&q->flush_queue) ? 'f':'-',
  232.    DRM_BUFCOUNT(&q->waitlist));
  233. atomic_dec(&q->use_count);
  234. }
  235. if (len > request + offset) return request;
  236. *eof = 1;
  237. return len - offset;
  238. }
  239. static int DRM(queues_info)(char *buf, char **start, off_t offset, int request,
  240.     int *eof, void *data)
  241. {
  242. drm_device_t *dev = (drm_device_t *)data;
  243. int      ret;
  244. down(&dev->struct_sem);
  245. ret = DRM(_queues_info)(buf, start, offset, request, eof, data);
  246. up(&dev->struct_sem);
  247. return ret;
  248. }
  249. /* drm_bufs_info is called whenever a process reads
  250.    /dev/dri/<dev>/bufs. */
  251. static int DRM(_bufs_info)(char *buf, char **start, off_t offset, int request,
  252.    int *eof, void *data)
  253. {
  254. drm_device_t  *dev = (drm_device_t *)data;
  255. int              len  = 0;
  256. drm_device_dma_t *dma = dev->dma;
  257. int  i;
  258. if (!dma || offset > DRM_PROC_LIMIT) {
  259. *eof = 1;
  260. return 0;
  261. }
  262. *start = &buf[offset];
  263. *eof   = 0;
  264. DRM_PROC_PRINT(" o     size count  free  segs pages    kBnn");
  265. for (i = 0; i <= DRM_MAX_ORDER; i++) {
  266. if (dma->bufs[i].buf_count)
  267. DRM_PROC_PRINT("%2d %8d %5d %5d %5d %5d %5ldn",
  268.        i,
  269.        dma->bufs[i].buf_size,
  270.        dma->bufs[i].buf_count,
  271.        atomic_read(&dma->bufs[i]
  272.    .freelist.count),
  273.        dma->bufs[i].seg_count,
  274.        dma->bufs[i].seg_count
  275.        *(1 << dma->bufs[i].page_order),
  276.        (dma->bufs[i].seg_count
  277. * (1 << dma->bufs[i].page_order))
  278.        * PAGE_SIZE / 1024);
  279. }
  280. DRM_PROC_PRINT("n");
  281. for (i = 0; i < dma->buf_count; i++) {
  282. if (i && !(i%32)) DRM_PROC_PRINT("n");
  283. DRM_PROC_PRINT(" %d", dma->buflist[i]->list);
  284. }
  285. DRM_PROC_PRINT("n");
  286. if (len > request + offset) return request;
  287. *eof = 1;
  288. return len - offset;
  289. }
  290. static int DRM(bufs_info)(char *buf, char **start, off_t offset, int request,
  291.   int *eof, void *data)
  292. {
  293. drm_device_t *dev = (drm_device_t *)data;
  294. int      ret;
  295. down(&dev->struct_sem);
  296. ret = DRM(_bufs_info)(buf, start, offset, request, eof, data);
  297. up(&dev->struct_sem);
  298. return ret;
  299. }
  300. static int DRM(_clients_info)(char *buf, char **start, off_t offset,
  301.       int request, int *eof, void *data)
  302. {
  303. drm_device_t *dev = (drm_device_t *)data;
  304. int          len  = 0;
  305. drm_file_t   *priv;
  306. if (offset > DRM_PROC_LIMIT) {
  307. *eof = 1;
  308. return 0;
  309. }
  310. *start = &buf[offset];
  311. *eof   = 0;
  312. DRM_PROC_PRINT("a dev pid    uid magic   ioctlsnn");
  313. for (priv = dev->file_first; priv; priv = priv->next) {
  314. DRM_PROC_PRINT("%c %3d %5d %5d %10u %10lun",
  315.        priv->authenticated ? 'y' : 'n',
  316.        priv->minor,
  317.        priv->pid,
  318.        priv->uid,
  319.        priv->magic,
  320.        priv->ioctl_count);
  321. }
  322. if (len > request + offset) return request;
  323. *eof = 1;
  324. return len - offset;
  325. }
  326. static int DRM(clients_info)(char *buf, char **start, off_t offset,
  327.      int request, int *eof, void *data)
  328. {
  329. drm_device_t *dev = (drm_device_t *)data;
  330. int      ret;
  331. down(&dev->struct_sem);
  332. ret = DRM(_clients_info)(buf, start, offset, request, eof, data);
  333. up(&dev->struct_sem);
  334. return ret;
  335. }
  336. #if DRM_DEBUG_CODE
  337. #define DRM_VMA_VERBOSE 0
  338. static int DRM(_vma_info)(char *buf, char **start, off_t offset, int request,
  339.   int *eof, void *data)
  340. {
  341. drm_device_t       *dev = (drm_device_t *)data;
  342. int                   len  = 0;
  343. drm_vma_entry_t       *pt;
  344. struct vm_area_struct *vma;
  345. #if DRM_VMA_VERBOSE
  346. unsigned long       i;
  347. unsigned long       address;
  348. pgd_t       *pgd;
  349. pmd_t       *pmd;
  350. pte_t       *pte;
  351. #endif
  352. #if defined(__i386__)
  353. unsigned int       pgprot;
  354. #endif
  355. if (offset > DRM_PROC_LIMIT) {
  356. *eof = 1;
  357. return 0;
  358. }
  359. *start = &buf[offset];
  360. *eof   = 0;
  361. DRM_PROC_PRINT("vma use count: %d, high_memory = %p, 0x%08lxn",
  362.        atomic_read(&dev->vma_count),
  363.        high_memory, virt_to_phys(high_memory));
  364. for (pt = dev->vmalist; pt; pt = pt->next) {
  365. if (!(vma = pt->vma)) continue;
  366. DRM_PROC_PRINT("n%5d 0x%08lx-0x%08lx %c%c%c%c%c%c 0x%08lx",
  367.        pt->pid,
  368.        vma->vm_start,
  369.        vma->vm_end,
  370.        vma->vm_flags & VM_READ    ? 'r' : '-',
  371.        vma->vm_flags & VM_WRITE    ? 'w' : '-',
  372.        vma->vm_flags & VM_EXEC    ? 'x' : '-',
  373.        vma->vm_flags & VM_MAYSHARE ? 's' : 'p',
  374.        vma->vm_flags & VM_LOCKED   ? 'l' : '-',
  375.        vma->vm_flags & VM_IO    ? 'i' : '-',
  376.        VM_OFFSET(vma));
  377. #if defined(__i386__)
  378. pgprot = pgprot_val(vma->vm_page_prot);
  379. DRM_PROC_PRINT(" %c%c%c%c%c%c%c%c%c",
  380.        pgprot & _PAGE_PRESENT  ? 'p' : '-',
  381.        pgprot & _PAGE_RW       ? 'w' : 'r',
  382.        pgprot & _PAGE_USER     ? 'u' : 's',
  383.        pgprot & _PAGE_PWT      ? 't' : 'b',
  384.        pgprot & _PAGE_PCD      ? 'u' : 'c',
  385.        pgprot & _PAGE_ACCESSED ? 'a' : '-',
  386.        pgprot & _PAGE_DIRTY    ? 'd' : '-',
  387.        pgprot & _PAGE_PSE      ? 'm' : 'k',
  388.        pgprot & _PAGE_GLOBAL   ? 'g' : 'l' );
  389. #endif
  390. DRM_PROC_PRINT("n");
  391. #if 0
  392. for (i = vma->vm_start; i < vma->vm_end; i += PAGE_SIZE) {
  393. pgd = pgd_offset(vma->vm_mm, i);
  394. pmd = pmd_offset(pgd, i);
  395. pte = pte_offset(pmd, i);
  396. if (pte_present(*pte)) {
  397. address = __pa(pte_page(*pte))
  398. + (i & (PAGE_SIZE-1));
  399. DRM_PROC_PRINT("      0x%08lx -> 0x%08lx"
  400.        " %c%c%c%c%cn",
  401.        i,
  402.        address,
  403.        pte_read(*pte)  ? 'r' : '-',
  404.        pte_write(*pte) ? 'w' : '-',
  405.        pte_exec(*pte)  ? 'x' : '-',
  406.        pte_dirty(*pte) ? 'd' : '-',
  407.        pte_young(*pte) ? 'a' : '-' );
  408. } else {
  409. DRM_PROC_PRINT("      0x%08lxn", i);
  410. }
  411. }
  412. #endif
  413. }
  414. if (len > request + offset) return request;
  415. *eof = 1;
  416. return len - offset;
  417. }
  418. static int DRM(vma_info)(char *buf, char **start, off_t offset, int request,
  419.  int *eof, void *data)
  420. {
  421. drm_device_t *dev = (drm_device_t *)data;
  422. int      ret;
  423. down(&dev->struct_sem);
  424. ret = DRM(_vma_info)(buf, start, offset, request, eof, data);
  425. up(&dev->struct_sem);
  426. return ret;
  427. }
  428. #endif
  429. #if __HAVE_DMA_HISTOGRAM
  430. static int DRM(_histo_info)(char *buf, char **start, off_t offset, int request,
  431.     int *eof, void *data)
  432. {
  433. drm_device_t  *dev = (drm_device_t *)data;
  434. int              len  = 0;
  435. drm_device_dma_t *dma = dev->dma;
  436. int  i;
  437. unsigned long  slot_value = DRM_DMA_HISTOGRAM_INITIAL;
  438. unsigned long  prev_value = 0;
  439. drm_buf_t  *buffer;
  440. if (offset > DRM_PROC_LIMIT) {
  441. *eof = 1;
  442. return 0;
  443. }
  444. *start = &buf[offset];
  445. *eof   = 0;
  446. DRM_PROC_PRINT("general statistics:n");
  447. DRM_PROC_PRINT("total  %10un", atomic_read(&dev->histo.total));
  448. DRM_PROC_PRINT("open  %10un",
  449.        atomic_read(&dev->counts[_DRM_STAT_OPENS]));
  450. DRM_PROC_PRINT("close  %10un",
  451.        atomic_read(&dev->counts[_DRM_STAT_CLOSES]));
  452. DRM_PROC_PRINT("ioctl  %10un",
  453.        atomic_read(&dev->counts[_DRM_STAT_IOCTLS]));
  454. DRM_PROC_PRINT("nlock statistics:n");
  455. DRM_PROC_PRINT("locks  %10un",
  456.        atomic_read(&dev->counts[_DRM_STAT_LOCKS]));
  457. DRM_PROC_PRINT("unlocks  %10un",
  458.        atomic_read(&dev->counts[_DRM_STAT_UNLOCKS]));
  459. if (dma) {
  460. #if 0
  461. DRM_PROC_PRINT("ndma statistics:n");
  462. DRM_PROC_PRINT("prio  %10un",
  463.        atomic_read(&dma->total_prio));
  464. DRM_PROC_PRINT("bytes  %10un",
  465.        atomic_read(&dma->total_bytes));
  466. DRM_PROC_PRINT("dmas  %10un",
  467.        atomic_read(&dma->total_dmas));
  468. DRM_PROC_PRINT("missed:n");
  469. DRM_PROC_PRINT("  dma  %10un",
  470.        atomic_read(&dma->total_missed_dma));
  471. DRM_PROC_PRINT("  lock  %10un",
  472.        atomic_read(&dma->total_missed_lock));
  473. DRM_PROC_PRINT("  free  %10un",
  474.        atomic_read(&dma->total_missed_free));
  475. DRM_PROC_PRINT("  sched  %10un",
  476.        atomic_read(&dma->total_missed_sched));
  477. DRM_PROC_PRINT("tried  %10un",
  478.        atomic_read(&dma->total_tried));
  479. DRM_PROC_PRINT("hit  %10un",
  480.        atomic_read(&dma->total_hit));
  481. DRM_PROC_PRINT("lost  %10un",
  482.        atomic_read(&dma->total_lost));
  483. #endif
  484. buffer = dma->next_buffer;
  485. if (buffer) {
  486. DRM_PROC_PRINT("next_buffer %7dn", buffer->idx);
  487. } else {
  488. DRM_PROC_PRINT("next_buffer    nonen");
  489. }
  490. buffer = dma->this_buffer;
  491. if (buffer) {
  492. DRM_PROC_PRINT("this_buffer %7dn", buffer->idx);
  493. } else {
  494. DRM_PROC_PRINT("this_buffer    nonen");
  495. }
  496. }
  497. DRM_PROC_PRINT("nvalues:n");
  498. if (dev->lock.hw_lock) {
  499. DRM_PROC_PRINT("lock        0x%08xn",
  500.        dev->lock.hw_lock->lock);
  501. } else {
  502. DRM_PROC_PRINT("lock      nonen");
  503. }
  504. DRM_PROC_PRINT("context_flag   0x%08lxn", dev->context_flag);
  505. DRM_PROC_PRINT("interrupt_flag 0x%08lxn", dev->interrupt_flag);
  506. DRM_PROC_PRINT("dma_flag       0x%08lxn", dev->dma_flag);
  507. DRM_PROC_PRINT("queue_count    %10dn",  dev->queue_count);
  508. DRM_PROC_PRINT("last_context   %10dn",  dev->last_context);
  509. DRM_PROC_PRINT("last_switch    %10lun", dev->last_switch);
  510. DRM_PROC_PRINT("last_checked   %10dn",  dev->last_checked);
  511. DRM_PROC_PRINT("n        q2d   d2c      c2f"
  512.        " q2c    q2f       dma  sch"
  513.        " ctx   lacq      lhldnn");
  514. for (i = 0; i < DRM_DMA_HISTOGRAM_SLOTS; i++) {
  515. DRM_PROC_PRINT("%s %10lu %10u %10u %10u %10u %10u"
  516.        " %10u %10u %10u %10u %10un",
  517.        i == DRM_DMA_HISTOGRAM_SLOTS - 1 ? ">=" : "< ",
  518.        i == DRM_DMA_HISTOGRAM_SLOTS - 1
  519.        ? prev_value : slot_value ,
  520.        atomic_read(&dev->histo
  521.    .queued_to_dispatched[i]),
  522.        atomic_read(&dev->histo
  523.    .dispatched_to_completed[i]),
  524.        atomic_read(&dev->histo
  525.    .completed_to_freed[i]),
  526.        atomic_read(&dev->histo
  527.    .queued_to_completed[i]),
  528.        atomic_read(&dev->histo
  529.    .queued_to_freed[i]),
  530.        atomic_read(&dev->histo.dma[i]),
  531.        atomic_read(&dev->histo.schedule[i]),
  532.        atomic_read(&dev->histo.ctx[i]),
  533.        atomic_read(&dev->histo.lacq[i]),
  534.        atomic_read(&dev->histo.lhld[i]));
  535. prev_value = slot_value;
  536. slot_value = DRM_DMA_HISTOGRAM_NEXT(slot_value);
  537. }
  538. if (len > request + offset) return request;
  539. *eof = 1;
  540. return len - offset;
  541. }
  542. static int DRM(histo_info)(char *buf, char **start, off_t offset, int request,
  543.    int *eof, void *data)
  544. {
  545. drm_device_t *dev = (drm_device_t *)data;
  546. int      ret;
  547. down(&dev->struct_sem);
  548. ret = DRM(_histo_info)(buf, start, offset, request, eof, data);
  549. up(&dev->struct_sem);
  550. return ret;
  551. }
  552. #endif