[PATCH v4 2/2] lib: utils/fdt: fixup DT when both Svade and Svadu are in DT

Anup Patel anup at brainfault.org
Fri Jun 21 05:08:29 PDT 2024


On Wed, Jun 5, 2024 at 5:41 PM Yong-Xuan Wang <yongxuan.wang at sifive.com> wrote:
>
> Delete Svadu when bot Svade and Svadu are present in DT. This will be
> removed after we have FWFT support.
>
> Signed-off-by: Yong-Xuan Wang <yongxuan.wang at sifive.com>

I think we don't need this anymore since SBI FWFT support is
merged as experimental.

Regards,
Anup

> ---
>  lib/utils/fdt/fdt_fixup.c | 71 +++++++++++++++++++++++++++++++++++++--
>  1 file changed, 69 insertions(+), 2 deletions(-)
>
> diff --git a/lib/utils/fdt/fdt_fixup.c b/lib/utils/fdt/fdt_fixup.c
> index 974b1b883eb4..77a2bee79d95 100644
> --- a/lib/utils/fdt/fdt_fixup.c
> +++ b/lib/utils/fdt/fdt_fixup.c
> @@ -13,6 +13,7 @@
>  #include <sbi/sbi_domain.h>
>  #include <sbi/sbi_math.h>
>  #include <sbi/sbi_hart.h>
> +#include <sbi/sbi_heap.h>
>  #include <sbi/sbi_scratch.h>
>  #include <sbi/sbi_string.h>
>  #include <sbi/sbi_error.h>
> @@ -108,9 +109,11 @@ int fdt_add_cpu_idle_states(void *fdt, const struct sbi_cpu_idle_state *state)
>  void fdt_cpu_fixup(void *fdt)
>  {
>         struct sbi_domain *dom = sbi_domain_thishart_ptr();
> -       int err, cpu_offset, cpus_offset, len;
> -       const char *mmu_type;
> +       int err, cpu_offset, cpus_offset, len, idx;
> +       const char *mmu_type, *isa;
> +       char *new_isa = NULL;
>         u32 hartid;
> +       bool has_svadu, has_svade;
>
>         err = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 32);
>         if (err < 0)
> @@ -139,6 +142,70 @@ void fdt_cpu_fixup(void *fdt)
>                     !mmu_type || !len)
>                         fdt_setprop_string(fdt, cpu_offset, "status",
>                                            "disabled");
> +
> +               /*
> +                * Delete Svadu when both Svade and Svadu are in DT. This will be removed after
> +                * we have FWFT extension.
> +                */
> +
> +               isa = fdt_getprop(fdt, cpu_offset, "riscv,isa", &len);
> +               if (isa) {
> +                       has_svadu = has_svade = false;
> +                       idx = 0;
> +
> +                       for (int i = 0; i < len; i++) {
> +                               if (isa[i] != '_')
> +                                       continue;
> +
> +                               /* Skip the '_' character */
> +                               if (!sbi_strncmp(isa + i + 1, "svadu", 5)) {
> +                                       has_svadu = true;
> +                                       idx = i + 1;
> +                               } else if (!sbi_strncmp(isa + i + 1, "svade", 5)) {
> +                                       has_svade = true;
> +                               }
> +                       }
> +
> +                       if (has_svadu && has_svade) {
> +                               new_isa = sbi_calloc(sizeof(char), len - 6);
> +
> +                               idx--;
> +                               sbi_memcpy(new_isa, isa, idx);
> +                               sbi_memcpy(new_isa + idx, isa + idx + 6, sbi_strlen(isa + idx + 6));
> +
> +                               fdt_setprop_string(fdt, cpu_offset, "riscv,isa", new_isa);
> +                               sbi_free(new_isa);
> +                       }
> +               }
> +
> +               isa = fdt_getprop(fdt, cpu_offset, "riscv,isa-extensions", &len);
> +               if (isa) {
> +                       idx = fdt_stringlist_search(fdt, cpu_offset, "riscv,isa-extensions",
> +                                                   "svadu");
> +                       has_svade = fdt_stringlist_contains(isa, len, "svade");
> +
> +                       if (idx >= 0 && has_svade) {
> +                               const char *p;
> +                               int len1, len2;
> +
> +                               new_isa = sbi_calloc(sizeof(char), len - 6);
> +                               p = fdt_stringlist_get(fdt, cpu_offset, "riscv,isa-extensions",
> +                                                      idx, &len1);
> +                               len2 = p - isa;
> +                               sbi_memcpy(new_isa, isa, len2);
> +
> +                               p = fdt_stringlist_get(fdt, cpu_offset, "riscv,isa-extensions",
> +                                                      idx + 1, &len1);
> +
> +                               if (p)
> +                                       sbi_memcpy(new_isa + len2, isa + len2 + 6,
> +                                                  isa + len - p + 1);
> +
> +                               fdt_setprop(fdt, cpu_offset, "riscv,isa-extensions", new_isa,
> +                                           len - 6);
> +                               sbi_free(new_isa);
> +                       }
> +               }
>         }
>  }
>
> --
> 2.17.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list