Commit c35e0950 authored by Marc Zyngier's avatar Marc Zyngier Committed by chenxiang
Browse files

KVM: arm64: vgic-v4: Propagate the NMI state into the GICv4.1 VSGI configuration

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

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git/commit/?h=arm64/nmi&id=25f2d8db395c86c637bee12a4982c42c6a2f137d



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

Just as we now allow the NMI state to make it into the LRs,
allow the same state to be propagated into the VSGI configuration.

Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Signed-off-by: default avatarXiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: default avatarcaijian <caijian11@h-partners.com>
parent 49c1f332
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -61,9 +61,11 @@ unsigned long vgic_mmio_read_group(struct kvm_vcpu *vcpu,
	return value;
}

static void vgic_update_vsgi(struct vgic_irq *irq)
void vgic_update_vsgi(struct vgic_irq *irq)
{
	WARN_ON(its_prop_update_vsgi(irq->host_irq, irq->priority, irq->group));
	WARN_ON(its_prop_update_vsgi(irq->host_irq,
				     irq->nmi ? 0 : irq->priority,
				     irq->group, irq->nmi));
}

void vgic_mmio_write_group(struct kvm_vcpu *vcpu, gpa_t addr,
+1 −0
Original line number Diff line number Diff line
@@ -110,6 +110,7 @@ static void vgic_v4_sync_sgi_config(struct its_vpe *vpe, struct vgic_irq *irq)
	vpe->sgi_config[irq->intid].enabled	= irq->enabled;
	vpe->sgi_config[irq->intid].group 	= irq->group;
	vpe->sgi_config[irq->intid].priority	= irq->priority;
	vpe->sgi_config[irq->intid].nmi		= irq->nmi;
}

static void vgic_v4_enable_vsgis(struct kvm_vcpu *vcpu)
+1 −0
Original line number Diff line number Diff line
@@ -352,6 +352,7 @@ bool vgic_supports_direct_msis(struct kvm *kvm);
int vgic_v4_init(struct kvm *kvm);
void vgic_v4_teardown(struct kvm *kvm);
void vgic_v4_configure_vsgis(struct kvm *kvm);
void vgic_update_vsgi(struct vgic_irq *irq);
void vgic_v4_get_vlpi_state(struct vgic_irq *irq, bool *val);
int vgic_v4_request_vpe_irq(struct kvm_vcpu *vcpu, int irq);
#ifdef CONFIG_VIRT_VTIMER_IRQ_BYPASS
+9 −0
Original line number Diff line number Diff line
@@ -627,6 +627,7 @@ struct its_cmd_desc {
			u8 sgi;
			u8 priority;
			bool enable;
			bool nmi;
			bool group;
			bool clear;
		} its_vsgi_cmd;
@@ -800,6 +801,11 @@ static void its_encode_sgi_priority(struct its_cmd_block *cmd, u8 prio)
	its_mask_encode(&cmd->raw_cmd[0], prio >> 4, 23, 20);
}

static void its_encode_sgi_nmi(struct its_cmd_block *cmd, bool nmi)
{
	its_mask_encode(&cmd->raw_cmd[0], nmi, 11, 11);
}

static void its_encode_sgi_group(struct its_cmd_block *cmd, bool grp)
{
	its_mask_encode(&cmd->raw_cmd[0], grp, 10, 10);
@@ -1203,6 +1209,7 @@ static struct its_vpe *its_build_vsgi_cmd(struct its_node *its,
	its_encode_sgi_intid(cmd, desc->its_vsgi_cmd.sgi);
#endif
	its_encode_sgi_priority(cmd, desc->its_vsgi_cmd.priority);
	its_encode_sgi_nmi(cmd, desc->its_vsgi_cmd.nmi);
	its_encode_sgi_group(cmd, desc->its_vsgi_cmd.group);
	its_encode_sgi_clear(cmd, desc->its_vsgi_cmd.clear);
	its_encode_sgi_enable(cmd, desc->its_vsgi_cmd.enable);
@@ -4495,6 +4502,7 @@ static void its_configure_sgi(struct irq_data *d, bool clear)
	desc.its_vsgi_cmd.priority = vpe->sgi_config[d->hwirq].priority;
	desc.its_vsgi_cmd.enable = vpe->sgi_config[d->hwirq].enabled;
	desc.its_vsgi_cmd.group = vpe->sgi_config[d->hwirq].group;
	desc.its_vsgi_cmd.nmi = vpe->sgi_config[d->hwirq].nmi;
	desc.its_vsgi_cmd.clear = clear;

	/*
@@ -4653,6 +4661,7 @@ static int its_sgi_set_vcpu_affinity(struct irq_data *d, void *vcpu_info)
	case PROP_UPDATE_VSGI:
		vpe->sgi_config[d->hwirq].priority = info->priority;
		vpe->sgi_config[d->hwirq].group = info->group;
		vpe->sgi_config[d->hwirq].nmi = info->nmi;
		its_configure_sgi(d, false);
		return 0;

+2 −1
Original line number Diff line number Diff line
@@ -393,13 +393,14 @@ int its_prop_update_vlpi(int irq, u8 config, bool inv)
	return irq_set_vcpu_affinity(irq, &info);
}

int its_prop_update_vsgi(int irq, u8 priority, bool group)
int its_prop_update_vsgi(int irq, u8 priority, bool group, bool nmi)
{
	struct its_cmd_info info = {
		.cmd_type = PROP_UPDATE_VSGI,
		{
			.priority	= priority,
			.group		= group,
			.nmi		= nmi,
		},
	};

Loading