mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-08-18 01:21:49 +01:00
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:
@@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user