mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Herve Codina <herve.codina@bootlin.com>
Cc: Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	David Lechner <dlechner@baylibre.com>,
	Ayush Singh <ayush@beagleboard.org>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	devicetree-compiler@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, devicetree-spec@vger.kernel.org,
	Hui Pu <hui.pu@gehealthcare.com>,
	Ian Ray <ian.ray@gehealthcare.com>,
	Luca Ceresoli <luca.ceresoli@bootlin.com>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
	Frank Li <Frank.Li@nxp.com>
Subject: Re: [PATCH v3 15/15] Introduce v18 dtb version
Date: Wed, 21 Oct 2026 13:26:49 +1100	[thread overview]
Message-ID: <atgi4rMsw5W6kKkS@gractus.seuss> (raw)
In-Reply-To: <20261019151121.26d99f30@bootlin.com>

[-- Attachment #1: Type: text/plain, Size: 9855 bytes --]

On Mon, Oct 19, 2026 at 03:11:21PM +0200, Herve Codina wrote:
> Hi David,
> 
> On Fri, 16 Oct 2026 16:18:03 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > On Tue, Oct 13, 2026 at 07:03:47PM +0200, Herve Codina wrote:
> > > Hi David, Rob,
> > > 
> > > On Tue, 13 Oct 2026 18:10:39 +1100
> > > David Gibson <david@gibson.dropbear.id.au> wrote:
> > >   
> > > > On Fri, Sep 25, 2026 at 03:21:57PM +0200, Herve Codina wrote:  
> > > > > Hi David,
> > > > > 
> > > > > On Mon, 21 Sep 2026 16:20:02 +1000
> > > > > David Gibson <david@gibson.dropbear.id.au> wrote:
> > > > >     
> > > > > > On Wed, Aug 26, 2026 at 10:31:46AM +0200, Herve Codina wrote:    
> > > > > > > This v18 version will add support for
> > > > > > >   - Structured tags.
> > > > > > >     Those tags value definition will allow "old" libfdt, dtc and other
> > > > > > >     tools to skip unknown tags if encountered in future dtb version.
> > > > > > > 
> > > > > > >     libfdt, dtc and other tools implementing version v18 will be able to
> > > > > > >     skip unknown tags available in dtbd generated with later version of
> > > > > > >     dtc.
> > > > > > > 
> > > > > > >   - dt_flags header field.
> > > > > > >     For now this flag field is set to 0. It is a placeholder for future
> > > > > > >     dtb version and could be used to store some dtb related information
> > > > > > >     such as the kind of dtb. For instance, the future addons format will
> > > > > > >     use this field to clearly identify that the dtb is an addon dtb.
> > > > > > > 
> > > > > > >   - last_comp_version_w header field.
> > > > > > >     This field is similar to last_comp_version but for writing.
> > > > > > >     It contains the lowest version of the devicetree data structure with
> > > > > > >     which the version used can safely perform modifications (taking into
> > > > > > >     account following rules related to unknown tags).
> > > > > > >     If this lowest version is greater than the last known supported
> > > > > > >     version, modification are simply forbidden and lead to a
> > > > > > >     FDT_ERR_BADVERSION error.
> > > > > > > 
> > > > > > > For modification, when an unknown tag that can be skipped is involved
> > > > > > > and last_comp_version_w allows modifications, the following rules
> > > > > > > apply:      
> > > > > > 
> > > > > > "last_comp_version_w allows modifications" is a bit hard to
> > > > > > understand.  What exactly is the version number against which we're
> > > > > > comparing that value?    
> > > > > 
> > > > > We had one last_comp_version.
> > > > > 
> > > > > Now we have two last_comp_version, one for reading and one for writing.
> > > > > We compare again the dtb version supported by our libfdt version.
> > > > > 
> > > > > This comes from the discussion [1]
> > > > > 
> > > > > [1] https://lore.kernel.org/all/CAL_JsqLRrbZje_gGZPBDni6StFa+6rdiECtk49on8VfkP7CDvw@mail.gmail.com/    
> > > > 
> > > > Ok, I now see that the logic is you simply fail to proceed with writes
> > > > if the library's latest understood version is < last_comp_version_w.
> > > > 
> > > > As I said elsewhere, this approach doesn't particularly make sense to
> > > > me.  If lib_version >= last_comp_version you *can* write, even if it
> > > > means stripping everything that's not understood at lib_version.
> > > > 
> > > > So the real question here is how do we know, for any given structured
> > > > tag, what write operations require the version to be downgraded (which
> > > > might in turn require this and/or other structured tags to be stripped
> > > > entirely).  
> > > 
> > > The rules is well known.  
> > 
> > I really don't think they are.  You've proposed one set of rules (as
> > code) - although I don't think they quite make sense.  I've proposed
> > another.  Other variants are possible.
> > 
> > > An old libfdt version will strip the tag and
> > > downgrade the version. If, when we define a new tags this rules cannot be
> > > follow by olf libfdt version, last_comp_version_w will be set to protect
> > > against modification.
> > > 
> > > Maybe the problem is just downgrading the version.
> > > 
> > > Instead of downgrading it could be better if we mark the dtb "one or more
> > > 'unknown' tags have been removed due to a write by an old libfdt version" ?
> > > 
> > > We have a dt_flags header field. We can dedicate one bit for this marker.
> > > 
> > > Could it make sense ?  
> > 
> > I really dislike this idea.  It means we effectively have at least two
> > variants of every version which strikes me as pretty confusing.
> > 
> > > > This is related to (though not the same as) the question of whether
> > > > introducing a new structured tags requires a bump to the dtb version
> > > > (though not to last_comp_version, of course).
> > > > 
> > > > Here's the simplest model I can think of.  It's what I'd suggest,
> > > > unless one of it's limitations is a showstopper for what you have in mind:
> > > > 
> > > >  - version and last_comp_version retain their meanings.  No new header
> > > >    version.
> > > >  - New structured tags *do* require a new version.  If a dtb wants to
> > > >    include a specific tag, it must label itself with a version that
> > > >    defines that tag.  To enforce that:
> > > >     - For read operations, if we encounter a (known) tag that
> > > >       doesn't belong in the header version, we throw an error (either
> > > >       BADSTRUCTURE, or a new error for the purpose).
> > > >        - If version <= FDT_LAST_SUPPORTED_VERSION and we encounter an
> > > >          unknown tag that also trips the error (since if it was
> > > > 	 defined in this version, we should know about it).
> > > >     - For write operations (including in-place), we always error if
> > > >       version > FDT_LAST_SUPPORTED_VERSION (done in fdt_rw_probe_()).
> > > >     - fdt_open_into() _is_ permitted if version > FDT_LAST_SUPPORTED_VERSION.
> > > >       It will strip all unknown structured tags from the entire tree
> > > >       and downgrade the version to FDT_LAST_SUPPORTED_VERSION.
> > > > 
> 
> Ok, my proposal seems to be a no-go and so I will follow your proposal given
> above.

To be clear, I'm rejecting the original proposal because I think it's
internally inconsistent (if you follow the consequences of decisions
far enough).  I'm not necessarily opposed to something other than the
above, as long as the rules for when unknown tags must be invalidated
(and what that does to the version) are made very clear in the
structured tag spec.  e.g. see an alternative proposal below.

> Just to clarify, correct me if I am wrong.
> 
> When read if we encountered a skippable unknown tag (this is possible if
> version > FDT_LAST_SUPPORTED_VERSION), we just skip the tag without any
> error.

Correct.  Btw, I know I suggested "skippable tag" as a term, but given
how that gets kind of misleading in the case of writes, I'm coming to
prefer the orignal "structured tag" term.

> For write, "we always error if version > FDT_LAST_SUPPORTED_VERSION".
> If fdt_open_into() has been called before the write operation, this will
> not happen. Indeed, we have downgraded the version to FDT_LAST_SUPPORTED_VERSION
> and removed all unknown skippable tags.

Correct.

> Also, during this downgrade process (downgrade version + remove skippable
> unknown tags), if a unknown tag that cannot be skipped is found, the downgrade
> process fails an return an error.

Yes.  This kind of happens naturally: since non-skippable tags are no
longer structured tags in current thinking, we won't be able to
complete scanning the tree to strip tags if we encounter any
non-skippable unknown tags.

Essentially the theory of the proposal above is to be maximally
conservative: any write (adding, removing, changing, in-place,
whatever) will invalidate all unknown tags and downgrade the version.


But, here's an alternative proposal for invalidation/version semantics
that I think is consistent, while being a bit closer to your original
proposal.

1. version and last_comp_version retain their meanings.  No new header
   version.
2. If version >= 18 the tree may include any structured tags, even if
   they weren't defined as of v18.
3. Some future version might _require_ certain structured tags to be
   present.  But a client must only rely on those tags if the version
   indicates it can.
     - e.g. suppose FDT_FOO tag is introduced in v20.  A client
       reading a v19 tree _might_ see some FDT_FOO tags (because of
       (2)), but cannot rely on them being present in all the places
       they should be.
4. Any write to a property (including in place) invalidates all
   unknown tags on that property (they must be stripped)
5. Any write to a property invalidates all unknown tags on that
   property's node
6. Adding or deleting a property on a node invalidates all unknown tags
   on the node
7. Adding or deleting a subnode invalidates all unknown tags on the
   node
8. Whenever a tag is invalidated and stripped, the overall version
   must be downgraded (to let clients know they can't count on tags
   being present)

Points (4)-(7) are all somewhat negotiable.  In particular, I'm not
sure how feasible (6) is to implement.

Note that because writes don't invalidate tags on ancestor nodes
beyond one level, this proposal doesn't permit tags to contain summary
information about an entire subtree that could be invalidated by
writes further down in that tree.

-- 
David Gibson (he or they)	| 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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2026-10-21  2:28 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-26  8:31 [PATCH v3 00/15] Add support for structured tags and " Herve Codina
2026-08-26  8:31 ` [PATCH v3 01/15] fdtget: Use libfdt iterators instead of open coded loops Herve Codina
2026-08-27  3:55   ` David Gibson
2026-08-26  8:31 ` [PATCH v3 02/15] libfdt: Don't assume the root node is available at offset 0 Herve Codina
2026-08-30  3:21   ` David Gibson
2026-08-31 12:01     ` Herve Codina
2026-09-01  7:42       ` David Gibson
2026-09-01 12:18         ` Herve Codina
2026-09-02  7:06           ` David Gibson
2026-09-07 16:46             ` Herve Codina
2026-09-08  6:41               ` David Gibson
2026-09-08  8:08                 ` Herve Codina
2026-09-09  6:18                   ` David Gibson
2026-09-09  6:58                     ` Herve Codina
2026-09-09  7:02                       ` David Gibson
2026-08-26  8:31 ` [PATCH v3 03/15] tests: " Herve Codina
2026-09-01  8:03   ` David Gibson
2026-09-01 13:36     ` Herve Codina
2026-09-02  8:56       ` David Gibson
2026-08-26  8:31 ` [PATCH v3 04/15] tests/nopulate: Add a FDT_NOP before the root node Herve Codina
2026-09-01  8:05   ` David Gibson
2026-08-26  8:31 ` [PATCH v3 05/15] tests: treegen: Introduce emit_fdt_header_vers() Herve Codina
2026-09-09  6:38   ` David Gibson
2026-08-26  8:31 ` [PATCH v3 06/15] Introduce structured tag value definition Herve Codina
2026-09-10  4:51   ` David Gibson
2026-09-10  7:41     ` Herve Codina
2026-09-10  9:32       ` David Gibson
2026-09-11  7:16         ` Herve Codina
2026-09-12  2:34           ` David Gibson
2026-09-14 10:19             ` Herve Codina
2026-09-16  5:21               ` David Gibson
2026-09-17  7:04                 ` Herve Codina
2026-09-18  4:41                   ` David Gibson
2026-09-18  8:16                     ` Herve Codina
2026-09-19  4:22                       ` David Gibson
2026-09-22  6:41                         ` Herve Codina
2026-09-24  3:49                           ` David Gibson
2026-09-25 10:48                             ` Herve Codina
2026-09-26  1:49                               ` David Gibson
2026-09-10  5:33   ` David Gibson
2026-09-10  7:58     ` Herve Codina
2026-09-10  9:41       ` David Gibson
2026-09-11  7:53         ` Herve Codina
2026-09-12  2:35           ` David Gibson
2026-09-17  8:56             ` Herve Codina
2026-08-26  8:31 ` [PATCH v3 07/15] fdtdump: Handle unknown tags Herve Codina
2026-09-10  5:25   ` David Gibson
2026-08-26  8:31 ` [PATCH v3 08/15] flattree: " Herve Codina
2026-09-14  8:23   ` David Gibson
2026-09-15 10:16     ` Herve Codina
2026-09-15 11:52       ` David Gibson
2026-09-16  6:31         ` Herve Codina
2026-09-16  8:27           ` David Gibson
2026-09-17  7:11             ` Herve Codina
2026-08-26  8:31 ` [PATCH v3 09/15] libfdt: Handle unknown tags in fdt_next_tag() Herve Codina
2026-09-16  9:10   ` David Gibson
2026-09-17  8:34     ` Herve Codina
2026-09-17  9:36       ` David Gibson
2026-09-17 17:28         ` Herve Codina
2026-09-19  4:46           ` David Gibson
2026-09-30 16:47             ` Herve Codina
2026-10-01  3:07               ` David Gibson
2026-08-26  8:31 ` [PATCH v3 10/15] libfdt: Introduce fdt_ptr_offset_() Herve Codina
2026-08-26  8:31 ` [PATCH v3 11/15] libfdt: Introduce fdt_getprop_by_offset_w() Herve Codina
2026-09-16  9:56   ` David Gibson
2026-09-16 10:42     ` Herve Codina
2026-09-17  4:52       ` David Gibson
2026-09-17  8:43         ` Herve Codina
2026-08-26  8:31 ` [PATCH v3 12/15] libfdt: Introduce fdt_getprop_offset_namelen() Herve Codina
2026-09-21  6:07   ` David Gibson
2026-09-22 16:25     ` Herve Codina
2026-08-26  8:31 ` [PATCH v3 13/15] tests: Add wip_func utility Herve Codina
2026-09-16 10:00   ` David Gibson
2026-09-16 17:27     ` Herve Codina
2026-08-26  8:31 ` [PATCH v3 14/15] libfdt: Handle unknown tags on dtb modifications Herve Codina
2026-09-21  6:06   ` David Gibson
2026-09-25 12:40     ` Herve Codina
2026-09-28  4:39       ` David Gibson
2026-09-28 14:54         ` Herve Codina
2026-08-26  8:31 ` [PATCH v3 15/15] Introduce v18 dtb version Herve Codina
2026-09-21  6:20   ` David Gibson
2026-09-25 13:21     ` Herve Codina
2026-10-13  7:10       ` David Gibson
2026-10-13 17:03         ` Herve Codina
2026-10-16  5:18           ` David Gibson
2026-10-19 13:11             ` Herve Codina
2026-10-21  2:26               ` David Gibson [this message]
2026-10-13 17:04         ` Ayush Singh
2026-10-13 17:23           ` Herve Codina
2026-10-13 19:49             ` Ayush Singh

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=atgi4rMsw5W6kKkS@gractus.seuss \
    --to=david@gibson.dropbear.id.au \
    --cc=Frank.Li@nxp.com \
    --cc=ayush@beagleboard.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree-compiler@vger.kernel.org \
    --cc=devicetree-spec@vger.kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dlechner@baylibre.com \
    --cc=geert@linux-m68k.org \
    --cc=herve.codina@bootlin.com \
    --cc=hui.pu@gehealthcare.com \
    --cc=ian.ray@gehealthcare.com \
    --cc=krzk@kernel.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luca.ceresoli@bootlin.com \
    --cc=robh@kernel.org \
    --cc=thomas.petazzoni@bootlin.com \
    /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

all inboxes | Powered by JetHome®