From 771c656181c360ed351a4a96a3e25102cbc140b9 Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Wed, 21 May 2025 18:34:33 -0700 Subject: [PATCH] lib: sbi: fwft: Use only the provided PMLEN value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As of riscv-sbi-doc commit c7d3d1f7dcaa ("ext-fwft: use the provided value in fwft_set(POINTER_MASKING_PMLEN)"), the SBI implementation must use only the provided PMLEN value or else fail. It may not fall back to a larger PMLEN value. Signed-off-by: Samuel Holland Reviewed-by: Radim Krčmář Link: https://lore.kernel.org/r/20250522013503.2556053-1-samuel.holland@sifive.com Signed-off-by: Anup Patel --- lib/sbi/sbi_fwft.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/sbi/sbi_fwft.c b/lib/sbi/sbi_fwft.c index c46006d4..a2aefb9a 100644 --- a/lib/sbi/sbi_fwft.c +++ b/lib/sbi/sbi_fwft.c @@ -223,32 +223,32 @@ static int fwft_pmlen_supported(struct fwft_config *conf) return SBI_OK; } -static bool fwft_try_to_set_pmm(unsigned long pmm) -{ - csr_set(CSR_MENVCFG, pmm); - return (csr_read(CSR_MENVCFG) & ENVCFG_PMM) == pmm; -} - static int fwft_set_pmlen(struct fwft_config *conf, unsigned long value) { - unsigned long prev; + unsigned long pmm, prev; - if (value > 16) + switch (value) { + case 0: + pmm = ENVCFG_PMM_PMLEN_0; + break; + case 7: + pmm = ENVCFG_PMM_PMLEN_7; + break; + case 16: + pmm = ENVCFG_PMM_PMLEN_16; + break; + default: return SBI_EINVAL; + } prev = csr_read_clear(CSR_MENVCFG, ENVCFG_PMM); - if (value == 0) - return SBI_OK; - if (value <= 7) { - if (fwft_try_to_set_pmm(ENVCFG_PMM_PMLEN_7)) - return SBI_OK; - csr_clear(CSR_MENVCFG, ENVCFG_PMM); + csr_set(CSR_MENVCFG, pmm); + if ((csr_read(CSR_MENVCFG) & ENVCFG_PMM) != pmm) { + csr_write(CSR_MENVCFG, prev); + return SBI_EINVAL; } - if (fwft_try_to_set_pmm(ENVCFG_PMM_PMLEN_16)) - return SBI_OK; - csr_write(CSR_MENVCFG, prev); - return SBI_EINVAL; + return SBI_OK; } static int fwft_get_pmlen(struct fwft_config *conf, unsigned long *value)