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 <yuzenghui@huawei.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20200206075711.1275-3-yuzenghui@huawei.com
This commit is contained in:
parent
e88bd316e5
commit
8b718d403c
|
@ -2376,6 +2376,8 @@ static u64 inherit_vpe_l1_table_from_its(void)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* We have a winner! */
|
/* We have a winner! */
|
||||||
|
gic_data_rdist()->vpe_l1_base = its->tables[2].base;
|
||||||
|
|
||||||
val = GICR_VPROPBASER_4_1_VALID;
|
val = GICR_VPROPBASER_4_1_VALID;
|
||||||
if (baser & GITS_BASER_INDIRECT)
|
if (baser & GITS_BASER_INDIRECT)
|
||||||
val |= GICR_VPROPBASER_4_1_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 = gits_read_vpropbaser(base + SZ_128K + GICR_VPROPBASER);
|
||||||
val &= ~GICR_VPROPBASER_4_1_Z;
|
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;
|
*mask = gic_data_rdist_cpu(cpu)->vpe_table_mask;
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
@ -2542,7 +2545,7 @@ static int allocate_vpe_l1_table(void)
|
||||||
if (!page)
|
if (!page)
|
||||||
return -ENOMEM;
|
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));
|
pa = virt_to_phys(page_address(page));
|
||||||
WARN_ON(!IS_ALIGNED(pa, psz));
|
WARN_ON(!IS_ALIGNED(pa, psz));
|
||||||
|
|
||||||
|
|
|
@ -652,10 +652,10 @@ struct rdists {
|
||||||
struct {
|
struct {
|
||||||
void __iomem *rd_base;
|
void __iomem *rd_base;
|
||||||
struct page *pend_page;
|
struct page *pend_page;
|
||||||
struct page *vpe_l1_page;
|
|
||||||
phys_addr_t phys_base;
|
phys_addr_t phys_base;
|
||||||
bool lpi_enabled;
|
bool lpi_enabled;
|
||||||
cpumask_t *vpe_table_mask;
|
cpumask_t *vpe_table_mask;
|
||||||
|
void *vpe_l1_base;
|
||||||
} __percpu *rdist;
|
} __percpu *rdist;
|
||||||
phys_addr_t prop_table_pa;
|
phys_addr_t prop_table_pa;
|
||||||
void *prop_table_va;
|
void *prop_table_va;
|
||||||
|
|
Loading…
Reference in New Issue