[PATCH] lib: utils/fdt: Fix DT parsing in fdt_pmu_setup()

Andrew Jones ajones at ventanamicro.com
Mon Sep 5 06:13:26 PDT 2022


On Mon, Sep 05, 2022 at 12:32:42PM +0530, Anup Patel wrote:
> This patch does following fixes in fdt_pmu_setup():
> 1) If any of the event mapping DT property is absent or too small
>    then don't skip parsing of other DT properties.
> 2) Return failure if sbi_pmu_add_hw_event_counter_map() fails.
> 3) Return failure if sbi_pmu_add_raw_event_counter_map() fails.
> 
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
>  lib/utils/fdt/fdt_pmu.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/utils/fdt/fdt_pmu.c b/lib/utils/fdt/fdt_pmu.c
> index 8ba6b08..8ced8e1 100644
> --- a/lib/utils/fdt/fdt_pmu.c
> +++ b/lib/utils/fdt/fdt_pmu.c
> @@ -77,18 +77,21 @@ int fdt_pmu_setup(void *fdt)
>  
>  	event_ctr_map = fdt_getprop(fdt, pmu_offset, "riscv,event-to-mhpmcounters", &len);
>  	if (!event_ctr_map || len < 8)
> -		return SBI_EFAIL;
> +		goto skip_event_to_mhpmcounters;
>  	len = len / (sizeof(u32) * 3);
>  	for (i = 0; i < len; i++) {
>  		event_idx_start = fdt32_to_cpu(event_ctr_map[3 * i]);
>  		event_idx_end = fdt32_to_cpu(event_ctr_map[3 * i + 1]);
>  		ctr_map = fdt32_to_cpu(event_ctr_map[3 * i + 2]);
> -		sbi_pmu_add_hw_event_counter_map(event_idx_start, event_idx_end, ctr_map);
> +		result = sbi_pmu_add_hw_event_counter_map(event_idx_start, event_idx_end, ctr_map);
> +		if (result)
> +			return result;
>  	}
> +skip_event_to_mhpmcounters:
>  
>  	event_val = fdt_getprop(fdt, pmu_offset, "riscv,event-to-mhpmevent", &len);
>  	if (!event_val || len < 8)
> -		return SBI_EFAIL;
> +		goto skip_event_to_mhpmevent;
>  	len = len / (sizeof(u32) * 3);
>  	for (i = 0; i < len; i++) {
>  		event = &fdt_pmu_evt_select[hw_event_count];
> @@ -97,10 +100,11 @@ int fdt_pmu_setup(void *fdt)
>  		event->select = (event->select << 32) | fdt32_to_cpu(event_val[3 * i + 2]);
>  		hw_event_count++;
>  	}
> +skip_event_to_mhpmevent:
>  
>  	event_val = fdt_getprop(fdt, pmu_offset, "riscv,raw-event-to-mhpmcounters", &len);
>  	if (!event_val || len < 20)
> -		return SBI_EFAIL;
> +		goto skip_raw_event_to_mhpmcounters;
>  	len = len / (sizeof(u32) * 5);
>  	for (i = 0; i < len; i++) {
>  		raw_selector = fdt32_to_cpu(event_val[5 * i]);
> @@ -109,9 +113,10 @@ int fdt_pmu_setup(void *fdt)
>  		select_mask = (select_mask  << 32) | fdt32_to_cpu(event_val[5 * i + 3]);
>  		ctr_map = fdt32_to_cpu(event_val[5 * i + 4]);
>  		result = sbi_pmu_add_raw_event_counter_map(raw_selector, select_mask, ctr_map);
> -		if (!result)
> -			hw_event_count++;
> +		if (result)
> +			return result;
>  	}
> +skip_raw_event_to_mhpmcounters:
>  
>  	return 0;
>  }
> -- 
> 2.34.1

I think I'd prefer putting the for-loops into if-blocks to the gotos, but
otherwise

Reviewed-by: Andrew Jones <ajones at ventanamicro.com>



More information about the opensbi mailing list