Message ID | 1341507652-22155-6-git-send-email-peter.maydell@linaro.org |
---|---|
State | Superseded |
Headers | show |
On Thu, Jul 5, 2012 at 5:00 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > Support the case where the device tree blob specifies that > #address-cells and #size-cells are greater than 1. (This > is needed for device trees which can handle 64 bit physical > addresses and thus total RAM sizes over 4GB.) > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> > --- > hw/arm_boot.c | 36 +++++++++++++++++++++++++++++++++--- > 1 files changed, 33 insertions(+), 3 deletions(-) > > diff --git a/hw/arm_boot.c b/hw/arm_boot.c > index 7366427..8203422 100644 > --- a/hw/arm_boot.c > +++ b/hw/arm_boot.c > @@ -216,11 +216,12 @@ static void set_kernel_args_old(const struct arm_boot_info *info) > static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) > { > #ifdef CONFIG_FDT > - uint32_t mem_reg_property[] = { cpu_to_be32(binfo->loader_start), > - cpu_to_be32(binfo->ram_size) }; > + uint32_t *mem_reg_property; > + uint32_t mem_reg_propsize; > void *fdt = NULL; > char *filename; > int size, rc; > + uint32_t acells, scells, hival; > > filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, binfo->dtb_filename); > if (!filename) { > @@ -236,8 +237,37 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) > } > g_free(filename); > > + acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells"); > + scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells"); > + printf("fdt: acells %d scells %d\n", acells, scells); Leftover debugging? > + if (acells == 0 || scells == 0) { > + fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); > + return -1; > + } > + > + mem_reg_propsize = acells + scells; > + mem_reg_property = g_new0(uint32_t, mem_reg_propsize); > + mem_reg_property[acells - 1] = cpu_to_be32(binfo->loader_start); > + hival = cpu_to_be32(binfo->loader_start >> 32); > + if (acells > 1) { > + mem_reg_property[acells - 2] = hival; > + } else if (hival != 0) { > + fprintf(stderr, "qemu: dtb file not compatible with " > + "RAM start address > 4GB\n"); > + exit(1); > + } > + mem_reg_property[acells + scells - 1] = cpu_to_be32(binfo->ram_size); > + hival = cpu_to_be32(binfo->ram_size >> 32); > + if (scells > 1) { > + mem_reg_property[acells + scells - 2] = hival; > + } else if (hival != 0) { > + fprintf(stderr, "qemu: dtb file not compatible with " > + "RAM size > 4GB\n"); > + exit(1); > + } > + > rc = qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property, > - sizeof(mem_reg_property)); > + mem_reg_propsize * sizeof(uint32_t)); > if (rc < 0) { > fprintf(stderr, "couldn't set /memory/reg\n"); > } > -- > 1.7.1 > >
On 5 July 2012 19:53, Blue Swirl <blauwirbel@gmail.com> wrote: > On Thu, Jul 5, 2012 at 5:00 PM, Peter Maydell <peter.maydell@linaro.org> wrote: >> @@ -236,8 +237,37 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) >> } >> g_free(filename); >> >> + acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells"); >> + scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells"); >> + printf("fdt: acells %d scells %d\n", acells, scells); > > Leftover debugging? Doh. Yes, will remove printf in v2. -- PMM
On Fri, Jul 6, 2012 at 3:00 AM, Peter Maydell <peter.maydell@linaro.org> wrote: > Support the case where the device tree blob specifies that > #address-cells and #size-cells are greater than 1. (This > is needed for device trees which can handle 64 bit physical > addresses and thus total RAM sizes over 4GB.) > > Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com> > --- > hw/arm_boot.c | 36 +++++++++++++++++++++++++++++++++--- > 1 files changed, 33 insertions(+), 3 deletions(-) > > diff --git a/hw/arm_boot.c b/hw/arm_boot.c > index 7366427..8203422 100644 > --- a/hw/arm_boot.c > +++ b/hw/arm_boot.c > @@ -216,11 +216,12 @@ static void set_kernel_args_old(const struct arm_boot_info *info) > static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) > { > #ifdef CONFIG_FDT > - uint32_t mem_reg_property[] = { cpu_to_be32(binfo->loader_start), > - cpu_to_be32(binfo->ram_size) }; > + uint32_t *mem_reg_property; > + uint32_t mem_reg_propsize; > void *fdt = NULL; > char *filename; > int size, rc; > + uint32_t acells, scells, hival; > > filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, binfo->dtb_filename); > if (!filename) { > @@ -236,8 +237,37 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) > } > g_free(filename); > > + acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells"); > + scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells"); > + printf("fdt: acells %d scells %d\n", acells, scells); > + if (acells == 0 || scells == 0) { > + fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); > + return -1; > + } > + > + mem_reg_propsize = acells + scells; > + mem_reg_property = g_new0(uint32_t, mem_reg_propsize); > + mem_reg_property[acells - 1] = cpu_to_be32(binfo->loader_start); > + hival = cpu_to_be32(binfo->loader_start >> 32); > + if (acells > 1) { > + mem_reg_property[acells - 2] = hival; > + } else if (hival != 0) { > + fprintf(stderr, "qemu: dtb file not compatible with " > + "RAM start address > 4GB\n"); > + exit(1); > + } > + mem_reg_property[acells + scells - 1] = cpu_to_be32(binfo->ram_size); > + hival = cpu_to_be32(binfo->ram_size >> 32); > + if (scells > 1) { > + mem_reg_property[acells + scells - 2] = hival; > + } else if (hival != 0) { > + fprintf(stderr, "qemu: dtb file not compatible with " > + "RAM size > 4GB\n"); > + exit(1); > + } > + > rc = qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property, > - sizeof(mem_reg_property)); > + mem_reg_propsize * sizeof(uint32_t)); > if (rc < 0) { > fprintf(stderr, "couldn't set /memory/reg\n"); > } > -- > 1.7.1 >
diff --git a/hw/arm_boot.c b/hw/arm_boot.c index 7366427..8203422 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -216,11 +216,12 @@ static void set_kernel_args_old(const struct arm_boot_info *info) static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) { #ifdef CONFIG_FDT - uint32_t mem_reg_property[] = { cpu_to_be32(binfo->loader_start), - cpu_to_be32(binfo->ram_size) }; + uint32_t *mem_reg_property; + uint32_t mem_reg_propsize; void *fdt = NULL; char *filename; int size, rc; + uint32_t acells, scells, hival; filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, binfo->dtb_filename); if (!filename) { @@ -236,8 +237,37 @@ static int load_dtb(target_phys_addr_t addr, const struct arm_boot_info *binfo) } g_free(filename); + acells = qemu_devtree_getprop_cell(fdt, "/", "#address-cells"); + scells = qemu_devtree_getprop_cell(fdt, "/", "#size-cells"); + printf("fdt: acells %d scells %d\n", acells, scells); + if (acells == 0 || scells == 0) { + fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0)\n"); + return -1; + } + + mem_reg_propsize = acells + scells; + mem_reg_property = g_new0(uint32_t, mem_reg_propsize); + mem_reg_property[acells - 1] = cpu_to_be32(binfo->loader_start); + hival = cpu_to_be32(binfo->loader_start >> 32); + if (acells > 1) { + mem_reg_property[acells - 2] = hival; + } else if (hival != 0) { + fprintf(stderr, "qemu: dtb file not compatible with " + "RAM start address > 4GB\n"); + exit(1); + } + mem_reg_property[acells + scells - 1] = cpu_to_be32(binfo->ram_size); + hival = cpu_to_be32(binfo->ram_size >> 32); + if (scells > 1) { + mem_reg_property[acells + scells - 2] = hival; + } else if (hival != 0) { + fprintf(stderr, "qemu: dtb file not compatible with " + "RAM size > 4GB\n"); + exit(1); + } + rc = qemu_devtree_setprop(fdt, "/memory", "reg", mem_reg_property, - sizeof(mem_reg_property)); + mem_reg_propsize * sizeof(uint32_t)); if (rc < 0) { fprintf(stderr, "couldn't set /memory/reg\n"); }
Support the case where the device tree blob specifies that #address-cells and #size-cells are greater than 1. (This is needed for device trees which can handle 64 bit physical addresses and thus total RAM sizes over 4GB.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> --- hw/arm_boot.c | 36 +++++++++++++++++++++++++++++++++--- 1 files changed, 33 insertions(+), 3 deletions(-)