18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2015-2020 ARM Limited. 48c2ecf20Sopenharmony_ci * Original author: Dave Martin <Dave.Martin@arm.com> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include <assert.h> 78c2ecf20Sopenharmony_ci#include <errno.h> 88c2ecf20Sopenharmony_ci#include <stdio.h> 98c2ecf20Sopenharmony_ci#include <stdlib.h> 108c2ecf20Sopenharmony_ci#include <string.h> 118c2ecf20Sopenharmony_ci#include <sys/auxv.h> 128c2ecf20Sopenharmony_ci#include <sys/prctl.h> 138c2ecf20Sopenharmony_ci#include <asm/sigcontext.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include "../../kselftest.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ciint main(int argc, char **argv) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci unsigned int vq; 208c2ecf20Sopenharmony_ci int vl; 218c2ecf20Sopenharmony_ci static unsigned int vqs[SVE_VQ_MAX]; 228c2ecf20Sopenharmony_ci unsigned int nvqs = 0; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci ksft_print_header(); 258c2ecf20Sopenharmony_ci ksft_set_plan(2); 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci if (!(getauxval(AT_HWCAP) & HWCAP_SVE)) 288c2ecf20Sopenharmony_ci ksft_exit_skip("SVE not available"); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci /* 318c2ecf20Sopenharmony_ci * Enumerate up to SVE_VQ_MAX vector lengths 328c2ecf20Sopenharmony_ci */ 338c2ecf20Sopenharmony_ci for (vq = SVE_VQ_MAX; vq > 0; --vq) { 348c2ecf20Sopenharmony_ci vl = prctl(PR_SVE_SET_VL, vq * 16); 358c2ecf20Sopenharmony_ci if (vl == -1) 368c2ecf20Sopenharmony_ci ksft_exit_fail_msg("PR_SVE_SET_VL failed: %s (%d)\n", 378c2ecf20Sopenharmony_ci strerror(errno), errno); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci vl &= PR_SVE_VL_LEN_MASK; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci if (!sve_vl_valid(vl)) 428c2ecf20Sopenharmony_ci ksft_exit_fail_msg("VL %d invalid\n", vl); 438c2ecf20Sopenharmony_ci vq = sve_vq_from_vl(vl); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci if (!(nvqs < SVE_VQ_MAX)) 468c2ecf20Sopenharmony_ci ksft_exit_fail_msg("Too many VLs %u >= SVE_VQ_MAX\n", 478c2ecf20Sopenharmony_ci nvqs); 488c2ecf20Sopenharmony_ci vqs[nvqs++] = vq; 498c2ecf20Sopenharmony_ci } 508c2ecf20Sopenharmony_ci ksft_test_result_pass("Enumerated %d vector lengths\n", nvqs); 518c2ecf20Sopenharmony_ci ksft_test_result_pass("All vector lengths valid\n"); 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci /* Print out the vector lengths in ascending order: */ 548c2ecf20Sopenharmony_ci while (nvqs--) 558c2ecf20Sopenharmony_ci ksft_print_msg("%u\n", 16 * vqs[nvqs]); 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci ksft_exit_pass(); 588c2ecf20Sopenharmony_ci} 59