From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Thu, 30 Apr 2026 13:42:47 +0200 Received: from metis.whiteo.stw.pengutronix.de ([2a0a:edc0:2:b01:1d::104]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wIPn5-000TLr-1v for lore@lore.pengutronix.de; Thu, 30 Apr 2026 13:42:47 +0200 Received: from bombadil.infradead.org ([2607:7c80:54:3::133]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1wIPn3-0000cM-6M for lore@pengutronix.de; Thu, 30 Apr 2026 13:42:47 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:Message-Id: Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=qTQ98vcuKdmEDaZc/pn2xWiecN/FU4fVSAOuLuF3jIg=; b=Uii+/3XdYhUxlxcZ7DIU9NS3cq Ga53cQghXTUEkkneRGUmycuqTWXYh+8HmD+43acVtkvq1Nvg1B6Yu3yfv2a615W3tQhL0oL605SgZ +frOdWm0Q1Sn4qmaMWnQ87sWvzbp50DQl9j0l89sSicATMFH1qL8OrKzgchHW2qQzCQN58T/piqFI JfcmpJUYllAjq9+rS6FueHpwdtezopbqNwGDUKpiSDJbif4NhyDFT+43O880hEtjw9eGs5MGyd4Ip GN4OrDpGCsZp8hBCRM66S909GE9pfV971fshkkhk9aNLpJkdTobGYuf4KNoSb0FI/82eU6qPBymFY JwDFvXQQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIPmA-00000005Of0-3Fiu; Thu, 30 Apr 2026 11:41:50 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIPm9-00000005Oer-2bNQ for barebox@bombadil.infradead.org; Thu, 30 Apr 2026 11:41:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Cc:To:Message-Id: Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date:From:Sender: Reply-To:Content-ID:Content-Description:In-Reply-To:References; bh=qTQ98vcuKdmEDaZc/pn2xWiecN/FU4fVSAOuLuF3jIg=; b=exfr8sABdf828kaFXEzeA3Nkkc QlHrG55ie1AZgbZkqJayVh84H5v+uQEjGX46gJ9RzpUv3DugQE4ono+DXJdDoGedG2xQJGoZbpD6V t3/f6I391vk1aF/eRMbGd1vDzpg/J2yKSX/imBy3deuMlOzgNi394BAnSx4NzN5dyDYd7AuTOd1AA bEbJkY6FH8VZoTOCBVaVCZznhYAXTX+NmOr9BAiXkJfvs+xj0H+nv1tx6n4V1M3BWf7uhZgjv4L+e DA00U3UQ6ohYb97fl/Wyl4qa9MfZHNwZebGVfI1mMpxXenbw0l9KBRt5nwgTuGIbjk751SGPHK0tB 5g6VdPLQ==; Received: from metis.whiteo.stw.pengutronix.de ([2a0a:edc0:2:b01:1d::104]) by desiato.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIPm5-00000007HfA-3Jjs for barebox@lists.infradead.org; Thu, 30 Apr 2026 11:41:48 +0000 Received: from dude06.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::5c]) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1wIPm5-00009p-5F; Thu, 30 Apr 2026 13:41:45 +0200 From: Fabian Pflug Date: Thu, 30 Apr 2026 13:41:41 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260430-v2026-04-0-topic-tlv-doc-v1-1-5aa0ef602bb8@pengutronix.de> To: Sascha Hauer , BAREBOX Cc: Fabian Pflug X-Mailer: b4 0.14.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260430_124146_670288_1D7D3B16 X-CRM114-Status: GOOD ( 20.21 ) X-BeenThere: barebox@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "barebox" X-SA-Exim-Connect-IP: 2607:7c80:54:3::133 X-SA-Exim-Mail-From: barebox-bounces+lore=pengutronix.de@lists.infradead.org X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on metis.whiteo.stw.pengutronix.de X-Spam-Level: X-Spam-Status: No, score=-2.7 required=4.0 tests=AWL,BAYES_50,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,LOTS_OF_MONEY, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.2 Subject: [PATCH RESEND] doc: tlv: add images and custom format documentation X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on metis.whiteo.stw.pengutronix.de) Improve the documentation by adding some images to make the interdependencies clearer and add an example on how to define custom TLV data format. --- Signed-off-by: Fabian Pflug --- Documentation/user/barebox-tlv.rst | 113 +++++++++++++++++++++++++++ Documentation/user/figures/tlv_generator.svg | Bin 0 -> 25691 bytes Documentation/user/figures/tlv_usage.svg | Bin 0 -> 16442 bytes 3 files changed, 113 insertions(+) diff --git a/Documentation/user/barebox-tlv.rst b/Documentation/user/barebox-tlv.rst index adade8a29b..3884d17409 100644 --- a/Documentation/user/barebox-tlv.rst +++ b/Documentation/user/barebox-tlv.rst @@ -10,6 +10,10 @@ Data is stored in a tag-length-value format (hence the name) and read from non-volatile memory during startup. Unpacked values are stored in the devicetree ``chosen``-node. +.. image:: figures/tlv_usage.svg + :width: 40% + :align: center + barebox TLV consists of two components: * The parser inside barebox (``common/tlv``). @@ -61,6 +65,21 @@ The tag range ``0x0000`` to ``0x7FFF`` is intended for common tags, that can be used in every schema. These common tags are defined in ``common/tlv/barebox.c``. +.. csv-table:: TLV predefined tags + :header: "ID", "Name", "Description" + :widths: 10, 20, 30 + + 0x0002, device-hardware-release, "Detailed release information string for the device" + 0x0003, factory-timestamp, "UNIX timestamp of fabrication" + 0x0004, device-serial-number, "Device serial number string" + 0x0005, modification, "Modification: 0: Device unmodified; 1: undocumented modifications" + 0x0006, featureset, "A comma separated list of features" + 0x0007, pcba-serial-number, "Printed Circuit Board Assembly serial number string" + 0x0008, pcba-hardware-release, "Printed Circuit Board Assembly hardware release" + 0x0011, ethernet-address, "A list of Ethernet addresses or a single Ethernet address" + 0x0012, ethernet-address, "A sequence of subsequent Ethernet addresses, by number and starting address" + 0x0024, bound-soc-uid, "Reject TLV if supplied binary data does not match UID SoC register" + The tag range ``0x8000`` to ``0xFFFF`` is intended for custom extensions. Parsing must be handled by board-specific extensions. @@ -102,6 +121,8 @@ This schema defines some well-known tags and two board-specific tags. Afterwards another yaml-file with the data for the TLV binary is needed. An example can be found in ``scripts/bareboxtlv-generator/data-example.yaml``. +.. image:: figures/tlv_generator.svg + With these information in place a TLV binary can be created: .. code-block:: shell @@ -118,3 +139,95 @@ that is correctly configured, can be used as KEY. .. note:: The ``FactoryDataset`` class in ``bareboxtlv-generator.py`` is intended to be used as a library. + +Data Location +------------- + +The generated ``tlv.bin`` file has to be stored on the device in a known location. +This location can for example be described inside the devicetree of the device. + +.. code-block:: dts + :emphasize-lines: 8,10 + + &eeprom1 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + tlv_partition: partition@0 { + compatible = "barebox,tlv-v1"; + label = "barebox_tlv"; + reg = <0x0 0x1000>; + }; + }; + }; + +The ``compatible`` defines the format to parse the TLV data as and the ``reg`` +describes the size of the data. + +Custom TLV format +----------------- + +A custom TLV format can be created for example like this: + +.. code-block:: c + :linenos: + + #include + #include + #include + + #define TLV_MAGIC_CUSTOM_V1_SIGNED 0xe3573cd3 + + static struct tlv_mapping custom_tlv_v1_mappings[] = { + /* UNIX timestamp of fabrication */ + { 0x0003, tlv_format_timestamp, "factory-timestamp" }, + /* Device serial number string */ + { 0x0004, tlv_handle_serial, "device-serial-number" }, + /* a comma separated list of features */ + { 0x0006, tlv_format_str, "featureset" }, + /* Printed Circuit Board Assembly serial number string */ + { 0x0007, tlv_format_str, "pcba-serial-number" }, + /* Reject TLV if supplied binary data does not match UID SoC register */ + { 0x0024, tlv_bind_soc_uid, "bound-soc-uid" }, + /* Custom key */ + { 0x8001, tlv_format_str, "custom-key"}, + { /* sentintel */ }, + }; + + static struct tlv_mapping *mappings[] = { + custom_tlv_v1_mappings, + NULL + }; + + static struct of_device_id matches[] = { + { .compatible = "custom,tlv-v1" }, + { /* sentinel */ } + }; + + static struct tlv_decoder custom_tlv_v1 = { + .magic = TLV_MAGIC_CUSTOM_V1_SIGNED, + .driver.name = "custom-tlv-v1", + .driver.of_compatible = matches, + .mappings = mappings, + .signature_keyring = "tlv-custom", + }; + + static int custom_tlv_v1_register(void) + { + return tlv_register_decoder(&custom_tlv_v1); + } + of_populate_initcall(custom_tlv_v1_register); + +* line 7-21: Every possible mapping, that is used must be listed here. +* line 19: The mapping includes a custom tag. + All tags above ``0x8000`` are reserved for custom use. +* line 29: The compatible string of the partition, that will contain the data. +* line 5,34: Some randomly generated 32bit value to uniquely identify the + mapping-table. +* line 38: The keyring tlv-stange should be used to validate the signature. + Keys for the keyring are specified in the barebox config + ``CONFIG_CRYPTO_PUBLIC_KEYS`` with for example: + ``keyring=tlv-custom:__ENV__TLV_KEY``. +* line 41-45: Registers the format into barebox. diff --git a/Documentation/user/figures/tlv_generator.svg b/Documentation/user/figures/tlv_generator.svg new file mode 100644 index 0000000000000000000000000000000000000000..84ab826145d702bfd7d7c7a85df421b4c9fe9b73 GIT binary patch literal 25691 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 literal 0 HcmV?d00001 diff --git a/Documentation/user/figures/tlv_usage.svg b/Documentation/user/figures/tlv_usage.svg new file mode 100644 index 0000000000000000000000000000000000000000..7aed416a396d29198280198a4ef6a0044093fabc GIT binary patch literal 16442 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