Browse Source

Add a libfdt function to write a property placeholder

The existing function to add a new property to a tree being built requires
that the entire contents of the new property be passed in. For some
applications it is more convenient to be able to add the property contents
later, perhaps by reading from a file. This avoids double-buffering of the
contents.

Add a new function to support this and adjust the existing fdt_property() to
use it.
Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Simon Glass 8 years ago committed by David Gibson
parent
commit
580a9f6c28
  1. 16
      libfdt/fdt_sw.c
  2. 16
      libfdt/libfdt.h
  3. 1
      tests/include7.dts
  4. 5
      tests/sw_tree1.c
  5. 1
      tests/test_tree1.dts
  6. 1
      tests/test_tree1_label_noderef.dts
  7. 2
      tests/trees.S

16
libfdt/fdt_sw.c

@ -220,7 +220,7 @@ static int _fdt_find_add_string(void *fdt, const char *s) @@ -220,7 +220,7 @@ static int _fdt_find_add_string(void *fdt, const char *s)
return offset;
}

int fdt_property(void *fdt, const char *name, const void *val, int len)
int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
{
struct fdt_property *prop;
int nameoff;
@ -238,7 +238,19 @@ int fdt_property(void *fdt, const char *name, const void *val, int len) @@ -238,7 +238,19 @@ int fdt_property(void *fdt, const char *name, const void *val, int len)
prop->tag = cpu_to_fdt32(FDT_PROP);
prop->nameoff = cpu_to_fdt32(nameoff);
prop->len = cpu_to_fdt32(len);
memcpy(prop->data, val, len);
*valp = prop->data;
return 0;
}

int fdt_property(void *fdt, const char *name, const void *val, int len)
{
void *ptr;
int ret;

ret = fdt_property_placeholder(fdt, name, len, &ptr);
if (ret)
return ret;
memcpy(ptr, val, len);
return 0;
}


16
libfdt/libfdt.h

@ -1314,6 +1314,22 @@ static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val) @@ -1314,6 +1314,22 @@ static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
{
return fdt_property_u32(fdt, name, val);
}

/**
* fdt_property_placeholder - add a new property and return a ptr to its value
*
* @fdt: pointer to the device tree blob
* @name: name of property to add
* @len: length of property value in bytes
* @valp: returns a pointer to where where the value should be placed
*
* returns:
* 0, on success
* -FDT_ERR_BADMAGIC,
* -FDT_ERR_NOSPACE, standard meanings
*/
int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp);

#define fdt_property_string(fdt, name, str) \
fdt_property(fdt, name, str, strlen(str)+1)
int fdt_end_node(void *fdt);

1
tests/include7.dts

@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@

subsubnode {
compatible = "subsubnode1", "subsubnode";
placeholder = "this is a placeholder string", "string2";
prop-int = <0xdeadbeef>;
};


5
tests/sw_tree1.c

@ -85,6 +85,9 @@ int main(int argc, char *argv[]) @@ -85,6 +85,9 @@ int main(int argc, char *argv[])
size_t size;
int err;
bool created = false;
void *place;
const char place_str[] = "this is a placeholder string\0string2";
int place_len = sizeof(place_str);

test_init(argc, argv);

@ -135,6 +138,8 @@ int main(int argc, char *argv[]) @@ -135,6 +138,8 @@ int main(int argc, char *argv[])
CHECK(fdt_begin_node(fdt, "subsubnode"));
CHECK(fdt_property(fdt, "compatible", "subsubnode1\0subsubnode",
23));
CHECK(fdt_property_placeholder(fdt, "placeholder", place_len, &place));
memcpy(place, place_str, place_len);
CHECK(fdt_property_cell(fdt, "prop-int", TEST_VALUE_1));
CHECK(fdt_end_node(fdt));
CHECK(fdt_begin_node(fdt, "ss1"));

1
tests/test_tree1.dts

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@

subsubnode {
compatible = "subsubnode1", "subsubnode";
placeholder = "this is a placeholder string", "string2";
prop-int = <0xdeadbeef>;
};


1
tests/test_tree1_label_noderef.dts

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@

subsubnode {
compatible = "subsubnode1", "subsubnode";
placeholder = "this is a placeholder string", "string2";
prop-int = <0xdeadbeef>;
};


2
tests/trees.S

@ -102,6 +102,7 @@ test_tree1_struct: @@ -102,6 +102,7 @@ test_tree1_struct:

BEGIN_NODE("subsubnode")
PROP_STR(test_tree1, compatible, "subsubnode1\0subsubnode")
PROP_STR(test_tree1, placeholder, "this is a placeholder string\0string2")
PROP_INT(test_tree1, prop_int, TEST_VALUE_1)
END_NODE

@ -141,6 +142,7 @@ test_tree1_strings: @@ -141,6 +142,7 @@ test_tree1_strings:
STRING(test_tree1, linux_phandle, "linux,phandle")
STRING(test_tree1, phandle, "phandle")
STRING(test_tree1, reg, "reg")
STRING(test_tree1, placeholder, "placeholder")
STRING(test_tree1, address_cells, "#address-cells")
STRING(test_tree1, size_cells, "#size-cells")
test_tree1_strings_end:

Loading…
Cancel
Save