mirror of https://gitee.com/openkylin/linux.git
selftests: arm64: Test case for enumeration of SVE vector lengths
Add a test case that verifies that we can enumerate the SVE vector lengths on systems where we detect SVE, and that those SVE vector lengths are valid. This program was written by Dave Martin and adapted to kselftest by me. Signed-off-by: Mark Brown <broonie@kernel.org> Acked-by: Dave Martin <Dave.Martin@arm.com> Acked-by: Shuah Khan <skhan@linuxfoundation.org> Link: https://lore.kernel.org/r/20200819114837.51466-2-broonie@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
d21435e967
commit
ca765153eb
|
@ -0,0 +1,58 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015-2020 ARM Limited.
|
||||||
|
* Original author: Dave Martin <Dave.Martin@arm.com>
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/auxv.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#include <asm/sigcontext.h>
|
||||||
|
|
||||||
|
#include "../../kselftest.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
unsigned int vq;
|
||||||
|
int vl;
|
||||||
|
static unsigned int vqs[SVE_VQ_MAX];
|
||||||
|
unsigned int nvqs = 0;
|
||||||
|
|
||||||
|
ksft_print_header();
|
||||||
|
ksft_set_plan(2);
|
||||||
|
|
||||||
|
if (!(getauxval(AT_HWCAP) & HWCAP_SVE))
|
||||||
|
ksft_exit_skip("SVE not available");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enumerate up to SVE_VQ_MAX vector lengths
|
||||||
|
*/
|
||||||
|
for (vq = SVE_VQ_MAX; vq > 0; --vq) {
|
||||||
|
vl = prctl(PR_SVE_SET_VL, vq * 16);
|
||||||
|
if (vl == -1)
|
||||||
|
ksft_exit_fail_msg("PR_SVE_SET_VL failed: %s (%d)\n",
|
||||||
|
strerror(errno), errno);
|
||||||
|
|
||||||
|
vl &= PR_SVE_VL_LEN_MASK;
|
||||||
|
|
||||||
|
if (!sve_vl_valid(vl))
|
||||||
|
ksft_exit_fail_msg("VL %d invalid\n", vl);
|
||||||
|
vq = sve_vq_from_vl(vl);
|
||||||
|
|
||||||
|
if (!(nvqs < SVE_VQ_MAX))
|
||||||
|
ksft_exit_fail_msg("Too many VLs %u >= SVE_VQ_MAX\n",
|
||||||
|
nvqs);
|
||||||
|
vqs[nvqs++] = vq;
|
||||||
|
}
|
||||||
|
ksft_test_result_pass("Enumerated %d vector lengths\n", nvqs);
|
||||||
|
ksft_test_result_pass("All vector lengths valid\n");
|
||||||
|
|
||||||
|
/* Print out the vector lengths in ascending order: */
|
||||||
|
while (nvqs--)
|
||||||
|
ksft_print_msg("%u\n", 16 * vqs[nvqs]);
|
||||||
|
|
||||||
|
ksft_exit_pass();
|
||||||
|
}
|
Loading…
Reference in New Issue