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