Initialize SVE system registers.

This patch initializes the SVE system registers if available
and initializes the vector length to the maximum supported.

This is done according to the SVE specification [1].

[1] https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
This commit is contained in:
Tamar Christina 2018-10-26 10:18:17 +01:00 committed by Richard Earnshaw
parent 2bbe8697d8
commit 9a7f131e0e
1 changed files with 27 additions and 0 deletions

View File

@ -145,6 +145,33 @@ _flat_map:
dsb sy dsb sy
msr sctlr_el3, x0 msr sctlr_el3, x0
isb isb
/* Determine if SVE is available. */
mrs x0, id_aa64pfr0_el1
tbz x0, 32, .Lnosve
/* set up CPTR_EL3.TZ to 1. */
mrs x0, cptr_el3
/* TZ is bit 8 of CPTR_EL3. */
orr x0, x0, #0x100
msr cptr_el3, x0
isb
/* set up vector lenght in ZCR_EL3 (4 LSB). */
mov x2, #0xF
/* Try to set the maximum value supported by the architecture (2048).
SVE Arch.
"If this field is set to a value that is not supported by the
implementation then reading the register must return the highest
supported vector length that is less than the value written." */
mrs x1, s3_6_c1_c2_0 /* mrs x1, zcr_el3. */
bfi x1, x2, 0, 4
msr s3_6_c1_c2_0, x1 /* msr zcr_el3, x1. */
isb
.Lnosve:
ret ret
.data .data