162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2023 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <drm/drm_debugfs.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "lsdc_benchmark.h"
962306a36Sopenharmony_ci#include "lsdc_drv.h"
1062306a36Sopenharmony_ci#include "lsdc_gem.h"
1162306a36Sopenharmony_ci#include "lsdc_ttm.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_citypedef void (*lsdc_copy_proc_t)(struct lsdc_bo *src_bo,
1462306a36Sopenharmony_ci				 struct lsdc_bo *dst_bo,
1562306a36Sopenharmony_ci				 unsigned int size,
1662306a36Sopenharmony_ci				 int n);
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic void lsdc_copy_gtt_to_vram_cpu(struct lsdc_bo *src_bo,
1962306a36Sopenharmony_ci				      struct lsdc_bo *dst_bo,
2062306a36Sopenharmony_ci				      unsigned int size,
2162306a36Sopenharmony_ci				      int n)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	lsdc_bo_kmap(src_bo);
2462306a36Sopenharmony_ci	lsdc_bo_kmap(dst_bo);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	while (n--)
2762306a36Sopenharmony_ci		memcpy_toio(dst_bo->kptr, src_bo->kptr, size);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	lsdc_bo_kunmap(src_bo);
3062306a36Sopenharmony_ci	lsdc_bo_kunmap(dst_bo);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic void lsdc_copy_vram_to_gtt_cpu(struct lsdc_bo *src_bo,
3462306a36Sopenharmony_ci				      struct lsdc_bo *dst_bo,
3562306a36Sopenharmony_ci				      unsigned int size,
3662306a36Sopenharmony_ci				      int n)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	lsdc_bo_kmap(src_bo);
3962306a36Sopenharmony_ci	lsdc_bo_kmap(dst_bo);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	while (n--)
4262306a36Sopenharmony_ci		memcpy_fromio(dst_bo->kptr, src_bo->kptr, size);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	lsdc_bo_kunmap(src_bo);
4562306a36Sopenharmony_ci	lsdc_bo_kunmap(dst_bo);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic void lsdc_copy_gtt_to_gtt_cpu(struct lsdc_bo *src_bo,
4962306a36Sopenharmony_ci				     struct lsdc_bo *dst_bo,
5062306a36Sopenharmony_ci				     unsigned int size,
5162306a36Sopenharmony_ci				     int n)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	lsdc_bo_kmap(src_bo);
5462306a36Sopenharmony_ci	lsdc_bo_kmap(dst_bo);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	while (n--)
5762306a36Sopenharmony_ci		memcpy(dst_bo->kptr, src_bo->kptr, size);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	lsdc_bo_kunmap(src_bo);
6062306a36Sopenharmony_ci	lsdc_bo_kunmap(dst_bo);
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic void lsdc_benchmark_copy(struct lsdc_device *ldev,
6462306a36Sopenharmony_ci				unsigned int size,
6562306a36Sopenharmony_ci				unsigned int n,
6662306a36Sopenharmony_ci				u32 src_domain,
6762306a36Sopenharmony_ci				u32 dst_domain,
6862306a36Sopenharmony_ci				lsdc_copy_proc_t copy_proc,
6962306a36Sopenharmony_ci				struct drm_printer *p)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	struct drm_device *ddev = &ldev->base;
7262306a36Sopenharmony_ci	struct lsdc_bo *src_bo;
7362306a36Sopenharmony_ci	struct lsdc_bo *dst_bo;
7462306a36Sopenharmony_ci	unsigned long start_jiffies;
7562306a36Sopenharmony_ci	unsigned long end_jiffies;
7662306a36Sopenharmony_ci	unsigned int throughput;
7762306a36Sopenharmony_ci	unsigned int time;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	src_bo = lsdc_bo_create_kernel_pinned(ddev, src_domain, size);
8062306a36Sopenharmony_ci	dst_bo = lsdc_bo_create_kernel_pinned(ddev, dst_domain, size);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	start_jiffies = jiffies;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	copy_proc(src_bo, dst_bo, size, n);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	end_jiffies = jiffies;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	lsdc_bo_free_kernel_pinned(src_bo);
8962306a36Sopenharmony_ci	lsdc_bo_free_kernel_pinned(dst_bo);
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	time = jiffies_to_msecs(end_jiffies - start_jiffies);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	throughput = (n * (size >> 10)) / time;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	drm_printf(p,
9662306a36Sopenharmony_ci		   "Copy bo of %uKiB %u times from %s to %s in %ums: %uMB/s\n",
9762306a36Sopenharmony_ci		   size >> 10, n,
9862306a36Sopenharmony_ci		   lsdc_domain_to_str(src_domain),
9962306a36Sopenharmony_ci		   lsdc_domain_to_str(dst_domain),
10062306a36Sopenharmony_ci		   time, throughput);
10162306a36Sopenharmony_ci}
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ciint lsdc_show_benchmark_copy(struct lsdc_device *ldev, struct drm_printer *p)
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	unsigned int buffer_size = 1920 * 1080 * 4;
10662306a36Sopenharmony_ci	unsigned int iteration = 60;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	lsdc_benchmark_copy(ldev,
10962306a36Sopenharmony_ci			    buffer_size,
11062306a36Sopenharmony_ci			    iteration,
11162306a36Sopenharmony_ci			    LSDC_GEM_DOMAIN_GTT,
11262306a36Sopenharmony_ci			    LSDC_GEM_DOMAIN_GTT,
11362306a36Sopenharmony_ci			    lsdc_copy_gtt_to_gtt_cpu,
11462306a36Sopenharmony_ci			    p);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	lsdc_benchmark_copy(ldev,
11762306a36Sopenharmony_ci			    buffer_size,
11862306a36Sopenharmony_ci			    iteration,
11962306a36Sopenharmony_ci			    LSDC_GEM_DOMAIN_GTT,
12062306a36Sopenharmony_ci			    LSDC_GEM_DOMAIN_VRAM,
12162306a36Sopenharmony_ci			    lsdc_copy_gtt_to_vram_cpu,
12262306a36Sopenharmony_ci			    p);
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	lsdc_benchmark_copy(ldev,
12562306a36Sopenharmony_ci			    buffer_size,
12662306a36Sopenharmony_ci			    iteration,
12762306a36Sopenharmony_ci			    LSDC_GEM_DOMAIN_VRAM,
12862306a36Sopenharmony_ci			    LSDC_GEM_DOMAIN_GTT,
12962306a36Sopenharmony_ci			    lsdc_copy_vram_to_gtt_cpu,
13062306a36Sopenharmony_ci			    p);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	return 0;
13362306a36Sopenharmony_ci}
134