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 <anup.patel@oss.qualcomm.com>
Reviewed-by: Rahul Pathak <rahul.pathak@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20260727042504.1743250-3-anup.patel@oss.qualcomm.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Anup Patel
2026-08-02 15:17:12 +05:30
committed by Anup Patel
parent 622f3d4431
commit 48725e95b4
3 changed files with 30 additions and 8 deletions
+7
View File
@@ -77,6 +77,13 @@ int sbi_hart_protection_configure(struct sbi_scratch *scratch);
*/ */
void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch); void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch);
/**
* Re-configure protection for current HART
*
* @param scratch pointer to scratch space of current HART
*/
int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch);
/** /**
* Create temporary mapping to access address range on current HART * Create temporary mapping to access address range on current HART
* *
+1 -2
View File
@@ -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 * is also required for some of the above CSR updates (such
* as satp CSR). * as satp CSR).
*/ */
sbi_hart_protection_unconfigure(scratch); sbi_hart_protection_reconfigure(scratch);
sbi_hart_protection_configure(scratch);
/* Mark current context structure initialized because context saved */ /* Mark current context structure initialized because context saved */
ctx->initialized = true; ctx->initialized = true;
+22 -6
View File
@@ -49,10 +49,9 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot)
sbi_list_del(&hprot->head); 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) if (!hprot)
return 0; return 0;
if (!hprot->configure) if (!hprot->configure)
@@ -61,16 +60,33 @@ int sbi_hart_protection_configure(struct sbi_scratch *scratch)
return hprot->configure(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) if (!hprot || !hprot->unconfigure)
return; return;
hprot->unconfigure(scratch); 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) int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
{ {
struct sbi_hart_protection *hprot = sbi_hart_protection_best(); struct sbi_hart_protection *hprot = sbi_hart_protection_best();