Unverified Commit 1ada6c79 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!6778 v2 Fix two soc bugs of hip09

Merge Pull Request from: @cj-xiaocai 
 
Patch#1 fix one soc bug with vPE schedule for gicv4.0
Patch#2 fix another soc bug with inaccurate pending status for gicv4.1

Kunkun Jiang (1):
irqchip: gicv3: Add workaround for hip09 erratum 162200806

Xiang Chen (1):
irqchip: gicv3: Add workaround for hip09 erratum 162200803

https://gitee.com/openeuler/kernel/issues/I9KBKD 
 
Link:https://gitee.com/openeuler/kernel/pulls/6778

 

Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Reviewed-by: default avatarKevin Zhu <zhukeqian1@huawei.com>
Reviewed-by: default avatarLiu Chao <liuchao173@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents aeac9c02 cb0003ae
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -213,6 +213,10 @@ stable kernels.
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | SMMUv3          | #162100602      | HISILICON_ERRATUM_162100602 |
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | Hip09           | #162200803      | N/A                         |
+----------------+-----------------+-----------------+-----------------------------+
| Hisilicon      | Hip09           | #162200806      | N/A                         |
+----------------+-----------------+-----------------+-----------------------------+
| Qualcomm Tech. | Kryo/Falkor v1  | E1003           | QCOM_FALKOR_ERRATUM_1003    |
+----------------+-----------------+-----------------+-----------------------------+
| Qualcomm Tech. | Kryo/Falkor v1  | E1009           | QCOM_FALKOR_ERRATUM_1009    |
+1 −0
Original line number Diff line number Diff line
@@ -615,6 +615,7 @@ int kvm_vgic_hyp_init(void)
		kvm_vgic_global_state.no_hw_deactivation = true;
	}

	kvm_vgic_global_state.flags = gic_kvm_info->flags;
	switch (gic_kvm_info->type) {
	case GIC_V2:
		ret = vgic_v2_probe(gic_kvm_info);
+4 −0
Original line number Diff line number Diff line
@@ -83,6 +83,10 @@ static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu,
		if (vgic_has_its(vcpu->kvm)) {
			value |= (INTERRUPT_ID_BITS_ITS - 1) << 19;
			value |= GICD_TYPER_LPIS;
			/* Limit the number of vlpis to 4096 */
			if (kvm_vgic_global_state.flags & FLAGS_WORKAROUND_HIP09_ERRATUM_162200803)
				value |= 11 << GICD_TYPER_NUM_LPIS_SHIFT;

		} else {
			value |= (INTERRUPT_ID_BITS_SPIS - 1) << 19;
		}
+17 −0
Original line number Diff line number Diff line
@@ -228,6 +228,7 @@ int vgic_uaccess_write_cenable(struct kvm_vcpu *vcpu,
	return 0;
}

#define VIRTUAL_SGI_PENDING_OFFSET	0x3F0
static unsigned long __read_pending(struct kvm_vcpu *vcpu,
				    gpa_t addr, unsigned int len,
				    bool is_user)
@@ -235,6 +236,7 @@ static unsigned long __read_pending(struct kvm_vcpu *vcpu,
	u32 intid = VGIC_ADDR_TO_INTID(addr, 1);
	u32 value = 0;
	int i;
	struct its_vpe *vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;

	/* Loop over all IRQs affected by this read */
	for (i = 0; i < len * 8; i++) {
@@ -255,6 +257,21 @@ static unsigned long __read_pending(struct kvm_vcpu *vcpu,
		if (vgic_direct_sgi_or_ppi(irq)) {
			int err;

			if (irq->hw && vgic_irq_is_sgi(irq->intid) &&
			    (kvm_vgic_global_state.flags &
			     FLAGS_WORKAROUND_HIP09_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 = false;
			err = irq_get_irqchip_state(irq->host_irq,
						    IRQCHIP_STATE_PENDING,
+3 −0
Original line number Diff line number Diff line
@@ -5,6 +5,9 @@
#ifndef __KVM_ARM_VGIC_MMIO_H__
#define __KVM_ARM_VGIC_MMIO_H__

#define FLAGS_WORKAROUND_HIP09_ERRATUM_162200803    (1ULL << 4)
#define FLAGS_WORKAROUND_HIP09_ERRATUM_162200806    (1ULL << 5)

struct vgic_register_region {
	unsigned int reg_offset;
	unsigned int len;
Loading