summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnup Patel <[email protected]>2026-07-27 09:55:01 +0530
committerAnup Patel <[email protected]>2026-08-02 15:17:12 +0530
commit48725e95b4d02281bee268f6a9f8b5a77eb001fb (patch)
tree3860b375d87296b496df90c29fa9c34ca2009d9c /lib
parent622f3d44313c1d537f2301488167b42ac0680633 (diff)
lib: sbi: Introduce sbi_hart_protection_reconfigure() function
Instead of assuming that hart protection reconfiguration is unconfigure followed by configure, introduce a separate sbi_hart_protection_reconfigure() function and use it in switch_to_next_domain_context(). Signed-off-by: Anup Patel <[email protected]> Reviewed-by: Rahul Pathak <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/sbi_domain_context.c3
-rw-r--r--lib/sbi/sbi_hart_protection.c28
2 files changed, 23 insertions, 8 deletions
diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c
index cc4cc04d..7d9817d6 100644
--- a/lib/sbi/sbi_domain_context.c
+++ b/lib/sbi/sbi_domain_context.c
@@ -171,8 +171,7 @@ static int switch_to_next_domain_context(struct hart_context *ctx,
* is also required for some of the above CSR updates (such
* as satp CSR).
*/
- sbi_hart_protection_unconfigure(scratch);
- sbi_hart_protection_configure(scratch);
+ sbi_hart_protection_reconfigure(scratch);
/* Mark current context structure initialized because context saved */
ctx->initialized = true;
diff --git a/lib/sbi/sbi_hart_protection.c b/lib/sbi/sbi_hart_protection.c
index fbebfd1a..9a8427b9 100644
--- a/lib/sbi/sbi_hart_protection.c
+++ b/lib/sbi/sbi_hart_protection.c
@@ -49,10 +49,9 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot)
sbi_list_del(&hprot->head);
}
-int sbi_hart_protection_configure(struct sbi_scratch *scratch)
+static int __hart_protection_configure(struct sbi_scratch *scratch,
+ struct sbi_hart_protection *hprot)
{
- struct sbi_hart_protection *hprot = sbi_hart_protection_best();
-
if (!hprot)
return 0;
if (!hprot->configure)
@@ -61,16 +60,33 @@ int sbi_hart_protection_configure(struct sbi_scratch *scratch)
return hprot->configure(scratch);
}
-void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch)
+static void __hart_protection_unconfigure(struct sbi_scratch *scratch,
+ struct sbi_hart_protection *hprot)
{
- struct sbi_hart_protection *hprot = sbi_hart_protection_best();
-
if (!hprot || !hprot->unconfigure)
return;
hprot->unconfigure(scratch);
}
+int sbi_hart_protection_configure(struct sbi_scratch *scratch)
+{
+ return __hart_protection_configure(scratch, sbi_hart_protection_best());
+}
+
+void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch)
+{
+ __hart_protection_unconfigure(scratch, sbi_hart_protection_best());
+}
+
+int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch)
+{
+ struct sbi_hart_protection *hprot = sbi_hart_protection_best();
+
+ __hart_protection_unconfigure(scratch, hprot);
+ return __hart_protection_configure(scratch, hprot);
+}
+
int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
{
struct sbi_hart_protection *hprot = sbi_hart_protection_best();