devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
To: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
Cc: Devicetree Discuss
	<devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org>
Subject: Re: Boolean properties
Date: Tue, 6 Dec 2011 16:01:20 -0800	[thread overview]
Message-ID: <CAPnjgZ1q7EH=dbdqDqwe76xSf7-YLNUprqzC-vrbAZo+FYEtiQ@mail.gmail.com> (raw)
In-Reply-To: <20111206231216.GB7631-MK4v0fQdeXQXU02nzanrWNbf9cGiqdzd@public.gmane.org>

Hi David,

On Tue, Dec 6, 2011 at 3:12 PM, David Gibson
<david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org> wrote:
> On Mon, Dec 05, 2011 at 04:29:22PM -0800, Simon Glass wrote:
>> Hi,
>>
>> As I understand it, boolean properties in the device tree are defined
>> as follows:
>>
>> - if the property is present, then it is true
>> - if the property is absent, then it is false
>
> That's the common convention.  Although an individual binding could
> define something else, and I think some already do define a
> boolean~=int approach instead (e.g. the ibm,dfp cpu property).  In
> some cases that's anticipating future expansion to values other than 0
> and 1.

OK I didn't know that.

>
>> The fdtget and fdtput utilities deal with reading and changing these.
>> At present fdtget returns the value of the property and is not
>> suitable for boolean properties. fdtput allows setting of a property
>> value but not removing it.
>>
>> To deal with boolean properties these utilities need to change. One
>> option is to use something like:
>>
>> $ fdtget -t f /path/to/node property
>> (prints 'true' or 'false')
>> $ fdtput -t f /path/to/node property false/true
>> $ fdtput -t f /path/to/node property 0/1
>> (deletes the property for false and 0; adds it with no value for true and 1)
>>
>> (Unfortunately the 'b' type is taken for byte at present, so it is
>> unclear to be so far what letter we should use for 'f' in the -t flag)
>
> Hrm.  Rather than treating this as a boolean "type", I think it would
> be less ambiguous to instead add options to explicitly delete a
> property (either e.g. fdtput -d or a new fdtdel), and to create an
> empty valued property.

That was my first thought, but I thought it would be painful since
callers would need to do something like:

if [ $value -eq 0 ]
   fdtput -d /path/to/node property
else
   fdtput /path/to/node property <some tag that means nothing>
    (or maybe    fdtput -z /path/to/node property)
fi

so better IMO to provide boolean support in the tool. But it does
illustrate that presence/absence is not always ideal.

>
>> But first I would like to suggest that we support boolean properties
>> with a value, i.e. change to:
>>
>> - if the property is absent, then it is false
>> - if the property is present, then it is true
>>     - unless the property has a 0 value, iwc it is false
>
> So the first question here is who/what exactly constitutes "we" here -
> kernel, u-boot, dtc?  Using the above logic sounds like a good idea
> for fdt readers on the "be liberal in what you accept" principle.  But
> it's something I'd like to see Mitch Bradley and/or Segher comment on
> - they'd have a better idea of whether there's existing practice that
> might break with that.

I mean device tree users (kernel, u-boot) rather than dtc (which I
suspect would be unaffected).

>
>> There are three reasons:
>> 1. it is very confusing for the poor user to set a property value to 0
>> and have it come back as 'true' from a function that checks these
>> sorts of things. This is particularly true since fdt properties do not
>> have types, or even type hints.  The function I have in mind is
>> something like this (modified to fit the discussion):
>>
>> /**
>>  * Look up a boolean property in a node and return it.
>>  *
>>  * A boolean properly is true if present in the device tree and false if not
>>  * present (regardless of any property data/value).
>>  *
>>  * @param blob        FDT blob
>>  * @param node        node to examine
>>  * @param prop_name   name of property to find
>>  * @return 1 if the properly is present; 0 if it isn't present
>>  */
>> int fdtdec_get_bool(const void *blob, int node, const char *prop_name);
>>
>> An alternative might be to print an error (and refuse to return a
>> value) when a boolean property has a value:
>>
>>  * @return 1 if the properly is present; 0 if it isn't present, -1 if
>> it has any data (and is therefore illegal as a boolean property)
>
> Kind of a pain for C.

I don't like it either. But we currently have a situation where a zero
value is considered true, and this can be confusing. I would prefer to
expand the meaning.

>
>> 2. it allows us to adjust the boolean value without requiring a change
>> in the size of the device tree blob (faster, easier)
>>
>> 3. Related to 2 it allows us to put template values in the fdt which
>> can then be *optionally* updated in the build system or in U-Boot to
>> the required value before passing to the kernel.
>>
>> I presume this discussion has happened before - can anyone please
>> point me to the thread?
>>

Regards,
Simon

> --
> 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

  parent reply	other threads:[~2011-12-07  0:01 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-06  0:29 Boolean properties Simon Glass
     [not found] ` <CAPnjgZ1BevAt3==ZcQKn_f7xudrcKE+ks0YpHwBFqTXg2uc7Jw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-06 23:12   ` David Gibson
     [not found]     ` <20111206231216.GB7631-MK4v0fQdeXQXU02nzanrWNbf9cGiqdzd@public.gmane.org>
2011-12-07  0:01       ` Simon Glass [this message]
     [not found]         ` <CAPnjgZ1q7EH=dbdqDqwe76xSf7-YLNUprqzC-vrbAZo+FYEtiQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-09  1:15           ` David Gibson
     [not found]             ` <20111209011551.GB5750-MK4v0fQdeXQXU02nzanrWNbf9cGiqdzd@public.gmane.org>
2011-12-09  1:51               ` Simon Glass
2011-12-07  8:04       ` Mitch Bradley
     [not found]         ` <4EDF1DFC.3020808-D5eQfiDGL7eakBO8gow8eQ@public.gmane.org>
2011-12-09  1:33           ` Simon Glass
     [not found]             ` <CAPnjgZ0LrPZgL680LKpOkBZfA_s8duzz3_Knzpufuq=mW8Ubbw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-09  2:00               ` Mitch Bradley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPnjgZ1q7EH=dbdqDqwe76xSf7-YLNUprqzC-vrbAZo+FYEtiQ@mail.gmail.com' \
    --to=sjg-f7+t8e8rja9g9huczpvpmw@public.gmane.org \
    --cc=david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org \
    --cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).