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

Anup Patel apatel at ventanamicro.com
Tue Sep 13 02:10:31 PDT 2022


On Mon, Sep 5, 2022 at 6:43 PM Andrew Jones <ajones at ventanamicro.com> wrote:
>
> 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

Okay, I will put for-loops under if-blocks in the next revision.

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

Regards,
Anup



More information about the opensbi mailing list