[PATCH] lib: sbi: Drop fw_rw_offset alignment requirement for single fw region

Anirudh Srinivasan asrinivasan at oss.tenstorrent.com
Fri May 22 15:54:17 PDT 2026


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>
---
 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>




More information about the opensbi mailing list