Commit 95bc7fb1 authored by wanghaibin's avatar wanghaibin Committed by Dongxu Sun
Browse files

irqchip/gic-v4.1: Probe vtimer irqbypass capability at RD level

virt inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8K89F


CVE: NA

------------------------------------------------------------------

Hisilicon hardware use GICv4.1 to indicate whether vtimer bypass is
supported in GICR.

Signed-off-by: default avatarwanghaibin <wanghaibin.wang@huawei.com>
Signed-off-by: default avatarZenghui Yu <yuzenghui@huawei.com>
Signed-off-by: default avatarKunkun Jiang <jiangkunkun@huawei.com>
Signed-off-by: default avatarDongxu Sun <sundongxu3@huawei.com>
parent 80edb965
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -5776,8 +5776,10 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists,
		rdists->has_rvpeid = false;

	/* vtimer irqbypass depends on rvpeid support */
	if (WARN_ON(!has_v4_1 && has_vtimer_irqbypass))
	if (WARN_ON(!has_v4_1 && has_vtimer_irqbypass)) {
		has_vtimer_irqbypass = false;
		rdists->has_vtimer = false;
	}

	if (has_v4 & rdists->has_vlpis) {
		const struct irq_domain_ops *sgi_ops;
+6 −0
Original line number Diff line number Diff line
@@ -932,6 +932,9 @@ static int __gic_update_rdist_properties(struct redist_region *region,
		gic_data.rdists.has_rvpeid = false;
	}

	/* HiSilicon implement: if GICv4.1 is supported, vtimer irqbypass is supported */
	gic_data.rdists.has_vtimer = gic_data.rdists.has_rvpeid;

	gic_data.ppi_nr = min(GICR_TYPER_NR_PPIS(typer), gic_data.ppi_nr);

	return 1;
@@ -1849,6 +1852,7 @@ static int __init gic_init_bases(void __iomem *dist_base,
	gic_data.rdists.has_vlpis = true;
	gic_data.rdists.has_direct_lpi = true;
	gic_data.rdists.has_vpend_valid_dirty = true;
	gic_data.rdists.has_vtimer = false;
	gic_compute_nr_gicr();

	if (WARN_ON(!gic_data.domain) || WARN_ON(!gic_data.rdists.rdist)) {
@@ -2028,6 +2032,7 @@ static void __init gic_of_setup_kvm_info(struct device_node *node)

	gic_v3_kvm_info.has_v4 = gic_data.rdists.has_vlpis;
	gic_v3_kvm_info.has_v4_1 = gic_data.rdists.has_rvpeid;
	gic_v3_kvm_info.has_vtimer = gic_data.rdists.has_vtimer;
	gic_set_kvm_info(&gic_v3_kvm_info);
}

@@ -2344,6 +2349,7 @@ static void __init gic_acpi_setup_kvm_info(void)

	gic_v3_kvm_info.has_v4 = gic_data.rdists.has_vlpis;
	gic_v3_kvm_info.has_v4_1 = gic_data.rdists.has_rvpeid;
	gic_v3_kvm_info.has_vtimer = gic_data.rdists.has_vtimer;
	gic_set_kvm_info(&gic_v3_kvm_info);
}

+3 −0
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ struct gic_kvm_info {
	bool		has_v4;
	/* rvpeid support */
	bool		has_v4_1;
	/* vtimer irqbypass support */
	bool		has_vtimer;

};

const struct gic_kvm_info *gic_get_kvm_info(void);
+1 −0
Original line number Diff line number Diff line
@@ -698,6 +698,7 @@ struct rdists {
	bool			has_rvpeid;
	bool			has_direct_lpi;
	bool			has_vpend_valid_dirty;
	bool			has_vtimer;
};

struct irq_domain;