Commit 0c4f928e authored by Kunkun Jiang's avatar Kunkun Jiang Committed by Zhou Wang
Browse files

KVM: arm64: vgic-v3: Fix a issue of hip10 erratum 162200806

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9KBKD



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

The variable 'is_pending' is ineffective, and replace it with 'val' to fix
the issue. Change the hisi cpu type hip09 to hip10.

Fixes: cb0003ae ("irqchip: gicv3: Add workaround for hip09 erratum 162200806")
Signed-off-by: default avatarKunkun Jiang <jiangkunkun@huawei.com>
parent 7f3dd3e5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -218,7 +218,7 @@ stable kernels.
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | Hip{10,10C}     | #162200803      | N/A                         |
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | Hip09           | #162200806      | N/A                         |
| Hisilicon      | Hip10           | #162200806      | N/A                         |
+----------------+-----------------+-----------------+-----------------------------+
| Qualcomm Tech. | Kryo/Falkor v1  | E1003           | QCOM_FALKOR_ERRATUM_1003    |
+----------------+-----------------+-----------------+-----------------------------+
+7 −8
Original line number Diff line number Diff line
@@ -259,24 +259,23 @@ static unsigned long __read_pending(struct kvm_vcpu *vcpu,

			if (irq->hw && vgic_irq_is_sgi(irq->intid) &&
			    (kvm_vgic_global_state.flags &
			     FLAGS_WORKAROUND_HIP09_ERRATUM_162200806)) {
			     FLAGS_WORKAROUND_HIP10_ERRATUM_162200806)) {
				void *va;
				u8 *ptr;
				int mask;
				bool is_pending;

				mask = BIT(irq->intid % BITS_PER_BYTE);
				va = page_address(vpe->vpt_page);
				ptr = va + VIRTUAL_SGI_PENDING_OFFSET +
				      irq->intid / BITS_PER_BYTE;
				is_pending = *ptr & mask;
			}

				val = *ptr & mask;
			} else {
				val = false;
				err = irq_get_irqchip_state(irq->host_irq,
						    IRQCHIP_STATE_PENDING,
						    &val);
				WARN_RATELIMIT(err, "IRQ %d", irq->host_irq);
			}
		} else if (!is_user && vgic_irq_is_mapped_level(irq)) {
			val = vgic_get_phys_line_level(irq);
		} else {
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
#define __KVM_ARM_VGIC_MMIO_H__

#define FLAGS_WORKAROUND_HIP10_ERRATUM_162200803    (1ULL << 4)
#define FLAGS_WORKAROUND_HIP09_ERRATUM_162200806    (1ULL << 5)
#define FLAGS_WORKAROUND_HIP10_ERRATUM_162200806    (1ULL << 5)

struct vgic_register_region {
	unsigned int reg_offset;
+9 −5
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@
#define FLAGS_WORKAROUND_MTK_GICR_SAVE		(1ULL << 2)
#define FLAGS_WORKAROUND_ASR_ERRATUM_8601001	(1ULL << 3)
#define FLAGS_WORKAROUND_HIP10_ERRATUM_162200803	(1ULL << 4)
#define FLAGS_WORKAROUND_HIP09_ERRATUM_162200806	(1ULL << 5)
#define FLAGS_WORKAROUND_HIP10_ERRATUM_162200806	(1ULL << 5)

#define GIC_IRQ_TYPE_PARTITION	(GIC_IRQ_TYPE_LPI + 1)

@@ -2125,11 +2125,11 @@ static bool gic_enable_quirk_hip10_10c_162200803(void *data)
	return true;
}

static bool __maybe_unused gic_enable_quirk_hip09_162200806(void *data)
static bool __maybe_unused gic_enable_quirk_hip10_162200806(void *data)
{
	struct gic_chip_data *d = data;

	d->flags |= FLAGS_WORKAROUND_HIP09_ERRATUM_162200806;
	d->flags |= FLAGS_WORKAROUND_HIP10_ERRATUM_162200806;

	return true;
}
@@ -2218,10 +2218,10 @@ static const struct gic_quirk gic_quirks[] = {
		.init	= gic_enable_quirk_hip10_10c_162200803,
	},
	{
		.desc	= "GICv3: HIP09 erratum 162200806",
		.desc	= "GICv3: HIP10 erratum 162200806",
		.iidr	= 0x01050736,
		.mask	= 0xffffffff,
		.init	= gic_enable_quirk_hip09_162200806,
		.init	= gic_enable_quirk_hip10_162200806,
	},
	{
	}
@@ -2536,6 +2536,8 @@ static void __init gic_of_setup_kvm_info(struct device_node *node)
#endif
	if (gic_v3_kvm_info.has_v4 && !gic_v3_kvm_info.has_v4_1)
		gic_v3_kvm_info.flags |= gic_data.flags & FLAGS_WORKAROUND_HIP10_ERRATUM_162200803;
	if (gic_v3_kvm_info.has_v4_1)
		gic_v3_kvm_info.flags |= gic_data.flags & FLAGS_WORKAROUND_HIP10_ERRATUM_162200806;
	vgic_set_kvm_info(&gic_v3_kvm_info);
}

@@ -2890,6 +2892,8 @@ static void __init gic_acpi_setup_kvm_info(void)
#endif
	if (gic_v3_kvm_info.has_v4 && !gic_v3_kvm_info.has_v4_1)
		gic_v3_kvm_info.flags |= gic_data.flags & FLAGS_WORKAROUND_HIP10_ERRATUM_162200803;
	if (gic_v3_kvm_info.has_v4_1)
		gic_v3_kvm_info.flags |= gic_data.flags & FLAGS_WORKAROUND_HIP10_ERRATUM_162200806;
	vgic_set_kvm_info(&gic_v3_kvm_info);
}