[PATCH AUTOSEL 6.17-6.16] riscv: mm: Return intended SATP mode for noXlvl options

Sasha Levin sashal at kernel.org
Thu Oct 2 08:30:00 PDT 2025


From: Junhui Liu <junhui.liu at pigmoral.tech>

[ Upstream commit f3243bed39c26ce0f13e6392a634f91d409b2d02 ]

Change the return value of match_noXlvl() to return the SATP mode that
will be used, rather than the mode being disabled. This enables unified
logic for return value judgement with the function that obtains mmu-type
from the fdt, avoiding extra conversion. This only changes the naming,
with no functional impact.

Signed-off-by: Junhui Liu <junhui.liu at pigmoral.tech>
Reviewed-by: Alexandre Ghiti <alexghiti at rivosinc.com>
Reviewed-by: Nutty Liu <liujingqi at lanxincomputing.com>
Link: https://lore.kernel.org/r/20250722-satp-from-fdt-v1-1-5ba22218fa5f@pigmoral.tech
Signed-off-by: Paul Walmsley <pjw at kernel.org>
Signed-off-by: Sasha Levin <sashal at kernel.org>
---

LLM Generated explanations, may be completely bogus:

Based on my comprehensive investigation of this commit and its context,
here is my analysis:

## Analysis Summary

**Backport Status: YES**

## Detailed Explanation

### 1. **This is a prerequisite for an important bug fix**

While the commit message states "This only changes the naming, with no
functional impact," this refactoring is **part 1 of a 2-patch series**.
The follow-up commit (17e9521044c9b "riscv: mm: Use mmu-type from FDT to
limit SATP mode") fixes a real hardware issue:

> "Some RISC-V implementations may hang when attempting to write an
unsupported SATP mode, even though the latest RISC-V specification
states such writes should have no effect."

The bug fix depends on this refactoring to work correctly.

### 2. **Code changes are functionally equivalent**

Examining the specific changes:

**In `arch/riscv/kernel/pi/cmdline_early.c`:**
- OLD: `no4lvl` returns `SATP_MODE_48` (the mode being disabled)
- NEW: `no4lvl` returns `SATP_MODE_39` (the mode to actually use)
- OLD: `no5lvl` returns `SATP_MODE_57` (the mode being disabled)
- NEW: `no5lvl` returns `SATP_MODE_48` (the mode to actually use)

**In `arch/riscv/mm/init.c`:**
- The comparison logic changes accordingly to match the new semantics
- OLD: `if (satp_mode_cmdline == SATP_MODE_57)` → disable L5
- NEW: `if (satp_mode_cmdline == SATP_MODE_48)` → disable L5

The end result is identical - both code paths result in the same page
table configuration.

### 3. **Enables unified logic with FDT mmu-type**

The refactoring allows the follow-up patch to use
`min_not_zero(__pi_set_satp_mode_from_cmdline(),
__pi_set_satp_mode_from_fdt())` to combine both sources of SATP mode
limits. This unified approach prevents writing unsupported SATP modes
that cause hardware hangs.

### 4. **Low regression risk**

- Self-contained changes to only 2 files
- Both files modified consistently with matching semantics
- No change to external APIs or behavior
- Simple, straightforward logic transformation

### 5. **Affects stable kernels 6.4+**

The `no4lvl`/`no5lvl` command line options were introduced in v6.4
(commit 26e7aacb83dfd), so any stable kernel from 6.4 onwards would
benefit from having both patches backported together.

### 6. **Already being backported together**

I can confirm that both commits are already being backported to
6.17-stable as a pair:
- f3243bed39c26 → b222a93bf5294 (this refactoring)
- 17e9521044c9b → f64e5a29ae1a2 (the bug fix)

This indicates the maintainers recognized these should be backported
together.

## Conclusion

**YES**, this commit should be backported to stable trees because:
1. It's a necessary prerequisite for fixing hardware hangs on some
   RISC-V implementations
2. The refactoring is functionally equivalent with no behavior change
3. It has minimal regression risk
4. It should be backported together with its follow-up patch
   17e9521044c9b
5. It benefits all stable kernels 6.4+ that have the no4lvl/no5lvl
   feature

 arch/riscv/kernel/pi/cmdline_early.c | 4 ++--
 arch/riscv/mm/init.c                 | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/riscv/kernel/pi/cmdline_early.c b/arch/riscv/kernel/pi/cmdline_early.c
index fbcdc9e4e1432..389d086a07187 100644
--- a/arch/riscv/kernel/pi/cmdline_early.c
+++ b/arch/riscv/kernel/pi/cmdline_early.c
@@ -41,9 +41,9 @@ static char *get_early_cmdline(uintptr_t dtb_pa)
 static u64 match_noXlvl(char *cmdline)
 {
 	if (strstr(cmdline, "no4lvl"))
-		return SATP_MODE_48;
+		return SATP_MODE_39;
 	else if (strstr(cmdline, "no5lvl"))
-		return SATP_MODE_57;
+		return SATP_MODE_48;
 
 	return 0;
 }
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index 15683ae13fa5d..054265b3f2680 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -864,9 +864,9 @@ static __init void set_satp_mode(uintptr_t dtb_pa)
 
 	kernel_map.page_offset = PAGE_OFFSET_L5;
 
-	if (satp_mode_cmdline == SATP_MODE_57) {
+	if (satp_mode_cmdline == SATP_MODE_48) {
 		disable_pgtable_l5();
-	} else if (satp_mode_cmdline == SATP_MODE_48) {
+	} else if (satp_mode_cmdline == SATP_MODE_39) {
 		disable_pgtable_l5();
 		disable_pgtable_l4();
 		return;
-- 
2.51.0




More information about the linux-riscv mailing list