diff options
| author | Anup Patel <[email protected]> | 2026-07-27 09:55:01 +0530 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2026-08-02 15:17:12 +0530 |
| commit | 48725e95b4d02281bee268f6a9f8b5a77eb001fb (patch) | |
| tree | 3860b375d87296b496df90c29fa9c34ca2009d9c /lib | |
| parent | 622f3d44313c1d537f2301488167b42ac0680633 (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.c | 3 | ||||
| -rw-r--r-- | lib/sbi/sbi_hart_protection.c | 28 |
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(); |
