Thread (50 messages) 50 messages, 6 authors, 2025-06-20

RE: [PATCH 2/4] firmware: arm_scmi: bus: Bypass setting fwnode for pinctrl

From: Peng Fan <peng.fan@nxp.com>
Date: 2025-01-15 07:22:39
Also in: arm-scmi, imx, linux-gpio, lkml

Subject: Re: [PATCH 2/4] firmware: arm_scmi: bus: Bypass setting
fwnode for pinctrl

On Tue, Jan 14, 2025 at 08:31:03AM +0000, Peng Fan wrote:
quoted
Hi Cristian, Sudeep
quoted
Subject: Re: [PATCH 2/4] firmware: arm_scmi: bus: Bypass setting
fwnode for pinctrl
[...]
quoted
quoted
quoted
fix here) than this change.
...or indeed this is another possibility
I am doing a patch as below, how to do you think?
Do you have any comments on below ideas?

I am thinking to send out new patchset based on below ideas in this
week.
Hi Peng,

sorry for the delay.

Why both blacklist and allowlist ?
Because there is blocklist in pinctrl-scmi.c and allowlist in
pinctrl-imx-scmi.c.

we need to make sure only one pinctrl device are
created when both drivers are built in. So to pinctrl-scmi.c,
use blacklist, to pinctrl-imx-scmi.c use allowlist.

To vendor protocols, just need allowlist.

Regards,
Peng.
Cristian
quoted
quoted
With below patch, we could resolve the devlink issue and also
support mutitple vendor drivers built in, with each vendor driver
has a machine_allowlist.
diff --git a/drivers/firmware/arm_scmi/bus.c
b/drivers/firmware/arm_scmi/bus.c index
1d2aedfcfdb4..c1c45b545480 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -55,6 +55,20 @@ static int
scmi_protocol_device_request(const
quoted
quoted
struct scmi_device_id *id_table)
        unsigned int id = 0;
        struct list_head *head, *phead = NULL;
        struct scmi_requested_dev *rdev;
+       const char * const *allowlist = id_table->machine_allowlist;
+       const char * const *blocklist = id_table->machine_blocklist;
+
+       if (blocklist && of_machine_compatible_match(blocklist)) {
+               pr_debug("block SCMI device (%s) for protocol %x\n",
+                        id_table->name, id_table->protocol_id);
+               return 0;
+       }
+
+       if (allowlist && !of_machine_compatible_match(allowlist)) {
+               pr_debug("block SCMI device (%s) for protocol %x\n",
+                        id_table->name, id_table->protocol_id);
+               return 0;
+       }

        pr_debug("Requesting SCMI device (%s) for protocol %x\n",
                 id_table->name, id_table->protocol_id); diff --git
a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
index 688466a0e816..e1b822d3522f 100644
--- a/include/linux/scmi_protocol.h
+++ b/include/linux/scmi_protocol.h
@@ -950,6 +950,9 @@ struct scmi_device {  struct scmi_device_id
{
quoted
quoted
        u8 protocol_id;
        const char *name;
+       /* Optional */
+       const char * const *machine_blocklist;
+       const char * const *machine_allowlist;
 };
Thanks,
Peng.
quoted
 struct scmi_driver {

Thanks,
Peng
quoted
Thanks,
Cristian
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help