mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-06-09 23:36:03 +09:00
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 <jffs2/load_kernel.h>
|
||||||
#include <mtd_node.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)
|
static int fdt_del_subnodes(const void *blob, int parent_offset)
|
||||||
{
|
{
|
||||||
int off, ndepth;
|
int off, ndepth;
|
||||||
|
@ -785,15 +780,22 @@ int fdt_node_set_part_info(void *blob, int parent_offset,
|
||||||
{
|
{
|
||||||
struct list_head *pentry;
|
struct list_head *pentry;
|
||||||
struct part_info *part;
|
struct part_info *part;
|
||||||
struct reg_cell cell;
|
|
||||||
int off, ndepth = 0;
|
int off, ndepth = 0;
|
||||||
int part_num, ret;
|
int part_num, ret;
|
||||||
|
int sizecell;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
ret = fdt_del_partitions(blob, parent_offset);
|
ret = fdt_del_partitions(blob, parent_offset);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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
|
* Check if it is nand {}; subnode, adjust
|
||||||
* the offset in this case
|
* the offset in this case
|
||||||
|
@ -842,10 +844,21 @@ add_ro:
|
||||||
goto err_prop;
|
goto err_prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
cell.r0 = cpu_to_fdt32(part->offset);
|
|
||||||
cell.r1 = cpu_to_fdt32(part->size);
|
|
||||||
add_reg:
|
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) {
|
if (ret == -FDT_ERR_NOSPACE) {
|
||||||
ret = fdt_increase_size(blob, 512);
|
ret = fdt_increase_size(blob, 512);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user