diff options
| author | Samuel Holland <[email protected]> | 2025-05-21 18:34:33 -0700 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2025-06-15 18:56:33 +0530 |
| commit | 771c656181c360ed351a4a96a3e25102cbc140b9 (patch) | |
| tree | 022e464d2938e157b9d9e395159dbcb1fd1d0d3c | |
| parent | f30a54f3b3a091c225a00476f4039bf399badd1f (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.c | 36 |
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) |
