Hi Zhiqiang, On 3/5/2021 4:21 AM, Zhiqiang Hou wrote: > From: Hou Zhiqiang <zhiqiang....@nxp.com> > > The GICv3 RM requires "The first 1KB of memory for the LPI Pending tables > must contain only zeros on initial allocation, and this must be visible > to the Redistributors, or else the effect is UNPREDICTABLE". > > And as the following statement, we here clear the whole Pending tables > instead of the first 1KB. > "An LPI Pending table that contains only zeros, including in the first 1KB, > indicates that there are no pending LPIs. > The first 1KB of the LPI Pending table is IMPLEMENTATION DEFINED. However, > if the first 1KB of the LPI Pending table and the rest of the table contain > only zeros, this must indicate that there are no pending LPIs." > > And there isn't any pending LPI under U-Boot, so it's unnecessary to > load the contents of the Pending table during the enablement, then set > the GICR_PENDBASER.PTZ flag. > > Signed-off-by: Hou Zhiqiang <zhiqiang....@nxp.com> > --- > V2: > - Clear the Pending tables using virtual address. > - Correct some typos in the change log. > > arch/arm/lib/gic-v3-its.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/lib/gic-v3-its.c b/arch/arm/lib/gic-v3-its.c > index f5a921b3d1..2dadc48a50 100644 > --- a/arch/arm/lib/gic-v3-its.c > +++ b/arch/arm/lib/gic-v3-its.c > @@ -3,6 +3,7 @@ > * Copyright 2019 Broadcom. > */ > #include <common.h> > +#include <cpu_func.h> > #include <dm.h> > #include <regmap.h> > #include <syscon.h> > @@ -108,6 +109,8 @@ int gic_lpi_tables_init(void) > int i; > u64 redist_lpi_base; > u64 pend_base; > + ulong pend_tab_total_sz; > + void *pend_tab_va; > > if (gic_v3_its_get_gic_addr(&priv)) > return -EINVAL; > @@ -160,7 +163,12 @@ int gic_lpi_tables_init(void) > } > } > > - redist_lpi_base = priv.lpi_base + LPI_PROPBASE_SZ;
I don't think you want to drop this. > + pend_tab_total_sz = priv.num_redist * LPI_PENDBASE_SZ; > + pend_tab_va = map_physmem(redist_lpi_base, pend_tab_total_sz, > + MAP_NOCACHE); > + memset(pend_tab_va, 0, pend_tab_total_sz); > + flush_cache((ulong)pend_tab_va, pend_tab_total_sz); Given that the memory is mapped as non-cacheable, is this flush necessary? --- Best Regards, Laurentiu > + unmap_physmem(pend_tab_va, MAP_NOCACHE); > > pend_base = priv.gicr_base + GICR_PENDBASER; > for (i = 0; i < priv.num_redist; i++) { > @@ -168,7 +176,8 @@ int gic_lpi_tables_init(void) > > val = ((redist_lpi_base + (i * LPI_PENDBASE_SZ)) | > GICR_PENDBASER_INNERSHAREABLE | > - GICR_PENDBASER_RAWAWB); > + GICR_PENDBASER_RAWAWB | > + GICR_PENDBASER_PTZ); > > writeq(val, (uintptr_t)(pend_base + offset)); > tmp = readq((uintptr_t)(pend_base + offset)); >