KVM: arm/arm64: vgic: add init entry to VGIC KVM device
Since the advent of VGIC dynamic initialization, this latter is initialized quite late on the first vcpu run or "on-demand", when injecting an IRQ or when the guest sets its registers. This initialization could be initiated explicitly much earlier by the users-space, as soon as it has provided the requested dimensioning parameters. This patch adds a new entry to the VGIC KVM device that allows the user to manually request the VGIC init: - a new KVM_DEV_ARM_VGIC_GRP_CTRL group is introduced. - Its first attribute is KVM_DEV_ARM_VGIC_CTRL_INIT The rationale behind introducing a group is to be able to add other controls later on, if needed. Signed-off-by: Eric Auger <eric.auger@linaro.org> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
This commit is contained in:

committed by
Christoffer Dall

parent
66b030e48a
commit
065c003482
@@ -81,3 +81,14 @@ Groups:
|
|||||||
-EINVAL: Value set is out of the expected range
|
-EINVAL: Value set is out of the expected range
|
||||||
-EBUSY: Value has already be set, or GIC has already been initialized
|
-EBUSY: Value has already be set, or GIC has already been initialized
|
||||||
with default values.
|
with default values.
|
||||||
|
|
||||||
|
KVM_DEV_ARM_VGIC_GRP_CTRL
|
||||||
|
Attributes:
|
||||||
|
KVM_DEV_ARM_VGIC_CTRL_INIT
|
||||||
|
request the initialization of the VGIC, no additional parameter in
|
||||||
|
kvm_device_attr.addr.
|
||||||
|
Errors:
|
||||||
|
-ENXIO: VGIC not properly configured as required prior to calling
|
||||||
|
this attribute
|
||||||
|
-ENODEV: no online VCPU
|
||||||
|
-ENOMEM: memory shortage when allocating vgic internal data
|
||||||
|
@@ -175,6 +175,8 @@ struct kvm_arch_memory_slot {
|
|||||||
#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
|
#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
|
||||||
#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
|
#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
|
||||||
#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
|
#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
|
||||||
|
#define KVM_DEV_ARM_VGIC_GRP_CTRL 4
|
||||||
|
#define KVM_DEV_ARM_VGIC_CTRL_INIT 0
|
||||||
|
|
||||||
/* KVM_IRQ_LINE irq field index values */
|
/* KVM_IRQ_LINE irq field index values */
|
||||||
#define KVM_ARM_IRQ_TYPE_SHIFT 24
|
#define KVM_ARM_IRQ_TYPE_SHIFT 24
|
||||||
|
@@ -161,6 +161,8 @@ struct kvm_arch_memory_slot {
|
|||||||
#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
|
#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
|
||||||
#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
|
#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
|
||||||
#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
|
#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
|
||||||
|
#define KVM_DEV_ARM_VGIC_GRP_CTRL 4
|
||||||
|
#define KVM_DEV_ARM_VGIC_CTRL_INIT 0
|
||||||
|
|
||||||
/* KVM_IRQ_LINE irq field index values */
|
/* KVM_IRQ_LINE irq field index values */
|
||||||
#define KVM_ARM_IRQ_TYPE_SHIFT 24
|
#define KVM_ARM_IRQ_TYPE_SHIFT 24
|
||||||
|
@@ -2302,7 +2302,14 @@ static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
case KVM_DEV_ARM_VGIC_GRP_CTRL: {
|
||||||
|
switch (attr->attr) {
|
||||||
|
case KVM_DEV_ARM_VGIC_CTRL_INIT:
|
||||||
|
r = vgic_init(dev->kvm);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
@@ -2381,6 +2388,11 @@ static int vgic_has_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
|
|||||||
return vgic_has_attr_regs(vgic_cpu_ranges, offset);
|
return vgic_has_attr_regs(vgic_cpu_ranges, offset);
|
||||||
case KVM_DEV_ARM_VGIC_GRP_NR_IRQS:
|
case KVM_DEV_ARM_VGIC_GRP_NR_IRQS:
|
||||||
return 0;
|
return 0;
|
||||||
|
case KVM_DEV_ARM_VGIC_GRP_CTRL:
|
||||||
|
switch (attr->attr) {
|
||||||
|
case KVM_DEV_ARM_VGIC_CTRL_INIT:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user