This helper function controls the signaling of LPIs at redistributor level. Signed-off-by: Eric Auger <eric.auger@xxxxxxxxxx> --- v2 -> v3: - move the helper in lib/arm/gic-v3.c - rename the function with gicv3_lpi_ prefix - s/report_abort/assert --- lib/arm/asm/gic-v3.h | 1 + lib/arm/gic-v3.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/arm/asm/gic-v3.h b/lib/arm/asm/gic-v3.h index ec2a6f0..734c0c0 100644 --- a/lib/arm/asm/gic-v3.h +++ b/lib/arm/asm/gic-v3.h @@ -96,6 +96,7 @@ extern void gicv3_lpi_set_config(int n, u8 val); extern u8 gicv3_lpi_get_config(int n); extern void gicv3_lpi_set_pending_table_bit(int rdist, int n, bool set); extern void gicv3_lpi_alloc_tables(void); +extern void gicv3_lpi_rdist_ctrl(u32 redist, bool set); static inline void gicv3_do_wait_for_rwp(void *base) { diff --git a/lib/arm/gic-v3.c b/lib/arm/gic-v3.c index c33f883..7865d01 100644 --- a/lib/arm/gic-v3.c +++ b/lib/arm/gic-v3.c @@ -210,4 +210,21 @@ void gicv3_lpi_set_pending_table_bit(int rdist, int n, bool set) byte &= ~mask; *ptr = byte; } + +void gicv3_lpi_rdist_ctrl(u32 redist, bool set) +{ + void *ptr; + u64 val; + + assert(redist < nr_cpus); + + ptr = gicv3_data.redist_base[redist]; + val = readl(ptr + GICR_CTLR); + if (set) + val |= GICR_CTLR_ENABLE_LPIS; + else + val &= ~GICR_CTLR_ENABLE_LPIS; + writel(val, ptr + GICR_CTLR); +} #endif /* __aarch64__ */ + -- 2.20.1