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:
Anup Patel
2026-08-02 15:17:12 +05:30
committed by Anup Patel
parent 48725e95b4
commit 5053774c2f
6 changed files with 50 additions and 29 deletions
+19 -6
View File
@@ -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
+1 -1
View File
@@ -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;
+6 -5
View File
@@ -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);
+17 -11
View File
@@ -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
View File
@@ -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();
+4 -3
View File
@@ -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,