]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firmware: arm_scmi: imx: Discover MISC build info from the system manager
authorPeng Fan <peng.fan@nxp.com>
Thu, 4 Sep 2025 10:40:43 +0000 (18:40 +0800)
committerSudeep Holla <sudeep.holla@arm.com>
Mon, 8 Sep 2025 10:52:30 +0000 (11:52 +0100)
MISC protocol can report System Manager (SM) build information (commit,
build date/time, etc.). Discover those information at the init time.
If the firmware doesn't support it, ignore -EOPNOTSUPP.

Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Message-Id: <20250904-sm-misc-api-v1-v4-2-0bf10eaabdf1@nxp.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/vendors/imx/imx-sm-misc.c

index a8915d3b4df518719d56bfff38922625ad9b70f6..be34e4a8d738b999b12898d2f8ca75e46e93bdbc 100644 (file)
@@ -25,6 +25,7 @@
 enum scmi_imx_misc_protocol_cmd {
        SCMI_IMX_MISC_CTRL_SET  = 0x3,
        SCMI_IMX_MISC_CTRL_GET  = 0x4,
+       SCMI_IMX_MISC_DISCOVER_BUILD_INFO = 0x6,
        SCMI_IMX_MISC_CTRL_NOTIFY = 0x8,
 };
 
@@ -65,6 +66,15 @@ struct scmi_imx_misc_ctrl_get_out {
        __le32 val[];
 };
 
+struct scmi_imx_misc_buildinfo_out {
+       __le32 buildnum;
+       __le32 buildcommit;
+#define MISC_MAX_BUILDDATE     16
+       u8 builddate[MISC_MAX_BUILDDATE];
+#define MISC_MAX_BUILDTIME     16
+       u8 buildtime[MISC_MAX_BUILDTIME];
+};
+
 static int scmi_imx_misc_attributes_get(const struct scmi_protocol_handle *ph,
                                        struct scmi_imx_misc_info *mi)
 {
@@ -272,6 +282,33 @@ static int scmi_imx_misc_ctrl_set(const struct scmi_protocol_handle *ph,
        return ret;
 }
 
+static int scmi_imx_misc_build_info_discover(const struct scmi_protocol_handle *ph)
+{
+       char date[MISC_MAX_BUILDDATE], time[MISC_MAX_BUILDTIME];
+       struct scmi_imx_misc_buildinfo_out *out;
+       struct scmi_xfer *t;
+       int ret;
+
+       ret = ph->xops->xfer_get_init(ph, SCMI_IMX_MISC_DISCOVER_BUILD_INFO, 0,
+                                     sizeof(*out), &t);
+       if (ret)
+               return ret;
+
+       ret = ph->xops->do_xfer(ph, t);
+       if (!ret) {
+               out = t->rx.buf;
+               strscpy(date, out->builddate, MISC_MAX_BUILDDATE);
+               strscpy(time, out->buildtime, MISC_MAX_BUILDTIME);
+               dev_info(ph->dev, "SM Version\t= Build %u, Commit %08x %s %s\n",
+                        le32_to_cpu(out->buildnum), le32_to_cpu(out->buildcommit),
+                        date, time);
+       }
+
+       ph->xops->xfer_put(ph, t);
+
+       return ret;
+}
+
 static const struct scmi_imx_misc_proto_ops scmi_imx_misc_proto_ops = {
        .misc_ctrl_set = scmi_imx_misc_ctrl_set,
        .misc_ctrl_get = scmi_imx_misc_ctrl_get,
@@ -299,6 +336,10 @@ static int scmi_imx_misc_protocol_init(const struct scmi_protocol_handle *ph)
        if (ret)
                return ret;
 
+       ret = scmi_imx_misc_build_info_discover(ph);
+       if (ret && ret != -EOPNOTSUPP)
+               return ret;
+
        return ph->set_priv(ph, minfo, version);
 }