mirror of
https://github.com/xemu-project/xemu.git
synced 2025-01-22 03:45:30 +00:00
device_tree: s/qemu_devtree/qemu_fdt globally
The qemu_devtree API is a wrapper around the fdt_ set of APIs. Rename accordingly. Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> [agraf: also convert hw/arm/virt.c] Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
c2b63f0397
commit
5a4348d111
@ -131,8 +131,8 @@ static int findnode_nofail(void *fdt, const char *node_path)
|
||||
return offset;
|
||||
}
|
||||
|
||||
int qemu_devtree_setprop(void *fdt, const char *node_path,
|
||||
const char *property, const void *val_array, int size)
|
||||
int qemu_fdt_setprop(void *fdt, const char *node_path,
|
||||
const char *property, const void *val_array, int size)
|
||||
{
|
||||
int r;
|
||||
|
||||
@ -146,8 +146,8 @@ int qemu_devtree_setprop(void *fdt, const char *node_path,
|
||||
return r;
|
||||
}
|
||||
|
||||
int qemu_devtree_setprop_cell(void *fdt, const char *node_path,
|
||||
const char *property, uint32_t val)
|
||||
int qemu_fdt_setprop_cell(void *fdt, const char *node_path,
|
||||
const char *property, uint32_t val)
|
||||
{
|
||||
int r;
|
||||
|
||||
@ -161,15 +161,15 @@ int qemu_devtree_setprop_cell(void *fdt, const char *node_path,
|
||||
return r;
|
||||
}
|
||||
|
||||
int qemu_devtree_setprop_u64(void *fdt, const char *node_path,
|
||||
const char *property, uint64_t val)
|
||||
int qemu_fdt_setprop_u64(void *fdt, const char *node_path,
|
||||
const char *property, uint64_t val)
|
||||
{
|
||||
val = cpu_to_be64(val);
|
||||
return qemu_devtree_setprop(fdt, node_path, property, &val, sizeof(val));
|
||||
return qemu_fdt_setprop(fdt, node_path, property, &val, sizeof(val));
|
||||
}
|
||||
|
||||
int qemu_devtree_setprop_string(void *fdt, const char *node_path,
|
||||
const char *property, const char *string)
|
||||
int qemu_fdt_setprop_string(void *fdt, const char *node_path,
|
||||
const char *property, const char *string)
|
||||
{
|
||||
int r;
|
||||
|
||||
@ -183,8 +183,8 @@ int qemu_devtree_setprop_string(void *fdt, const char *node_path,
|
||||
return r;
|
||||
}
|
||||
|
||||
const void *qemu_devtree_getprop(void *fdt, const char *node_path,
|
||||
const char *property, int *lenp)
|
||||
const void *qemu_fdt_getprop(void *fdt, const char *node_path,
|
||||
const char *property, int *lenp)
|
||||
{
|
||||
int len;
|
||||
const void *r;
|
||||
@ -200,11 +200,11 @@ const void *qemu_devtree_getprop(void *fdt, const char *node_path,
|
||||
return r;
|
||||
}
|
||||
|
||||
uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path,
|
||||
const char *property)
|
||||
uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path,
|
||||
const char *property)
|
||||
{
|
||||
int len;
|
||||
const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len);
|
||||
const uint32_t *p = qemu_fdt_getprop(fdt, node_path, property, &len);
|
||||
if (len != 4) {
|
||||
fprintf(stderr, "%s: %s/%s not 4 bytes long (not a cell?)\n",
|
||||
__func__, node_path, property);
|
||||
@ -213,7 +213,7 @@ uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path,
|
||||
return be32_to_cpu(*p);
|
||||
}
|
||||
|
||||
uint32_t qemu_devtree_get_phandle(void *fdt, const char *path)
|
||||
uint32_t qemu_fdt_get_phandle(void *fdt, const char *path)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
@ -227,15 +227,15 @@ uint32_t qemu_devtree_get_phandle(void *fdt, const char *path)
|
||||
return r;
|
||||
}
|
||||
|
||||
int qemu_devtree_setprop_phandle(void *fdt, const char *node_path,
|
||||
const char *property,
|
||||
const char *target_node_path)
|
||||
int qemu_fdt_setprop_phandle(void *fdt, const char *node_path,
|
||||
const char *property,
|
||||
const char *target_node_path)
|
||||
{
|
||||
uint32_t phandle = qemu_devtree_get_phandle(fdt, target_node_path);
|
||||
return qemu_devtree_setprop_cell(fdt, node_path, property, phandle);
|
||||
uint32_t phandle = qemu_fdt_get_phandle(fdt, target_node_path);
|
||||
return qemu_fdt_setprop_cell(fdt, node_path, property, phandle);
|
||||
}
|
||||
|
||||
uint32_t qemu_devtree_alloc_phandle(void *fdt)
|
||||
uint32_t qemu_fdt_alloc_phandle(void *fdt)
|
||||
{
|
||||
static int phandle = 0x0;
|
||||
|
||||
@ -259,7 +259,7 @@ uint32_t qemu_devtree_alloc_phandle(void *fdt)
|
||||
return phandle++;
|
||||
}
|
||||
|
||||
int qemu_devtree_nop_node(void *fdt, const char *node_path)
|
||||
int qemu_fdt_nop_node(void *fdt, const char *node_path)
|
||||
{
|
||||
int r;
|
||||
|
||||
@ -273,7 +273,7 @@ int qemu_devtree_nop_node(void *fdt, const char *node_path)
|
||||
return r;
|
||||
}
|
||||
|
||||
int qemu_devtree_add_subnode(void *fdt, const char *name)
|
||||
int qemu_fdt_add_subnode(void *fdt, const char *name)
|
||||
{
|
||||
char *dupname = g_strdup(name);
|
||||
char *basename = strrchr(dupname, '/');
|
||||
@ -303,7 +303,7 @@ int qemu_devtree_add_subnode(void *fdt, const char *name)
|
||||
return retval;
|
||||
}
|
||||
|
||||
void qemu_devtree_dumpdtb(void *fdt, int size)
|
||||
void qemu_fdt_dumpdtb(void *fdt, int size)
|
||||
{
|
||||
const char *dumpdtb = qemu_opt_get(qemu_get_machine_opts(), "dumpdtb");
|
||||
|
||||
@ -313,11 +313,11 @@ void qemu_devtree_dumpdtb(void *fdt, int size)
|
||||
}
|
||||
}
|
||||
|
||||
int qemu_devtree_setprop_sized_cells_from_array(void *fdt,
|
||||
const char *node_path,
|
||||
const char *property,
|
||||
int numvalues,
|
||||
uint64_t *values)
|
||||
int qemu_fdt_setprop_sized_cells_from_array(void *fdt,
|
||||
const char *node_path,
|
||||
const char *property,
|
||||
int numvalues,
|
||||
uint64_t *values)
|
||||
{
|
||||
uint32_t *propcells;
|
||||
uint64_t value;
|
||||
@ -342,6 +342,6 @@ int qemu_devtree_setprop_sized_cells_from_array(void *fdt,
|
||||
propcells[cellnum++] = cpu_to_be32(value);
|
||||
}
|
||||
|
||||
return qemu_devtree_setprop(fdt, node_path, property, propcells,
|
||||
cellnum * sizeof(uint32_t));
|
||||
return qemu_fdt_setprop(fdt, node_path, property, propcells,
|
||||
cellnum * sizeof(uint32_t));
|
||||
}
|
||||
|
@ -335,8 +335,8 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo)
|
||||
}
|
||||
}
|
||||
|
||||
acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells");
|
||||
scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells");
|
||||
acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells");
|
||||
scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells");
|
||||
if (acells == 0 || scells == 0) {
|
||||
fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n");
|
||||
goto fail;
|
||||
@ -351,17 +351,17 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
rc = qemu_devtree_setprop_sized_cells(fdt, "/memory", "reg",
|
||||
acells, binfo->loader_start,
|
||||
scells, binfo->ram_size);
|
||||
rc = qemu_fdt_setprop_sized_cells(fdt, "/memory", "reg",
|
||||
acells, binfo->loader_start,
|
||||
scells, binfo->ram_size);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "couldn't set /memory/reg\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (binfo->kernel_cmdline && *binfo->kernel_cmdline) {
|
||||
rc = qemu_devtree_setprop_string(fdt, "/chosen", "bootargs",
|
||||
binfo->kernel_cmdline);
|
||||
rc = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs",
|
||||
binfo->kernel_cmdline);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "couldn't set /chosen/bootargs\n");
|
||||
goto fail;
|
||||
@ -369,15 +369,15 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo)
|
||||
}
|
||||
|
||||
if (binfo->initrd_size) {
|
||||
rc = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
binfo->initrd_start);
|
||||
rc = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
binfo->initrd_start);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
rc = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
binfo->initrd_start + binfo->initrd_size);
|
||||
rc = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
binfo->initrd_start + binfo->initrd_size);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n");
|
||||
goto fail;
|
||||
@ -388,7 +388,7 @@ static int load_dtb(hwaddr addr, const struct arm_boot_info *binfo)
|
||||
binfo->modify_dtb(binfo, fdt);
|
||||
}
|
||||
|
||||
qemu_devtree_dumpdtb(fdt, size);
|
||||
qemu_fdt_dumpdtb(fdt, size);
|
||||
|
||||
cpu_physical_memory_write(addr, fdt, size);
|
||||
|
||||
|
@ -419,13 +419,13 @@ static int add_virtio_mmio_node(void *fdt, uint32_t acells, uint32_t scells,
|
||||
int rc;
|
||||
char *nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, addr);
|
||||
|
||||
rc = qemu_devtree_add_subnode(fdt, nodename);
|
||||
rc |= qemu_devtree_setprop_string(fdt, nodename,
|
||||
"compatible", "virtio,mmio");
|
||||
rc |= qemu_devtree_setprop_sized_cells(fdt, nodename, "reg",
|
||||
acells, addr, scells, size);
|
||||
qemu_devtree_setprop_cells(fdt, nodename, "interrupt-parent", intc);
|
||||
qemu_devtree_setprop_cells(fdt, nodename, "interrupts", 0, irq, 1);
|
||||
rc = qemu_fdt_add_subnode(fdt, nodename);
|
||||
rc |= qemu_fdt_setprop_string(fdt, nodename,
|
||||
"compatible", "virtio,mmio");
|
||||
rc |= qemu_fdt_setprop_sized_cells(fdt, nodename, "reg",
|
||||
acells, addr, scells, size);
|
||||
qemu_fdt_setprop_cells(fdt, nodename, "interrupt-parent", intc);
|
||||
qemu_fdt_setprop_cells(fdt, nodename, "interrupts", 0, irq, 1);
|
||||
g_free(nodename);
|
||||
if (rc) {
|
||||
return -1;
|
||||
@ -456,8 +456,8 @@ static void vexpress_modify_dtb(const struct arm_boot_info *info, void *fdt)
|
||||
uint32_t acells, scells, intc;
|
||||
const VEDBoardInfo *daughterboard = (const VEDBoardInfo *)info;
|
||||
|
||||
acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells");
|
||||
scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells");
|
||||
acells = qemu_fdt_getprop_cell(fdt, "/", "#address-cells");
|
||||
scells = qemu_fdt_getprop_cell(fdt, "/", "#size-cells");
|
||||
intc = find_int_controller(fdt);
|
||||
if (!intc) {
|
||||
/* Not fatal, we just won't provide virtio. This will
|
||||
|
106
hw/arm/virt.c
106
hw/arm/virt.c
@ -156,42 +156,42 @@ static void create_fdt(VirtBoardInfo *vbi)
|
||||
vbi->fdt = fdt;
|
||||
|
||||
/* Header */
|
||||
qemu_devtree_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
|
||||
qemu_devtree_setprop_cell(fdt, "/", "#address-cells", 0x2);
|
||||
qemu_devtree_setprop_cell(fdt, "/", "#size-cells", 0x2);
|
||||
qemu_fdt_setprop_string(fdt, "/", "compatible", "linux,dummy-virt");
|
||||
qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2);
|
||||
qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
|
||||
|
||||
/*
|
||||
* /chosen and /memory nodes must exist for load_dtb
|
||||
* to fill in necessary properties later
|
||||
*/
|
||||
qemu_devtree_add_subnode(fdt, "/chosen");
|
||||
qemu_devtree_add_subnode(fdt, "/memory");
|
||||
qemu_devtree_setprop_string(fdt, "/memory", "device_type", "memory");
|
||||
qemu_fdt_add_subnode(fdt, "/chosen");
|
||||
qemu_fdt_add_subnode(fdt, "/memory");
|
||||
qemu_fdt_setprop_string(fdt, "/memory", "device_type", "memory");
|
||||
|
||||
/* Clock node, for the benefit of the UART. The kernel device tree
|
||||
* binding documentation claims the PL011 node clock properties are
|
||||
* optional but in practice if you omit them the kernel refuses to
|
||||
* probe for the device.
|
||||
*/
|
||||
vbi->clock_phandle = qemu_devtree_alloc_phandle(fdt);
|
||||
qemu_devtree_add_subnode(fdt, "/apb-pclk");
|
||||
qemu_devtree_setprop_string(fdt, "/apb-pclk", "compatible", "fixed-clock");
|
||||
qemu_devtree_setprop_cell(fdt, "/apb-pclk", "#clock-cells", 0x0);
|
||||
qemu_devtree_setprop_cell(fdt, "/apb-pclk", "clock-frequency", 24000000);
|
||||
qemu_devtree_setprop_string(fdt, "/apb-pclk", "clock-output-names",
|
||||
vbi->clock_phandle = qemu_fdt_alloc_phandle(fdt);
|
||||
qemu_fdt_add_subnode(fdt, "/apb-pclk");
|
||||
qemu_fdt_setprop_string(fdt, "/apb-pclk", "compatible", "fixed-clock");
|
||||
qemu_fdt_setprop_cell(fdt, "/apb-pclk", "#clock-cells", 0x0);
|
||||
qemu_fdt_setprop_cell(fdt, "/apb-pclk", "clock-frequency", 24000000);
|
||||
qemu_fdt_setprop_string(fdt, "/apb-pclk", "clock-output-names",
|
||||
"clk24mhz");
|
||||
qemu_devtree_setprop_cell(fdt, "/apb-pclk", "phandle", vbi->clock_phandle);
|
||||
qemu_fdt_setprop_cell(fdt, "/apb-pclk", "phandle", vbi->clock_phandle);
|
||||
|
||||
/* No PSCI for TCG yet */
|
||||
if (kvm_enabled()) {
|
||||
qemu_devtree_add_subnode(fdt, "/psci");
|
||||
qemu_devtree_setprop_string(fdt, "/psci", "compatible", "arm,psci");
|
||||
qemu_devtree_setprop_string(fdt, "/psci", "method", "hvc");
|
||||
qemu_devtree_setprop_cell(fdt, "/psci", "cpu_suspend",
|
||||
qemu_fdt_add_subnode(fdt, "/psci");
|
||||
qemu_fdt_setprop_string(fdt, "/psci", "compatible", "arm,psci");
|
||||
qemu_fdt_setprop_string(fdt, "/psci", "method", "hvc");
|
||||
qemu_fdt_setprop_cell(fdt, "/psci", "cpu_suspend",
|
||||
PSCI_FN_CPU_SUSPEND);
|
||||
qemu_devtree_setprop_cell(fdt, "/psci", "cpu_off", PSCI_FN_CPU_OFF);
|
||||
qemu_devtree_setprop_cell(fdt, "/psci", "cpu_on", PSCI_FN_CPU_ON);
|
||||
qemu_devtree_setprop_cell(fdt, "/psci", "migrate", PSCI_FN_MIGRATE);
|
||||
qemu_fdt_setprop_cell(fdt, "/psci", "cpu_off", PSCI_FN_CPU_OFF);
|
||||
qemu_fdt_setprop_cell(fdt, "/psci", "cpu_on", PSCI_FN_CPU_ON);
|
||||
qemu_fdt_setprop_cell(fdt, "/psci", "migrate", PSCI_FN_MIGRATE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -206,10 +206,10 @@ static void fdt_add_timer_nodes(const VirtBoardInfo *vbi)
|
||||
irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
|
||||
GIC_FDT_IRQ_PPI_CPU_WIDTH, (1 << vbi->smp_cpus) - 1);
|
||||
|
||||
qemu_devtree_add_subnode(vbi->fdt, "/timer");
|
||||
qemu_devtree_setprop_string(vbi->fdt, "/timer",
|
||||
qemu_fdt_add_subnode(vbi->fdt, "/timer");
|
||||
qemu_fdt_setprop_string(vbi->fdt, "/timer",
|
||||
"compatible", "arm,armv7-timer");
|
||||
qemu_devtree_setprop_cells(vbi->fdt, "/timer", "interrupts",
|
||||
qemu_fdt_setprop_cells(vbi->fdt, "/timer", "interrupts",
|
||||
GIC_FDT_IRQ_TYPE_PPI, 13, irqflags,
|
||||
GIC_FDT_IRQ_TYPE_PPI, 14, irqflags,
|
||||
GIC_FDT_IRQ_TYPE_PPI, 11, irqflags,
|
||||
@ -220,25 +220,25 @@ static void fdt_add_cpu_nodes(const VirtBoardInfo *vbi)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
qemu_devtree_add_subnode(vbi->fdt, "/cpus");
|
||||
qemu_devtree_setprop_cell(vbi->fdt, "/cpus", "#address-cells", 0x1);
|
||||
qemu_devtree_setprop_cell(vbi->fdt, "/cpus", "#size-cells", 0x0);
|
||||
qemu_fdt_add_subnode(vbi->fdt, "/cpus");
|
||||
qemu_fdt_setprop_cell(vbi->fdt, "/cpus", "#address-cells", 0x1);
|
||||
qemu_fdt_setprop_cell(vbi->fdt, "/cpus", "#size-cells", 0x0);
|
||||
|
||||
for (cpu = vbi->smp_cpus - 1; cpu >= 0; cpu--) {
|
||||
char *nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
|
||||
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
|
||||
|
||||
qemu_devtree_add_subnode(vbi->fdt, nodename);
|
||||
qemu_devtree_setprop_string(vbi->fdt, nodename, "device_type", "cpu");
|
||||
qemu_devtree_setprop_string(vbi->fdt, nodename, "compatible",
|
||||
qemu_fdt_add_subnode(vbi->fdt, nodename);
|
||||
qemu_fdt_setprop_string(vbi->fdt, nodename, "device_type", "cpu");
|
||||
qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible",
|
||||
armcpu->dtb_compatible);
|
||||
|
||||
if (vbi->smp_cpus > 1) {
|
||||
qemu_devtree_setprop_string(vbi->fdt, nodename,
|
||||
qemu_fdt_setprop_string(vbi->fdt, nodename,
|
||||
"enable-method", "psci");
|
||||
}
|
||||
|
||||
qemu_devtree_setprop_cell(vbi->fdt, nodename, "reg", cpu);
|
||||
qemu_fdt_setprop_cell(vbi->fdt, nodename, "reg", cpu);
|
||||
g_free(nodename);
|
||||
}
|
||||
}
|
||||
@ -247,20 +247,20 @@ static void fdt_add_gic_node(const VirtBoardInfo *vbi)
|
||||
{
|
||||
uint32_t gic_phandle;
|
||||
|
||||
gic_phandle = qemu_devtree_alloc_phandle(vbi->fdt);
|
||||
qemu_devtree_setprop_cell(vbi->fdt, "/", "interrupt-parent", gic_phandle);
|
||||
gic_phandle = qemu_fdt_alloc_phandle(vbi->fdt);
|
||||
qemu_fdt_setprop_cell(vbi->fdt, "/", "interrupt-parent", gic_phandle);
|
||||
|
||||
qemu_devtree_add_subnode(vbi->fdt, "/intc");
|
||||
qemu_devtree_setprop_string(vbi->fdt, "/intc", "compatible",
|
||||
qemu_fdt_add_subnode(vbi->fdt, "/intc");
|
||||
qemu_fdt_setprop_string(vbi->fdt, "/intc", "compatible",
|
||||
vbi->gic_compatible);
|
||||
qemu_devtree_setprop_cell(vbi->fdt, "/intc", "#interrupt-cells", 3);
|
||||
qemu_devtree_setprop(vbi->fdt, "/intc", "interrupt-controller", NULL, 0);
|
||||
qemu_devtree_setprop_sized_cells(vbi->fdt, "/intc", "reg",
|
||||
qemu_fdt_setprop_cell(vbi->fdt, "/intc", "#interrupt-cells", 3);
|
||||
qemu_fdt_setprop(vbi->fdt, "/intc", "interrupt-controller", NULL, 0);
|
||||
qemu_fdt_setprop_sized_cells(vbi->fdt, "/intc", "reg",
|
||||
2, vbi->memmap[VIRT_GIC_DIST].base,
|
||||
2, vbi->memmap[VIRT_GIC_DIST].size,
|
||||
2, vbi->memmap[VIRT_GIC_CPU].base,
|
||||
2, vbi->memmap[VIRT_GIC_CPU].size);
|
||||
qemu_devtree_setprop_cell(vbi->fdt, "/intc", "phandle", gic_phandle);
|
||||
qemu_fdt_setprop_cell(vbi->fdt, "/intc", "phandle", gic_phandle);
|
||||
}
|
||||
|
||||
static void create_uart(const VirtBoardInfo *vbi, qemu_irq *pic)
|
||||
@ -275,18 +275,18 @@ static void create_uart(const VirtBoardInfo *vbi, qemu_irq *pic)
|
||||
sysbus_create_simple("pl011", base, pic[irq]);
|
||||
|
||||
nodename = g_strdup_printf("/pl011@%" PRIx64, base);
|
||||
qemu_devtree_add_subnode(vbi->fdt, nodename);
|
||||
qemu_fdt_add_subnode(vbi->fdt, nodename);
|
||||
/* Note that we can't use setprop_string because of the embedded NUL */
|
||||
qemu_devtree_setprop(vbi->fdt, nodename, "compatible",
|
||||
qemu_fdt_setprop(vbi->fdt, nodename, "compatible",
|
||||
compat, sizeof(compat));
|
||||
qemu_devtree_setprop_sized_cells(vbi->fdt, nodename, "reg",
|
||||
qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
|
||||
2, base, 2, size);
|
||||
qemu_devtree_setprop_cells(vbi->fdt, nodename, "interrupts",
|
||||
qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupts",
|
||||
GIC_FDT_IRQ_TYPE_SPI, irq,
|
||||
GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
||||
qemu_devtree_setprop_cells(vbi->fdt, nodename, "clocks",
|
||||
qemu_fdt_setprop_cells(vbi->fdt, nodename, "clocks",
|
||||
vbi->clock_phandle, vbi->clock_phandle);
|
||||
qemu_devtree_setprop(vbi->fdt, nodename, "clock-names",
|
||||
qemu_fdt_setprop(vbi->fdt, nodename, "clock-names",
|
||||
clocknames, sizeof(clocknames));
|
||||
g_free(nodename);
|
||||
}
|
||||
@ -314,14 +314,14 @@ static void create_virtio_devices(const VirtBoardInfo *vbi, qemu_irq *pic)
|
||||
hwaddr base = vbi->memmap[VIRT_MMIO].base + i * size;
|
||||
|
||||
nodename = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
|
||||
qemu_devtree_add_subnode(vbi->fdt, nodename);
|
||||
qemu_devtree_setprop_string(vbi->fdt, nodename,
|
||||
"compatible", "virtio,mmio");
|
||||
qemu_devtree_setprop_sized_cells(vbi->fdt, nodename, "reg",
|
||||
2, base, 2, size);
|
||||
qemu_devtree_setprop_cells(vbi->fdt, nodename, "interrupts",
|
||||
GIC_FDT_IRQ_TYPE_SPI, irq,
|
||||
GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
||||
qemu_fdt_add_subnode(vbi->fdt, nodename);
|
||||
qemu_fdt_setprop_string(vbi->fdt, nodename,
|
||||
"compatible", "virtio,mmio");
|
||||
qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg",
|
||||
2, base, 2, size);
|
||||
qemu_fdt_setprop_cells(vbi->fdt, nodename, "interrupts",
|
||||
GIC_FDT_IRQ_TYPE_SPI, irq,
|
||||
GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
||||
g_free(nodename);
|
||||
}
|
||||
}
|
||||
|
@ -79,19 +79,19 @@ static int microblaze_load_dtb(hwaddr addr,
|
||||
}
|
||||
|
||||
if (kernel_cmdline) {
|
||||
r = qemu_devtree_setprop_string(fdt, "/chosen", "bootargs",
|
||||
kernel_cmdline);
|
||||
r = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs",
|
||||
kernel_cmdline);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "couldn't set /chosen/bootargs\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (initrd_start) {
|
||||
qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
initrd_start);
|
||||
qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
initrd_start);
|
||||
|
||||
qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
initrd_end);
|
||||
qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
initrd_end);
|
||||
}
|
||||
|
||||
cpu_physical_memory_write(addr, fdt, fdt_size);
|
||||
|
213
hw/ppc/e500.c
213
hw/ppc/e500.c
@ -108,18 +108,18 @@ static void dt_serial_create(void *fdt, unsigned long long offset,
|
||||
char ser[128];
|
||||
|
||||
snprintf(ser, sizeof(ser), "%s/serial@%llx", soc, offset);
|
||||
qemu_devtree_add_subnode(fdt, ser);
|
||||
qemu_devtree_setprop_string(fdt, ser, "device_type", "serial");
|
||||
qemu_devtree_setprop_string(fdt, ser, "compatible", "ns16550");
|
||||
qemu_devtree_setprop_cells(fdt, ser, "reg", offset, 0x100);
|
||||
qemu_devtree_setprop_cell(fdt, ser, "cell-index", idx);
|
||||
qemu_devtree_setprop_cell(fdt, ser, "clock-frequency", 0);
|
||||
qemu_devtree_setprop_cells(fdt, ser, "interrupts", 42, 2);
|
||||
qemu_devtree_setprop_phandle(fdt, ser, "interrupt-parent", mpic);
|
||||
qemu_devtree_setprop_string(fdt, "/aliases", alias, ser);
|
||||
qemu_fdt_add_subnode(fdt, ser);
|
||||
qemu_fdt_setprop_string(fdt, ser, "device_type", "serial");
|
||||
qemu_fdt_setprop_string(fdt, ser, "compatible", "ns16550");
|
||||
qemu_fdt_setprop_cells(fdt, ser, "reg", offset, 0x100);
|
||||
qemu_fdt_setprop_cell(fdt, ser, "cell-index", idx);
|
||||
qemu_fdt_setprop_cell(fdt, ser, "clock-frequency", 0);
|
||||
qemu_fdt_setprop_cells(fdt, ser, "interrupts", 42, 2);
|
||||
qemu_fdt_setprop_phandle(fdt, ser, "interrupt-parent", mpic);
|
||||
qemu_fdt_setprop_string(fdt, "/aliases", alias, ser);
|
||||
|
||||
if (defcon) {
|
||||
qemu_devtree_setprop_string(fdt, "/chosen", "linux,stdout-path", ser);
|
||||
qemu_fdt_setprop_string(fdt, "/chosen", "linux,stdout-path", ser);
|
||||
}
|
||||
}
|
||||
|
||||
@ -183,30 +183,30 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs *args,
|
||||
}
|
||||
|
||||
/* Manipulate device tree in memory. */
|
||||
qemu_devtree_setprop_cell(fdt, "/", "#address-cells", 2);
|
||||
qemu_devtree_setprop_cell(fdt, "/", "#size-cells", 2);
|
||||
qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 2);
|
||||
qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 2);
|
||||
|
||||
qemu_devtree_add_subnode(fdt, "/memory");
|
||||
qemu_devtree_setprop_string(fdt, "/memory", "device_type", "memory");
|
||||
qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property,
|
||||
sizeof(mem_reg_property));
|
||||
qemu_fdt_add_subnode(fdt, "/memory");
|
||||
qemu_fdt_setprop_string(fdt, "/memory", "device_type", "memory");
|
||||
qemu_fdt_setprop(fdt, "/memory", "reg", mem_reg_property,
|
||||
sizeof(mem_reg_property));
|
||||
|
||||
qemu_devtree_add_subnode(fdt, "/chosen");
|
||||
qemu_fdt_add_subnode(fdt, "/chosen");
|
||||
if (initrd_size) {
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
initrd_base);
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
initrd_base);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n");
|
||||
}
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
(initrd_base + initrd_size));
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
(initrd_base + initrd_size));
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n");
|
||||
}
|
||||
}
|
||||
|
||||
ret = qemu_devtree_setprop_string(fdt, "/chosen", "bootargs",
|
||||
ret = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs",
|
||||
args->kernel_cmdline);
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "couldn't set /chosen/bootargs\n");
|
||||
@ -217,22 +217,22 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs *args,
|
||||
tb_freq = kvmppc_get_tbfreq();
|
||||
|
||||
/* indicate KVM hypercall interface */
|
||||
qemu_devtree_add_subnode(fdt, "/hypervisor");
|
||||
qemu_devtree_setprop_string(fdt, "/hypervisor", "compatible",
|
||||
"linux,kvm");
|
||||
qemu_fdt_add_subnode(fdt, "/hypervisor");
|
||||
qemu_fdt_setprop_string(fdt, "/hypervisor", "compatible",
|
||||
"linux,kvm");
|
||||
kvmppc_get_hypercall(env, hypercall, sizeof(hypercall));
|
||||
qemu_devtree_setprop(fdt, "/hypervisor", "hcall-instructions",
|
||||
hypercall, sizeof(hypercall));
|
||||
qemu_fdt_setprop(fdt, "/hypervisor", "hcall-instructions",
|
||||
hypercall, sizeof(hypercall));
|
||||
/* if KVM supports the idle hcall, set property indicating this */
|
||||
if (kvmppc_get_hasidle(env)) {
|
||||
qemu_devtree_setprop(fdt, "/hypervisor", "has-idle", NULL, 0);
|
||||
qemu_fdt_setprop(fdt, "/hypervisor", "has-idle", NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create CPU nodes */
|
||||
qemu_devtree_add_subnode(fdt, "/cpus");
|
||||
qemu_devtree_setprop_cell(fdt, "/cpus", "#address-cells", 1);
|
||||
qemu_devtree_setprop_cell(fdt, "/cpus", "#size-cells", 0);
|
||||
qemu_fdt_add_subnode(fdt, "/cpus");
|
||||
qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 1);
|
||||
qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0);
|
||||
|
||||
/* We need to generate the cpu nodes in reverse order, so Linux can pick
|
||||
the first node as boot node and be happy */
|
||||
@ -249,55 +249,56 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs *args,
|
||||
|
||||
snprintf(cpu_name, sizeof(cpu_name), "/cpus/PowerPC,8544@%x",
|
||||
cpu->cpu_index);
|
||||
qemu_devtree_add_subnode(fdt, cpu_name);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "clock-frequency", clock_freq);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "timebase-frequency", tb_freq);
|
||||
qemu_devtree_setprop_string(fdt, cpu_name, "device_type", "cpu");
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "reg", cpu->cpu_index);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "d-cache-line-size",
|
||||
env->dcache_line_size);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "i-cache-line-size",
|
||||
env->icache_line_size);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "d-cache-size", 0x8000);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "i-cache-size", 0x8000);
|
||||
qemu_devtree_setprop_cell(fdt, cpu_name, "bus-frequency", 0);
|
||||
qemu_fdt_add_subnode(fdt, cpu_name);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "clock-frequency", clock_freq);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "timebase-frequency", tb_freq);
|
||||
qemu_fdt_setprop_string(fdt, cpu_name, "device_type", "cpu");
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "reg", cpu->cpu_index);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "d-cache-line-size",
|
||||
env->dcache_line_size);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "i-cache-line-size",
|
||||
env->icache_line_size);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "d-cache-size", 0x8000);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "i-cache-size", 0x8000);
|
||||
qemu_fdt_setprop_cell(fdt, cpu_name, "bus-frequency", 0);
|
||||
if (cpu->cpu_index) {
|
||||
qemu_devtree_setprop_string(fdt, cpu_name, "status", "disabled");
|
||||
qemu_devtree_setprop_string(fdt, cpu_name, "enable-method", "spin-table");
|
||||
qemu_devtree_setprop_u64(fdt, cpu_name, "cpu-release-addr",
|
||||
cpu_release_addr);
|
||||
qemu_fdt_setprop_string(fdt, cpu_name, "status", "disabled");
|
||||
qemu_fdt_setprop_string(fdt, cpu_name, "enable-method",
|
||||
"spin-table");
|
||||
qemu_fdt_setprop_u64(fdt, cpu_name, "cpu-release-addr",
|
||||
cpu_release_addr);
|
||||
} else {
|
||||
qemu_devtree_setprop_string(fdt, cpu_name, "status", "okay");
|
||||
qemu_fdt_setprop_string(fdt, cpu_name, "status", "okay");
|
||||
}
|
||||
}
|
||||
|
||||
qemu_devtree_add_subnode(fdt, "/aliases");
|
||||
qemu_fdt_add_subnode(fdt, "/aliases");
|
||||
/* XXX These should go into their respective devices' code */
|
||||
snprintf(soc, sizeof(soc), "/soc@%llx", MPC8544_CCSRBAR_BASE);
|
||||
qemu_devtree_add_subnode(fdt, soc);
|
||||
qemu_devtree_setprop_string(fdt, soc, "device_type", "soc");
|
||||
qemu_devtree_setprop(fdt, soc, "compatible", compatible_sb,
|
||||
sizeof(compatible_sb));
|
||||
qemu_devtree_setprop_cell(fdt, soc, "#address-cells", 1);
|
||||
qemu_devtree_setprop_cell(fdt, soc, "#size-cells", 1);
|
||||
qemu_devtree_setprop_cells(fdt, soc, "ranges", 0x0,
|
||||
MPC8544_CCSRBAR_BASE >> 32, MPC8544_CCSRBAR_BASE,
|
||||
MPC8544_CCSRBAR_SIZE);
|
||||
qemu_fdt_add_subnode(fdt, soc);
|
||||
qemu_fdt_setprop_string(fdt, soc, "device_type", "soc");
|
||||
qemu_fdt_setprop(fdt, soc, "compatible", compatible_sb,
|
||||
sizeof(compatible_sb));
|
||||
qemu_fdt_setprop_cell(fdt, soc, "#address-cells", 1);
|
||||
qemu_fdt_setprop_cell(fdt, soc, "#size-cells", 1);
|
||||
qemu_fdt_setprop_cells(fdt, soc, "ranges", 0x0,
|
||||
MPC8544_CCSRBAR_BASE >> 32, MPC8544_CCSRBAR_BASE,
|
||||
MPC8544_CCSRBAR_SIZE);
|
||||
/* XXX should contain a reasonable value */
|
||||
qemu_devtree_setprop_cell(fdt, soc, "bus-frequency", 0);
|
||||
qemu_fdt_setprop_cell(fdt, soc, "bus-frequency", 0);
|
||||
|
||||
snprintf(mpic, sizeof(mpic), "%s/pic@%llx", soc, MPC8544_MPIC_REGS_OFFSET);
|
||||
qemu_devtree_add_subnode(fdt, mpic);
|
||||
qemu_devtree_setprop_string(fdt, mpic, "device_type", "open-pic");
|
||||
qemu_devtree_setprop_string(fdt, mpic, "compatible", "fsl,mpic");
|
||||
qemu_devtree_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_OFFSET,
|
||||
0x40000);
|
||||
qemu_devtree_setprop_cell(fdt, mpic, "#address-cells", 0);
|
||||
qemu_devtree_setprop_cell(fdt, mpic, "#interrupt-cells", 2);
|
||||
mpic_ph = qemu_devtree_alloc_phandle(fdt);
|
||||
qemu_devtree_setprop_cell(fdt, mpic, "phandle", mpic_ph);
|
||||
qemu_devtree_setprop_cell(fdt, mpic, "linux,phandle", mpic_ph);
|
||||
qemu_devtree_setprop(fdt, mpic, "interrupt-controller", NULL, 0);
|
||||
qemu_fdt_add_subnode(fdt, mpic);
|
||||
qemu_fdt_setprop_string(fdt, mpic, "device_type", "open-pic");
|
||||
qemu_fdt_setprop_string(fdt, mpic, "compatible", "fsl,mpic");
|
||||
qemu_fdt_setprop_cells(fdt, mpic, "reg", MPC8544_MPIC_REGS_OFFSET,
|
||||
0x40000);
|
||||
qemu_fdt_setprop_cell(fdt, mpic, "#address-cells", 0);
|
||||
qemu_fdt_setprop_cell(fdt, mpic, "#interrupt-cells", 2);
|
||||
mpic_ph = qemu_fdt_alloc_phandle(fdt);
|
||||
qemu_fdt_setprop_cell(fdt, mpic, "phandle", mpic_ph);
|
||||
qemu_fdt_setprop_cell(fdt, mpic, "linux,phandle", mpic_ph);
|
||||
qemu_fdt_setprop(fdt, mpic, "interrupt-controller", NULL, 0);
|
||||
|
||||
/*
|
||||
* We have to generate ser1 first, because Linux takes the first
|
||||
@ -311,19 +312,19 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs *args,
|
||||
|
||||
snprintf(gutil, sizeof(gutil), "%s/global-utilities@%llx", soc,
|
||||
MPC8544_UTIL_OFFSET);
|
||||
qemu_devtree_add_subnode(fdt, gutil);
|
||||
qemu_devtree_setprop_string(fdt, gutil, "compatible", "fsl,mpc8544-guts");
|
||||
qemu_devtree_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_OFFSET, 0x1000);
|
||||
qemu_devtree_setprop(fdt, gutil, "fsl,has-rstcr", NULL, 0);
|
||||
qemu_fdt_add_subnode(fdt, gutil);
|
||||
qemu_fdt_setprop_string(fdt, gutil, "compatible", "fsl,mpc8544-guts");
|
||||
qemu_fdt_setprop_cells(fdt, gutil, "reg", MPC8544_UTIL_OFFSET, 0x1000);
|
||||
qemu_fdt_setprop(fdt, gutil, "fsl,has-rstcr", NULL, 0);
|
||||
|
||||
snprintf(msi, sizeof(msi), "/%s/msi@%llx", soc, MPC8544_MSI_REGS_OFFSET);
|
||||
qemu_devtree_add_subnode(fdt, msi);
|
||||
qemu_devtree_setprop_string(fdt, msi, "compatible", "fsl,mpic-msi");
|
||||
qemu_devtree_setprop_cells(fdt, msi, "reg", MPC8544_MSI_REGS_OFFSET, 0x200);
|
||||
msi_ph = qemu_devtree_alloc_phandle(fdt);
|
||||
qemu_devtree_setprop_cells(fdt, msi, "msi-available-ranges", 0x0, 0x100);
|
||||
qemu_devtree_setprop_phandle(fdt, msi, "interrupt-parent", mpic);
|
||||
qemu_devtree_setprop_cells(fdt, msi, "interrupts",
|
||||
qemu_fdt_add_subnode(fdt, msi);
|
||||
qemu_fdt_setprop_string(fdt, msi, "compatible", "fsl,mpic-msi");
|
||||
qemu_fdt_setprop_cells(fdt, msi, "reg", MPC8544_MSI_REGS_OFFSET, 0x200);
|
||||
msi_ph = qemu_fdt_alloc_phandle(fdt);
|
||||
qemu_fdt_setprop_cells(fdt, msi, "msi-available-ranges", 0x0, 0x100);
|
||||
qemu_fdt_setprop_phandle(fdt, msi, "interrupt-parent", mpic);
|
||||
qemu_fdt_setprop_cells(fdt, msi, "interrupts",
|
||||
0xe0, 0x0,
|
||||
0xe1, 0x0,
|
||||
0xe2, 0x0,
|
||||
@ -332,46 +333,46 @@ static int ppce500_load_device_tree(QEMUMachineInitArgs *args,
|
||||
0xe5, 0x0,
|
||||
0xe6, 0x0,
|
||||
0xe7, 0x0);
|
||||
qemu_devtree_setprop_cell(fdt, msi, "phandle", msi_ph);
|
||||
qemu_devtree_setprop_cell(fdt, msi, "linux,phandle", msi_ph);
|
||||
qemu_fdt_setprop_cell(fdt, msi, "phandle", msi_ph);
|
||||
qemu_fdt_setprop_cell(fdt, msi, "linux,phandle", msi_ph);
|
||||
|
||||
snprintf(pci, sizeof(pci), "/pci@%llx", MPC8544_PCI_REGS_BASE);
|
||||
qemu_devtree_add_subnode(fdt, pci);
|
||||
qemu_devtree_setprop_cell(fdt, pci, "cell-index", 0);
|
||||
qemu_devtree_setprop_string(fdt, pci, "compatible", "fsl,mpc8540-pci");
|
||||
qemu_devtree_setprop_string(fdt, pci, "device_type", "pci");
|
||||
qemu_devtree_setprop_cells(fdt, pci, "interrupt-map-mask", 0xf800, 0x0,
|
||||
0x0, 0x7);
|
||||
pci_map = pci_map_create(fdt, qemu_devtree_get_phandle(fdt, mpic),
|
||||
qemu_fdt_add_subnode(fdt, pci);
|
||||
qemu_fdt_setprop_cell(fdt, pci, "cell-index", 0);
|
||||
qemu_fdt_setprop_string(fdt, pci, "compatible", "fsl,mpc8540-pci");
|
||||
qemu_fdt_setprop_string(fdt, pci, "device_type", "pci");
|
||||
qemu_fdt_setprop_cells(fdt, pci, "interrupt-map-mask", 0xf800, 0x0,
|
||||
0x0, 0x7);
|
||||
pci_map = pci_map_create(fdt, qemu_fdt_get_phandle(fdt, mpic),
|
||||
params->pci_first_slot, params->pci_nr_slots,
|
||||
&len);
|
||||
qemu_devtree_setprop(fdt, pci, "interrupt-map", pci_map, len);
|
||||
qemu_devtree_setprop_phandle(fdt, pci, "interrupt-parent", mpic);
|
||||
qemu_devtree_setprop_cells(fdt, pci, "interrupts", 24, 2);
|
||||
qemu_devtree_setprop_cells(fdt, pci, "bus-range", 0, 255);
|
||||
qemu_fdt_setprop(fdt, pci, "interrupt-map", pci_map, len);
|
||||
qemu_fdt_setprop_phandle(fdt, pci, "interrupt-parent", mpic);
|
||||
qemu_fdt_setprop_cells(fdt, pci, "interrupts", 24, 2);
|
||||
qemu_fdt_setprop_cells(fdt, pci, "bus-range", 0, 255);
|
||||
for (i = 0; i < 14; i++) {
|
||||
pci_ranges[i] = cpu_to_be32(pci_ranges[i]);
|
||||
}
|
||||
qemu_devtree_setprop_cell(fdt, pci, "fsl,msi", msi_ph);
|
||||
qemu_devtree_setprop(fdt, pci, "ranges", pci_ranges, sizeof(pci_ranges));
|
||||
qemu_devtree_setprop_cells(fdt, pci, "reg", MPC8544_PCI_REGS_BASE >> 32,
|
||||
MPC8544_PCI_REGS_BASE, 0, 0x1000);
|
||||
qemu_devtree_setprop_cell(fdt, pci, "clock-frequency", 66666666);
|
||||
qemu_devtree_setprop_cell(fdt, pci, "#interrupt-cells", 1);
|
||||
qemu_devtree_setprop_cell(fdt, pci, "#size-cells", 2);
|
||||
qemu_devtree_setprop_cell(fdt, pci, "#address-cells", 3);
|
||||
qemu_devtree_setprop_string(fdt, "/aliases", "pci0", pci);
|
||||
qemu_fdt_setprop_cell(fdt, pci, "fsl,msi", msi_ph);
|
||||
qemu_fdt_setprop(fdt, pci, "ranges", pci_ranges, sizeof(pci_ranges));
|
||||
qemu_fdt_setprop_cells(fdt, pci, "reg", MPC8544_PCI_REGS_BASE >> 32,
|
||||
MPC8544_PCI_REGS_BASE, 0, 0x1000);
|
||||
qemu_fdt_setprop_cell(fdt, pci, "clock-frequency", 66666666);
|
||||
qemu_fdt_setprop_cell(fdt, pci, "#interrupt-cells", 1);
|
||||
qemu_fdt_setprop_cell(fdt, pci, "#size-cells", 2);
|
||||
qemu_fdt_setprop_cell(fdt, pci, "#address-cells", 3);
|
||||
qemu_fdt_setprop_string(fdt, "/aliases", "pci0", pci);
|
||||
|
||||
params->fixup_devtree(params, fdt);
|
||||
|
||||
if (toplevel_compat) {
|
||||
qemu_devtree_setprop(fdt, "/", "compatible", toplevel_compat,
|
||||
strlen(toplevel_compat) + 1);
|
||||
qemu_fdt_setprop(fdt, "/", "compatible", toplevel_compat,
|
||||
strlen(toplevel_compat) + 1);
|
||||
}
|
||||
|
||||
done:
|
||||
if (!dry_run) {
|
||||
qemu_devtree_dumpdtb(fdt, fdt_size);
|
||||
qemu_fdt_dumpdtb(fdt, fdt_size);
|
||||
cpu_physical_memory_write(addr, fdt, fdt_size);
|
||||
}
|
||||
ret = fdt_size;
|
||||
|
@ -23,9 +23,9 @@ static void e500plat_fixup_devtree(PPCE500Params *params, void *fdt)
|
||||
const char model[] = "QEMU ppce500";
|
||||
const char compatible[] = "fsl,qemu-e500";
|
||||
|
||||
qemu_devtree_setprop(fdt, "/", "model", model, sizeof(model));
|
||||
qemu_devtree_setprop(fdt, "/", "compatible", compatible,
|
||||
sizeof(compatible));
|
||||
qemu_fdt_setprop(fdt, "/", "model", model, sizeof(model));
|
||||
qemu_fdt_setprop(fdt, "/", "compatible", compatible,
|
||||
sizeof(compatible));
|
||||
}
|
||||
|
||||
static void e500plat_init(QEMUMachineInitArgs *args)
|
||||
|
@ -21,9 +21,9 @@ static void mpc8544ds_fixup_devtree(PPCE500Params *params, void *fdt)
|
||||
const char model[] = "MPC8544DS";
|
||||
const char compatible[] = "MPC8544DS\0MPC85xxDS";
|
||||
|
||||
qemu_devtree_setprop(fdt, "/", "model", model, sizeof(model));
|
||||
qemu_devtree_setprop(fdt, "/", "compatible", compatible,
|
||||
sizeof(compatible));
|
||||
qemu_fdt_setprop(fdt, "/", "model", model, sizeof(model));
|
||||
qemu_fdt_setprop(fdt, "/", "compatible", compatible,
|
||||
sizeof(compatible));
|
||||
}
|
||||
|
||||
static void mpc8544ds_init(QEMUMachineInitArgs *args)
|
||||
|
@ -77,23 +77,23 @@ static int bamboo_load_device_tree(hwaddr addr,
|
||||
|
||||
/* Manipulate device tree in memory. */
|
||||
|
||||
ret = qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property,
|
||||
sizeof(mem_reg_property));
|
||||
ret = qemu_fdt_setprop(fdt, "/memory", "reg", mem_reg_property,
|
||||
sizeof(mem_reg_property));
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "couldn't set /memory/reg\n");
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
initrd_base);
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start",
|
||||
initrd_base);
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n");
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
(initrd_base + initrd_size));
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end",
|
||||
(initrd_base + initrd_size));
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n");
|
||||
|
||||
ret = qemu_devtree_setprop_string(fdt, "/chosen", "bootargs",
|
||||
kernel_cmdline);
|
||||
ret = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs",
|
||||
kernel_cmdline);
|
||||
if (ret < 0)
|
||||
fprintf(stderr, "couldn't set /chosen/bootargs\n");
|
||||
|
||||
@ -105,10 +105,10 @@ static int bamboo_load_device_tree(hwaddr addr,
|
||||
clock_freq = kvmppc_get_clockfreq();
|
||||
}
|
||||
|
||||
qemu_devtree_setprop_cell(fdt, "/cpus/cpu@0", "clock-frequency",
|
||||
clock_freq);
|
||||
qemu_devtree_setprop_cell(fdt, "/cpus/cpu@0", "timebase-frequency",
|
||||
tb_freq);
|
||||
qemu_fdt_setprop_cell(fdt, "/cpus/cpu@0", "clock-frequency",
|
||||
clock_freq);
|
||||
qemu_fdt_setprop_cell(fdt, "/cpus/cpu@0", "timebase-frequency",
|
||||
tb_freq);
|
||||
|
||||
rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr);
|
||||
g_free(fdt);
|
||||
|
@ -334,24 +334,24 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr,
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/rtas", "linux,rtas-base",
|
||||
rtas_addr);
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/rtas", "linux,rtas-base",
|
||||
rtas_addr);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Couldn't add linux,rtas-base property: %s\n",
|
||||
fdt_strerror(ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/rtas", "linux,rtas-entry",
|
||||
rtas_addr);
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/rtas", "linux,rtas-entry",
|
||||
rtas_addr);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Couldn't add linux,rtas-entry property: %s\n",
|
||||
fdt_strerror(ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/rtas", "rtas-size",
|
||||
rtas_size);
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/rtas", "rtas-size",
|
||||
rtas_size);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Couldn't add rtas-size property: %s\n",
|
||||
fdt_strerror(ret));
|
||||
@ -365,8 +365,8 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr,
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = qemu_devtree_setprop_cell(fdt, "/rtas", call->name,
|
||||
i + TOKEN_BASE);
|
||||
ret = qemu_fdt_setprop_cell(fdt, "/rtas", call->name,
|
||||
i + TOKEN_BASE);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Couldn't add rtas token for %s: %s\n",
|
||||
call->name, fdt_strerror(ret));
|
||||
|
@ -166,7 +166,7 @@ static int xilinx_load_device_tree(hwaddr addr,
|
||||
if (!fdt) {
|
||||
return 0;
|
||||
}
|
||||
r = qemu_devtree_setprop_string(fdt, "/chosen", "bootargs", kernel_cmdline);
|
||||
r = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", kernel_cmdline);
|
||||
if (r < 0)
|
||||
fprintf(stderr, "couldn't set /chosen/bootargs\n");
|
||||
cpu_physical_memory_write(addr, fdt, fdt_size);
|
||||
|
@ -17,27 +17,27 @@
|
||||
void *create_device_tree(int *sizep);
|
||||
void *load_device_tree(const char *filename_path, int *sizep);
|
||||
|
||||
int qemu_devtree_setprop(void *fdt, const char *node_path,
|
||||
const char *property, const void *val_array, int size);
|
||||
int qemu_devtree_setprop_cell(void *fdt, const char *node_path,
|
||||
const char *property, uint32_t val);
|
||||
int qemu_devtree_setprop_u64(void *fdt, const char *node_path,
|
||||
const char *property, uint64_t val);
|
||||
int qemu_devtree_setprop_string(void *fdt, const char *node_path,
|
||||
const char *property, const char *string);
|
||||
int qemu_devtree_setprop_phandle(void *fdt, const char *node_path,
|
||||
const char *property,
|
||||
const char *target_node_path);
|
||||
const void *qemu_devtree_getprop(void *fdt, const char *node_path,
|
||||
const char *property, int *lenp);
|
||||
uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path,
|
||||
const char *property);
|
||||
uint32_t qemu_devtree_get_phandle(void *fdt, const char *path);
|
||||
uint32_t qemu_devtree_alloc_phandle(void *fdt);
|
||||
int qemu_devtree_nop_node(void *fdt, const char *node_path);
|
||||
int qemu_devtree_add_subnode(void *fdt, const char *name);
|
||||
int qemu_fdt_setprop(void *fdt, const char *node_path,
|
||||
const char *property, const void *val_array, int size);
|
||||
int qemu_fdt_setprop_cell(void *fdt, const char *node_path,
|
||||
const char *property, uint32_t val);
|
||||
int qemu_fdt_setprop_u64(void *fdt, const char *node_path,
|
||||
const char *property, uint64_t val);
|
||||
int qemu_fdt_setprop_string(void *fdt, const char *node_path,
|
||||
const char *property, const char *string);
|
||||
int qemu_fdt_setprop_phandle(void *fdt, const char *node_path,
|
||||
const char *property,
|
||||
const char *target_node_path);
|
||||
const void *qemu_fdt_getprop(void *fdt, const char *node_path,
|
||||
const char *property, int *lenp);
|
||||
uint32_t qemu_fdt_getprop_cell(void *fdt, const char *node_path,
|
||||
const char *property);
|
||||
uint32_t qemu_fdt_get_phandle(void *fdt, const char *path);
|
||||
uint32_t qemu_fdt_alloc_phandle(void *fdt);
|
||||
int qemu_fdt_nop_node(void *fdt, const char *node_path);
|
||||
int qemu_fdt_add_subnode(void *fdt, const char *name);
|
||||
|
||||
#define qemu_devtree_setprop_cells(fdt, node_path, property, ...) \
|
||||
#define qemu_fdt_setprop_cells(fdt, node_path, property, ...) \
|
||||
do { \
|
||||
uint32_t qdt_tmp[] = { __VA_ARGS__ }; \
|
||||
int i; \
|
||||
@ -45,14 +45,14 @@ int qemu_devtree_add_subnode(void *fdt, const char *name);
|
||||
for (i = 0; i < ARRAY_SIZE(qdt_tmp); i++) { \
|
||||
qdt_tmp[i] = cpu_to_be32(qdt_tmp[i]); \
|
||||
} \
|
||||
qemu_devtree_setprop(fdt, node_path, property, qdt_tmp, \
|
||||
sizeof(qdt_tmp)); \
|
||||
qemu_fdt_setprop(fdt, node_path, property, qdt_tmp, \
|
||||
sizeof(qdt_tmp)); \
|
||||
} while (0)
|
||||
|
||||
void qemu_devtree_dumpdtb(void *fdt, int size);
|
||||
void qemu_fdt_dumpdtb(void *fdt, int size);
|
||||
|
||||
/**
|
||||
* qemu_devtree_setprop_sized_cells_from_array:
|
||||
* qemu_fdt_setprop_sized_cells_from_array:
|
||||
* @fdt: device tree blob
|
||||
* @node_path: node to set property on
|
||||
* @property: property to set
|
||||
@ -72,20 +72,20 @@ void qemu_devtree_dumpdtb(void *fdt, int size);
|
||||
* the number of cells used for each element vary depending on the
|
||||
* #address-cells and #size-cells properties of their parent node.
|
||||
* If you know all your cell elements are one cell wide you can use the
|
||||
* simpler qemu_devtree_setprop_cells(). If you're not setting up the
|
||||
* array programmatically, qemu_devtree_setprop_sized_cells may be more
|
||||
* simpler qemu_fdt_setprop_cells(). If you're not setting up the
|
||||
* array programmatically, qemu_fdt_setprop_sized_cells may be more
|
||||
* convenient.
|
||||
*
|
||||
* Return value: 0 on success, <0 on error.
|
||||
*/
|
||||
int qemu_devtree_setprop_sized_cells_from_array(void *fdt,
|
||||
const char *node_path,
|
||||
const char *property,
|
||||
int numvalues,
|
||||
uint64_t *values);
|
||||
int qemu_fdt_setprop_sized_cells_from_array(void *fdt,
|
||||
const char *node_path,
|
||||
const char *property,
|
||||
int numvalues,
|
||||
uint64_t *values);
|
||||
|
||||
/**
|
||||
* qemu_devtree_setprop_sized_cells:
|
||||
* qemu_fdt_setprop_sized_cells:
|
||||
* @fdt: device tree blob
|
||||
* @node_path: node to set property on
|
||||
* @property: property to set
|
||||
@ -97,17 +97,17 @@ int qemu_devtree_setprop_sized_cells_from_array(void *fdt,
|
||||
* used by this value" and "value".
|
||||
*
|
||||
* This is a convenience wrapper for the function
|
||||
* qemu_devtree_setprop_sized_cells_from_array().
|
||||
* qemu_fdt_setprop_sized_cells_from_array().
|
||||
*
|
||||
* Return value: 0 on success, <0 on error.
|
||||
*/
|
||||
#define qemu_devtree_setprop_sized_cells(fdt, node_path, property, ...) \
|
||||
({ \
|
||||
uint64_t qdt_tmp[] = { __VA_ARGS__ }; \
|
||||
qemu_devtree_setprop_sized_cells_from_array(fdt, node_path, \
|
||||
property, \
|
||||
ARRAY_SIZE(qdt_tmp) / 2, \
|
||||
qdt_tmp); \
|
||||
#define qemu_fdt_setprop_sized_cells(fdt, node_path, property, ...) \
|
||||
({ \
|
||||
uint64_t qdt_tmp[] = { __VA_ARGS__ }; \
|
||||
qemu_fdt_setprop_sized_cells_from_array(fdt, node_path, \
|
||||
property, \
|
||||
ARRAY_SIZE(qdt_tmp) / 2, \
|
||||
qdt_tmp); \
|
||||
})
|
||||
|
||||
#endif /* __DEVICE_TREE_H__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user