lsdc_benchmark.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2023 Loongson Technology Corporation Limited
  4. */
  5. #include <drm/drm_debugfs.h>
  6. #include <drm/drm_print.h>
  7. #include "lsdc_benchmark.h"
  8. #include "lsdc_drv.h"
  9. #include "lsdc_gem.h"
  10. #include "lsdc_ttm.h"
  11. typedef void (*lsdc_copy_proc_t)(struct lsdc_bo *src_bo,
  12. struct lsdc_bo *dst_bo,
  13. unsigned int size,
  14. int n);
  15. static void lsdc_copy_gtt_to_vram_cpu(struct lsdc_bo *src_bo,
  16. struct lsdc_bo *dst_bo,
  17. unsigned int size,
  18. int n)
  19. {
  20. lsdc_bo_kmap(src_bo);
  21. lsdc_bo_kmap(dst_bo);
  22. while (n--)
  23. memcpy_toio(dst_bo->kptr, src_bo->kptr, size);
  24. lsdc_bo_kunmap(src_bo);
  25. lsdc_bo_kunmap(dst_bo);
  26. }
  27. static void lsdc_copy_vram_to_gtt_cpu(struct lsdc_bo *src_bo,
  28. struct lsdc_bo *dst_bo,
  29. unsigned int size,
  30. int n)
  31. {
  32. lsdc_bo_kmap(src_bo);
  33. lsdc_bo_kmap(dst_bo);
  34. while (n--)
  35. memcpy_fromio(dst_bo->kptr, src_bo->kptr, size);
  36. lsdc_bo_kunmap(src_bo);
  37. lsdc_bo_kunmap(dst_bo);
  38. }
  39. static void lsdc_copy_gtt_to_gtt_cpu(struct lsdc_bo *src_bo,
  40. struct lsdc_bo *dst_bo,
  41. unsigned int size,
  42. int n)
  43. {
  44. lsdc_bo_kmap(src_bo);
  45. lsdc_bo_kmap(dst_bo);
  46. while (n--)
  47. memcpy(dst_bo->kptr, src_bo->kptr, size);
  48. lsdc_bo_kunmap(src_bo);
  49. lsdc_bo_kunmap(dst_bo);
  50. }
  51. static void lsdc_benchmark_copy(struct lsdc_device *ldev,
  52. unsigned int size,
  53. unsigned int n,
  54. u32 src_domain,
  55. u32 dst_domain,
  56. lsdc_copy_proc_t copy_proc,
  57. struct drm_printer *p)
  58. {
  59. struct drm_device *ddev = &ldev->base;
  60. struct lsdc_bo *src_bo;
  61. struct lsdc_bo *dst_bo;
  62. unsigned long start_jiffies;
  63. unsigned long end_jiffies;
  64. unsigned int throughput;
  65. unsigned int time;
  66. src_bo = lsdc_bo_create_kernel_pinned(ddev, src_domain, size);
  67. dst_bo = lsdc_bo_create_kernel_pinned(ddev, dst_domain, size);
  68. start_jiffies = jiffies;
  69. copy_proc(src_bo, dst_bo, size, n);
  70. end_jiffies = jiffies;
  71. lsdc_bo_free_kernel_pinned(src_bo);
  72. lsdc_bo_free_kernel_pinned(dst_bo);
  73. time = jiffies_to_msecs(end_jiffies - start_jiffies);
  74. throughput = (n * (size >> 10)) / time;
  75. drm_printf(p,
  76. "Copy bo of %uKiB %u times from %s to %s in %ums: %uMB/s\n",
  77. size >> 10, n,
  78. lsdc_domain_to_str(src_domain),
  79. lsdc_domain_to_str(dst_domain),
  80. time, throughput);
  81. }
  82. int lsdc_show_benchmark_copy(struct lsdc_device *ldev, struct drm_printer *p)
  83. {
  84. unsigned int buffer_size = 1920 * 1080 * 4;
  85. unsigned int iteration = 60;
  86. lsdc_benchmark_copy(ldev,
  87. buffer_size,
  88. iteration,
  89. LSDC_GEM_DOMAIN_GTT,
  90. LSDC_GEM_DOMAIN_GTT,
  91. lsdc_copy_gtt_to_gtt_cpu,
  92. p);
  93. lsdc_benchmark_copy(ldev,
  94. buffer_size,
  95. iteration,
  96. LSDC_GEM_DOMAIN_GTT,
  97. LSDC_GEM_DOMAIN_VRAM,
  98. lsdc_copy_gtt_to_vram_cpu,
  99. p);
  100. lsdc_benchmark_copy(ldev,
  101. buffer_size,
  102. iteration,
  103. LSDC_GEM_DOMAIN_VRAM,
  104. LSDC_GEM_DOMAIN_GTT,
  105. lsdc_copy_vram_to_gtt_cpu,
  106. p);
  107. return 0;
  108. }