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 #include "rdvl.h" 17 18 int main(int argc, char **argv) 19 { 20 unsigned int vq; 21 int vl; 22 static unsigned int vqs[SVE_VQ_MAX]; 23 unsigned int nvqs = 0; 24 25 ksft_print_header(); 26 ksft_set_plan(2); 27 28 if (!(getauxval(AT_HWCAP) & HWCAP_SVE)) 29 ksft_exit_skip("SVE not available\n"); 30 31 /* 32 * Enumerate up to SVE_VQ_MAX vector lengths 33 */ 34 for (vq = SVE_VQ_MAX; vq > 0; --vq) { 35 vl = prctl(PR_SVE_SET_VL, vq * 16); 36 if (vl == -1) 37 ksft_exit_fail_msg("PR_SVE_SET_VL failed: %s (%d)\n", 38 strerror(errno), errno); 39 40 vl &= PR_SVE_VL_LEN_MASK; 41 42 if (rdvl_sve() != vl) 43 ksft_exit_fail_msg("PR_SVE_SET_VL reports %d, RDVL %d\n", 44 vl, rdvl_sve()); 45 46 if (!sve_vl_valid(vl)) 47 ksft_exit_fail_msg("VL %d invalid\n", vl); 48 vq = sve_vq_from_vl(vl); 49 50 if (!(nvqs < SVE_VQ_MAX)) 51 ksft_exit_fail_msg("Too many VLs %u >= SVE_VQ_MAX\n", 52 nvqs); 53 vqs[nvqs++] = vq; 54 } 55 ksft_test_result_pass("Enumerated %d vector lengths\n", nvqs); 56 ksft_test_result_pass("All vector lengths valid\n"); 57 58 /* Print out the vector lengths in ascending order: */ 59 while (nvqs--) 60 ksft_print_msg("%u\n", 16 * vqs[nvqs]); 61 62 ksft_exit_pass(); 63 } 64