From: Elliot Berman <quic_eberman@quicinc.com>
To: Rob Herring <robh+dt@kernel.org>,
Frank Rowand <frowand.list@gmail.com>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>
Cc: Amrit Anand <quic_amrianan@quicinc.com>,
Peter Griffin <peter.griffin@linaro.org>,
Caleb Connolly <caleb.connolly@linaro.org>,
"Andy Gross" <agross@kernel.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>,
"Doug Anderson" <dianders@chromium.org>,
Simon Glass <sjg@chromium.org>,
"Chen-Yu Tsai" <wenst@chromium.org>,
Julius Werner <jwerner@chromium.org>,
"Humphreys, Jonathan" <j-humphreys@ti.com>,
Sumit Garg <sumit.garg@linaro.org>,
"Jon Hunter" <jonathanh@nvidia.org>,
Michal Simek <michal.simek@amd.com>,
<boot-architecture@lists.linaro.org>,
<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-arm-msm@vger.kernel.org>,
Elliot Berman <quic_eberman@quicinc.com>
Subject: [PATCH RFC v3 1/9] libfdt: board-id: Implement board-id scoring
Date: Tue, 21 May 2024 11:37:58 -0700 [thread overview]
Message-ID: <20240521-board-ids-v3-1-e6c71d05f4d2@quicinc.com> (raw)
In-Reply-To: <20240521-board-ids-v3-0-e6c71d05f4d2@quicinc.com>
The devicetree spec introduced a mechanism to match devicetree blobs to
boards using firmware-provided identifiers. Although the matching can be
implemented by DTB loaders, having a canonical implementation makes it
easier to integrate and ensure consistent behavior across ecosystems.
I've not yet investigated swig/python support for the new functions; I
would work on that before submitting the patch to libfdt.
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
---
scripts/dtc/libfdt/fdt_ro.c | 76 +++++++++++++++++++++++++++++++++++++++++++++
scripts/dtc/libfdt/libfdt.h | 54 ++++++++++++++++++++++++++++++++
2 files changed, 130 insertions(+)
diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c
index 9f6c551a22c2..b19b17127399 100644
--- a/scripts/dtc/libfdt/fdt_ro.c
+++ b/scripts/dtc/libfdt/fdt_ro.c
@@ -857,3 +857,79 @@ int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
return offset; /* error from fdt_next_node() */
}
+
+int fdt_board_id_prop_matches(const void *fdt,
+ const struct fdt_property *prop,
+ fdt_get_board_id_t get_board_id_cb,
+ void *ctx)
+{
+ int data_len;
+ const void *data;
+ const char *name;
+ int name_len;
+ int string = 0;
+
+ name = fdt_get_string(fdt, fdt32_to_cpu(prop->nameoff), &name_len);
+ if (!name)
+ return -FDT_ERR_BADOFFSET;
+
+ if (name_len > 4 && !strcmp(name + name_len - 4, "_str"))
+ string = 1;
+
+ data = get_board_id_cb(ctx, name, &data_len);
+ if (!data)
+ return -FDT_ERR_NOTFOUND;
+
+ if (string) {
+ return fdt_stringlist_contains(prop->data,
+ fdt32_to_cpu(prop->len),
+ data);
+ } else {
+ // exact data comparison. data_len is the size of each entry
+ if (fdt32_to_cpu(prop->len) % data_len || data_len % 4)
+ return -FDT_ERR_BADVALUE;
+
+ for (int i = 0; i < fdt32_to_cpu(prop->len); i += data_len) {
+ if (!memcmp(&prop->data[i], data, data_len))
+ return 1;
+ }
+
+ return 0;
+ }
+
+ return 0;
+}
+
+int fdt_board_id_score(const void *fdt, fdt_get_board_id_t get_board_id_cb,
+ void *ctx)
+{
+ const struct fdt_property *prop;
+ int node, property, ret, score = 0;
+ const char *name;
+
+ node = fdt_path_offset(fdt, "/board-id");
+ if (node < 0)
+ return node;
+
+ fdt_for_each_property_offset(property, fdt, node) {
+ prop = fdt_get_property_by_offset(fdt, property, NULL);
+ if (!prop)
+ return -FDT_ERR_BADOFFSET;
+
+ name = fdt_get_string(fdt, fdt32_to_cpu(prop->nameoff), NULL);
+ if (!name)
+ return -FDT_ERR_BADOFFSET;
+
+ if (!strcmp(name, "phandle") || !strcmp(name, "linux,phandle"))
+ continue;
+
+ ret = fdt_board_id_prop_matches(fdt, prop, get_board_id_cb,
+ ctx);
+ if (ret == 1)
+ score++;
+ else
+ return ret;
+ }
+
+ return score;
+}
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
index 77ccff19911e..de1cbc339315 100644
--- a/scripts/dtc/libfdt/libfdt.h
+++ b/scripts/dtc/libfdt/libfdt.h
@@ -1230,6 +1230,60 @@ int fdt_address_cells(const void *fdt, int nodeoffset);
*/
int fdt_size_cells(const void *fdt, int nodeoffset);
+/**********************************************************************/
+/* Read-only functions (board-id related) */
+/**********************************************************************/
+
+/**
+ * fdt_get_board_id_t - callback to retrieve the board id for the platform
+ * @ctx: Context data passed from fdt_board_id_prop_matches()
+ * @name: board id name
+ * @data: Callback sets pointer to the board id data
+ * @datalen: Callback sets length of the board id data
+ *
+ * returns:
+ * Pointer to the board id data, NULL if the data doesn't exist
+ */
+typedef const void *(*fdt_get_board_id_t)(void *ctx, const char *name,
+ int *datalen);
+
+/**
+ * fdt_board_id_prop_matches - check if the property matches the platform's board id
+ * @fdt: pointer to the device tree blob
+ * @prop_offset: Offset of the property to match
+ * @get_board_id_cb: Function pointer to retrieve the platform's board id
+ *
+ * returns:
+ * 1: the property matches
+ * 0: the property doesn't match
+ * -FDT_ERR_BADMAGIC,
+ * -FDT_ERR_BADVERSION,
+ * -FDT_ERR_BADSTATE,
+ * -FDT_ERR_BADSTRUCTURE,
+ * -FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_board_id_prop_matches(const void *fdt,
+ const struct fdt_property *prop,
+ fdt_get_board_id_t get_board_id_cb,
+ void *ctx);
+
+/**
+ * fdt_board_id_score - calculate score of the fdt's board_id
+ * @fdt: pointer to the device tree blob
+ * @get_board_id_cb: Function pointer to retrieve the platform's board id
+ *
+ * returns:
+ * >0 for the number of board-id properties that were matched
+ * 0 if there was a mismatch in any of the board-id properties
+ * -FDT_ERR_BADMAGIC,
+ * -FDT_ERR_BADVERSION,
+ * -FDT_ERR_BADSTATE,
+ * -FDT_ERR_BADSTRUCTURE,
+ * -FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_board_id_score(const void *fdt, fdt_get_board_id_t get_board_id_cb,
+ void *ctx);
+
/**********************************************************************/
/* Write-in-place functions */
--
2.34.1
next prev parent reply other threads:[~2024-05-21 18:40 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-21 18:37 [PATCH RFC v3 0/9] dt-bindings: hwinfo: Introduce board-id Elliot Berman
2024-05-21 18:37 ` Elliot Berman [this message]
2024-05-21 19:28 ` [PATCH RFC v3 1/9] libfdt: board-id: Implement board-id scoring Conor Dooley
2024-05-22 23:57 ` Elliot Berman
2024-05-21 18:37 ` [PATCH RFC v3 2/9] dt-bindings: board: Introduce board-id Elliot Berman
2024-05-21 19:19 ` Rob Herring (Arm)
2024-05-21 19:21 ` Conor Dooley
2024-05-21 19:25 ` Conor Dooley
2024-05-21 21:32 ` Rob Herring
2024-05-21 21:47 ` Conor Dooley
2024-05-22 23:47 ` Elliot Berman
2024-05-22 23:54 ` Elliot Berman
2024-05-23 1:23 ` Rob Herring (Arm)
2024-05-25 16:54 ` Conor Dooley
2024-05-29 15:43 ` Elliot Berman
2024-05-21 18:38 ` [PATCH RFC v3 3/9] fdt-select-board: Add test tool for selecting dtbs based on board-id Elliot Berman
2024-05-21 18:38 ` [PATCH RFC v3 4/9] dt-bindings: arm: qcom: Update Devicetree identifiers Elliot Berman
2024-05-25 17:21 ` Conor Dooley
2024-05-29 15:34 ` Elliot Berman
2024-05-21 18:38 ` [PATCH RFC v3 5/9] dt-bindings: board: Document board-ids for Qualcomm devices Elliot Berman
2024-05-21 19:19 ` Rob Herring (Arm)
2024-05-25 17:08 ` Conor Dooley
2024-05-29 15:09 ` Elliot Berman
2024-05-21 18:38 ` [PATCH RFC v3 6/9] arm64: boot: dts: sm8650: Add board-id Elliot Berman
2024-06-05 8:18 ` Krzysztof Kozlowski
2024-05-21 18:38 ` [PATCH RFC v3 7/9] arm64: boot: dts: qcom: Use phandles for thermal_zones Elliot Berman
2024-05-21 18:38 ` [PATCH RFC v3 8/9] arm64: boot: dts: qcom: sm8550: Split into overlays Elliot Berman
2024-06-05 8:20 ` Krzysztof Kozlowski
2024-05-21 18:38 ` [PATCH RFC v3 9/9] tools: board-id: Add test suite Elliot Berman
2024-05-21 19:00 ` [PATCH RFC v3 0/9] dt-bindings: hwinfo: Introduce board-id Dmitry Baryshkov
2024-05-24 15:51 ` Konrad Dybcio
2024-05-27 7:19 ` Michal Simek
2024-05-29 15:32 ` Elliot Berman
2024-05-30 14:12 ` Michal Simek
2024-06-05 13:17 ` Simon Glass
2024-06-05 17:17 ` Elliot Berman
2024-06-06 16:00 ` Simon Glass
2024-06-21 22:40 ` Elliot Berman
2024-06-22 7:18 ` Dmitry Baryshkov
2024-06-28 7:33 ` Simon Glass
2024-06-28 8:04 ` Simon Glass
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=20240521-board-ids-v3-1-e6c71d05f4d2@quicinc.com \
--to=quic_eberman@quicinc.com \
--cc=agross@kernel.org \
--cc=andersson@kernel.org \
--cc=boot-architecture@lists.linaro.org \
--cc=caleb.connolly@linaro.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dianders@chromium.org \
--cc=frowand.list@gmail.com \
--cc=j-humphreys@ti.com \
--cc=jonathanh@nvidia.org \
--cc=jwerner@chromium.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.simek@amd.com \
--cc=peter.griffin@linaro.org \
--cc=quic_amrianan@quicinc.com \
--cc=robh+dt@kernel.org \
--cc=sjg@chromium.org \
--cc=sumit.garg@linaro.org \
--cc=wenst@chromium.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).