aboutsummaryrefslogtreecommitdiffstats
path: root/arm
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2013-05-01 16:50:07 +0100
committerWill Deacon <will.deacon@arm.com>2015-06-01 16:39:54 +0100
commit2454c7dc0d18f1fa18f90733df556cd0ee7f571f (patch)
tree7e69b6ffe19f2cb1ce604a1acaec29ec3a0efb30 /arm
parent1d716fa6dff0b0b747177375d28370f8a248afc5 (diff)
downloadkvmtool-2454c7dc0d18f1fa18f90733df556cd0ee7f571f.tar.gz
kvm tools: virtio: move fdt node generation into core mmio code
Generating fdt nodes for virtio-mmio devices should be in the core code, not hidden inside the architecture code for ARM. This patch reworks the .data field of struct device_header for virtio-mmio devices, so that it contains a function pointer which can be called to generate the FDT node for each device. Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'arm')
-rw-r--r--arm/fdt.c30
1 files changed, 10 insertions, 20 deletions
diff --git a/arm/fdt.c b/arm/fdt.c
index c61bf58a..7198fe84 100644
--- a/arm/fdt.c
+++ b/arm/fdt.c
@@ -69,28 +69,15 @@ static void generate_cpu_nodes(void *fdt, struct kvm *kvm)
_FDT(fdt_end_node(fdt));
}
-#define DEVICE_NAME_MAX_LEN 32
-static void generate_virtio_mmio_node(void *fdt, struct virtio_mmio *vmmio)
+static void generate_irq_prop(void *fdt, u8 irq)
{
- char dev_name[DEVICE_NAME_MAX_LEN];
- u64 addr = vmmio->addr;
- u64 reg_prop[] = {
- cpu_to_fdt64(addr),
- cpu_to_fdt64(VIRTIO_MMIO_IO_SIZE)
- };
u32 irq_prop[] = {
cpu_to_fdt32(GIC_FDT_IRQ_TYPE_SPI),
- cpu_to_fdt32(vmmio->irq - GIC_SPI_IRQ_BASE),
+ cpu_to_fdt32(irq - GIC_SPI_IRQ_BASE),
cpu_to_fdt32(GIC_FDT_IRQ_FLAGS_EDGE_LO_HI),
};
- snprintf(dev_name, DEVICE_NAME_MAX_LEN, "virtio@%llx", addr);
-
- _FDT(fdt_begin_node(fdt, dev_name));
- _FDT(fdt_property_string(fdt, "compatible", "virtio,mmio"));
- _FDT(fdt_property(fdt, "reg", reg_prop, sizeof(reg_prop)));
_FDT(fdt_property(fdt, "interrupts", irq_prop, sizeof(irq_prop)));
- _FDT(fdt_end_node(fdt));
}
static int setup_fdt(struct kvm *kvm)
@@ -105,8 +92,10 @@ 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_fdt_nodes)(void *, struct kvm *, u32)
- = kvm->cpus[0]->generate_fdt_nodes;
+ void (*generate_mmio_fdt_nodes)(void *, struct device_header *,
+ void (*)(void *, u8));
+ void (*generate_cpu_peripheral_fdt_nodes)(void *, struct kvm *, u32)
+ = kvm->cpus[0]->generate_fdt_nodes;
/* Create new tree without a reserve map */
_FDT(fdt_create(fdt, FDT_MAX_SIZE));
@@ -144,13 +133,14 @@ static int setup_fdt(struct kvm *kvm)
/* CPU and peripherals (interrupt controller, timers, etc) */
generate_cpu_nodes(fdt, kvm);
- if (generate_fdt_nodes)
- generate_fdt_nodes(fdt, kvm, gic_phandle);
+ if (generate_cpu_peripheral_fdt_nodes)
+ generate_cpu_peripheral_fdt_nodes(fdt, kvm, gic_phandle);
/* Virtio MMIO devices */
dev_hdr = device__first_dev(DEVICE_BUS_MMIO);
while (dev_hdr) {
- generate_virtio_mmio_node(fdt, dev_hdr->data);
+ generate_mmio_fdt_nodes = dev_hdr->data;
+ generate_mmio_fdt_nodes(fdt, dev_hdr, generate_irq_prop);
dev_hdr = device__next_dev(dev_hdr);
}