18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * selftest for sparc64's privileged ADI driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Author: Tom Hromatka <tom.hromatka@oracle.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/kernel.h> 88c2ecf20Sopenharmony_ci#include <errno.h> 98c2ecf20Sopenharmony_ci#include <fcntl.h> 108c2ecf20Sopenharmony_ci#include <stdarg.h> 118c2ecf20Sopenharmony_ci#include <stdio.h> 128c2ecf20Sopenharmony_ci#include <stdlib.h> 138c2ecf20Sopenharmony_ci#include <string.h> 148c2ecf20Sopenharmony_ci#include <sys/syscall.h> 158c2ecf20Sopenharmony_ci#include <sys/types.h> 168c2ecf20Sopenharmony_ci#include <sys/stat.h> 178c2ecf20Sopenharmony_ci#include <unistd.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "../../kselftest.h" 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#define DEBUG_LEVEL_1_BIT (0x0001) 228c2ecf20Sopenharmony_ci#define DEBUG_LEVEL_2_BIT (0x0002) 238c2ecf20Sopenharmony_ci#define DEBUG_LEVEL_3_BIT (0x0004) 248c2ecf20Sopenharmony_ci#define DEBUG_LEVEL_4_BIT (0x0008) 258c2ecf20Sopenharmony_ci#define DEBUG_TIMING_BIT (0x1000) 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#ifndef ARRAY_SIZE 288c2ecf20Sopenharmony_ci# define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 298c2ecf20Sopenharmony_ci#endif 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/* bit mask of enabled bits to print */ 328c2ecf20Sopenharmony_ci#define DEBUG 0x0001 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#define DEBUG_PRINT_L1(...) debug_print(DEBUG_LEVEL_1_BIT, __VA_ARGS__) 358c2ecf20Sopenharmony_ci#define DEBUG_PRINT_L2(...) debug_print(DEBUG_LEVEL_2_BIT, __VA_ARGS__) 368c2ecf20Sopenharmony_ci#define DEBUG_PRINT_L3(...) debug_print(DEBUG_LEVEL_3_BIT, __VA_ARGS__) 378c2ecf20Sopenharmony_ci#define DEBUG_PRINT_L4(...) debug_print(DEBUG_LEVEL_4_BIT, __VA_ARGS__) 388c2ecf20Sopenharmony_ci#define DEBUG_PRINT_T(...) debug_print(DEBUG_TIMING_BIT, __VA_ARGS__) 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic void debug_print(int level, const char *s, ...) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci va_list args; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci va_start(args, s); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci if (DEBUG & level) 478c2ecf20Sopenharmony_ci vfprintf(stdout, s, args); 488c2ecf20Sopenharmony_ci va_end(args); 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#ifndef min 528c2ecf20Sopenharmony_ci#define min(x, y) ((x) < (y) ? x : y) 538c2ecf20Sopenharmony_ci#endif 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define RETURN_FROM_TEST(_ret) \ 568c2ecf20Sopenharmony_ci do { \ 578c2ecf20Sopenharmony_ci DEBUG_PRINT_L1( \ 588c2ecf20Sopenharmony_ci "\tTest %s returned %d\n", __func__, _ret); \ 598c2ecf20Sopenharmony_ci return _ret; \ 608c2ecf20Sopenharmony_ci } while (0) 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci#define ADI_BLKSZ 64 638c2ecf20Sopenharmony_ci#define ADI_MAX_VERSION 15 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci#define TEST_STEP_FAILURE(_ret) \ 668c2ecf20Sopenharmony_ci do { \ 678c2ecf20Sopenharmony_ci fprintf(stderr, "\tTest step failure: %d at %s:%d\n", \ 688c2ecf20Sopenharmony_ci _ret, __func__, __LINE__); \ 698c2ecf20Sopenharmony_ci goto out; \ 708c2ecf20Sopenharmony_ci } while (0) 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define RDTICK(_x) \ 738c2ecf20Sopenharmony_ci asm volatile(" rd %%tick, %0\n" : "=r" (_x)) 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistatic int random_version(void) 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci long tick; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci RDTICK(tick); 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci return tick % (ADI_MAX_VERSION + 1); 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci#define MAX_RANGES_SUPPORTED 5 858c2ecf20Sopenharmony_cistatic const char system_ram_str[] = "System RAM\n"; 868c2ecf20Sopenharmony_cistatic int range_count; 878c2ecf20Sopenharmony_cistatic unsigned long long int start_addr[MAX_RANGES_SUPPORTED]; 888c2ecf20Sopenharmony_cistatic unsigned long long int end_addr[MAX_RANGES_SUPPORTED]; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistruct stats { 918c2ecf20Sopenharmony_ci char name[16]; 928c2ecf20Sopenharmony_ci unsigned long total; 938c2ecf20Sopenharmony_ci unsigned long count; 948c2ecf20Sopenharmony_ci unsigned long bytes; 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistatic struct stats read_stats = { 988c2ecf20Sopenharmony_ci .name = "read", .total = 0, .count = 0, .bytes = 0}; 998c2ecf20Sopenharmony_cistatic struct stats pread_stats = { 1008c2ecf20Sopenharmony_ci .name = "pread", .total = 0, .count = 0, .bytes = 0}; 1018c2ecf20Sopenharmony_cistatic struct stats write_stats = { 1028c2ecf20Sopenharmony_ci .name = "write", .total = 0, .count = 0, .bytes = 0}; 1038c2ecf20Sopenharmony_cistatic struct stats pwrite_stats = { 1048c2ecf20Sopenharmony_ci .name = "pwrite", .total = 0, .count = 0, .bytes = 0}; 1058c2ecf20Sopenharmony_cistatic struct stats seek_stats = { 1068c2ecf20Sopenharmony_ci .name = "seek", .total = 0, .count = 0, .bytes = 0}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic void update_stats(struct stats * const ustats, 1098c2ecf20Sopenharmony_ci unsigned long measurement, unsigned long bytes) 1108c2ecf20Sopenharmony_ci{ 1118c2ecf20Sopenharmony_ci ustats->total += measurement; 1128c2ecf20Sopenharmony_ci ustats->bytes += bytes; 1138c2ecf20Sopenharmony_ci ustats->count++; 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistatic void print_ustats(const struct stats * const ustats) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci DEBUG_PRINT_L1("%s\t%7d\t%7.0f\t%7.0f\n", 1198c2ecf20Sopenharmony_ci ustats->name, ustats->count, 1208c2ecf20Sopenharmony_ci (float)ustats->total / (float)ustats->count, 1218c2ecf20Sopenharmony_ci (float)ustats->bytes / (float)ustats->count); 1228c2ecf20Sopenharmony_ci} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic void print_stats(void) 1258c2ecf20Sopenharmony_ci{ 1268c2ecf20Sopenharmony_ci DEBUG_PRINT_L1("\nSyscall\tCall\tAvgTime\tAvgSize\n" 1278c2ecf20Sopenharmony_ci "\tCount\t(ticks)\t(bytes)\n" 1288c2ecf20Sopenharmony_ci "-------------------------------\n"); 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci print_ustats(&read_stats); 1318c2ecf20Sopenharmony_ci print_ustats(&pread_stats); 1328c2ecf20Sopenharmony_ci print_ustats(&write_stats); 1338c2ecf20Sopenharmony_ci print_ustats(&pwrite_stats); 1348c2ecf20Sopenharmony_ci print_ustats(&seek_stats); 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistatic int build_memory_map(void) 1388c2ecf20Sopenharmony_ci{ 1398c2ecf20Sopenharmony_ci char line[256]; 1408c2ecf20Sopenharmony_ci FILE *fp; 1418c2ecf20Sopenharmony_ci int i; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci range_count = 0; 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci fp = fopen("/proc/iomem", "r"); 1468c2ecf20Sopenharmony_ci if (!fp) { 1478c2ecf20Sopenharmony_ci fprintf(stderr, "/proc/iomem: error %d: %s\n", 1488c2ecf20Sopenharmony_ci errno, strerror(errno)); 1498c2ecf20Sopenharmony_ci return -errno; 1508c2ecf20Sopenharmony_ci } 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci while (fgets(line, sizeof(line), fp) != 0) { 1538c2ecf20Sopenharmony_ci if (strstr(line, system_ram_str)) { 1548c2ecf20Sopenharmony_ci char *dash, *end_ptr; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci /* Given a line like this: 1578c2ecf20Sopenharmony_ci * d0400000-10ffaffff : System RAM 1588c2ecf20Sopenharmony_ci * replace the "-" with a space 1598c2ecf20Sopenharmony_ci */ 1608c2ecf20Sopenharmony_ci dash = strstr(line, "-"); 1618c2ecf20Sopenharmony_ci dash[0] = 0x20; 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci start_addr[range_count] = strtoull(line, &end_ptr, 16); 1648c2ecf20Sopenharmony_ci end_addr[range_count] = strtoull(end_ptr, NULL, 16); 1658c2ecf20Sopenharmony_ci range_count++; 1668c2ecf20Sopenharmony_ci } 1678c2ecf20Sopenharmony_ci } 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci fclose(fp); 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci DEBUG_PRINT_L1("RAM Ranges\n"); 1728c2ecf20Sopenharmony_ci for (i = 0; i < range_count; i++) 1738c2ecf20Sopenharmony_ci DEBUG_PRINT_L1("\trange %d: 0x%llx\t- 0x%llx\n", 1748c2ecf20Sopenharmony_ci i, start_addr[i], end_addr[i]); 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci if (range_count == 0) { 1778c2ecf20Sopenharmony_ci fprintf(stderr, "No valid address ranges found. Error.\n"); 1788c2ecf20Sopenharmony_ci return -1; 1798c2ecf20Sopenharmony_ci } 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci return 0; 1828c2ecf20Sopenharmony_ci} 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_cistatic int read_adi(int fd, unsigned char *buf, int buf_sz) 1858c2ecf20Sopenharmony_ci{ 1868c2ecf20Sopenharmony_ci int ret, bytes_read = 0; 1878c2ecf20Sopenharmony_ci long start, end, elapsed_time = 0; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci do { 1908c2ecf20Sopenharmony_ci RDTICK(start); 1918c2ecf20Sopenharmony_ci ret = read(fd, buf + bytes_read, buf_sz - bytes_read); 1928c2ecf20Sopenharmony_ci RDTICK(end); 1938c2ecf20Sopenharmony_ci if (ret < 0) 1948c2ecf20Sopenharmony_ci return -errno; 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci elapsed_time += end - start; 1978c2ecf20Sopenharmony_ci update_stats(&read_stats, elapsed_time, buf_sz); 1988c2ecf20Sopenharmony_ci bytes_read += ret; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci } while (bytes_read < buf_sz); 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci DEBUG_PRINT_T("\tread elapsed timed = %ld\n", elapsed_time); 2038c2ecf20Sopenharmony_ci DEBUG_PRINT_L3("\tRead %d bytes\n", bytes_read); 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci return bytes_read; 2068c2ecf20Sopenharmony_ci} 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_cistatic int pread_adi(int fd, unsigned char *buf, 2098c2ecf20Sopenharmony_ci int buf_sz, unsigned long offset) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci int ret, i, bytes_read = 0; 2128c2ecf20Sopenharmony_ci unsigned long cur_offset; 2138c2ecf20Sopenharmony_ci long start, end, elapsed_time = 0; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci cur_offset = offset; 2168c2ecf20Sopenharmony_ci do { 2178c2ecf20Sopenharmony_ci RDTICK(start); 2188c2ecf20Sopenharmony_ci ret = pread(fd, buf + bytes_read, buf_sz - bytes_read, 2198c2ecf20Sopenharmony_ci cur_offset); 2208c2ecf20Sopenharmony_ci RDTICK(end); 2218c2ecf20Sopenharmony_ci if (ret < 0) 2228c2ecf20Sopenharmony_ci return -errno; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci elapsed_time += end - start; 2258c2ecf20Sopenharmony_ci update_stats(&pread_stats, elapsed_time, buf_sz); 2268c2ecf20Sopenharmony_ci bytes_read += ret; 2278c2ecf20Sopenharmony_ci cur_offset += ret; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci } while (bytes_read < buf_sz); 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci DEBUG_PRINT_T("\tpread elapsed timed = %ld\n", elapsed_time); 2328c2ecf20Sopenharmony_ci DEBUG_PRINT_L3("\tRead %d bytes starting at offset 0x%lx\n", 2338c2ecf20Sopenharmony_ci bytes_read, offset); 2348c2ecf20Sopenharmony_ci for (i = 0; i < bytes_read; i++) 2358c2ecf20Sopenharmony_ci DEBUG_PRINT_L4("\t\t0x%lx\t%d\n", offset + i, buf[i]); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci return bytes_read; 2388c2ecf20Sopenharmony_ci} 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_cistatic int write_adi(int fd, const unsigned char * const buf, int buf_sz) 2418c2ecf20Sopenharmony_ci{ 2428c2ecf20Sopenharmony_ci int ret, bytes_written = 0; 2438c2ecf20Sopenharmony_ci long start, end, elapsed_time = 0; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci do { 2468c2ecf20Sopenharmony_ci RDTICK(start); 2478c2ecf20Sopenharmony_ci ret = write(fd, buf + bytes_written, buf_sz - bytes_written); 2488c2ecf20Sopenharmony_ci RDTICK(end); 2498c2ecf20Sopenharmony_ci if (ret < 0) 2508c2ecf20Sopenharmony_ci return -errno; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci elapsed_time += (end - start); 2538c2ecf20Sopenharmony_ci update_stats(&write_stats, elapsed_time, buf_sz); 2548c2ecf20Sopenharmony_ci bytes_written += ret; 2558c2ecf20Sopenharmony_ci } while (bytes_written < buf_sz); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci DEBUG_PRINT_T("\twrite elapsed timed = %ld\n", elapsed_time); 2588c2ecf20Sopenharmony_ci DEBUG_PRINT_L3("\tWrote %d of %d bytes\n", bytes_written, buf_sz); 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci return bytes_written; 2618c2ecf20Sopenharmony_ci} 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_cistatic int pwrite_adi(int fd, const unsigned char * const buf, 2648c2ecf20Sopenharmony_ci int buf_sz, unsigned long offset) 2658c2ecf20Sopenharmony_ci{ 2668c2ecf20Sopenharmony_ci int ret, bytes_written = 0; 2678c2ecf20Sopenharmony_ci unsigned long cur_offset; 2688c2ecf20Sopenharmony_ci long start, end, elapsed_time = 0; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci cur_offset = offset; 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci do { 2738c2ecf20Sopenharmony_ci RDTICK(start); 2748c2ecf20Sopenharmony_ci ret = pwrite(fd, buf + bytes_written, 2758c2ecf20Sopenharmony_ci buf_sz - bytes_written, cur_offset); 2768c2ecf20Sopenharmony_ci RDTICK(end); 2778c2ecf20Sopenharmony_ci if (ret < 0) { 2788c2ecf20Sopenharmony_ci fprintf(stderr, "pwrite(): error %d: %s\n", 2798c2ecf20Sopenharmony_ci errno, strerror(errno)); 2808c2ecf20Sopenharmony_ci return -errno; 2818c2ecf20Sopenharmony_ci } 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci elapsed_time += (end - start); 2848c2ecf20Sopenharmony_ci update_stats(&pwrite_stats, elapsed_time, buf_sz); 2858c2ecf20Sopenharmony_ci bytes_written += ret; 2868c2ecf20Sopenharmony_ci cur_offset += ret; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci } while (bytes_written < buf_sz); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci DEBUG_PRINT_T("\tpwrite elapsed timed = %ld\n", elapsed_time); 2918c2ecf20Sopenharmony_ci DEBUG_PRINT_L3("\tWrote %d of %d bytes starting at address 0x%lx\n", 2928c2ecf20Sopenharmony_ci bytes_written, buf_sz, offset); 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci return bytes_written; 2958c2ecf20Sopenharmony_ci} 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_cistatic off_t seek_adi(int fd, off_t offset, int whence) 2988c2ecf20Sopenharmony_ci{ 2998c2ecf20Sopenharmony_ci long start, end; 3008c2ecf20Sopenharmony_ci off_t ret; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci RDTICK(start); 3038c2ecf20Sopenharmony_ci ret = lseek(fd, offset, whence); 3048c2ecf20Sopenharmony_ci RDTICK(end); 3058c2ecf20Sopenharmony_ci DEBUG_PRINT_L2("\tlseek ret = 0x%llx\n", ret); 3068c2ecf20Sopenharmony_ci if (ret < 0) 3078c2ecf20Sopenharmony_ci goto out; 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci DEBUG_PRINT_T("\tlseek elapsed timed = %ld\n", end - start); 3108c2ecf20Sopenharmony_ci update_stats(&seek_stats, end - start, 0); 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ciout: 3138c2ecf20Sopenharmony_ci (void)lseek(fd, 0, SEEK_END); 3148c2ecf20Sopenharmony_ci return ret; 3158c2ecf20Sopenharmony_ci} 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_cistatic int test0_prpw_aligned_1byte(int fd) 3188c2ecf20Sopenharmony_ci{ 3198c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 3208c2ecf20Sopenharmony_ci unsigned long paddr = 3218c2ecf20Sopenharmony_ci (end_addr[range_count - 1] - 0x1000) & ~(ADI_BLKSZ - 1); 3228c2ecf20Sopenharmony_ci unsigned char version[1], expected_version; 3238c2ecf20Sopenharmony_ci loff_t offset; 3248c2ecf20Sopenharmony_ci int ret; 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci version[0] = random_version(); 3278c2ecf20Sopenharmony_ci expected_version = version[0]; 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci ret = pwrite_adi(fd, version, sizeof(version), offset); 3328c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 3338c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci ret = pread_adi(fd, version, sizeof(version), offset); 3368c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 3378c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci if (expected_version != version[0]) { 3408c2ecf20Sopenharmony_ci DEBUG_PRINT_L2("\tExpected version %d but read version %d\n", 3418c2ecf20Sopenharmony_ci expected_version, version[0]); 3428c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version); 3438c2ecf20Sopenharmony_ci } 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_ci ret = 0; 3468c2ecf20Sopenharmony_ciout: 3478c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 3488c2ecf20Sopenharmony_ci} 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci#define TEST1_VERSION_SZ 4096 3518c2ecf20Sopenharmony_cistatic int test1_prpw_aligned_4096bytes(int fd) 3528c2ecf20Sopenharmony_ci{ 3538c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 3548c2ecf20Sopenharmony_ci unsigned long paddr = 3558c2ecf20Sopenharmony_ci (end_addr[range_count - 1] - 0x6000) & ~(ADI_BLKSZ - 1); 3568c2ecf20Sopenharmony_ci unsigned char version[TEST1_VERSION_SZ], 3578c2ecf20Sopenharmony_ci expected_version[TEST1_VERSION_SZ]; 3588c2ecf20Sopenharmony_ci loff_t offset; 3598c2ecf20Sopenharmony_ci int ret, i; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci for (i = 0; i < TEST1_VERSION_SZ; i++) { 3628c2ecf20Sopenharmony_ci version[i] = random_version(); 3638c2ecf20Sopenharmony_ci expected_version[i] = version[i]; 3648c2ecf20Sopenharmony_ci } 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci ret = pwrite_adi(fd, version, sizeof(version), offset); 3698c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 3708c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci ret = pread_adi(fd, version, sizeof(version), offset); 3738c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 3748c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci for (i = 0; i < TEST1_VERSION_SZ; i++) { 3778c2ecf20Sopenharmony_ci if (expected_version[i] != version[i]) { 3788c2ecf20Sopenharmony_ci DEBUG_PRINT_L2( 3798c2ecf20Sopenharmony_ci "\tExpected version %d but read version %d\n", 3808c2ecf20Sopenharmony_ci expected_version, version[0]); 3818c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version[i]); 3828c2ecf20Sopenharmony_ci } 3838c2ecf20Sopenharmony_ci } 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci ret = 0; 3868c2ecf20Sopenharmony_ciout: 3878c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 3888c2ecf20Sopenharmony_ci} 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci#define TEST2_VERSION_SZ 10327 3918c2ecf20Sopenharmony_cistatic int test2_prpw_aligned_10327bytes(int fd) 3928c2ecf20Sopenharmony_ci{ 3938c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 3948c2ecf20Sopenharmony_ci unsigned long paddr = 3958c2ecf20Sopenharmony_ci (start_addr[0] + 0x6000) & ~(ADI_BLKSZ - 1); 3968c2ecf20Sopenharmony_ci unsigned char version[TEST2_VERSION_SZ], 3978c2ecf20Sopenharmony_ci expected_version[TEST2_VERSION_SZ]; 3988c2ecf20Sopenharmony_ci loff_t offset; 3998c2ecf20Sopenharmony_ci int ret, i; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci for (i = 0; i < TEST2_VERSION_SZ; i++) { 4028c2ecf20Sopenharmony_ci version[i] = random_version(); 4038c2ecf20Sopenharmony_ci expected_version[i] = version[i]; 4048c2ecf20Sopenharmony_ci } 4058c2ecf20Sopenharmony_ci 4068c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci ret = pwrite_adi(fd, version, sizeof(version), offset); 4098c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 4108c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci ret = pread_adi(fd, version, sizeof(version), offset); 4138c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 4148c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci for (i = 0; i < TEST2_VERSION_SZ; i++) { 4178c2ecf20Sopenharmony_ci if (expected_version[i] != version[i]) { 4188c2ecf20Sopenharmony_ci DEBUG_PRINT_L2( 4198c2ecf20Sopenharmony_ci "\tExpected version %d but read version %d\n", 4208c2ecf20Sopenharmony_ci expected_version, version[0]); 4218c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version[i]); 4228c2ecf20Sopenharmony_ci } 4238c2ecf20Sopenharmony_ci } 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ci ret = 0; 4268c2ecf20Sopenharmony_ciout: 4278c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 4288c2ecf20Sopenharmony_ci} 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_ci#define TEST3_VERSION_SZ 12541 4318c2ecf20Sopenharmony_cistatic int test3_prpw_unaligned_12541bytes(int fd) 4328c2ecf20Sopenharmony_ci{ 4338c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 4348c2ecf20Sopenharmony_ci unsigned long paddr = 4358c2ecf20Sopenharmony_ci ((start_addr[0] + 0xC000) & ~(ADI_BLKSZ - 1)) + 17; 4368c2ecf20Sopenharmony_ci unsigned char version[TEST3_VERSION_SZ], 4378c2ecf20Sopenharmony_ci expected_version[TEST3_VERSION_SZ]; 4388c2ecf20Sopenharmony_ci loff_t offset; 4398c2ecf20Sopenharmony_ci int ret, i; 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci for (i = 0; i < TEST3_VERSION_SZ; i++) { 4428c2ecf20Sopenharmony_ci version[i] = random_version(); 4438c2ecf20Sopenharmony_ci expected_version[i] = version[i]; 4448c2ecf20Sopenharmony_ci } 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 4478c2ecf20Sopenharmony_ci 4488c2ecf20Sopenharmony_ci ret = pwrite_adi(fd, version, sizeof(version), offset); 4498c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 4508c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 4518c2ecf20Sopenharmony_ci 4528c2ecf20Sopenharmony_ci ret = pread_adi(fd, version, sizeof(version), offset); 4538c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 4548c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_ci for (i = 0; i < TEST3_VERSION_SZ; i++) { 4578c2ecf20Sopenharmony_ci if (expected_version[i] != version[i]) { 4588c2ecf20Sopenharmony_ci DEBUG_PRINT_L2( 4598c2ecf20Sopenharmony_ci "\tExpected version %d but read version %d\n", 4608c2ecf20Sopenharmony_ci expected_version, version[0]); 4618c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version[i]); 4628c2ecf20Sopenharmony_ci } 4638c2ecf20Sopenharmony_ci } 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_ci ret = 0; 4668c2ecf20Sopenharmony_ciout: 4678c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 4688c2ecf20Sopenharmony_ci} 4698c2ecf20Sopenharmony_ci 4708c2ecf20Sopenharmony_cistatic int test4_lseek(int fd) 4718c2ecf20Sopenharmony_ci{ 4728c2ecf20Sopenharmony_ci#define OFFSET_ADD (0x100) 4738c2ecf20Sopenharmony_ci#define OFFSET_SUBTRACT (0xFFFFFFF000000000) 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_ci off_t offset_out, offset_in; 4768c2ecf20Sopenharmony_ci int ret; 4778c2ecf20Sopenharmony_ci 4788c2ecf20Sopenharmony_ci 4798c2ecf20Sopenharmony_ci offset_in = 0x123456789abcdef0; 4808c2ecf20Sopenharmony_ci offset_out = seek_adi(fd, offset_in, SEEK_SET); 4818c2ecf20Sopenharmony_ci if (offset_out != offset_in) { 4828c2ecf20Sopenharmony_ci ret = -1; 4838c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 4848c2ecf20Sopenharmony_ci } 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci /* seek to the current offset. this should return EINVAL */ 4878c2ecf20Sopenharmony_ci offset_out = seek_adi(fd, offset_in, SEEK_SET); 4888c2ecf20Sopenharmony_ci if (offset_out < 0 && errno == EINVAL) 4898c2ecf20Sopenharmony_ci DEBUG_PRINT_L2( 4908c2ecf20Sopenharmony_ci "\tSEEK_SET failed as designed. Not an error\n"); 4918c2ecf20Sopenharmony_ci else { 4928c2ecf20Sopenharmony_ci ret = -2; 4938c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 4948c2ecf20Sopenharmony_ci } 4958c2ecf20Sopenharmony_ci 4968c2ecf20Sopenharmony_ci offset_out = seek_adi(fd, 0, SEEK_CUR); 4978c2ecf20Sopenharmony_ci if (offset_out != offset_in) { 4988c2ecf20Sopenharmony_ci ret = -3; 4998c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5008c2ecf20Sopenharmony_ci } 5018c2ecf20Sopenharmony_ci 5028c2ecf20Sopenharmony_ci offset_out = seek_adi(fd, OFFSET_ADD, SEEK_CUR); 5038c2ecf20Sopenharmony_ci if (offset_out != (offset_in + OFFSET_ADD)) { 5048c2ecf20Sopenharmony_ci ret = -4; 5058c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5068c2ecf20Sopenharmony_ci } 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci offset_out = seek_adi(fd, OFFSET_SUBTRACT, SEEK_CUR); 5098c2ecf20Sopenharmony_ci if (offset_out != (offset_in + OFFSET_ADD + OFFSET_SUBTRACT)) { 5108c2ecf20Sopenharmony_ci ret = -5; 5118c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5128c2ecf20Sopenharmony_ci } 5138c2ecf20Sopenharmony_ci 5148c2ecf20Sopenharmony_ci ret = 0; 5158c2ecf20Sopenharmony_ciout: 5168c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 5178c2ecf20Sopenharmony_ci} 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_cistatic int test5_rw_aligned_1byte(int fd) 5208c2ecf20Sopenharmony_ci{ 5218c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 5228c2ecf20Sopenharmony_ci unsigned long paddr = 5238c2ecf20Sopenharmony_ci (end_addr[range_count - 1] - 0xF000) & ~(ADI_BLKSZ - 1); 5248c2ecf20Sopenharmony_ci unsigned char version, expected_version; 5258c2ecf20Sopenharmony_ci loff_t offset; 5268c2ecf20Sopenharmony_ci off_t oret; 5278c2ecf20Sopenharmony_ci int ret; 5288c2ecf20Sopenharmony_ci 5298c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 5308c2ecf20Sopenharmony_ci version = expected_version = random_version(); 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci oret = seek_adi(fd, offset, SEEK_SET); 5338c2ecf20Sopenharmony_ci if (oret != offset) { 5348c2ecf20Sopenharmony_ci ret = -1; 5358c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5368c2ecf20Sopenharmony_ci } 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_ci ret = write_adi(fd, &version, sizeof(version)); 5398c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 5408c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_ci oret = seek_adi(fd, offset, SEEK_SET); 5438c2ecf20Sopenharmony_ci if (oret != offset) { 5448c2ecf20Sopenharmony_ci ret = -1; 5458c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5468c2ecf20Sopenharmony_ci } 5478c2ecf20Sopenharmony_ci 5488c2ecf20Sopenharmony_ci ret = read_adi(fd, &version, sizeof(version)); 5498c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 5508c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci if (expected_version != version) { 5538c2ecf20Sopenharmony_ci DEBUG_PRINT_L2("\tExpected version %d but read version %d\n", 5548c2ecf20Sopenharmony_ci expected_version, version); 5558c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version); 5568c2ecf20Sopenharmony_ci } 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci ret = 0; 5598c2ecf20Sopenharmony_ciout: 5608c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 5618c2ecf20Sopenharmony_ci} 5628c2ecf20Sopenharmony_ci 5638c2ecf20Sopenharmony_ci#define TEST6_VERSION_SZ 9434 5648c2ecf20Sopenharmony_cistatic int test6_rw_aligned_9434bytes(int fd) 5658c2ecf20Sopenharmony_ci{ 5668c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 5678c2ecf20Sopenharmony_ci unsigned long paddr = 5688c2ecf20Sopenharmony_ci (end_addr[range_count - 1] - 0x5F000) & ~(ADI_BLKSZ - 1); 5698c2ecf20Sopenharmony_ci unsigned char version[TEST6_VERSION_SZ], 5708c2ecf20Sopenharmony_ci expected_version[TEST6_VERSION_SZ]; 5718c2ecf20Sopenharmony_ci loff_t offset; 5728c2ecf20Sopenharmony_ci off_t oret; 5738c2ecf20Sopenharmony_ci int ret, i; 5748c2ecf20Sopenharmony_ci 5758c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 5768c2ecf20Sopenharmony_ci for (i = 0; i < TEST6_VERSION_SZ; i++) 5778c2ecf20Sopenharmony_ci version[i] = expected_version[i] = random_version(); 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci oret = seek_adi(fd, offset, SEEK_SET); 5808c2ecf20Sopenharmony_ci if (oret != offset) { 5818c2ecf20Sopenharmony_ci ret = -1; 5828c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5838c2ecf20Sopenharmony_ci } 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci ret = write_adi(fd, version, sizeof(version)); 5868c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 5878c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5888c2ecf20Sopenharmony_ci 5898c2ecf20Sopenharmony_ci memset(version, 0, TEST6_VERSION_SZ); 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_ci oret = seek_adi(fd, offset, SEEK_SET); 5928c2ecf20Sopenharmony_ci if (oret != offset) { 5938c2ecf20Sopenharmony_ci ret = -1; 5948c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 5958c2ecf20Sopenharmony_ci } 5968c2ecf20Sopenharmony_ci 5978c2ecf20Sopenharmony_ci ret = read_adi(fd, version, sizeof(version)); 5988c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 5998c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_ci for (i = 0; i < TEST6_VERSION_SZ; i++) { 6028c2ecf20Sopenharmony_ci if (expected_version[i] != version[i]) { 6038c2ecf20Sopenharmony_ci DEBUG_PRINT_L2( 6048c2ecf20Sopenharmony_ci "\tExpected version %d but read version %d\n", 6058c2ecf20Sopenharmony_ci expected_version[i], version[i]); 6068c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version[i]); 6078c2ecf20Sopenharmony_ci } 6088c2ecf20Sopenharmony_ci } 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_ci ret = 0; 6118c2ecf20Sopenharmony_ciout: 6128c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 6138c2ecf20Sopenharmony_ci} 6148c2ecf20Sopenharmony_ci 6158c2ecf20Sopenharmony_ci#define TEST7_VERSION_SZ 14963 6168c2ecf20Sopenharmony_cistatic int test7_rw_aligned_14963bytes(int fd) 6178c2ecf20Sopenharmony_ci{ 6188c2ecf20Sopenharmony_ci /* somewhat arbitrarily chosen address */ 6198c2ecf20Sopenharmony_ci unsigned long paddr = 6208c2ecf20Sopenharmony_ci ((start_addr[range_count - 1] + 0xF000) & ~(ADI_BLKSZ - 1)) + 39; 6218c2ecf20Sopenharmony_ci unsigned char version[TEST7_VERSION_SZ], 6228c2ecf20Sopenharmony_ci expected_version[TEST7_VERSION_SZ]; 6238c2ecf20Sopenharmony_ci loff_t offset; 6248c2ecf20Sopenharmony_ci off_t oret; 6258c2ecf20Sopenharmony_ci int ret, i; 6268c2ecf20Sopenharmony_ci 6278c2ecf20Sopenharmony_ci offset = paddr / ADI_BLKSZ; 6288c2ecf20Sopenharmony_ci for (i = 0; i < TEST7_VERSION_SZ; i++) { 6298c2ecf20Sopenharmony_ci version[i] = random_version(); 6308c2ecf20Sopenharmony_ci expected_version[i] = version[i]; 6318c2ecf20Sopenharmony_ci } 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_ci oret = seek_adi(fd, offset, SEEK_SET); 6348c2ecf20Sopenharmony_ci if (oret != offset) { 6358c2ecf20Sopenharmony_ci ret = -1; 6368c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 6378c2ecf20Sopenharmony_ci } 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_ci ret = write_adi(fd, version, sizeof(version)); 6408c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 6418c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci memset(version, 0, TEST7_VERSION_SZ); 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci oret = seek_adi(fd, offset, SEEK_SET); 6468c2ecf20Sopenharmony_ci if (oret != offset) { 6478c2ecf20Sopenharmony_ci ret = -1; 6488c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 6498c2ecf20Sopenharmony_ci } 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_ci ret = read_adi(fd, version, sizeof(version)); 6528c2ecf20Sopenharmony_ci if (ret != sizeof(version)) 6538c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(ret); 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci for (i = 0; i < TEST7_VERSION_SZ; i++) { 6568c2ecf20Sopenharmony_ci if (expected_version[i] != version[i]) { 6578c2ecf20Sopenharmony_ci DEBUG_PRINT_L2( 6588c2ecf20Sopenharmony_ci "\tExpected version %d but read version %d\n", 6598c2ecf20Sopenharmony_ci expected_version[i], version[i]); 6608c2ecf20Sopenharmony_ci TEST_STEP_FAILURE(-expected_version[i]); 6618c2ecf20Sopenharmony_ci } 6628c2ecf20Sopenharmony_ci 6638c2ecf20Sopenharmony_ci paddr += ADI_BLKSZ; 6648c2ecf20Sopenharmony_ci } 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_ci ret = 0; 6678c2ecf20Sopenharmony_ciout: 6688c2ecf20Sopenharmony_ci RETURN_FROM_TEST(ret); 6698c2ecf20Sopenharmony_ci} 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_cistatic int (*tests[])(int fd) = { 6728c2ecf20Sopenharmony_ci test0_prpw_aligned_1byte, 6738c2ecf20Sopenharmony_ci test1_prpw_aligned_4096bytes, 6748c2ecf20Sopenharmony_ci test2_prpw_aligned_10327bytes, 6758c2ecf20Sopenharmony_ci test3_prpw_unaligned_12541bytes, 6768c2ecf20Sopenharmony_ci test4_lseek, 6778c2ecf20Sopenharmony_ci test5_rw_aligned_1byte, 6788c2ecf20Sopenharmony_ci test6_rw_aligned_9434bytes, 6798c2ecf20Sopenharmony_ci test7_rw_aligned_14963bytes, 6808c2ecf20Sopenharmony_ci}; 6818c2ecf20Sopenharmony_ci#define TEST_COUNT ARRAY_SIZE(tests) 6828c2ecf20Sopenharmony_ci 6838c2ecf20Sopenharmony_ciint main(int argc, char *argv[]) 6848c2ecf20Sopenharmony_ci{ 6858c2ecf20Sopenharmony_ci int fd, ret, test; 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_ci ret = build_memory_map(); 6888c2ecf20Sopenharmony_ci if (ret < 0) 6898c2ecf20Sopenharmony_ci return ret; 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci fd = open("/dev/adi", O_RDWR); 6928c2ecf20Sopenharmony_ci if (fd < 0) { 6938c2ecf20Sopenharmony_ci fprintf(stderr, "open: error %d: %s\n", 6948c2ecf20Sopenharmony_ci errno, strerror(errno)); 6958c2ecf20Sopenharmony_ci return -errno; 6968c2ecf20Sopenharmony_ci } 6978c2ecf20Sopenharmony_ci 6988c2ecf20Sopenharmony_ci for (test = 0; test < TEST_COUNT; test++) { 6998c2ecf20Sopenharmony_ci DEBUG_PRINT_L1("Running test #%d\n", test); 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_ci ret = (*tests[test])(fd); 7028c2ecf20Sopenharmony_ci if (ret != 0) 7038c2ecf20Sopenharmony_ci ksft_test_result_fail("Test #%d failed: error %d\n", 7048c2ecf20Sopenharmony_ci test, ret); 7058c2ecf20Sopenharmony_ci else 7068c2ecf20Sopenharmony_ci ksft_test_result_pass("Test #%d passed\n", test); 7078c2ecf20Sopenharmony_ci } 7088c2ecf20Sopenharmony_ci 7098c2ecf20Sopenharmony_ci print_stats(); 7108c2ecf20Sopenharmony_ci close(fd); 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci if (ksft_get_fail_cnt() > 0) 7138c2ecf20Sopenharmony_ci ksft_exit_fail(); 7148c2ecf20Sopenharmony_ci else 7158c2ecf20Sopenharmony_ci ksft_exit_pass(); 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci /* it's impossible to get here, but the compiler throws a warning 7188c2ecf20Sopenharmony_ci * about control reaching the end of non-void function. bah. 7198c2ecf20Sopenharmony_ci */ 7208c2ecf20Sopenharmony_ci return 0; 7218c2ecf20Sopenharmony_ci} 722