From: Dave Martin <Dave.Martin@arm.com>
To: Mark Brown <broonie@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Jackson Cooper-Driver <Jackson.Cooper-Driver@arm.com>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] arm64/sme: Restore SMCR on exit from suspend
Date: Tue, 30 Jan 2024 10:53:42 +0000 [thread overview]
Message-ID: <ZbjVNggOxxoQXitV@e133380.arm.com> (raw)
In-Reply-To: <20240130-arm64-sme-resume-v1-1-0e60ebba18df@kernel.org>
On Tue, Jan 30, 2024 at 12:02:48AM +0000, Mark Brown wrote:
> The fields in SMCR_EL1 reset to an architecturally UNKNOWN value. Since we
> do not otherwise manage the traps configured in this register at runtime we
> need to reconfigure them after a suspend in case nothing else was kind
> enough to preserve them for us.
Are any other regs affected?
What about SMPRI_EL1? That seems to be initialised once and for all in
cpufeatures, so I'd guess it might be affected.
Also, what about the _EL2 regs if the kernel is resuming at EL2
(without VHE -- or if SME && !VHE not a thing?)
> The vector length will be restored as part of restoring the SME state for
> the next SME using task.
>
> Fixes: a1f4ccd25cc2 (arm64/sme: Provide Kconfig for SME)
> Reported-by: Jackson Cooper-Driver <Jackson.Cooper-Driver@arm.com>
> Signed-off-by: Mark Brown <broonie@kernel.org>
> ---
> arch/arm64/include/asm/fpsimd.h | 2 ++
> arch/arm64/kernel/fpsimd.c | 13 +++++++++++++
> arch/arm64/kernel/suspend.c | 3 +++
> 3 files changed, 18 insertions(+)
>
> diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h
> index 50e5f25d3024..7780d343ef08 100644
> --- a/arch/arm64/include/asm/fpsimd.h
> +++ b/arch/arm64/include/asm/fpsimd.h
> @@ -386,6 +386,7 @@ extern void sme_alloc(struct task_struct *task, bool flush);
> extern unsigned int sme_get_vl(void);
> extern int sme_set_current_vl(unsigned long arg);
> extern int sme_get_current_vl(void);
> +extern void sme_suspend_exit(void);
>
> /*
> * Return how many bytes of memory are required to store the full SME
> @@ -421,6 +422,7 @@ static inline int sme_max_vl(void) { return 0; }
> static inline int sme_max_virtualisable_vl(void) { return 0; }
> static inline int sme_set_current_vl(unsigned long arg) { return -EINVAL; }
> static inline int sme_get_current_vl(void) { return -EINVAL; }
> +static inline void sme_suspend_exit(void) { }
>
> static inline size_t sme_state_size(struct task_struct const *task)
> {
> diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
> index a5dc6f764195..69201208bb13 100644
> --- a/arch/arm64/kernel/fpsimd.c
> +++ b/arch/arm64/kernel/fpsimd.c
> @@ -1311,6 +1311,19 @@ void __init sme_setup(void)
> get_sme_default_vl());
> }
>
> +void sme_suspend_exit(void)
> +{
> + u64 smcr = 0;
> +
> + if (!system_supports_sme())
> + return;
> +
> + if (system_supports_fa64())
> + smcr |= SMCR_ELx_FA64;
This seems to silently duplicate logic present in cpufeatures.c.
Would it be cleaner to save/restore this register explicitly across
suspend, once cpufeatures has initialised it?
Or this could be factored somehow, but dumbly saving/restoring it is
probably simpler (?)
> + write_sysreg_s(smcr, SYS_SMCR_EL1);
Is there an ISB or equivalent somewhere on this path?
Can we blow up when trying to restore SME state (e.g., ZT0) before we
enter userspace for the first time, if the firmware left the SME regs
inaccessible?
> +}
> +
[...]
Cheers
---Dave
next prev parent reply other threads:[~2024-01-30 10:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-30 0:02 [PATCH 0/2] arm64/sme: Fix handling of traps on resume Mark Brown
2024-01-30 0:02 ` [PATCH 1/2] arm64/sme: Restore SMCR on exit from suspend Mark Brown
2024-01-30 10:53 ` Dave Martin [this message]
2024-01-30 12:25 ` Mark Brown
2024-01-30 12:42 ` Mark Brown
2024-01-30 0:02 ` [PATCH 2/2] arm64/sme: Restore SMCR_EL1.EZT0 " Mark Brown
2024-01-30 10:54 ` Dave Martin
2024-01-30 14:34 ` Mark Brown
2024-01-30 15:10 ` Dave Martin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZbjVNggOxxoQXitV@e133380.arm.com \
--to=dave.martin@arm.com \
--cc=Jackson.Cooper-Driver@arm.com \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®