Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/arm64/fp/sve-probe-vls.c
26289 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Copyright (C) 2015-2020 ARM Limited.
4
* Original author: Dave Martin <[email protected]>
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
65