[PATCH v2 10/12] lib: utils/ipi: Add PLICSW mmio region to root domain

Anup Patel anup at brainfault.org
Tue Oct 11 09:57:23 PDT 2022


On Mon, Oct 3, 2022 at 5:24 PM Yu Chien Peter Lin
<peterlin at andestech.com> wrote:
>
> Add PLICSW as mmio memregion in root domain at boot-time.
>
> Signed-off-by: Yu Chien Peter Lin <peterlin at andestech.com>
> Reviewed-by: Leo Yu-Chi Liang <ycliang at andestech.com>
> ---
>  lib/utils/ipi/fdt_ipi_plicsw.c | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
>
> diff --git a/lib/utils/ipi/fdt_ipi_plicsw.c b/lib/utils/ipi/fdt_ipi_plicsw.c
> index 8788f74..3af92bd 100644
> --- a/lib/utils/ipi/fdt_ipi_plicsw.c
> +++ b/lib/utils/ipi/fdt_ipi_plicsw.c
> @@ -10,6 +10,7 @@
>   *   Yu Chien Peter Lin <peterlin at andestech.com>
>   */
>
> +#include <sbi/sbi_domain.h>
>  #include <sbi/sbi_error.h>
>  #include <sbi/sbi_ipi.h>
>  #include <sbi_utils/fdt/fdt_helper.h>
> @@ -34,6 +35,34 @@ static int plicsw_warm_ipi_init(void)
>         return 0;
>  }
>
> +static int andes_plicsw_add_regions(unsigned long addr, unsigned long size)
> +{
> +#define PLICSW_ADD_REGION_ALIGN 0x1000
> +       int rc;
> +       unsigned long pos, end, region_size;
> +       struct sbi_domain_memregion reg;
> +
> +       pos = addr;
> +       end = addr + size;
> +       while (pos < end) {
> +               if (pos & (PLICSW_ADD_REGION_ALIGN - 1))
> +                       region_size = 1UL << sbi_ffs(pos);
> +               else
> +                       region_size = ((end - pos) < PLICSW_ADD_REGION_ALIGN)
> +                                             ? (end - pos)
> +                                             : PLICSW_ADD_REGION_ALIGN;
> +
> +               sbi_domain_memregion_init(pos, region_size,
> +                                         SBI_DOMAIN_MEMREGION_MMIO, &reg);
> +               rc = sbi_domain_root_add_memregion(&reg);
> +               if (rc)
> +                       return rc;
> +               pos += region_size;
> +       }
> +
> +       return 0;
> +}
> +

This is exactly same as your PATCH5 and aclint_mtimer_add_regions()
defined in lib/utils/timer/aclint_mtimer.c

I suggest adding a common function in sbi_domain.c and sbi_domain.h
with following function prototype:
int sbi_domain_root_add_memrange(unsigned long addr,
                                                            unsigned long size,
                                                            unsigned long align,
                                                            unsigned
long region_flags);

You can have one patch at the beginning of the series which adds
above function in sbi_domain.c and remove it from aclint_mtimer.c

Your PATCH4 and PATCH9 can directly use this new function
which will allow you to drop your PATCH5 and PATCH10

Regards,
Anup

>  static int plicsw_cold_ipi_init(void *fdt, int nodeoff,
>                                 const struct fdt_match *match)
>  {
> @@ -61,6 +90,11 @@ static int plicsw_cold_ipi_init(void *fdt, int nodeoff,
>                 enable_mask <<= 1;
>         }
>
> +       /* Add PLICSW region to the root domain */
> +       rc = andes_plicsw_add_regions(plicsw.addr, plicsw.size);
> +       if (rc)
> +               return rc;
> +
>         sbi_ipi_set_device(&plicsw_ipi);
>
>         return 0;
> --
> 2.34.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list