lib: reset: Move fdt_reset_init into generic_early_init
authorGuo Ren <guoren@linux.alibaba.com>
Sun, 18 Jun 2023 15:07:16 +0000 (11:07 -0400)
committerAnup Patel <anup@brainfault.org>
Wed, 21 Jun 2023 05:42:42 +0000 (11:12 +0530)
The fdt_reset_thead driver needs to modify the __reset_thead_csr_stub
text region for the secondary harts booting. After that, the
sbi_hart_pmp_configure may lock down the text region with M_READABLE &
M_EXECUTABLE attributes in the future. Currently, the M_READABLE &
M_EXECUtABLE have no effect on m-mode, the L-bit in pmpcfg csr is
useless for the current opensbi scenario. See:

Priv-isa-spec 3.7.1.2. Locking and Privilege Mode
When the L bit is clear, any M-mode access matching the PMP entry will
succeed; the R/W/X permissions apply only to S and U modes.

That's why current fdt_reset_thead could still work well after commit:
230278dcf127 ("lib: sbi: Add separate entries for firmware RX and RW
regions"). So this patch fixes up a fake bug for the M-mode permission
setting of the future.

Fixes: 230278dcf127 ("lib: sbi: Add separate entries for firmware RX and RW regions")
Link: http://lists.infradead.org/pipermail/opensbi/2023-June/005176.html
Reported-by: Jessica Clarke <jrtc27@jrtc27.com>
Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
Reviewed-by: Anup Patel <anup@brainfault.org>
platform/generic/platform.c

index 0c9cd95181731b7f41b69ebdd362a90aa2292926..86811e6b02c6e3e77dba68f5864845f5f0a042b0 100644 (file)
@@ -143,6 +143,9 @@ static int generic_nascent_init(void)
 
 static int generic_early_init(bool cold_boot)
 {
+       if (cold_boot)
+               fdt_reset_init();
+
        if (!generic_plat || !generic_plat->early_init)
                return 0;
 
@@ -154,9 +157,6 @@ static int generic_final_init(bool cold_boot)
        void *fdt;
        int rc;
 
-       if (cold_boot)
-               fdt_reset_init();
-
        if (generic_plat && generic_plat->final_init) {
                rc = generic_plat->final_init(cold_boot, generic_plat_match);
                if (rc)