Re: [PATCH v3 5/9] firmware: arm_scmi: Pass protocol ID to chan_available() transport callback
Jonathan Cameron <[email protected]>
| Newsgroups | org.infradead.lists.linux-arm-kernel,org.kernel.vger.arm-scmi |
|---|---|
| Organization | Qualcomm |
| Message-ID | <[email protected]> |
On Thu, 13 Aug 2026 12:33:00 +0100 Sudeep Holla <[email protected]> wrote: > Extend the SCMI transport_ops chan_available() callback to include the > protocol ID (prot_id) as an argument. This allows transports to determine > channel availability based on the specific protocol being used, improving > flexibility in platforms that share transport channels across multiple > protocols. This will be useful when ACPI PCC transport gets added. > > Updated all existing users and definitions of chan_available() in > SCMI core and transport drivers (mailbox, optee, etc.) accordingly. > > No functional change. > > Signed-off-by: Sudeep Holla <[email protected]> Reviewed-by: Jonathan Cameron <[email protected]> > --- > drivers/firmware/arm_scmi/common.h | 3 ++- > drivers/firmware/arm_scmi/driver.c | 2 +- > drivers/firmware/arm_scmi/transports/mailbox.c | 3 ++- > drivers/firmware/arm_scmi/transports/optee.c | 3 ++- > drivers/firmware/arm_scmi/transports/smc.c | 3 ++- > drivers/firmware/arm_scmi/transports/virtio.c | 3 ++- > 6 files changed, 11 insertions(+), 6 deletions(-) > > diff --git a/drivers/firmware/arm_scmi/common.h b/drivers/firmware/arm_scmi/common.h > index 042867c28b88..1ab4543e0f4a 100644 > --- a/drivers/firmware/arm_scmi/common.h > +++ b/drivers/firmware/arm_scmi/common.h > @@ -207,7 +207,8 @@ struct scmi_chan_info { > * @poll_done: Callback to poll transfer status > */ > struct scmi_transport_ops { > - bool (*chan_available)(struct fwnode_handle *fwnode, int idx); > + bool (*chan_available)(struct fwnode_handle *fwnode, int prot_id, > + int idx); > int (*chan_setup)(struct scmi_chan_info *cinfo, struct device *dev, > bool tx); > int (*chan_free)(int id, void *p, void *data); > diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c > index 9ad827c6a9ab..aad678db0f6e 100644 > --- a/drivers/firmware/arm_scmi/driver.c > +++ b/drivers/firmware/arm_scmi/driver.c > @@ -2768,7 +2768,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct fwnode_handle *fwnode, > if (idr_find(idr, prot_id)) > return -EEXIST; > > - if (!info->desc->ops->chan_available(fwnode, idx)) { > + if (!info->desc->ops->chan_available(fwnode, prot_id, idx)) { > cinfo = idr_find(idr, SCMI_PROTOCOL_BASE); > if (unlikely(!cinfo)) /* Possible only if platform has no Rx */ > return -EINVAL; > diff --git a/drivers/firmware/arm_scmi/transports/mailbox.c b/drivers/firmware/arm_scmi/transports/mailbox.c > index b692cae4ff25..56af2cb0f424 100644 > --- a/drivers/firmware/arm_scmi/transports/mailbox.c > +++ b/drivers/firmware/arm_scmi/transports/mailbox.c > @@ -77,7 +77,8 @@ static void rx_callback(struct mbox_client *cl, void *m) > core->shmem->read_header(smbox->shmem), NULL); > } > > -static bool mailbox_chan_available(struct fwnode_handle *fwnode, int idx) > +static bool > +mailbox_chan_available(struct fwnode_handle *fwnode, int prot_id, int idx) > { > int num_mb; > struct device_node *of_node = to_of_node(fwnode); > diff --git a/drivers/firmware/arm_scmi/transports/optee.c b/drivers/firmware/arm_scmi/transports/optee.c > index 07d3affa0964..6022f74d28f3 100644 > --- a/drivers/firmware/arm_scmi/transports/optee.c > +++ b/drivers/firmware/arm_scmi/transports/optee.c > @@ -314,7 +314,8 @@ static int invoke_process_msg_channel(struct scmi_optee_channel *channel, size_t > return 0; > } > > -static bool scmi_optee_chan_available(struct fwnode_handle *fwnode, int idx) > +static bool > +scmi_optee_chan_available(struct fwnode_handle *fwnode, int prot_id, int idx) > { > u32 channel_id; > struct device_node *of_node = to_of_node(fwnode); > diff --git a/drivers/firmware/arm_scmi/transports/smc.c b/drivers/firmware/arm_scmi/transports/smc.c > index 1079cd01190b..ee9e44468c1e 100644 > --- a/drivers/firmware/arm_scmi/transports/smc.c > +++ b/drivers/firmware/arm_scmi/transports/smc.c > @@ -84,7 +84,8 @@ static irqreturn_t smc_msg_done_isr(int irq, void *data) > return IRQ_HANDLED; > } > > -static bool smc_chan_available(struct fwnode_handle *fwnode, int idx) > +static bool > +smc_chan_available(struct fwnode_handle *fwnode, int prot_id, int idx) > { > struct device_node *of_node = to_of_node(fwnode); > struct device_node *np __free(device_node) = NULL; > diff --git a/drivers/firmware/arm_scmi/transports/virtio.c b/drivers/firmware/arm_scmi/transports/virtio.c > index 6b060d61e0ca..3d608c8c4fe8 100644 > --- a/drivers/firmware/arm_scmi/transports/virtio.c > +++ b/drivers/firmware/arm_scmi/transports/virtio.c > @@ -375,7 +375,8 @@ static unsigned int virtio_get_max_msg(struct scmi_chan_info *base_cinfo) > return vioch->max_msg; > } > > -static bool virtio_chan_available(struct fwnode_handle *fwnode, int idx) > +static bool > +virtio_chan_available(struct fwnode_handle *fwnode, int prot_id, int idx) > { > struct scmi_vio_channel *channels, *vioch = NULL; > >