common: fdt_support: Check mtdparts cell size
When using fdt_fixup_mtdparts() offset and length cell sizes are limited to 4 bytes (1 cell). However if the mtd device is bigger then 4GiB, then #address-cells and #size-cells are 8 bytes (2 cells) [1]. This patch read #size-cells and uses either fdt32_t or fdt64_t cell size. The default is fdt32_t. [1] Documentation/devicetree/bindings/mtd/partition.txt Signed-off-by: Stefan Mavrodiev <stefan@olimex.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
3bf2f15351
commit
3a9a62a18e
@ -722,11 +722,6 @@ int fdt_increase_size(void *fdt, int add_len)
|
||||
#include <jffs2/load_kernel.h>
|
||||
#include <mtd_node.h>
|
||||
|
||||
struct reg_cell {
|
||||
unsigned int r0;
|
||||
unsigned int r1;
|
||||
};
|
||||
|
||||
static int fdt_del_subnodes(const void *blob, int parent_offset)
|
||||
{
|
||||
int off, ndepth;
|
||||
@ -785,15 +780,22 @@ int fdt_node_set_part_info(void *blob, int parent_offset,
|
||||
{
|
||||
struct list_head *pentry;
|
||||
struct part_info *part;
|
||||
struct reg_cell cell;
|
||||
int off, ndepth = 0;
|
||||
int part_num, ret;
|
||||
int sizecell;
|
||||
char buf[64];
|
||||
|
||||
ret = fdt_del_partitions(blob, parent_offset);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Check if size/address is 1 or 2 cells.
|
||||
* We assume #address-cells and #size-cells have same value.
|
||||
*/
|
||||
sizecell = fdt_getprop_u32_default_node(blob, parent_offset,
|
||||
0, "#size-cells", 1);
|
||||
|
||||
/*
|
||||
* Check if it is nand {}; subnode, adjust
|
||||
* the offset in this case
|
||||
@ -842,10 +844,21 @@ add_ro:
|
||||
goto err_prop;
|
||||
}
|
||||
|
||||
cell.r0 = cpu_to_fdt32(part->offset);
|
||||
cell.r1 = cpu_to_fdt32(part->size);
|
||||
add_reg:
|
||||
ret = fdt_setprop(blob, newoff, "reg", &cell, sizeof(cell));
|
||||
if (sizecell == 2) {
|
||||
ret = fdt_setprop_u64(blob, newoff,
|
||||
"reg", part->offset);
|
||||
if (!ret)
|
||||
ret = fdt_appendprop_u64(blob, newoff,
|
||||
"reg", part->size);
|
||||
} else {
|
||||
ret = fdt_setprop_u32(blob, newoff,
|
||||
"reg", part->offset);
|
||||
if (!ret)
|
||||
ret = fdt_appendprop_u32(blob, newoff,
|
||||
"reg", part->size);
|
||||
}
|
||||
|
||||
if (ret == -FDT_ERR_NOSPACE) {
|
||||
ret = fdt_increase_size(blob, 512);
|
||||
if (!ret)
|
||||
|
Loading…
Reference in New Issue
Block a user