[PATCH v4 12/15] lib: utils: fdt_pmu: Make the fdt_pmu_evt_select table global variable
Atish Patra
atishp at atishpatra.org
Tue Dec 5 17:54:05 PST 2023
On Thu, Nov 30, 2023 at 4:43 AM Yu Chien Peter Lin
<peterlin at andestech.com> wrote:
>
> To allow platform override pmu_init() filling the translation table
> fdt_pmu_evt_select[] when PMU node doesn't provide such information,
> we need to share the table and its entry counter with other .c file.
>
> We also define the structures of PMU property in fdt_helper.h, so we
> can initialize the mappings in arrays.
>
> Signed-off-by: Yu Chien Peter Lin <peterlin at andestech.com>
> ---
> Changes v2 -> v3:
> - New patch
> Changes v3 -> v4:
> - No change
> ---
> include/sbi_utils/fdt/fdt_helper.h | 17 +++++++++++++++++
> include/sbi_utils/fdt/fdt_pmu.h | 6 ++++++
> lib/utils/fdt/fdt_pmu.c | 13 ++++---------
> 3 files changed, 27 insertions(+), 9 deletions(-)
>
> diff --git a/include/sbi_utils/fdt/fdt_helper.h b/include/sbi_utils/fdt/fdt_helper.h
> index 5c928ff..f6f505b 100644
> --- a/include/sbi_utils/fdt/fdt_helper.h
> +++ b/include/sbi_utils/fdt/fdt_helper.h
> @@ -34,6 +34,23 @@ struct platform_uart_data {
> unsigned long reg_offset;
> };
>
> +struct fdt_pmu_hw_event_select_map {
> + uint32_t eidx;
> + uint64_t select;
> +};
> +
> +struct fdt_pmu_hw_event_counter_map {
> + uint32_t eidx_start;
> + uint32_t eidx_end;
> + uint32_t ctr_map;
> +};
> +
> +struct fdt_pmu_raw_event_counter_map {
> + uint64_t select;
> + uint64_t select_mask;
> + uint32_t ctr_map;
> +};
> +
> const struct fdt_match *fdt_match_node(void *fdt, int nodeoff,
> const struct fdt_match *match_table);
>
> diff --git a/include/sbi_utils/fdt/fdt_pmu.h b/include/sbi_utils/fdt/fdt_pmu.h
> index c65cad7..9a13487 100644
> --- a/include/sbi_utils/fdt/fdt_pmu.h
> +++ b/include/sbi_utils/fdt/fdt_pmu.h
> @@ -12,6 +12,7 @@
> #define __FDT_PMU_H__
>
> #include <sbi/sbi_types.h>
> +#include <sbi_utils/fdt/fdt_helper.h>
>
> #ifdef CONFIG_FDT_PMU
>
> @@ -45,6 +46,11 @@ int fdt_pmu_setup(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 a8d7648..cf3220f 100644
> --- a/lib/utils/fdt/fdt_pmu.c
> +++ b/lib/utils/fdt/fdt_pmu.c
> @@ -17,18 +17,13 @@
>
> #define FDT_PMU_HW_EVENT_MAX (SBI_PMU_HW_EVENT_MAX * 2)
>
> -struct fdt_pmu_hw_event_select {
> - uint32_t eidx;
> - uint64_t select;
> -};
> -
> -static struct fdt_pmu_hw_event_select fdt_pmu_evt_select[FDT_PMU_HW_EVENT_MAX] = {0};
> -static uint32_t hw_event_count;
> +struct fdt_pmu_hw_event_select_map fdt_pmu_evt_select[FDT_PMU_HW_EVENT_MAX] = {0};
> +uint32_t hw_event_count;
>
> uint64_t fdt_pmu_get_select_value(uint32_t event_idx)
> {
> int i;
> - struct fdt_pmu_hw_event_select *event;
> + struct fdt_pmu_hw_event_select_map *event;
>
> for (i = 0; i < SBI_PMU_HW_EVENT_MAX; i++) {
> event = &fdt_pmu_evt_select[i];
> @@ -65,7 +60,7 @@ int fdt_pmu_setup(void *fdt)
> int i, pmu_offset, len, result;
> const u32 *event_val;
> const u32 *event_ctr_map;
> - struct fdt_pmu_hw_event_select *event;
> + struct fdt_pmu_hw_event_select_map *event;
> uint64_t raw_selector, select_mask;
> u32 event_idx_start, event_idx_end, ctr_map;
>
> --
> 2.34.1
>
Reviewed-by: Atish Patra <atishp at rivosinc.com>
--
Regards,
Atish
More information about the opensbi
mailing list