From: Yu-Chien Peter Lin <peter.lin@sifive.com>
To: Anup Patel <anup@brainfault.org>
Cc: Anup Patel <anup.patel@oss.qualcomm.com>,
Atish Patra <atish.patra@linux.dev>,
Andrew Jones <andrew.jones@oss.qualcomm.com>,
Samuel Holland <samuel.holland@sifive.com>,
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: Tue, 21 Jul 2026 15:47:12 +0800 [thread overview]
Message-ID: <al8kAG1wZGUgES08@plin-1878> (raw)
In-Reply-To: <CAAhSdy089rACuAxxuxhdmF=_Hu_kGokGqzSvqA2UTaC4=2oyQg@mail.gmail.com>
On Mon, Jul 20, 2026 at 04:19:10PM +0530, Anup Patel wrote:
> On Mon, Jul 20, 2026 at 3:40 PM Yu-Chien Peter Lin <peter.lin@sifive.com> wrote:
> >
> > 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!
>
> The RISC-V world DT property parsing can be done at the
> time of parsing domains from FDT (like already done in this
> series). The hart platform abstraction will be only for configuring
> the RISC-V world CSRs.
>
> May be you can add sbi_hart_worlds.c (just like sbi_hart_pmp.c) ?
>
> For RISC-V world checkers, we can have separate FDT based driver
> under lib/utils which will register sbi_domain_data instance upon probe
> of each RISC-V world checker instance. The domain_setup() and
> domain_cleanup() callbacks of the RISC-V worlds checker driver will
> program the RISC-V world checker MMIO registers.
Sounds great, thanks for the direction. Will follow this approach and
update in v2.
Thanks,
Peter Lin
>
> Regards,
> Anup
>
> >
> > 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
next prev parent reply other threads:[~2026-07-21 7:47 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
2026-07-20 10:49 ` Anup Patel
2026-07-20 10:54 ` Anup Patel
2026-07-21 7:47 ` Yu-Chien Peter Lin [this message]
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=al8kAG1wZGUgES08@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