diff mbox series

[02/11] firmware: arm_scmi: Segregate tx channel handling and prepare to add rx

Message ID 20190708154730.16643-3-sudeep.holla@arm.com
State New
Headers show
Series firmware: arm_scmi: Add support for Rx, async commands and delayed response | expand

Commit Message

Sudeep Holla July 8, 2019, 3:47 p.m. UTC
The transmit(Tx) channels are specified as the first entry and the
receive(Rx) channels are the second entry as per the device tree
bindings. Since we currently just support Tx, index 0 is hardcoded at
all required callsites.

In order to prepare for adding Rx support, let's remove those hardcoded
index and add boolean parameter to identify Tx/Rx channels when setting
them up.

Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>

---
 drivers/firmware/arm_scmi/driver.c | 33 ++++++++++++++++--------------
 1 file changed, 18 insertions(+), 15 deletions(-)

-- 
2.17.1

Comments

Jim Quinlan July 18, 2019, 9:23 p.m. UTC | #1
On Mon, Jul 8, 2019 at 11:47 AM Sudeep Holla <sudeep.holla@arm.com> wrote:
>

> The transmit(Tx) channels are specified as the first entry and the

> receive(Rx) channels are the second entry as per the device tree

> bindings. Since we currently just support Tx, index 0 is hardcoded at

> all required callsites.

>

> In order to prepare for adding Rx support, let's remove those hardcoded

> index and add boolean parameter to identify Tx/Rx channels when setting

> them up.

>

> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>

> ---

>  drivers/firmware/arm_scmi/driver.c | 33 ++++++++++++++++--------------

>  1 file changed, 18 insertions(+), 15 deletions(-)

>

> diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c

> index 0bd2af0a008f..f7fb6d5bfc64 100644

> --- a/drivers/firmware/arm_scmi/driver.c

> +++ b/drivers/firmware/arm_scmi/driver.c

> @@ -112,7 +112,7 @@ struct scmi_chan_info {

>   * @version: SCMI revision information containing protocol version,

>   *     implementation version and (sub-)vendor identification.

>   * @minfo: Message info

> - * @tx_idr: IDR object to map protocol id to channel info pointer

> + * @tx_idr: IDR object to map protocol id to Tx channel info pointer

>   * @protocols_imp: List of protocols implemented, currently maximum of

>   *     MAX_PROTOCOLS_IMP elements allocated by the base protocol

>   * @node: List head

> @@ -640,22 +640,26 @@ static int scmi_xfer_info_init(struct scmi_info *sinfo)

>         return 0;

>  }

>

> -static int scmi_mailbox_check(struct device_node *np)

> +static int scmi_mailbox_check(struct device_node *np, int idx)

>  {

> -       return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells", 0, NULL);

> +       return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells",

> +                                         idx, NULL);

>  }

>

> -static inline int

> -scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)

> +static int scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev,

> +                               int prot_id, bool tx)

>  {

> -       int ret;

> +       int ret, idx;

>         struct resource res;

>         resource_size_t size;

>         struct device_node *shmem, *np = dev->of_node;

>         struct scmi_chan_info *cinfo;

>         struct mbox_client *cl;

>

> -       if (scmi_mailbox_check(np)) {

> +       /* Transmit channel is first entry i.e. index 0 */

> +       idx = tx ? 0 : 1;

> +

> +       if (scmi_mailbox_check(np, idx)) {

>                 cinfo = idr_find(&info->tx_idr, SCMI_PROTOCOL_BASE);

>                 goto idr_alloc;

>         }

> @@ -669,11 +673,11 @@ scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)

>         cl = &cinfo->cl;

>         cl->dev = dev;

>         cl->rx_callback = scmi_rx_callback;

> -       cl->tx_prepare = scmi_tx_prepare;

> +       cl->tx_prepare = tx ? scmi_tx_prepare : NULL;

>         cl->tx_block = false;

> -       cl->knows_txdone = true;

> +       cl->knows_txdone = tx;

>

> -       shmem = of_parse_phandle(np, "shmem", 0);

> +       shmem = of_parse_phandle(np, "shmem", idx);

Hi Sudeep,

You can't see it in the diff but you have two error messages that use
"Tx"; should this be changed to "Tx/Rx"?

Jim
>         ret = of_address_to_resource(shmem, 0, &res);

>         of_node_put(shmem);

>         if (ret) {

> @@ -688,8 +692,7 @@ scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)

>                 return -EADDRNOTAVAIL;

>         }

>

> -       /* Transmit channel is first entry i.e. index 0 */

> -       cinfo->chan = mbox_request_channel(cl, 0);

> +       cinfo->chan = mbox_request_channel(cl, idx);

>         if (IS_ERR(cinfo->chan)) {

>                 ret = PTR_ERR(cinfo->chan);

>                 if (ret != -EPROBE_DEFER)

> @@ -721,7 +724,7 @@ scmi_create_protocol_device(struct device_node *np, struct scmi_info *info,

>                 return;

>         }

>

> -       if (scmi_mbox_chan_setup(info, &sdev->dev, prot_id)) {

> +       if (scmi_mbox_chan_setup(info, &sdev->dev, prot_id, true)) {

>                 dev_err(&sdev->dev, "failed to setup transport\n");

>                 scmi_device_destroy(sdev);

>                 return;

> @@ -741,7 +744,7 @@ static int scmi_probe(struct platform_device *pdev)

>         struct device_node *child, *np = dev->of_node;

>

>         /* Only mailbox method supported, check for the presence of one */

> -       if (scmi_mailbox_check(np)) {

> +       if (scmi_mailbox_check(np, 0)) {

>                 dev_err(dev, "no mailbox found in %pOF\n", np);

>                 return -EINVAL;

>         }

> @@ -769,7 +772,7 @@ static int scmi_probe(struct platform_device *pdev)

>         handle->dev = info->dev;

>         handle->version = &info->version;

>

> -       ret = scmi_mbox_chan_setup(info, dev, SCMI_PROTOCOL_BASE);

> +       ret = scmi_mbox_chan_setup(info, dev, SCMI_PROTOCOL_BASE, true);

>         if (ret)

>                 return ret;

>

> --

> 2.17.1

>
Sudeep Holla July 19, 2019, 10:26 a.m. UTC | #2
On Thu, Jul 18, 2019 at 05:23:10PM -0400, Jim Quinlan wrote:
> On Mon, Jul 8, 2019 at 11:47 AM Sudeep Holla <sudeep.holla@arm.com> wrote:

> >

> > The transmit(Tx) channels are specified as the first entry and the

> > receive(Rx) channels are the second entry as per the device tree

> > bindings. Since we currently just support Tx, index 0 is hardcoded at

> > all required callsites.

> >

> > In order to prepare for adding Rx support, let's remove those hardcoded

> > index and add boolean parameter to identify Tx/Rx channels when setting

> > them up.

> >

> > Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>

> > ---

> >  drivers/firmware/arm_scmi/driver.c | 33 ++++++++++++++++--------------

> >  1 file changed, 18 insertions(+), 15 deletions(-)

> >

> > diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c

> > index 0bd2af0a008f..f7fb6d5bfc64 100644

> > --- a/drivers/firmware/arm_scmi/driver.c

> > +++ b/drivers/firmware/arm_scmi/driver.c

> > @@ -112,7 +112,7 @@ struct scmi_chan_info {

> >   * @version: SCMI revision information containing protocol version,

> >   *     implementation version and (sub-)vendor identification.

> >   * @minfo: Message info

> > - * @tx_idr: IDR object to map protocol id to channel info pointer

> > + * @tx_idr: IDR object to map protocol id to Tx channel info pointer

> >   * @protocols_imp: List of protocols implemented, currently maximum of

> >   *     MAX_PROTOCOLS_IMP elements allocated by the base protocol

> >   * @node: List head

> > @@ -640,22 +640,26 @@ static int scmi_xfer_info_init(struct scmi_info *sinfo)

> >         return 0;

> >  }

> >

> > -static int scmi_mailbox_check(struct device_node *np)

> > +static int scmi_mailbox_check(struct device_node *np, int idx)

> >  {

> > -       return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells", 0, NULL);

> > +       return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells",

> > +                                         idx, NULL);

> >  }

> >

> > -static inline int

> > -scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)

> > +static int scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev,

> > +                               int prot_id, bool tx)

> >  {

> > -       int ret;

> > +       int ret, idx;

> >         struct resource res;

> >         resource_size_t size;

> >         struct device_node *shmem, *np = dev->of_node;

> >         struct scmi_chan_info *cinfo;

> >         struct mbox_client *cl;

> >

> > -       if (scmi_mailbox_check(np)) {

> > +       /* Transmit channel is first entry i.e. index 0 */

> > +       idx = tx ? 0 : 1;

> > +

> > +       if (scmi_mailbox_check(np, idx)) {

> >                 cinfo = idr_find(&info->tx_idr, SCMI_PROTOCOL_BASE);

> >                 goto idr_alloc;

> >         }

> > @@ -669,11 +673,11 @@ scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)

> >         cl = &cinfo->cl;

> >         cl->dev = dev;

> >         cl->rx_callback = scmi_rx_callback;

> > -       cl->tx_prepare = scmi_tx_prepare;

> > +       cl->tx_prepare = tx ? scmi_tx_prepare : NULL;

> >         cl->tx_block = false;

> > -       cl->knows_txdone = true;

> > +       cl->knows_txdone = tx;

> >

> > -       shmem = of_parse_phandle(np, "shmem", 0);

> > +       shmem = of_parse_phandle(np, "shmem", idx);

> Hi Sudeep,

> 

> You can't see it in the diff but you have two error messages that use

> "Tx"; should this be changed to "Tx/Rx"?

> 


Thanks for spotting, will fix it.

--
Regards,
Sudeep
diff mbox series

Patch

diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 0bd2af0a008f..f7fb6d5bfc64 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -112,7 +112,7 @@  struct scmi_chan_info {
  * @version: SCMI revision information containing protocol version,
  *	implementation version and (sub-)vendor identification.
  * @minfo: Message info
- * @tx_idr: IDR object to map protocol id to channel info pointer
+ * @tx_idr: IDR object to map protocol id to Tx channel info pointer
  * @protocols_imp: List of protocols implemented, currently maximum of
  *	MAX_PROTOCOLS_IMP elements allocated by the base protocol
  * @node: List head
@@ -640,22 +640,26 @@  static int scmi_xfer_info_init(struct scmi_info *sinfo)
 	return 0;
 }
 
-static int scmi_mailbox_check(struct device_node *np)
+static int scmi_mailbox_check(struct device_node *np, int idx)
 {
-	return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells", 0, NULL);
+	return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells",
+					  idx, NULL);
 }
 
-static inline int
-scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)
+static int scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev,
+				int prot_id, bool tx)
 {
-	int ret;
+	int ret, idx;
 	struct resource res;
 	resource_size_t size;
 	struct device_node *shmem, *np = dev->of_node;
 	struct scmi_chan_info *cinfo;
 	struct mbox_client *cl;
 
-	if (scmi_mailbox_check(np)) {
+	/* Transmit channel is first entry i.e. index 0 */
+	idx = tx ? 0 : 1;
+
+	if (scmi_mailbox_check(np, idx)) {
 		cinfo = idr_find(&info->tx_idr, SCMI_PROTOCOL_BASE);
 		goto idr_alloc;
 	}
@@ -669,11 +673,11 @@  scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)
 	cl = &cinfo->cl;
 	cl->dev = dev;
 	cl->rx_callback = scmi_rx_callback;
-	cl->tx_prepare = scmi_tx_prepare;
+	cl->tx_prepare = tx ? scmi_tx_prepare : NULL;
 	cl->tx_block = false;
-	cl->knows_txdone = true;
+	cl->knows_txdone = tx;
 
-	shmem = of_parse_phandle(np, "shmem", 0);
+	shmem = of_parse_phandle(np, "shmem", idx);
 	ret = of_address_to_resource(shmem, 0, &res);
 	of_node_put(shmem);
 	if (ret) {
@@ -688,8 +692,7 @@  scmi_mbox_chan_setup(struct scmi_info *info, struct device *dev, int prot_id)
 		return -EADDRNOTAVAIL;
 	}
 
-	/* Transmit channel is first entry i.e. index 0 */
-	cinfo->chan = mbox_request_channel(cl, 0);
+	cinfo->chan = mbox_request_channel(cl, idx);
 	if (IS_ERR(cinfo->chan)) {
 		ret = PTR_ERR(cinfo->chan);
 		if (ret != -EPROBE_DEFER)
@@ -721,7 +724,7 @@  scmi_create_protocol_device(struct device_node *np, struct scmi_info *info,
 		return;
 	}
 
-	if (scmi_mbox_chan_setup(info, &sdev->dev, prot_id)) {
+	if (scmi_mbox_chan_setup(info, &sdev->dev, prot_id, true)) {
 		dev_err(&sdev->dev, "failed to setup transport\n");
 		scmi_device_destroy(sdev);
 		return;
@@ -741,7 +744,7 @@  static int scmi_probe(struct platform_device *pdev)
 	struct device_node *child, *np = dev->of_node;
 
 	/* Only mailbox method supported, check for the presence of one */
-	if (scmi_mailbox_check(np)) {
+	if (scmi_mailbox_check(np, 0)) {
 		dev_err(dev, "no mailbox found in %pOF\n", np);
 		return -EINVAL;
 	}
@@ -769,7 +772,7 @@  static int scmi_probe(struct platform_device *pdev)
 	handle->dev = info->dev;
 	handle->version = &info->version;
 
-	ret = scmi_mbox_chan_setup(info, dev, SCMI_PROTOCOL_BASE);
+	ret = scmi_mbox_chan_setup(info, dev, SCMI_PROTOCOL_BASE, true);
 	if (ret)
 		return ret;