FILE
lsdc_benchmark.c
File preview with syntax highlighting.
linux-6.19.14/drivers/gpu/drm/loongson/lsdc_benchmark.c
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 14typedef void (*lsdc_copy_proc_t)(struct lsdc_bo *src_bo, 15 struct lsdc_bo *dst_bo, 16 unsigned int size, 17 int n); 18 19static 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 34static 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 49static 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 64static 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 104int 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}
~/
Read-only file preview.