irqchip/gic-v4.1: Set vpe_l1_base for all redistributors
authorZenghui Yu <yuzenghui@huawei.com>
Thu, 6 Feb 2020 07:57:07 +0000 (15:57 +0800)
committerMarc Zyngier <maz@kernel.org>
Sat, 8 Feb 2020 10:01:33 +0000 (10:01 +0000)
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 <yuzenghui@huawei.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200206075711.1275-3-yuzenghui@huawei.com
drivers/irqchip/irq-gic-v3-its.c
include/linux/irqchip/arm-gic-v3.h

index 992bc72cab6f81b9aa4651867145299b3691ae50..0f1fe56ce0afc1820bd732f71ee6921b1ea0a113 100644 (file)
@@ -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));
 
index f0b8ca766e7df643f229082687b847a3ff85dc6e..83439bfb6c5b0eb258a3d1cec2cf6beb98e11abf 100644 (file)
@@ -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;