1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2015-2020 ARM Limited. 4*4882a593Smuzhiyun * Original author: Dave Martin <Dave.Martin@arm.com> 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #include <assert.h> 7*4882a593Smuzhiyun #include <errno.h> 8*4882a593Smuzhiyun #include <stdio.h> 9*4882a593Smuzhiyun #include <stdlib.h> 10*4882a593Smuzhiyun #include <string.h> 11*4882a593Smuzhiyun #include <sys/auxv.h> 12*4882a593Smuzhiyun #include <sys/prctl.h> 13*4882a593Smuzhiyun #include <asm/sigcontext.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include "../../kselftest.h" 16*4882a593Smuzhiyun main(int argc,char ** argv)17*4882a593Smuzhiyunint main(int argc, char **argv) 18*4882a593Smuzhiyun { 19*4882a593Smuzhiyun unsigned int vq; 20*4882a593Smuzhiyun int vl; 21*4882a593Smuzhiyun static unsigned int vqs[SVE_VQ_MAX]; 22*4882a593Smuzhiyun unsigned int nvqs = 0; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun ksft_print_header(); 25*4882a593Smuzhiyun ksft_set_plan(2); 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun if (!(getauxval(AT_HWCAP) & HWCAP_SVE)) 28*4882a593Smuzhiyun ksft_exit_skip("SVE not available"); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 31*4882a593Smuzhiyun * Enumerate up to SVE_VQ_MAX vector lengths 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun for (vq = SVE_VQ_MAX; vq > 0; --vq) { 34*4882a593Smuzhiyun vl = prctl(PR_SVE_SET_VL, vq * 16); 35*4882a593Smuzhiyun if (vl == -1) 36*4882a593Smuzhiyun ksft_exit_fail_msg("PR_SVE_SET_VL failed: %s (%d)\n", 37*4882a593Smuzhiyun strerror(errno), errno); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun vl &= PR_SVE_VL_LEN_MASK; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun if (!sve_vl_valid(vl)) 42*4882a593Smuzhiyun ksft_exit_fail_msg("VL %d invalid\n", vl); 43*4882a593Smuzhiyun vq = sve_vq_from_vl(vl); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun if (!(nvqs < SVE_VQ_MAX)) 46*4882a593Smuzhiyun ksft_exit_fail_msg("Too many VLs %u >= SVE_VQ_MAX\n", 47*4882a593Smuzhiyun nvqs); 48*4882a593Smuzhiyun vqs[nvqs++] = vq; 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun ksft_test_result_pass("Enumerated %d vector lengths\n", nvqs); 51*4882a593Smuzhiyun ksft_test_result_pass("All vector lengths valid\n"); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* Print out the vector lengths in ascending order: */ 54*4882a593Smuzhiyun while (nvqs--) 55*4882a593Smuzhiyun ksft_print_msg("%u\n", 16 * vqs[nvqs]); 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun ksft_exit_pass(); 58*4882a593Smuzhiyun } 59