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