// SPDX-License-Identifier: GPL-2.0
|
/*
|
* Copyright (c) 2015, Linaro Limited
|
*/
|
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <string.h>
|
|
#include "xtest_test.h"
|
#include "xtest_helpers.h"
|
|
#include <ta_storage_benchmark.h>
|
#include <util.h>
|
|
#define DO_VERIFY 0
|
#define DEFAULT_DATA_SIZE (2 * 1024 * 1024) /* 2MB */
|
#define DEFAULT_CHUNK_SIZE (1 * 1024) /* 1KB */
|
#define DEFAULT_COUNT (10)
|
|
size_t data_size_table[] = {
|
256,
|
512,
|
1024,
|
2 * 1024,
|
4 * 1024,
|
16 * 1024,
|
512 * 1024,
|
1024 * 1024,
|
0
|
};
|
|
static void xtest_tee_benchmark_1001(ADBG_Case_t *Case_p);
|
static void xtest_tee_benchmark_1002(ADBG_Case_t *Case_p);
|
static void xtest_tee_benchmark_1003(ADBG_Case_t *Case_p);
|
|
static TEEC_Result run_test_with_args(enum storage_benchmark_cmd cmd,
|
uint32_t arg0, uint32_t arg1, uint32_t arg2,
|
uint32_t arg3, uint32_t *out0, uint32_t *out1)
|
{
|
TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
|
TEEC_Result res = TEEC_ERROR_GENERIC;
|
TEEC_Session sess = { };
|
uint32_t orig = 0;
|
|
res = xtest_teec_open_session(&sess, &storage_benchmark_ta_uuid, NULL, &orig);
|
if (res != TEEC_SUCCESS)
|
return res;
|
|
op.params[0].value.a = arg0;
|
op.params[0].value.b = arg1;
|
op.params[1].value.a = arg2;
|
op.params[1].value.b = arg3;
|
|
op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
|
TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT, TEEC_NONE);
|
|
res = TEEC_InvokeCommand(&sess, cmd, &op, &orig);
|
|
if (out0)
|
*out0 = op.params[2].value.a;
|
if (out1)
|
*out1 = op.params[2].value.b;
|
|
TEEC_CloseSession(&sess);
|
|
return res;
|
}
|
|
struct test_record {
|
size_t data_size;
|
float spent_time;
|
float speed_in_kb;
|
};
|
|
static TEEC_Result run_chunk_access_test(enum storage_benchmark_cmd cmd,
|
uint32_t data_size, uint32_t chunk_size, struct test_record *rec)
|
{
|
TEE_Result res = TEEC_ERROR_GENERIC;
|
uint32_t spent_time = 0;
|
|
res = run_test_with_args(cmd, data_size, chunk_size, DO_VERIFY, 0,
|
&spent_time, NULL);
|
|
rec->data_size = data_size;
|
rec->spent_time = (float)spent_time / 1000.0;
|
rec->speed_in_kb = ((float)data_size / 1024.0) / rec->spent_time;
|
|
return res;
|
}
|
|
static void show_test_result(struct test_record records[], size_t size)
|
{
|
size_t i = 0;
|
|
printf("-----------------+---------------+----------------\n");
|
printf(" Data Size (B) \t | Time (s)\t | Speed (kB/s)\t \n");
|
printf("-----------------+---------------+----------------\n");
|
|
for (i = 0; i < size; i++) {
|
printf(" %8zd \t | %8.3f \t | %8.3f\n",
|
records[i].data_size, records[i].spent_time,
|
records[i].speed_in_kb);
|
}
|
|
printf("-----------------+---------------+----------------\n");
|
|
}
|
|
static void chunk_test(ADBG_Case_t *c, enum storage_benchmark_cmd cmd)
|
{
|
uint32_t chunk_size = DEFAULT_CHUNK_SIZE;
|
struct test_record records[ARRAY_SIZE(data_size_table) - 1];
|
size_t i = 0;
|
|
for (i = 0; data_size_table[i]; i++) {
|
ADBG_EXPECT_TEEC_SUCCESS(c,
|
run_chunk_access_test(cmd, data_size_table[i],
|
chunk_size, &records[i]));
|
}
|
|
show_test_result(records, ARRAY_SIZE(records));
|
}
|
|
static void xtest_tee_benchmark_1001(ADBG_Case_t *c)
|
{
|
chunk_test(c, TA_STORAGE_BENCHMARK_CMD_TEST_WRITE);
|
}
|
|
static void xtest_tee_benchmark_1002(ADBG_Case_t *c)
|
{
|
chunk_test(c, TA_STORAGE_BENCHMARK_CMD_TEST_READ);
|
}
|
|
static void xtest_tee_benchmark_1003(ADBG_Case_t *c)
|
{
|
chunk_test(c, TA_STORAGE_BENCHMARK_CMD_TEST_REWRITE);
|
}
|
|
ADBG_CASE_DEFINE(benchmark, 1001, xtest_tee_benchmark_1001,
|
"TEE Trusted Storage Performance Test (WRITE)");
|
ADBG_CASE_DEFINE(benchmark, 1002, xtest_tee_benchmark_1002,
|
"TEE Trusted Storage Performance Test (READ)");
|
ADBG_CASE_DEFINE(benchmark, 1003, xtest_tee_benchmark_1003,
|
"TEE Trusted Storage Performance Test (REWRITE)");
|