[RFC PATCH] lib: sbi_hart: Store PMP granularity as log base 2
Anup Patel
anup at brainfault.org
Fri Dec 8 09:09:53 PST 2023
On Thu, Nov 23, 2023 at 1:14 AM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> This minimizes the need to call log2roundup() to recover the log value.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>
> ---
> This actually ends up with a net increase in code size, so it's probably
> not worth merging. I'm sending the patch for completeness.
I agree there is not much difference with this patch but I think tracking
PMP granularity as power-of-2 (log2) is better because OpenSBI domain
region sizes are also power-of-2.
I rebased this patch on the latest OpenSBI and merged it as well with my
Reviewed-by.
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
>
> include/sbi/sbi_hart.h | 4 ++--
> lib/sbi/sbi_hart.c | 10 +++++-----
> lib/sbi/sbi_init.c | 2 +-
> 3 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
> index 6ee49ff..cbcac78 100644
> --- a/include/sbi/sbi_hart.h
> +++ b/include/sbi/sbi_hart.h
> @@ -71,7 +71,7 @@ struct sbi_hart_features {
> unsigned long extensions[BITS_TO_LONGS(SBI_HART_EXT_MAX)];
> unsigned int pmp_count;
> unsigned int pmp_addr_bits;
> - unsigned long pmp_gran;
> + unsigned int pmp_gran_log2;
> unsigned int mhpm_mask;
> unsigned int mhpm_bits;
> };
> @@ -91,7 +91,7 @@ unsigned int sbi_hart_mhpm_mask(struct sbi_scratch *scratch);
> void sbi_hart_delegation_dump(struct sbi_scratch *scratch,
> const char *prefix, const char *suffix);
> unsigned int sbi_hart_pmp_count(struct sbi_scratch *scratch);
> -unsigned long sbi_hart_pmp_granularity(struct sbi_scratch *scratch);
> +unsigned int sbi_hart_pmp_gran_log2(struct sbi_scratch *scratch);
> unsigned int sbi_hart_pmp_addrbits(struct sbi_scratch *scratch);
> unsigned int sbi_hart_mhpm_bits(struct sbi_scratch *scratch);
> int sbi_hart_pmp_configure(struct sbi_scratch *scratch);
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index bf8792a..5141160 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -267,12 +267,12 @@ unsigned int sbi_hart_pmp_count(struct sbi_scratch *scratch)
> return hfeatures->pmp_count;
> }
>
> -unsigned long sbi_hart_pmp_granularity(struct sbi_scratch *scratch)
> +unsigned int sbi_hart_pmp_gran_log2(struct sbi_scratch *scratch)
> {
> struct sbi_hart_features *hfeatures =
> sbi_scratch_offset_ptr(scratch, hart_features_offset);
>
> - return hfeatures->pmp_gran;
> + return hfeatures->pmp_gran_log2;
> }
>
> unsigned int sbi_hart_pmp_addrbits(struct sbi_scratch *scratch)
> @@ -508,7 +508,7 @@ int sbi_hart_map_saddr(unsigned long addr, unsigned long size)
> if (is_pmp_entry_mapped(SBI_SMEPMP_RESV_ENTRY))
> return SBI_ENOSPC;
>
> - for (order = log2roundup(MAX(sbi_hart_pmp_granularity(scratch), size));
> + for (order = MAX(sbi_hart_pmp_gran_log2(scratch), log2roundup(size));
> order <= __riscv_xlen; order++) {
> if (order < __riscv_xlen) {
> base = addr & ~((1UL << order) - 1UL);
> @@ -547,7 +547,7 @@ int sbi_hart_pmp_configure(struct sbi_scratch *scratch)
> if (!pmp_count)
> return 0;
>
> - pmp_gran_log2 = log2roundup(sbi_hart_pmp_granularity(scratch));
> + pmp_gran_log2 = sbi_hart_pmp_gran_log2(scratch);
> pmp_bits = sbi_hart_pmp_addrbits(scratch) - 1;
> pmp_addr_max = (1UL << pmp_bits) | ((1UL << pmp_bits) - 1);
>
> @@ -871,7 +871,7 @@ static int hart_detect_features(struct sbi_scratch *scratch)
> */
> val = hart_pmp_get_allowed_addr();
> if (val) {
> - hfeatures->pmp_gran = 1 << (sbi_ffs(val) + 2);
> + hfeatures->pmp_gran_log2 = sbi_ffs(val) + 2;
> hfeatures->pmp_addr_bits = sbi_fls(val) + 1;
> /* Detect number of PMP regions. At least PMPADDR0 should be implemented*/
> __check_csr_64(CSR_PMPADDR0, 0, val, pmp_count, __pmp_skip);
> diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
> index e723553..bfb8300 100644
> --- a/lib/sbi/sbi_init.c
> +++ b/lib/sbi/sbi_init.c
> @@ -177,7 +177,7 @@ static void sbi_boot_print_hart(struct sbi_scratch *scratch, u32 hartid)
> sbi_printf("Boot HART PMP Count : %d\n",
> sbi_hart_pmp_count(scratch));
> sbi_printf("Boot HART PMP Granularity : %lu\n",
> - sbi_hart_pmp_granularity(scratch));
> + 1UL << sbi_hart_pmp_gran_log2(scratch));
> sbi_printf("Boot HART PMP Address Bits: %d\n",
> sbi_hart_pmp_addrbits(scratch));
> sbi_printf("Boot HART MHPM Info : %lu (0x%08x)\n",
> --
> 2.42.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list