Re: [PATCH] yamltree: Ensure consistent bracketing of properties with phandles

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



On Wed, Sep 18, 2019 at 01:35:34PM -0500, Rob Herring wrote:
> The dts syntax allows for '<>' around phandles and arg cells or not
> which it didn't matter until adding type information. However, the YAML
> encoding expects each phandle + args to be bracketed.
> 
> If TYPE_UINT32 markers are not present before each REF_PHANDLE, fix up
> the markers and add the TYPE_UINT32 markers. This allows the subsequent
> YAML emitting code to work as-is.
> 
> Adding the markers at an earlier stage doesn't work because of
> possible labels in dts output. We'd have to define the ordering of
> labels and brackets. Also, it is probably best to have dts output match
> the input.
> 
> Signed-off-by: Rob Herring <robh@xxxxxxxxxx>

I've applied this.

Gotta say, though, it feels like a fragile hack occasioned by the fact
that the yaml format has information that the base tree format simply
doesn't (clients have to combine it with the binding to get that).

> ---
>  yamltree.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/yamltree.c b/yamltree.c
> index 5b6ea8ea862f..43ca869dd6a8 100644
> --- a/yamltree.c
> +++ b/yamltree.c
> @@ -138,6 +138,27 @@ static void yaml_propval(yaml_emitter_t *emitter, struct property *prop)
>  		(yaml_char_t *)YAML_SEQ_TAG, 1, YAML_FLOW_SEQUENCE_STYLE);
>  	yaml_emitter_emit_or_die(emitter, &event);
>  
> +	/* Ensure we have a type marker before any phandle */
> +	for_each_marker(m) {
> +		int last_offset = 0;
> +		struct marker *type_m;
> +
> +		if (m->type >= TYPE_UINT8)
> +			last_offset = m->offset;
> +
> +		if (!(m->next && m->next->type == REF_PHANDLE &&
> +		      last_offset < m->next->offset))
> +			continue;
> +
> +		type_m = xmalloc(sizeof(*type_m));
> +		type_m->offset = m->next->offset;
> +		type_m->type = TYPE_UINT32;
> +		type_m->ref = NULL;
> +		type_m->next = m->next;
> +		m->next = type_m;
> +	}
> +
> +	m = prop->val.markers;
>  	for_each_marker(m) {
>  		int chunk_len;
>  		char *data = &prop->val.val[m->offset];

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux