firmware: scmi: support to manage SCMI protocol drivers with a linker-genetated array
authorAlice Guo <alice.guo@nxp.com>
Mon, 28 Apr 2025 10:37:24 +0000 (18:37 +0800)
committerFabio Estevam <festevam@gmail.com>
Sat, 3 May 2025 19:55:32 +0000 (16:55 -0300)
U_BOOT_SCMI_PROTO_DRIVER macro is used to add a SCMI protocol driver to
scmi_proto_driver list. scmi_proto_driver_get() function can be used to
match a SCMI protocol id and its driver.

Signed-off-by: Alice Guo <alice.guo@nxp.com>
drivers/firmware/scmi/scmi_agent-uclass.c
include/scmi_agent-uclass.h

index e6e43ae..ea79cfa 100644 (file)
@@ -352,6 +352,22 @@ static int scmi_fill_base_info(struct udevice *agent, struct udevice *dev)
        return 0;
 }
 
+static struct driver *scmi_proto_driver_get(unsigned int proto_id)
+{
+       struct scmi_proto_driver *start, *entry;
+       int n_ents;
+
+       start = ll_entry_start(struct scmi_proto_driver, scmi_proto_driver);
+       n_ents = ll_entry_count(struct scmi_proto_driver, scmi_proto_driver);
+
+       for (entry = start; entry != start + n_ents; entry++) {
+               if (entry->match->proto_id == proto_id)
+                       return entry->driver;
+       }
+
+       return NULL;
+}
+
 /*
  * SCMI agent devices binds devices of various uclasses depending on
  * the FDT description. scmi_bind_protocol() is a generic bind sequence
index 33e0e18..842c568 100644 (file)
@@ -115,4 +115,19 @@ struct scmi_agent_ops {
                           struct scmi_msg *msg);
 };
 
+struct scmi_proto_match {
+       unsigned int proto_id;
+};
+
+struct scmi_proto_driver {
+       struct driver *driver;
+       const struct scmi_proto_match *match;
+};
+
+#define U_BOOT_SCMI_PROTO_DRIVER(__name, __match) \
+       ll_entry_declare(struct scmi_proto_driver, __name, scmi_proto_driver) = { \
+               .driver = llsym(struct driver, __name, driver), \
+               .match = __match, \
+       }
+
 #endif /* _SCMI_TRANSPORT_UCLASS_H */