summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Holland <[email protected]>2025-05-21 18:34:33 -0700
committerAnup Patel <[email protected]>2025-06-15 18:56:33 +0530
commit771c656181c360ed351a4a96a3e25102cbc140b9 (patch)
tree022e464d2938e157b9d9e395159dbcb1fd1d0d3c
parentf30a54f3b3a091c225a00476f4039bf399badd1f (diff)
lib: sbi: fwft: Use only the provided PMLEN value
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 <[email protected]> Reviewed-by: Radim Krčmář <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Anup Patel <[email protected]>
-rw-r--r--lib/sbi/sbi_fwft.c36
1 files 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)