aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <Marc.Zyngier@arm.com>2013-04-11 17:36:23 +0100
committerWill Deacon <will.deacon@arm.com>2015-06-01 16:39:54 +0100
commit9b47146bc9a1ff1a08d6e2e2f9cb517e075dd662 (patch)
treed589d3850820792f182a9c23c957231a44cd362b
parent8d0413d2a06c81417a791556829348b657df788f (diff)
downloadkvmtool-9b47146bc9a1ff1a08d6e2e2f9cb517e075dd662.tar.gz
kvm tools: arm: add CPU compatible string to target structure
Instead of hardcoding the CPU compatible string, store it in the target descriptor. This allows similar CPUs to be managed by the same backend, and yet have different compatible properties. Also remove a check for a condition that can never occur in both A15 and A57 backends. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--arm/aarch32/cortex-a15.c12
-rw-r--r--arm/aarch64/cortex-a57.c12
-rw-r--r--arm/include/arm-common/kvm-cpu-arch.h6
-rw-r--r--arm/kvm-cpu.c9
4 files changed, 18 insertions, 21 deletions
diff --git a/arm/aarch32/cortex-a15.c b/arm/aarch32/cortex-a15.c
index 80317474..4030e53c 100644
--- a/arm/aarch32/cortex-a15.c
+++ b/arm/aarch32/cortex-a15.c
@@ -20,16 +20,11 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
for (cpu = 0; cpu < kvm->nrcpus; ++cpu) {
char cpu_name[CPU_NAME_MAX_LEN];
- if (kvm->cpus[cpu]->cpu_type != KVM_ARM_TARGET_CORTEX_A15) {
- pr_warning("Ignoring unknown type for CPU %d\n", cpu);
- continue;
- }
-
snprintf(cpu_name, CPU_NAME_MAX_LEN, "cpu@%d", cpu);
_FDT(fdt_begin_node(fdt, cpu_name));
_FDT(fdt_property_string(fdt, "device_type", "cpu"));
- _FDT(fdt_property_string(fdt, "compatible", "arm,cortex-a15"));
+ _FDT(fdt_property_string(fdt, "compatible", kvm->cpus[cpu]->cpu_compatible));
if (kvm->nrcpus > 1)
_FDT(fdt_property_string(fdt, "enable-method", "psci"));
@@ -83,8 +78,9 @@ static int cortex_a15__vcpu_init(struct kvm_cpu *vcpu)
}
static struct kvm_arm_target target_cortex_a15 = {
- .id = KVM_ARM_TARGET_CORTEX_A15,
- .init = cortex_a15__vcpu_init,
+ .id = KVM_ARM_TARGET_CORTEX_A15,
+ .compatible = "arm,cortex-a15",
+ .init = cortex_a15__vcpu_init,
};
static int cortex_a15__core_init(struct kvm *kvm)
diff --git a/arm/aarch64/cortex-a57.c b/arm/aarch64/cortex-a57.c
index 4fd11ba1..f636ef73 100644
--- a/arm/aarch64/cortex-a57.c
+++ b/arm/aarch64/cortex-a57.c
@@ -20,16 +20,11 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
for (cpu = 0; cpu < kvm->nrcpus; ++cpu) {
char cpu_name[CPU_NAME_MAX_LEN];
- if (kvm->cpus[cpu]->cpu_type != KVM_ARM_TARGET_CORTEX_A57) {
- pr_warning("Ignoring unknown type for CPU %d\n", cpu);
- continue;
- }
-
snprintf(cpu_name, CPU_NAME_MAX_LEN, "cpu@%d", cpu);
_FDT(fdt_begin_node(fdt, cpu_name));
_FDT(fdt_property_string(fdt, "device_type", "cpu"));
- _FDT(fdt_property_string(fdt, "compatible", "arm,cortex-a57"));
+ _FDT(fdt_property_string(fdt, "compatible", kvm->cpus[cpu]->cpu_compatible));
if (kvm->nrcpus > 1)
_FDT(fdt_property_string(fdt, "enable-method", "psci"));
@@ -84,8 +79,9 @@ static int cortex_a57__vcpu_init(struct kvm_cpu *vcpu)
}
static struct kvm_arm_target target_cortex_a57 = {
- .id = KVM_ARM_TARGET_CORTEX_A57,
- .init = cortex_a57__vcpu_init,
+ .id = KVM_ARM_TARGET_CORTEX_A57,
+ .compatible = "arm,cortex-a57",
+ .init = cortex_a57__vcpu_init,
};
static int cortex_a57__core_init(struct kvm *kvm)
diff --git a/arm/include/arm-common/kvm-cpu-arch.h b/arm/include/arm-common/kvm-cpu-arch.h
index 351fbe68..b514dd56 100644
--- a/arm/include/arm-common/kvm-cpu-arch.h
+++ b/arm/include/arm-common/kvm-cpu-arch.h
@@ -12,6 +12,7 @@ struct kvm_cpu {
unsigned long cpu_id;
unsigned long cpu_type;
+ const char *cpu_compatible;
struct kvm *kvm;
int vcpu_fd;
@@ -28,8 +29,9 @@ struct kvm_cpu {
};
struct kvm_arm_target {
- u32 id;
- int (*init)(struct kvm_cpu *vcpu);
+ u32 id;
+ const char *compatible;
+ int (*init)(struct kvm_cpu *vcpu);
};
int kvm_cpu__register_kvm_arm_target(struct kvm_arm_target *target);
diff --git a/arm/kvm-cpu.c b/arm/kvm-cpu.c
index 27166907..6d4f3065 100644
--- a/arm/kvm-cpu.c
+++ b/arm/kvm-cpu.c
@@ -30,6 +30,7 @@ int kvm_cpu__register_kvm_arm_target(struct kvm_arm_target *target)
struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
{
+ struct kvm_arm_target *target;
struct kvm_cpu *vcpu;
int coalesced_offset, mmap_size, err = -1;
unsigned int i;
@@ -58,13 +59,14 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
for (i = 0; i < ARRAY_SIZE(kvm_arm_targets); ++i) {
if (!kvm_arm_targets[i])
continue;
- vcpu_init.target = kvm_arm_targets[i]->id;
+ target = kvm_arm_targets[i];
+ vcpu_init.target = target->id;
err = ioctl(vcpu->vcpu_fd, KVM_ARM_VCPU_INIT, &vcpu_init);
if (!err)
break;
}
- if (err || kvm_arm_targets[i]->init(vcpu))
+ if (err || target->init(vcpu))
die("Unable to initialise ARM vcpu");
coalesced_offset = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION,
@@ -76,7 +78,8 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned long cpu_id)
/* Populate the vcpu structure. */
vcpu->kvm = kvm;
vcpu->cpu_id = cpu_id;
- vcpu->cpu_type = vcpu_init.target;
+ vcpu->cpu_type = target->id;
+ vcpu->cpu_compatible = target->compatible;
vcpu->is_running = true;
return vcpu;
}