From: David Gibson <david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>
To: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Cc: Devicetree Discuss
<devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org>
Subject: Re: Boolean properties
Date: Fri, 9 Dec 2011 12:15:51 +1100 [thread overview]
Message-ID: <20111209011551.GB5750@truffala.fritz.box> (raw)
In-Reply-To: <CAPnjgZ1q7EH=dbdqDqwe76xSf7-YLNUprqzC-vrbAZo+FYEtiQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
On Tue, Dec 06, 2011 at 04:01:20PM -0800, Simon Glass wrote:
> 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.
Hrm. I think that's a lesser evil than having a data "type" that can
actually completely delete the property.
> >> 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).
Well, like I say, I have no in principle objection to using this as
the usual boolean test, but actually changing it is obviously
something you'd need to convince the maintainers of the relevant
projects.
> >> 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.
Actually, on further thought, I don't mind the above so much, because
even if you use it without checking for the error value, you'll at
least get the right behaviour for the unambiguous cases.
> >> 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?
--
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
next prev parent reply other threads:[~2011-12-09 1:15 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
[not found] ` <CAPnjgZ1q7EH=dbdqDqwe76xSf7-YLNUprqzC-vrbAZo+FYEtiQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-09 1:15 ` David Gibson [this message]
[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=20111209011551.GB5750@truffala.fritz.box \
--to=david-xt8fgy+axnrb3ne2bgzf6laj5h9x9tb+@public.gmane.org \
--cc=devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org \
--cc=sjg-F7+t8E8rja9g9hUCZPvPmw@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).