[Pdbg] [PATCH 08/13] libpdbg: Read/write properties directly from/to device tree

Alistair Popple alistair at popple.id.au
Thu Jan 16 12:34:05 AEDT 2020


Reviewed-by: Alistair Popple <alistair at popple.id.au>

On Wednesday, 15 January 2020 4:18:56 PM AEDT Amitay Isaacs wrote:
> 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);






More information about the Pdbg mailing list