Merge changes from topic "od/sme" into integration

* changes:
  fix(fvp): permit enabling SME for SPD=spmd
  feat(spmd): pass SMCCCv1.3 SVE hint to lower EL
This commit is contained in:
Madhukar Pappireddy 2024-02-07 22:45:38 +01:00 committed by TrustedFirmware Code Review
commit 4da4a1a61d
4 changed files with 20 additions and 7 deletions

View file

@ -34,7 +34,8 @@ uint64_t spmd_smc_switch_state(uint32_t smc_fid,
uint64_t x2,
uint64_t x3,
uint64_t x4,
void *handle);
void *handle,
uint64_t flags);
#endif /* __ASSEMBLER__ */
#endif /* SPMD_SVC_H */

View file

@ -57,7 +57,6 @@ ifneq (${SPD}, tspd)
ENABLE_FEAT_TWED := 2
ENABLE_FEAT_GCS := 2
ifeq (${ARCH}, aarch64)
ifneq (${SPD}, spmd)
ifeq (${SPM_MM}, 0)
ifeq (${CTX_INCLUDE_FPREGS}, 0)
ENABLE_SME_FOR_NS := 2
@ -66,7 +65,6 @@ endif
endif
endif
endif
endif
# enable unconditionally for all builds
ifeq (${ARCH}, aarch64)

View file

@ -234,7 +234,7 @@ static uint64_t spmc_smc_return(uint32_t smc_fid,
/* If we originated in the normal world then switch contexts. */
else if (!secure_origin && ffa_is_secure_world_id(dst_id)) {
return spmd_smc_switch_state(smc_fid, secure_origin, x1, x2,
x3, x4, handle);
x3, x4, handle, flags);
} else {
/* Unknown State. */
panic();
@ -2490,9 +2490,11 @@ static uint64_t spmc_sp_interrupt_handler(uint32_t id,
/*
* Forward the interrupt to the S-EL1 SP. The interrupt ID is not
* populated as the SP can determine this by itself.
* The flags field is forced to 0 mainly to pass the SVE hint bit
* cleared for consumption by the lower EL.
*/
return spmd_smc_switch_state(FFA_INTERRUPT, false,
FFA_PARAM_MBZ, FFA_PARAM_MBZ,
FFA_PARAM_MBZ, FFA_PARAM_MBZ,
handle);
handle, 0ULL);
}

View file

@ -667,11 +667,22 @@ uint64_t spmd_smc_switch_state(uint32_t smc_fid,
uint64_t x2,
uint64_t x3,
uint64_t x4,
void *handle)
void *handle,
uint64_t flags)
{
unsigned int secure_state_in = (secure_origin) ? SECURE : NON_SECURE;
unsigned int secure_state_out = (!secure_origin) ? SECURE : NON_SECURE;
#if SPMD_SPM_AT_SEL2
if ((secure_state_out == SECURE) && (is_sve_hint_set(flags) == true)) {
/*
* Set the SVE hint bit in x0 and pass to the lower secure EL,
* if it was set by the caller.
*/
smc_fid |= (FUNCID_SVE_HINT_MASK << FUNCID_SVE_HINT_SHIFT);
}
#endif
/* Save incoming security state */
#if SPMD_SPM_AT_SEL2
if (secure_state_in == NON_SECURE) {
@ -746,8 +757,9 @@ static uint64_t spmd_smc_forward(uint32_t smc_fid,
return spmc_smc_handler(smc_fid, secure_origin, x1, x2, x3, x4,
cookie, handle, flags);
}
return spmd_smc_switch_state(smc_fid, secure_origin, x1, x2, x3, x4,
handle);
handle, flags);
}