[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