[PATCH 2/2] lib: utils/fdt: Allocate fdt_pmu_evt_select on the heap

Anup Patel anup at brainfault.org
Wed Feb 19 04:58:17 PST 2025


On Fri, Feb 14, 2025 at 4:20 AM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> This reduces .bss size by 8 KiB, and should reduce overall memory usage
> since most platforms will have significantly fewer than 512 entries in
> this table. At the same time, it removes the fixed table size limit.
> Since the table is only used within fdt_pmu.c, instead of updating the
> extern declaration, make the table local to this file.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>
>  include/sbi_utils/fdt/fdt_pmu.h |  5 -----
>  lib/utils/fdt/fdt_pmu.c         | 17 +++++++++++------
>  2 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/include/sbi_utils/fdt/fdt_pmu.h b/include/sbi_utils/fdt/fdt_pmu.h
> index b31d8351..3879e111 100644
> --- a/include/sbi_utils/fdt/fdt_pmu.h
> +++ b/include/sbi_utils/fdt/fdt_pmu.h
> @@ -62,11 +62,6 @@ int fdt_pmu_setup(const void *fdt);
>   */
>  uint64_t fdt_pmu_get_select_value(uint32_t event_idx);
>
> -/** The event index to selector value table instance */
> -extern struct fdt_pmu_hw_event_select_map fdt_pmu_evt_select[];
> -/** The number of valid entries in fdt_pmu_evt_select[] */
> -extern uint32_t hw_event_count;
> -
>  #else
>
>  static inline void fdt_pmu_fixup(void *fdt) { }
> diff --git a/lib/utils/fdt/fdt_pmu.c b/lib/utils/fdt/fdt_pmu.c
> index 22760603..ee76d87f 100644
> --- a/lib/utils/fdt/fdt_pmu.c
> +++ b/lib/utils/fdt/fdt_pmu.c
> @@ -11,15 +11,14 @@
>  #include <libfdt.h>
>  #include <sbi/sbi_hart.h>
>  #include <sbi/sbi_error.h>
> +#include <sbi/sbi_heap.h>
>  #include <sbi/sbi_pmu.h>
>  #include <sbi/sbi_scratch.h>
>  #include <sbi_utils/fdt/fdt_helper.h>
>  #include <sbi_utils/fdt/fdt_pmu.h>
>
> -#define FDT_PMU_HW_EVENT_MAX (SBI_PMU_HW_EVENT_MAX * 2)
> -
> -struct fdt_pmu_hw_event_select_map fdt_pmu_evt_select[FDT_PMU_HW_EVENT_MAX] = {0};
> -uint32_t hw_event_count;
> +static struct fdt_pmu_hw_event_select_map *fdt_pmu_evt_select;
> +static uint32_t hw_event_count;
>
>  uint64_t fdt_pmu_get_select_value(uint32_t event_idx)
>  {
> @@ -91,13 +90,19 @@ int fdt_pmu_setup(const void *fdt)
>                                 "riscv,event-to-mhpmevent", &len);
>         if (event_val) {
>                 len = len / (sizeof(u32) * 3);
> +
> +               hw_event_count = len;
> +               fdt_pmu_evt_select = sbi_calloc(hw_event_count,
> +                                               sizeof(*fdt_pmu_evt_select));
> +               if (!fdt_pmu_evt_select)
> +                       return SBI_ENOMEM;
> +
>                 for (i = 0; i < len; i++) {
> -                       event = &fdt_pmu_evt_select[hw_event_count];
> +                       event = &fdt_pmu_evt_select[i];
>                         event->eidx = fdt32_to_cpu(event_val[3 * i]);
>                         event->select = fdt32_to_cpu(event_val[3 * i + 1]);
>                         event->select = (event->select << 32) |
>                                         fdt32_to_cpu(event_val[3 * i + 2]);
> -                       hw_event_count++;
>                 }
>         }
>
> --
> 2.47.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list