Commit 8b718d40 authored by Zenghui Yu's avatar Zenghui Yu Committed by Marc Zyngier
Browse files

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: default avatarZenghui Yu <yuzenghui@huawei.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200206075711.1275-3-yuzenghui@huawei.com
parent e88bd316
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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));

+1 −1
Original line number Diff line number Diff line
@@ -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;