aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <Marc.Zyngier@arm.com>2013-04-11 17:36:24 +0100
committerWill Deacon <will.deacon@arm.com>2015-06-01 16:39:54 +0100
commitbeff7ae0e7857eba651017b1d496371e339dddac (patch)
tree3c127af21a8903520093eb5112f3eb74c6ab251a
parent9b47146bc9a1ff1a08d6e2e2f9cb517e075dd662 (diff)
downloadkvmtool-beff7ae0e7857eba651017b1d496371e339dddac.tar.gz
kvm tools: arm: consolidate CPU node generation
Now that generate_cpu_nodes uses the cpu_compatible field to output the compatible property, we can unify the A15 and A57 implementations, as they are strictly identical. Move the function to fdt.c, together with most of the device tree generation. 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.c29
-rw-r--r--arm/aarch64/cortex-a57.c29
-rw-r--r--arm/fdt.c35
3 files changed, 32 insertions, 61 deletions
diff --git a/arm/aarch32/cortex-a15.c b/arm/aarch32/cortex-a15.c
index 4030e53c..ca65af76 100644
--- a/arm/aarch32/cortex-a15.c
+++ b/arm/aarch32/cortex-a15.c
@@ -8,34 +8,6 @@
#include <linux/byteorder.h>
#include <linux/types.h>
-#define CPU_NAME_MAX_LEN 8
-static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
-{
- int cpu;
-
- _FDT(fdt_begin_node(fdt, "cpus"));
- _FDT(fdt_property_cell(fdt, "#address-cells", 0x1));
- _FDT(fdt_property_cell(fdt, "#size-cells", 0x0));
-
- for (cpu = 0; cpu < kvm->nrcpus; ++cpu) {
- char cpu_name[CPU_NAME_MAX_LEN];
-
- 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", kvm->cpus[cpu]->cpu_compatible));
-
- if (kvm->nrcpus > 1)
- _FDT(fdt_property_string(fdt, "enable-method", "psci"));
-
- _FDT(fdt_property_cell(fdt, "reg", cpu));
- _FDT(fdt_end_node(fdt));
- }
-
- _FDT(fdt_end_node(fdt));
-}
-
static void generate_timer_nodes(void *fdt, struct kvm *kvm)
{
u32 cpu_mask = (((1 << kvm->nrcpus) - 1) << GIC_FDT_IRQ_PPI_CPU_SHIFT) \
@@ -66,7 +38,6 @@ static void generate_timer_nodes(void *fdt, struct kvm *kvm)
static void generate_fdt_nodes(void *fdt, struct kvm *kvm, u32 gic_phandle)
{
- generate_cpu_nodes(fdt, kvm);
gic__generate_fdt_nodes(fdt, gic_phandle);
generate_timer_nodes(fdt, kvm);
}
diff --git a/arm/aarch64/cortex-a57.c b/arm/aarch64/cortex-a57.c
index f636ef73..5b0dc4c3 100644
--- a/arm/aarch64/cortex-a57.c
+++ b/arm/aarch64/cortex-a57.c
@@ -8,34 +8,6 @@
#include <linux/byteorder.h>
#include <linux/types.h>
-#define CPU_NAME_MAX_LEN 8
-static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
-{
- int cpu;
-
- _FDT(fdt_begin_node(fdt, "cpus"));
- _FDT(fdt_property_cell(fdt, "#address-cells", 0x1));
- _FDT(fdt_property_cell(fdt, "#size-cells", 0x0));
-
- for (cpu = 0; cpu < kvm->nrcpus; ++cpu) {
- char cpu_name[CPU_NAME_MAX_LEN];
-
- 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", kvm->cpus[cpu]->cpu_compatible));
-
- if (kvm->nrcpus > 1)
- _FDT(fdt_property_string(fdt, "enable-method", "psci"));
-
- _FDT(fdt_property_cell(fdt, "reg", cpu));
- _FDT(fdt_end_node(fdt));
- }
-
- _FDT(fdt_end_node(fdt));
-}
-
static void generate_timer_nodes(void *fdt, struct kvm *kvm)
{
u32 cpu_mask = (((1 << kvm->nrcpus) - 1) << GIC_FDT_IRQ_PPI_CPU_SHIFT) \
@@ -66,7 +38,6 @@ static void generate_timer_nodes(void *fdt, struct kvm *kvm)
static void generate_fdt_nodes(void *fdt, struct kvm *kvm, u32 gic_phandle)
{
- generate_cpu_nodes(fdt, kvm);
gic__generate_fdt_nodes(fdt, gic_phandle);
generate_timer_nodes(fdt, kvm);
}
diff --git a/arm/fdt.c b/arm/fdt.c
index 20e03084..c61bf58a 100644
--- a/arm/fdt.c
+++ b/arm/fdt.c
@@ -41,6 +41,34 @@ static void dump_fdt(const char *dtb_file, void *fdt)
close(fd);
}
+#define CPU_NAME_MAX_LEN 8
+static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
+{
+ int cpu;
+
+ _FDT(fdt_begin_node(fdt, "cpus"));
+ _FDT(fdt_property_cell(fdt, "#address-cells", 0x1));
+ _FDT(fdt_property_cell(fdt, "#size-cells", 0x0));
+
+ for (cpu = 0; cpu < kvm->nrcpus; ++cpu) {
+ char cpu_name[CPU_NAME_MAX_LEN];
+
+ 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", kvm->cpus[cpu]->cpu_compatible));
+
+ if (kvm->nrcpus > 1)
+ _FDT(fdt_property_string(fdt, "enable-method", "psci"));
+
+ _FDT(fdt_property_cell(fdt, "reg", cpu));
+ _FDT(fdt_end_node(fdt));
+ }
+
+ _FDT(fdt_end_node(fdt));
+}
+
#define DEVICE_NAME_MAX_LEN 32
static void generate_virtio_mmio_node(void *fdt, struct virtio_mmio *vmmio)
{
@@ -77,7 +105,7 @@ static int setup_fdt(struct kvm *kvm)
void *fdt = staging_fdt;
void *fdt_dest = guest_flat_to_host(kvm,
kvm->arch.dtb_guest_start);
- void (*generate_cpu_nodes)(void *, struct kvm *, u32)
+ void (*generate_fdt_nodes)(void *, struct kvm *, u32)
= kvm->cpus[0]->generate_fdt_nodes;
/* Create new tree without a reserve map */
@@ -115,8 +143,9 @@ static int setup_fdt(struct kvm *kvm)
_FDT(fdt_end_node(fdt));
/* CPU and peripherals (interrupt controller, timers, etc) */
- if (generate_cpu_nodes)
- generate_cpu_nodes(fdt, kvm, gic_phandle);
+ generate_cpu_nodes(fdt, kvm);
+ if (generate_fdt_nodes)
+ generate_fdt_nodes(fdt, kvm, gic_phandle);
/* Virtio MMIO devices */
dev_hdr = device__first_dev(DEVICE_BUS_MMIO);