OpenSBI Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Yu-Chien Peter Lin <peter.lin@sifive.com>
To: Anup Patel <anup.patel@oss.qualcomm.com>
Cc: Atish Patra <atish.patra@linux.dev>,
	Andrew Jones <andrew.jones@oss.qualcomm.com>,
	Samuel Holland <samuel.holland@sifive.com>,
	Anup Patel <anup@brainfault.org>,
	opensbi@lists.infradead.org, raymondmaoca@gmail.com,
	zong.li@sifive.com, jim.shu@sifive.com,
	pawandeep.oza@oss.qualcomm.com
Subject: Re: [PATCH 4/5] lib: sbi: Extend hart protection abstraction to allow ID configuration
Date: Mon, 20 Jul 2026 18:10:29 +0800	[thread overview]
Message-ID: <al30Fax18B3Ev/qS@plin-1878> (raw)
In-Reply-To: <20260717074413.2536416-5-anup.patel@oss.qualcomm.com>

Hi Anup and Raymond,

On Fri, Jul 17, 2026 at 01:14:12PM +0530, Anup Patel wrote:
> There are various ID configuration ISA extensions such as RISC-V Worlds,
> Supervisor domain ID, QoS ID, etc which need to be re-configured upon
> domain context switch on a hart. Extend hart protection abstraction to
> support both memory protection and ID configuration ISA extensions.

I will rework my "[RFC,00/12] Add RISC-V Worlds ISA support to OpenSBI"
series based on this series.

Thanks,
Peter Lin

> 
> Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com>
> ---
>  include/sbi/sbi_hart_protection.h | 16 +++++-
>  lib/sbi/sbi_hart_pmp.c            |  2 +
>  lib/sbi/sbi_hart_protection.c     | 94 ++++++++++++++++++++++++++-----
>  lib/sbi/sbi_init.c                |  2 +-
>  platform/generic/eswin/eic770x.c  |  1 +
>  5 files changed, 98 insertions(+), 17 deletions(-)
> 
> diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h
> index 5e170f05..1358b5be 100644
> --- a/include/sbi/sbi_hart_protection.h
> +++ b/include/sbi/sbi_hart_protection.h
> @@ -13,6 +13,13 @@
>  struct sbi_scratch;
>  struct sbi_domain;
>  
> +/** Different types of hart protection mechanisms */
> +enum sbi_hart_protection_type {
> +	SBI_HART_PROTECTION_TYPE_MEMORY = 0,
> +	SBI_HART_PROTECTION_TYPE_ID,
> +	SBI_HART_PROTECTIOn_TYPE_MAX
> +};
> +
>  /** Representation of hart protection mechanism */
>  struct sbi_hart_protection {
>  	/** List head */
> @@ -21,6 +28,9 @@ struct sbi_hart_protection {
>  	/** Name of the hart protection mechanism */
>  	char name[32];
>  
> +	/** Type of the hart protection mechanism */
> +	enum sbi_hart_protection_type type;
> +
>  	/** Ratings of the hart protection mechanism (higher is better) */
>  	unsigned long rating;
>  
> @@ -40,11 +50,11 @@ struct sbi_hart_protection {
>  };
>  
>  /**
> - * Get the best hart protection mechanism
> + * Get the best hart memory protection mechanism
>   *
> - * @return pointer to best hart protection mechanism
> + * @return pointer to best hart memory protection mechanism
>   */
> -struct sbi_hart_protection *sbi_hart_protection_best(void);
> +struct sbi_hart_protection *sbi_hart_memory_protection_best(void);
>  
>  /**
>   * Register a hart protection mechanism
> diff --git a/lib/sbi/sbi_hart_pmp.c b/lib/sbi/sbi_hart_pmp.c
> index 5ede3cc1..c0a4ce1b 100644
> --- a/lib/sbi/sbi_hart_pmp.c
> +++ b/lib/sbi/sbi_hart_pmp.c
> @@ -425,6 +425,7 @@ static void sbi_hart_pmp_unconfigure(struct sbi_scratch *scratch,
>  static struct sbi_hart_protection pmp_protection = {
>  	.name = "pmp",
>  	.rating = 100,
> +	.type = SBI_HART_PROTECTION_TYPE_MEMORY,
>  	.configure = sbi_hart_oldpmp_configure,
>  	.unconfigure = sbi_hart_pmp_unconfigure,
>  };
> @@ -432,6 +433,7 @@ static struct sbi_hart_protection pmp_protection = {
>  static struct sbi_hart_protection epmp_protection = {
>  	.name = "epmp",
>  	.rating = 200,
> +	.type = SBI_HART_PROTECTION_TYPE_MEMORY,
>  	.configure = sbi_hart_smepmp_configure,
>  	.unconfigure = sbi_hart_pmp_unconfigure,
>  	.map_range = sbi_hart_smepmp_map_range,
> diff --git a/lib/sbi/sbi_hart_protection.c b/lib/sbi/sbi_hart_protection.c
> index fecefde8..d31e9938 100644
> --- a/lib/sbi/sbi_hart_protection.c
> +++ b/lib/sbi/sbi_hart_protection.c
> @@ -10,12 +10,16 @@
>  
>  static SBI_LIST_HEAD(hart_protection_list);
>  
> -struct sbi_hart_protection *sbi_hart_protection_best(void)
> +struct sbi_hart_protection *sbi_hart_memory_protection_best(void)
>  {
> -	if (sbi_list_empty(&hart_protection_list))
> -		return NULL;
> +	struct sbi_hart_protection *pos;
>  
> -	return sbi_list_first_entry(&hart_protection_list, struct sbi_hart_protection, head);
> +	sbi_list_for_each_entry(pos, &hart_protection_list, head) {
> +		if (pos->type == SBI_HART_PROTECTION_TYPE_MEMORY)
> +			return pos;
> +	}
> +
> +	return NULL;
>  }
>  
>  int sbi_hart_protection_register(struct sbi_hart_protection *hprot)
> @@ -74,33 +78,97 @@ static void __hart_protection_unconfigure(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(), dom);
> +	bool do_configure, memory_protect_done = false;
> +	struct sbi_hart_protection *hprot;
> +	int ret;
> +
> +	sbi_list_for_each_entry(hprot, &hart_protection_list, head) {
> +		do_configure = false;
> +		switch (hprot->type) {
> +		case SBI_HART_PROTECTION_TYPE_MEMORY:
> +			do_configure = !memory_protect_done;
> +			memory_protect_done = true;
> +			break;
> +		case SBI_HART_PROTECTION_TYPE_ID:
> +			do_configure = true;
> +			break;
> +		default:
> +			break;
> +		}
> +		if (!do_configure)
> +			continue;
> +
> +		ret = __hart_protection_configure(scratch, hprot, dom);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	return 0;
>  }
>  
>  void sbi_hart_protection_unconfigure(struct sbi_scratch *scratch,
>  				     struct sbi_domain *dom)
>  {
> -	__hart_protection_unconfigure(scratch, sbi_hart_protection_best(), dom);
> +
> +	bool do_unconfigure, memory_protect_done = false;
> +	struct sbi_hart_protection *hprot;
> +
> +	sbi_list_for_each_entry(hprot, &hart_protection_list, head) {
> +		do_unconfigure = false;
> +		switch (hprot->type) {
> +		case SBI_HART_PROTECTION_TYPE_MEMORY:
> +			do_unconfigure = !memory_protect_done;
> +			memory_protect_done = true;
> +			break;
> +		case SBI_HART_PROTECTION_TYPE_ID:
> +			do_unconfigure = true;
> +			break;
> +		default:
> +			break;
> +		}
> +		if (!do_unconfigure)
> +			continue;
> +
> +		__hart_protection_unconfigure(scratch, hprot, dom);
> +	}
>  }
>  
>  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();
> +	bool do_reconfigure, memory_protect_done = false;
> +	struct sbi_hart_protection *hprot;
>  	int ret;
>  
> -	__hart_protection_unconfigure(scratch, hprot, current_dom);
> -	ret = __hart_protection_configure(scratch, hprot, next_dom);
> -	if (ret)
> -		return ret;
> +	sbi_list_for_each_entry(hprot, &hart_protection_list, head) {
> +		do_reconfigure = false;
> +		switch (hprot->type) {
> +		case SBI_HART_PROTECTION_TYPE_MEMORY:
> +			do_reconfigure = !memory_protect_done;
> +			memory_protect_done = true;
> +			break;
> +		case SBI_HART_PROTECTION_TYPE_ID:
> +			do_reconfigure = true;
> +			break;
> +		default:
> +			break;
> +		}
> +		if (!do_reconfigure)
> +			continue;
> +
> +		__hart_protection_unconfigure(scratch, hprot, current_dom);
> +		ret = __hart_protection_configure(scratch, hprot, next_dom);
> +		if (ret)
> +			return ret;
> +	}
>  
>  	return 0;
>  }
>  
>  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_memory_protection_best();
>  
>  	if (!hprot || !hprot->map_range)
>  		return 0;
> @@ -110,7 +178,7 @@ int sbi_hart_protection_map_range(unsigned long base, unsigned long size)
>  
>  int sbi_hart_protection_unmap_range(unsigned long base, unsigned long size)
>  {
> -	struct sbi_hart_protection *hprot = sbi_hart_protection_best();
> +	struct sbi_hart_protection *hprot = sbi_hart_memory_protection_best();
>  
>  	if (!hprot || !hprot->unmap_range)
>  		return 0;
> diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
> index d74dc67c..3f1f136a 100644
> --- a/lib/sbi/sbi_init.c
> +++ b/lib/sbi/sbi_init.c
> @@ -93,7 +93,7 @@ static void sbi_boot_print_general(struct sbi_scratch *scratch)
>  	sbi_printf("Platform Features           : %s\n", str);
>  	sbi_printf("Platform HART Count         : %u\n",
>  		   sbi_platform_hart_count(plat));
> -	hprot = sbi_hart_protection_best();
> +	hprot = sbi_hart_memory_protection_best();
>  	sbi_printf("Platform HART Protection    : %s\n",
>  		   (hprot) ? hprot->name : "---");
>  	idev = sbi_ipi_get_device();
> diff --git a/platform/generic/eswin/eic770x.c b/platform/generic/eswin/eic770x.c
> index da4d0e34..c71198a8 100644
> --- a/platform/generic/eswin/eic770x.c
> +++ b/platform/generic/eswin/eic770x.c
> @@ -470,6 +470,7 @@ static void eswin_eic7700_pmp_unconfigure(struct sbi_scratch *scratch,
>  static struct sbi_hart_protection eswin_eic7700_pmp_protection = {
>  	.name = "eic7700_pmp",
>  	.rating = -1UL,
> +	.type = SBI_HART_PROTECTION_TYPE_MEMORY,
>  	.configure = eswin_eic7700_pmp_configure,
>  	.unconfigure = eswin_eic7700_pmp_unconfigure,
>  };

-- 
opensbi mailing list
opensbi@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/opensbi

  reply	other threads:[~2026-07-20 10:10 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-17  7:44 [PATCH 0/5] Extend hart protection abstraction for ID configuration Anup Patel
2026-07-17  7:44 ` [PATCH 1/5] lib: sbi: Fix typos related to hart protection Anup Patel
2026-07-22 10:56   ` Rahul Pathak
2026-07-17  7:44 ` [PATCH 2/5] lib: sbi: Introduce sbi_hart_protection_reconfigure() function Anup Patel
2026-07-22 10:59   ` Rahul Pathak
2026-07-17  7:44 ` [PATCH 3/5] lib: sbi: Add domain parameter to hart protection (un)configure() Anup Patel
2026-07-22 11:05   ` Rahul Pathak
2026-07-17  7:44 ` [PATCH 4/5] lib: sbi: Extend hart protection abstraction to allow ID configuration Anup Patel
2026-07-20 10:10   ` Yu-Chien Peter Lin [this message]
2026-07-20 10:49     ` Anup Patel
2026-07-20 10:54       ` Anup Patel
2026-07-21  7:47       ` Yu-Chien Peter Lin
2026-07-22 11:22   ` Rahul Pathak
2026-07-17  7:44 ` [PATCH 5/5] lib: sbi: Print list of all hart protection mechanisms at boot time Anup Patel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=al30Fax18B3Ev/qS@plin-1878 \
    --to=peter.lin@sifive.com \
    --cc=andrew.jones@oss.qualcomm.com \
    --cc=anup.patel@oss.qualcomm.com \
    --cc=anup@brainfault.org \
    --cc=atish.patra@linux.dev \
    --cc=jim.shu@sifive.com \
    --cc=opensbi@lists.infradead.org \
    --cc=pawandeep.oza@oss.qualcomm.com \
    --cc=raymondmaoca@gmail.com \
    --cc=samuel.holland@sifive.com \
    --cc=zong.li@sifive.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox