2020-02-04 09:13:21

by Zenghui Yu

[permalink] [raw]
Subject: [PATCH 0/5] irqchip/gic-v4.1: Cleanup and fixes for GICv4.1

Hi,

This series contains some cleanups, VPROPBASER field programming fix
and level2 vPE table allocation enhancement, collected while looking
through the GICv4.1 driver one more time.

Hope they will help, thanks!

Zenghui Yu (5):
irqchip/gic-v4.1: Fix programming of GICR_VPROPBASER_4_1_SIZE
irqchip/gic-v4.1: Set vpe_l1_base for all redistributors
irqchip/gic-v4.1: Ensure L2 vPE table is allocated at RD level
irqchip/gic-v4.1: Drop 'tmp' in inherit_vpe_l1_table_from_rd()
irqchip/gic-v3-its: Remove superfluous WARN_ON

drivers/irqchip/irq-gic-v3-its.c | 80 +++++++++++++++++++++++++++---
include/linux/irqchip/arm-gic-v3.h | 2 +-
2 files changed, 75 insertions(+), 7 deletions(-)

--
2.19.1



2020-02-04 09:13:29

by Zenghui Yu

[permalink] [raw]
Subject: [PATCH 2/5] irqchip/gic-v4.1: Set vpe_l1_base for all redistributors

Currently, we will not set vpe_l1_page for the current RD if we can
inherit the vPE configuration table from another RD (or ITS), which
results in an inconsistency between RDs within the same CommonLPIAff
group.

Let's rename it to vpe_l1_base to indicate the base address of the
vPE configuration table of this RD, and set it properly for *all*
v4.1 redistributors.

Signed-off-by: Zenghui Yu <[email protected]>
---
drivers/irqchip/irq-gic-v3-its.c | 5 ++++-
include/linux/irqchip/arm-gic-v3.h | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 992bc72cab6f..0f1fe56ce0af 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -2376,6 +2376,8 @@ static u64 inherit_vpe_l1_table_from_its(void)
continue;

/* We have a winner! */
+ gic_data_rdist()->vpe_l1_base = its->tables[2].base;
+
val = GICR_VPROPBASER_4_1_VALID;
if (baser & GITS_BASER_INDIRECT)
val |= GICR_VPROPBASER_4_1_INDIRECT;
@@ -2432,6 +2434,7 @@ static u64 inherit_vpe_l1_table_from_rd(cpumask_t **mask)
val = gits_read_vpropbaser(base + SZ_128K + GICR_VPROPBASER);
val &= ~GICR_VPROPBASER_4_1_Z;

+ gic_data_rdist()->vpe_l1_base = gic_data_rdist_cpu(cpu)->vpe_l1_base;
*mask = gic_data_rdist_cpu(cpu)->vpe_table_mask;

return val;
@@ -2542,7 +2545,7 @@ static int allocate_vpe_l1_table(void)
if (!page)
return -ENOMEM;

- gic_data_rdist()->vpe_l1_page = page;
+ gic_data_rdist()->vpe_l1_base = page_address(page);
pa = virt_to_phys(page_address(page));
WARN_ON(!IS_ALIGNED(pa, psz));

diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h
index f0b8ca766e7d..83439bfb6c5b 100644
--- a/include/linux/irqchip/arm-gic-v3.h
+++ b/include/linux/irqchip/arm-gic-v3.h
@@ -652,10 +652,10 @@ struct rdists {
struct {
void __iomem *rd_base;
struct page *pend_page;
- struct page *vpe_l1_page;
phys_addr_t phys_base;
bool lpi_enabled;
cpumask_t *vpe_table_mask;
+ void *vpe_l1_base;
} __percpu *rdist;
phys_addr_t prop_table_pa;
void *prop_table_va;
--
2.19.1


2020-02-04 09:13:51

by Zenghui Yu

[permalink] [raw]
Subject: [PATCH 4/5] irqchip/gic-v4.1: Drop 'tmp' in inherit_vpe_l1_table_from_rd()

The variable 'tmp' in inherit_vpe_l1_table_from_rd() is actually
not needed, drop it.

Signed-off-by: Zenghui Yu <[email protected]>
---
drivers/irqchip/irq-gic-v3-its.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index c1d01454eec8..fc799ad7cd19 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -2415,14 +2415,12 @@ static u64 inherit_vpe_l1_table_from_rd(cpumask_t **mask)

for_each_possible_cpu(cpu) {
void __iomem *base = gic_data_rdist_cpu(cpu)->rd_base;
- u32 tmp;

if (!base || cpu == smp_processor_id())
continue;

val = gic_read_typer(base + GICR_TYPER);
- tmp = compute_common_aff(val);
- if (tmp != aff)
+ if (aff != compute_common_aff(val))
continue;

/*
--
2.19.1


2020-02-04 09:14:07

by Zenghui Yu

[permalink] [raw]
Subject: [PATCH 5/5] irqchip/gic-v3-its: Remove superfluous WARN_ON

"ITS virtual pending table not cleaning" is already complained inside
its_clear_vpend_valid(), there's no need to trigger a WARN_ON again.

Signed-off-by: Zenghui Yu <[email protected]>
---
drivers/irqchip/irq-gic-v3-its.c | 1 -
1 file changed, 1 deletion(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index fc799ad7cd19..718946fbd382 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -2849,7 +2849,6 @@ static void its_cpu_init_lpis(void)
* corrupting memory.
*/
val = its_clear_vpend_valid(vlpi_base, 0, 0);
- WARN_ON(val & GICR_VPENDBASER_Dirty);
}

if (allocate_vpe_l1_table()) {
--
2.19.1


2020-02-05 12:48:50

by Marc Zyngier

[permalink] [raw]
Subject: Re: [PATCH 0/5] irqchip/gic-v4.1: Cleanup and fixes for GICv4.1

Hi Zenghui,

On 2020-02-04 09:09, Zenghui Yu wrote:
> Hi,
>
> This series contains some cleanups, VPROPBASER field programming fix
> and level2 vPE table allocation enhancement, collected while looking
> through the GICv4.1 driver one more time.
>
> Hope they will help, thanks!
>
> Zenghui Yu (5):
> irqchip/gic-v4.1: Fix programming of GICR_VPROPBASER_4_1_SIZE
> irqchip/gic-v4.1: Set vpe_l1_base for all redistributors
> irqchip/gic-v4.1: Ensure L2 vPE table is allocated at RD level
> irqchip/gic-v4.1: Drop 'tmp' in inherit_vpe_l1_table_from_rd()
> irqchip/gic-v3-its: Remove superfluous WARN_ON
>
> drivers/irqchip/irq-gic-v3-its.c | 80 +++++++++++++++++++++++++++---
> include/linux/irqchip/arm-gic-v3.h | 2 +-
> 2 files changed, 75 insertions(+), 7 deletions(-)

Thanks a lot for this, much appreciated, I'm quite happy with the
overall
state of the series. If you can just address the couple of nits I have
on
patch #3, I'll then queue the series and send off to Thomas together
with
the rest of the queued fixes.

Thanks,

M.
--
Jazz is not dead. It just smells funny...

2020-02-06 06:31:28

by Zenghui Yu

[permalink] [raw]
Subject: Re: [PATCH 0/5] irqchip/gic-v4.1: Cleanup and fixes for GICv4.1

Hi Marc,

On 2020/2/5 20:46, Marc Zyngier wrote:
> Hi Zenghui,
>
> On 2020-02-04 09:09, Zenghui Yu wrote:
>> Hi,
>>
>> This series contains some cleanups, VPROPBASER field programming fix
>> and level2 vPE table allocation enhancement, collected while looking
>> through the GICv4.1 driver one more time.
>>
>> Hope they will help, thanks!
>>
>> Zenghui Yu (5):
>>   irqchip/gic-v4.1: Fix programming of GICR_VPROPBASER_4_1_SIZE
>>   irqchip/gic-v4.1: Set vpe_l1_base for all redistributors
>>   irqchip/gic-v4.1: Ensure L2 vPE table is allocated at RD level
>>   irqchip/gic-v4.1: Drop 'tmp' in inherit_vpe_l1_table_from_rd()
>>   irqchip/gic-v3-its: Remove superfluous WARN_ON
>>
>>  drivers/irqchip/irq-gic-v3-its.c   | 80 +++++++++++++++++++++++++++---
>>  include/linux/irqchip/arm-gic-v3.h |  2 +-
>>  2 files changed, 75 insertions(+), 7 deletions(-)
>
> Thanks a lot for this, much appreciated, I'm quite happy with the overall
> state of the series. If you can just address the couple of nits I have on
> patch #3, I'll then queue the series and send off to Thomas together with
> the rest of the queued fixes.

I will respin patch#3 with your suggestion and send v2 today.
Thanks for your review!


Zenghui