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 #include #include +#include #include #include #include #include -#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++; } }