mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-08-18 01:21:49 +01:00
lib: sbi: Add domain parameter to hart protection (un)configure()
The switch_to_next_domain_context() already has the pointers to current and next domains so pass them as parameters to hart protection configure() and unconfigure() callbacks. 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-4-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
#include <sbi/sbi_list.h>
|
#include <sbi/sbi_list.h>
|
||||||
|
|
||||||
struct sbi_scratch;
|
struct sbi_scratch;
|
||||||
|
struct sbi_domain;
|
||||||
|
|
||||||
/** Representation of hart protection mechanism */
|
/** Representation of hart protection mechanism */
|
||||||
struct sbi_hart_protection {
|
struct sbi_hart_protection {
|
||||||
@@ -24,10 +25,10 @@ struct sbi_hart_protection {
|
|||||||
unsigned long rating;
|
unsigned long rating;
|
||||||
|
|
||||||
/** Configure protection for current HART (Mandatory) */
|
/** Configure protection for current HART (Mandatory) */
|
||||||
int (*configure)(struct sbi_scratch *scratch);
|
int (*configure)(struct sbi_scratch *scratch, struct sbi_domain *dom);
|
||||||
|
|
||||||
/** Unconfigure protection for current HART (Mandatory) */
|
/** Unconfigure protection for current HART (Optional) */
|
||||||
void (*unconfigure)(struct sbi_scratch *scratch);
|
void (*unconfigure)(struct sbi_scratch *scratch, struct sbi_domain *dom);
|
||||||
|
|
||||||
/** Create temporary mapping to access address range on current HART (Optional) */
|
/** Create temporary mapping to access address range on current HART (Optional) */
|
||||||
int (*map_range)(struct sbi_scratch *scratch,
|
int (*map_range)(struct sbi_scratch *scratch,
|
||||||
@@ -65,24 +66,36 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot);
|
|||||||
* Configure protection for current HART
|
* Configure protection for current HART
|
||||||
*
|
*
|
||||||
* @param scratch pointer to scratch space of current HART
|
* @param scratch pointer to scratch space of current HART
|
||||||
|
* @param dom pointer to the domain for which HART protection
|
||||||
|
* is being configured
|
||||||
*
|
*
|
||||||
* @return 0 on success and negative error code on failure
|
* @return 0 on success and negative error code on failure
|
||||||
*/
|
*/
|
||||||
int sbi_hart_protection_configure(struct sbi_scratch *scratch);
|
int sbi_hart_protection_configure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unconfigure protection for current HART
|
* Unconfigure protection for current HART
|
||||||
*
|
*
|
||||||
* @param scratch pointer to scratch space of current HART
|
* @param scratch pointer to scratch space of current HART
|
||||||
|
* @param dom pointer to the domain for which HART protection
|
||||||
|
* is being unconfigured
|
||||||
*/
|
*/
|
||||||
void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch);
|
void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Re-configure protection for current HART
|
* Re-configure protection for current HART
|
||||||
*
|
*
|
||||||
* @param scratch pointer to scratch space of current HART
|
* @param scratch pointer to scratch space of current HART
|
||||||
|
* @param current_dom pointer to the current domain for which
|
||||||
|
* HART protection is being unconfigured
|
||||||
|
* @param next_dom pointer to the next domain for which HART
|
||||||
|
* protection is being configured
|
||||||
*/
|
*/
|
||||||
int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch);
|
int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *current_dom,
|
||||||
|
struct sbi_domain *next_dom);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create temporary mapping to access address range on current HART
|
* Create temporary mapping to access address range on current HART
|
||||||
|
|||||||
@@ -171,7 +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_reconfigure(scratch);
|
sbi_hart_protection_reconfigure(scratch, current_dom, target_dom);
|
||||||
|
|
||||||
/* Mark current context structure initialized because context saved */
|
/* Mark current context structure initialized because context saved */
|
||||||
ctx->initialized = true;
|
ctx->initialized = true;
|
||||||
|
|||||||
@@ -228,10 +228,10 @@ static bool is_valid_pmp_idx(unsigned int pmp_count, unsigned int pmp_idx)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch)
|
static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
struct sbi_domain_memregion *reg;
|
struct sbi_domain_memregion *reg;
|
||||||
struct sbi_domain *dom = sbi_domain_thishart_ptr();
|
|
||||||
unsigned int pmp_log2gran, pmp_bits;
|
unsigned int pmp_log2gran, pmp_bits;
|
||||||
unsigned int pmp_idx, pmp_count;
|
unsigned int pmp_idx, pmp_count;
|
||||||
unsigned long pmp_addr_max;
|
unsigned long pmp_addr_max;
|
||||||
@@ -366,10 +366,10 @@ static int sbi_hart_smepmp_unmap_range(struct sbi_scratch *scratch,
|
|||||||
return sbi_hart_pmp_disable(SBI_SMEPMP_RESV_ENTRY);
|
return sbi_hart_pmp_disable(SBI_SMEPMP_RESV_ENTRY);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch)
|
static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
struct sbi_domain_memregion *reg;
|
struct sbi_domain_memregion *reg;
|
||||||
struct sbi_domain *dom = sbi_domain_thishart_ptr();
|
|
||||||
unsigned long pmp_addr, pmp_addr_max;
|
unsigned long pmp_addr, pmp_addr_max;
|
||||||
unsigned int pmp_log2gran, pmp_bits;
|
unsigned int pmp_log2gran, pmp_bits;
|
||||||
unsigned int pmp_idx, pmp_count;
|
unsigned int pmp_idx, pmp_count;
|
||||||
@@ -407,7 +407,8 @@ static int sbi_hart_oldpmp_configure(struct sbi_scratch *scratch)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sbi_hart_pmp_unconfigure(struct sbi_scratch *scratch)
|
static void sbi_hart_pmp_unconfigure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
int i, pmp_count = sbi_hart_pmp_count(scratch);
|
int i, pmp_count = sbi_hart_pmp_count(scratch);
|
||||||
|
|
||||||
|
|||||||
@@ -50,41 +50,47 @@ void sbi_hart_protection_unregister(struct sbi_hart_protection *hprot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int __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,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
if (!hprot)
|
if (!hprot)
|
||||||
return 0;
|
return 0;
|
||||||
if (!hprot->configure)
|
if (!hprot->configure)
|
||||||
return SBI_ENOSYS;
|
return SBI_ENOSYS;
|
||||||
|
|
||||||
return hprot->configure(scratch);
|
return hprot->configure(scratch, dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __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,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
if (!hprot || !hprot->unconfigure)
|
if (!hprot || !hprot->unconfigure)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hprot->unconfigure(scratch);
|
hprot->unconfigure(scratch, dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sbi_hart_protection_configure(struct sbi_scratch *scratch)
|
int sbi_hart_protection_configure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
return __hart_protection_configure(scratch, sbi_hart_protection_best());
|
return __hart_protection_configure(scratch, sbi_hart_protection_best(), dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch)
|
void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
__hart_protection_unconfigure(scratch, sbi_hart_protection_best());
|
__hart_protection_unconfigure(scratch, sbi_hart_protection_best(), dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch)
|
int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *current_dom,
|
||||||
|
struct sbi_domain *next_dom)
|
||||||
{
|
{
|
||||||
struct sbi_hart_protection *hprot = sbi_hart_protection_best();
|
struct sbi_hart_protection *hprot = sbi_hart_protection_best();
|
||||||
|
|
||||||
__hart_protection_unconfigure(scratch, hprot);
|
__hart_protection_unconfigure(scratch, hprot, current_dom);
|
||||||
return __hart_protection_configure(scratch, hprot);
|
return __hart_protection_configure(scratch, hprot, next_dom);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
|
int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
|
||||||
|
|||||||
+3
-3
@@ -435,7 +435,7 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
|
|||||||
* Configure hart protection at last because if SMEPMP is
|
* Configure hart protection at last because if SMEPMP is
|
||||||
* detected, M-mode access to the S/U space will be rescinded.
|
* detected, M-mode access to the S/U space will be rescinded.
|
||||||
*/
|
*/
|
||||||
rc = sbi_hart_protection_configure(scratch);
|
rc = sbi_hart_protection_configure(scratch, sbi_domain_thishart_ptr());
|
||||||
if (rc) {
|
if (rc) {
|
||||||
sbi_printf("%s: hart protection configure failed (error %d)\n",
|
sbi_printf("%s: hart protection configure failed (error %d)\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
@@ -518,7 +518,7 @@ static void __noreturn init_warm_startup(struct sbi_scratch *scratch,
|
|||||||
* Configure hart protection at last because if SMEPMP is
|
* Configure hart protection at last because if SMEPMP is
|
||||||
* detected, M-mode access to the S/U space will be rescinded.
|
* detected, M-mode access to the S/U space will be rescinded.
|
||||||
*/
|
*/
|
||||||
rc = sbi_hart_protection_configure(scratch);
|
rc = sbi_hart_protection_configure(scratch, sbi_domain_thishart_ptr());
|
||||||
if (rc)
|
if (rc)
|
||||||
sbi_hart_hang();
|
sbi_hart_hang();
|
||||||
|
|
||||||
@@ -539,7 +539,7 @@ static void __noreturn init_warm_resume(struct sbi_scratch *scratch,
|
|||||||
if (rc)
|
if (rc)
|
||||||
sbi_hart_hang();
|
sbi_hart_hang();
|
||||||
|
|
||||||
rc = sbi_hart_protection_configure(scratch);
|
rc = sbi_hart_protection_configure(scratch, sbi_domain_thishart_ptr());
|
||||||
if (rc)
|
if (rc)
|
||||||
sbi_hart_hang();
|
sbi_hart_hang();
|
||||||
|
|
||||||
|
|||||||
@@ -380,9 +380,9 @@ static int eswin_eic7700_final_init(bool cold_boot)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int eswin_eic7700_pmp_configure(struct sbi_scratch *scratch)
|
static int eswin_eic7700_pmp_configure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
struct sbi_domain *dom = sbi_domain_thishart_ptr();
|
|
||||||
struct sbi_domain_memregion *reg, *prev = NULL;
|
struct sbi_domain_memregion *reg, *prev = NULL;
|
||||||
unsigned int pmp_idx, pmp_max;
|
unsigned int pmp_idx, pmp_max;
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
@@ -453,7 +453,8 @@ no_more_pmp:
|
|||||||
return SBI_EFAIL;
|
return SBI_EFAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eswin_eic7700_pmp_unconfigure(struct sbi_scratch *scratch)
|
static void eswin_eic7700_pmp_unconfigure(struct sbi_scratch *scratch,
|
||||||
|
struct sbi_domain *dom)
|
||||||
{
|
{
|
||||||
/* Enable P550 internal + System Port */
|
/* Enable P550 internal + System Port */
|
||||||
sbi_hart_pmp_set(PMP_FREE_A_START + PMP_FREE_A_COUNT - 1, 0, 0,
|
sbi_hart_pmp_set(PMP_FREE_A_START + PMP_FREE_A_COUNT - 1, 0, 0,
|
||||||
|
|||||||
Reference in New Issue
Block a user