[PATCH] lib: sbi: Drop fw_rw_offset alignment requirement for single fw region
Anup Patel
apatel at ventanamicro.com
Sat Jun 13 03:03:19 PDT 2026
On Sat, May 23, 2026 at 4:57 AM Anirudh Srinivasan
<asrinivasan at oss.tenstorrent.com> wrote:
>
> From: Nicholas Piggin <npiggin at gmail.com>
>
> In a single fw region scheme, there is no separate PMP created for RW
> memory. The checks that opensbi does for the alignment between fw_start
> and fw_rw_start (using fw_rw_offset) and the power of 2 check for
> fw_rw_offset are no longer necessary.
>
> Update sbi_domain_init so that these checks are only done in the non
> single fw region scheme.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> Co-developed-by: Anirudh Srinivasan <asrinivasan at oss.tenstorrent.com>
> Signed-off-by: Anirudh Srinivasan <asrinivasan at oss.tenstorrent.com>
LGTM.
Reviewed-by: Anup Patel <anup at brainfault.org>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> lib/sbi/sbi_domain.c | 27 +++++++++++++++------------
> 1 file changed, 15 insertions(+), 12 deletions(-)
>
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 4f458ac0..296ee81b 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -871,20 +871,23 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
> struct sbi_hartmask *root_hmask;
> struct sbi_domain_memregion *root_memregs;
> int root_memregs_count = 0;
> + const struct sbi_platform *plat = sbi_platform_ptr(scratch);
> + bool fw_single_region = sbi_platform_single_fw_region(plat);
>
> SBI_INIT_LIST_HEAD(&domain_list);
>
> - if (scratch->fw_rw_offset == 0 ||
> - (scratch->fw_rw_offset & (scratch->fw_rw_offset - 1)) != 0) {
> - sbi_printf("%s: fw_rw_offset is not a power of 2 (0x%lx)\n",
> - __func__, scratch->fw_rw_offset);
> - return SBI_EINVAL;
> - }
> -
> - if ((scratch->fw_start & (scratch->fw_rw_offset - 1)) != 0) {
> - sbi_printf("%s: fw_start and fw_rw_offset not aligned\n",
> - __func__);
> - return SBI_EINVAL;
> + if (!fw_single_region) {
> + if (scratch->fw_rw_offset == 0 ||
> + (scratch->fw_rw_offset & (scratch->fw_rw_offset - 1)) != 0) {
> + sbi_printf("%s: fw_rw_offset is not a power of 2 (0x%lx)\n",
> + __func__, scratch->fw_rw_offset);
> + return SBI_EINVAL;
> + }
> + if ((scratch->fw_start & (scratch->fw_rw_offset - 1)) != 0) {
> + sbi_printf("%s: fw_start and fw_rw_offset not aligned\n",
> + __func__);
> + return SBI_EINVAL;
> + }
> }
>
> domain_hart_ptr_offset = sbi_scratch_alloc_type_offset(void *);
> @@ -913,7 +916,7 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
> root.possible_harts = root_hmask;
>
> /* Root domain firmware memory region */
> - if (sbi_platform_single_fw_region(sbi_platform_ptr(scratch))) {
> + if (fw_single_region) {
> sbi_domain_memregion_init(scratch->fw_start, scratch->fw_size,
> (SBI_DOMAIN_MEMREGION_M_READABLE |
> SBI_DOMAIN_MEMREGION_M_WRITABLE |
>
> ---
> base-commit: e7fa66c2160ec139de1853a00f669c09320a9256
> change-id: 20260522-fw_rw_start_alignment-44eaac884823
>
> Best regards,
> --
> Anirudh Srinivasan <asrinivasan at oss.tenstorrent.com>
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list