visl-debugfs.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Debugfs tracing for bitstream buffers. This is similar to VA-API's
  4. * LIBVA_TRACE_BUFDATA in that the raw bitstream can be dumped as a debugging
  5. * aid.
  6. *
  7. * Produces one file per OUTPUT buffer. Files are automatically cleared on
  8. * STREAMOFF unless the module parameter "keep_bitstream_buffers" is set.
  9. */
  10. #include <linux/debugfs.h>
  11. #include <linux/list.h>
  12. #include <linux/mutex.h>
  13. #include <media/v4l2-mem2mem.h>
  14. #include "visl-debugfs.h"
  15. int visl_debugfs_init(struct visl_dev *dev)
  16. {
  17. dev->debugfs_root = debugfs_create_dir("visl", NULL);
  18. INIT_LIST_HEAD(&dev->bitstream_blobs);
  19. mutex_init(&dev->bitstream_lock);
  20. if (IS_ERR(dev->debugfs_root))
  21. return PTR_ERR(dev->debugfs_root);
  22. return visl_debugfs_bitstream_init(dev);
  23. }
  24. int visl_debugfs_bitstream_init(struct visl_dev *dev)
  25. {
  26. dev->bitstream_debugfs = debugfs_create_dir("bitstream",
  27. dev->debugfs_root);
  28. if (IS_ERR(dev->bitstream_debugfs))
  29. return PTR_ERR(dev->bitstream_debugfs);
  30. return 0;
  31. }
  32. void visl_trace_bitstream(struct visl_ctx *ctx, struct visl_run *run)
  33. {
  34. u8 *vaddr = vb2_plane_vaddr(&run->src->vb2_buf, 0);
  35. struct visl_blob *blob;
  36. size_t data_sz = vb2_get_plane_payload(&run->src->vb2_buf, 0);
  37. struct dentry *dentry;
  38. char name[32];
  39. blob = kzalloc(sizeof(*blob), GFP_KERNEL);
  40. if (!blob)
  41. return;
  42. blob->blob.data = vzalloc(data_sz);
  43. if (!blob->blob.data)
  44. goto err_vmalloc;
  45. blob->blob.size = data_sz;
  46. snprintf(name, 32, "bitstream%d", run->src->sequence);
  47. memcpy(blob->blob.data, vaddr, data_sz);
  48. dentry = debugfs_create_blob(name, 0444, ctx->dev->bitstream_debugfs,
  49. &blob->blob);
  50. if (IS_ERR(dentry))
  51. goto err_debugfs;
  52. blob->dentry = dentry;
  53. mutex_lock(&ctx->dev->bitstream_lock);
  54. list_add_tail(&blob->list, &ctx->dev->bitstream_blobs);
  55. mutex_unlock(&ctx->dev->bitstream_lock);
  56. return;
  57. err_debugfs:
  58. vfree(blob->blob.data);
  59. err_vmalloc:
  60. kfree(blob);
  61. }
  62. void visl_debugfs_clear_bitstream(struct visl_dev *dev)
  63. {
  64. struct visl_blob *blob;
  65. struct visl_blob *tmp;
  66. mutex_lock(&dev->bitstream_lock);
  67. if (list_empty(&dev->bitstream_blobs))
  68. goto unlock;
  69. list_for_each_entry_safe(blob, tmp, &dev->bitstream_blobs, list) {
  70. list_del(&blob->list);
  71. debugfs_remove(blob->dentry);
  72. vfree(blob->blob.data);
  73. kfree(blob);
  74. }
  75. unlock:
  76. mutex_unlock(&dev->bitstream_lock);
  77. }
  78. void visl_debugfs_bitstream_deinit(struct visl_dev *dev)
  79. {
  80. visl_debugfs_clear_bitstream(dev);
  81. debugfs_remove_recursive(dev->bitstream_debugfs);
  82. dev->bitstream_debugfs = NULL;
  83. }
  84. void visl_debugfs_deinit(struct visl_dev *dev)
  85. {
  86. visl_debugfs_bitstream_deinit(dev);
  87. debugfs_remove_recursive(dev->debugfs_root);
  88. dev->debugfs_root = NULL;
  89. }