@@ -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)
@@ -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)
@@ -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);
@@ -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;
}