[Pdbg] [PATCH 08/13] libpdbg: Read/write properties directly from/to device tree
Amitay Isaacs
amitay at ozlabs.org
Wed Jan 15 16:18:56 AEDT 2020
Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
---
libpdbg/device.c | 46 +++++++++++++++++++++++++++-------------------
libpdbg/libpdbg.c | 8 ++++----
libpdbg/libpdbg.h | 2 +-
3 files changed, 32 insertions(+), 24 deletions(-)
diff --git a/libpdbg/device.c b/libpdbg/device.c
index c5fdc4e..76d6b3e 100644
--- a/libpdbg/device.c
+++ b/libpdbg/device.c
@@ -349,34 +349,42 @@ static void dt_add_phandle(struct pdbg_target *node, const char *name,
bool pdbg_target_set_property(struct pdbg_target *target, const char *name, const void *val, size_t size)
{
- struct dt_property *p;
+ const void *p;
+ size_t len;
+ int ret;
- if ((p = dt_find_property(target, name))) {
- if (size != p->len) {
- return false;
- }
+ p = pdbg_target_property(target, name, &len);
+ if (!p)
+ return false;
- memcpy(p->prop, val, size);
- } else {
+ if (len != size)
+ return false;
+
+ ret = fdt_setprop_inplace(target->fdt, target->fdt_offset, name, val, size);
+ if (ret)
return false;
- }
return true;
}
-void *pdbg_target_property(struct pdbg_target *target, const char *name, size_t *size)
+const void *pdbg_target_property(struct pdbg_target *target, const char *name, size_t *size)
{
- struct dt_property *p;
+ const void *buf;
+ int buflen;
- p = dt_find_property(target, name);
- if (p) {
- if (size)
- *size = p->len;
- return p->prop;
- } else if (size)
+ if (target->fdt_offset == -1) {
*size = 0;
+ return NULL;
+ }
- return NULL;
+ buf = fdt_getprop(target->fdt, target->fdt_offset, name, &buflen);
+ if (!buf) {
+ *size = 0;
+ return NULL;
+ }
+
+ *size = buflen;
+ return buf;
}
static u32 dt_property_get_cell(const struct dt_property *prop, u32 index)
@@ -439,10 +447,10 @@ static const struct dt_property *dt_require_property(struct pdbg_target *node,
bool pdbg_target_compatible(struct pdbg_target *target, const char *compatible)
{
- char *c, *end;
+ const char *c, *end;
size_t len;
- c = pdbg_target_property(target, "compatible", &len);
+ c = (const char *)pdbg_target_property(target, "compatible", &len);
if (!c)
return false;
diff --git a/libpdbg/libpdbg.c b/libpdbg/libpdbg.c
index 9f7b4cc..8af6a02 100644
--- a/libpdbg/libpdbg.c
+++ b/libpdbg/libpdbg.c
@@ -270,7 +270,7 @@ const char *pdbg_target_dn_name(struct pdbg_target *target)
int pdbg_target_u32_property(struct pdbg_target *target, const char *name, uint32_t *val)
{
- uint32_t *p;
+ const void *p;
size_t size;
p = pdbg_get_target_property(target, name, &size);
@@ -278,15 +278,15 @@ int pdbg_target_u32_property(struct pdbg_target *target, const char *name, uint3
return -1;
assert(size == 4);
- *val = be32toh(*p);
+ *val = be32toh(*(uint32_t *)p);
return 0;
}
int pdbg_target_u32_index(struct pdbg_target *target, const char *name, int index, uint32_t *val)
{
+ const void *p;
size_t len;
- uint32_t *p;
p = pdbg_get_target_property(target, name, &len);
if (!p)
@@ -298,7 +298,7 @@ int pdbg_target_u32_index(struct pdbg_target *target, const char *name, int inde
assert(!((uintptr_t) p & 0x3));
/* Always aligned, so this works. */
- *val = be32toh(p[index]);
+ *val = be32toh(((uint32_t *)p)[index]);
return 0;
}
diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h
index d28fd90..f07d7d1 100644
--- a/libpdbg/libpdbg.h
+++ b/libpdbg/libpdbg.h
@@ -87,7 +87,7 @@ struct pdbg_target *pdbg_target_require_parent(const char *klass, struct pdbg_ta
bool pdbg_target_set_property(struct pdbg_target *target, const char *name, const void *val, size_t size);
/* Get the given property and return the size */
-void *pdbg_target_property(struct pdbg_target *target, const char *name, size_t *size);
+const void *pdbg_target_property(struct pdbg_target *target, const char *name, size_t *size);
int pdbg_target_u32_property(struct pdbg_target *target, const char *name, uint32_t *val);
int pdbg_target_u32_index(struct pdbg_target *target, const char *name, int index, uint32_t *val);
uint64_t pdbg_target_address(struct pdbg_target *target, uint64_t *size);
--
2.21.1
More information about the Pdbg
mailing list