From: Himanshu Chauhan <hchauhan@ventanamicro.com>
To: opensbi@lists.infradead.org
Subject: [PATCH v2] lib: sbi: Fix how to check whether the domain contains fw_region
Date: Thu, 16 Mar 2023 19:03:56 +0530 [thread overview]
Message-ID: <ZBMaxFaz2j2x0SbG@xubuntu> (raw)
In-Reply-To: <20230316121111.122741-1-wxjstz@126.com>
On Thu, Mar 16, 2023 at 08:11:11PM +0800, Xiang W wrote:
> Because firmware is split into rw/rx segments, it cannot be recorded
> by a root_fw_region. This problem is solved by adding a flag
> fw_region_inited to sbi_domain.
>
> Signed-off-by: Xiang W <wxjstz@126.com>
LGTM
Reviewed-by: Himanshu Chauhan <hchauhan@ventanamicro.com>
> ---
> v2 changes: Remove unused have_fw_reg
>
> include/sbi/sbi_domain.h | 2 ++
> lib/sbi/sbi_domain.c | 28 +++++++---------------------
> lib/utils/fdt/fdt_domain.c | 1 +
> 3 files changed, 10 insertions(+), 21 deletions(-)
>
> diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
> index eaca7f0..124ea90 100644
> --- a/include/sbi/sbi_domain.h
> +++ b/include/sbi/sbi_domain.h
> @@ -122,6 +122,8 @@ struct sbi_domain {
> bool system_reset_allowed;
> /** Is domain allowed to suspend the system */
> bool system_suspend_allowed;
> + /** Identifies whether to include the firmware region */
> + bool fw_region_inited;
> };
>
> /** The root domain instance */
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 4d7b80a..d6e9ff6 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -30,7 +30,6 @@ static struct sbi_hartmask root_hmask = { 0 };
>
> #define ROOT_REGION_MAX 16
> static u32 root_memregs_count = 0;
> -static struct sbi_domain_memregion root_fw_region;
> static struct sbi_domain_memregion root_memregs[ROOT_REGION_MAX + 1] = { 0 };
>
> struct sbi_domain root = {
> @@ -39,6 +38,7 @@ struct sbi_domain root = {
> .regions = root_memregs,
> .system_reset_allowed = true,
> .system_suspend_allowed = true,
> + .fw_region_inited = false,
> };
>
> bool sbi_domain_is_assigned_hart(const struct sbi_domain *dom, u32 hartid)
> @@ -69,14 +69,6 @@ ulong sbi_domain_get_assigned_hartmask(const struct sbi_domain *dom,
> return ret;
> }
>
> -static void domain_memregion_initfw(struct sbi_domain_memregion *reg)
> -{
> - if (!reg)
> - return;
> -
> - sbi_memcpy(reg, &root_fw_region, sizeof(*reg));
> -}
> -
> void sbi_domain_memregion_init(unsigned long addr,
> unsigned long size,
> unsigned long flags,
> @@ -255,7 +247,6 @@ static int sanitize_domain(const struct sbi_platform *plat,
> struct sbi_domain *dom)
> {
> u32 i, j, count;
> - bool have_fw_reg;
> struct sbi_domain_memregion treg, *reg, *reg1;
>
> /* Check possible HARTs */
> @@ -288,17 +279,11 @@ static int sanitize_domain(const struct sbi_platform *plat,
> }
> }
>
> - /* Count memory regions and check presence of firmware region */
> + /* Count memory regions */
> count = 0;
> - have_fw_reg = false;
> - sbi_domain_for_each_memregion(dom, reg) {
> - if (reg->order == root_fw_region.order &&
> - reg->base == root_fw_region.base &&
> - reg->flags == root_fw_region.flags)
> - have_fw_reg = true;
> + sbi_domain_for_each_memregion(dom, reg)
> count++;
> - }
> - if (!have_fw_reg) {
> + if (!dom->fw_region_inited) {
> sbi_printf("%s: %s does not have firmware region\n",
> __func__, dom->name);
> return SBI_EINVAL;
> @@ -732,8 +717,7 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
> sbi_domain_memregion_init(scratch->fw_start, scratch->fw_rw_offset,
> (SBI_DOMAIN_MEMREGION_M_READABLE |
> SBI_DOMAIN_MEMREGION_M_EXECUTABLE),
> - &root_fw_region);
> - domain_memregion_initfw(&root_memregs[root_memregs_count++]);
> + &root_memregs[root_memregs_count++]);
>
> sbi_domain_memregion_init((scratch->fw_start + scratch->fw_rw_offset),
> (scratch->fw_size - scratch->fw_rw_offset),
> @@ -741,6 +725,8 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
> SBI_DOMAIN_MEMREGION_M_WRITABLE),
> &root_memregs[root_memregs_count++]);
>
> + root.fw_region_inited = true;
> +
> /* Root domain allow everything memory region */
> sbi_domain_memregion_init(0, ~0UL,
> (SBI_DOMAIN_MEMREGION_READABLE |
> diff --git a/lib/utils/fdt/fdt_domain.c b/lib/utils/fdt/fdt_domain.c
> index adcb94b..bb6d17d 100644
> --- a/lib/utils/fdt/fdt_domain.c
> +++ b/lib/utils/fdt/fdt_domain.c
> @@ -358,6 +358,7 @@ static int __fdt_parse_domain(void *fdt, int domain_offset, void *opaque)
> return SBI_EINVAL;
> memcpy(®ions[val32++], reg, sizeof(*reg));
> }
> + dom->fw_region_inited = root.fw_region_inited;
>
> /* Read "boot-hart" DT property */
> val32 = -1U;
> --
> 2.39.2
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
next prev parent reply other threads:[~2023-03-16 13:33 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-16 12:11 [PATCH v2] lib: sbi: Fix how to check whether the domain contains fw_region Xiang W
2023-03-16 13:33 ` Himanshu Chauhan [this message]
2023-04-06 13:14 ` 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=ZBMaxFaz2j2x0SbG@xubuntu \
--to=hchauhan@ventanamicro.com \
--cc=opensbi@lists.infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.