Re: [PATCH v1 2/2] firmware: arm_scmi: Augment SMC/HVC to allow optional interrupt

2020-11-11 Thread Sudeep Holla
On Wed, Nov 11, 2020 at 05:45:46PM +, Cristian Marussi wrote:
> On Wed, Nov 11, 2020 at 11:45:24AM -0500, Jim Quinlan wrote:
> > On Wed, Nov 11, 2020 at 5:42 AM Sudeep Holla  wrote:
> > >
> > > On Tue, Nov 10, 2020 at 01:38:19PM -0500, Jim Quinlan wrote:
> > > > The SMC/HVC SCMI transport is modified to allow the completion of an 
> > > > SCMI
> > > > message to be indicated by an interrupt rather than the return of the 
> > > > smc
> > > > call.  This accommodates the existing behavior of the BrcmSTB SCMI
> > > > "platform" whose SW is already out in the field and cannot be changed.
> > > >
> > > > Signed-off-by: Jim Quinlan 
> > > > ---
> > > >  drivers/firmware/arm_scmi/smc.c | 31 +++
> > > >  1 file changed, 31 insertions(+)
> > > >
> > > > diff --git a/drivers/firmware/arm_scmi/smc.c 
> > > > b/drivers/firmware/arm_scmi/smc.c
> > > > index 82a82a5dc86a..3bf935dbd00e 100644
> > > > --- a/drivers/firmware/arm_scmi/smc.c
> > > > +++ b/drivers/firmware/arm_scmi/smc.c
> > > > @@ -9,9 +9,11 @@
> > > >  #include 
> > > >  #include 
> > > >  #include 
> > > > +#include 
> > > >  #include 
> > > >  #include 
> > > >  #include 
> > > > +#include 
> > > >  #include 
> > > >
> > > >  #include "common.h"
> > > > @@ -23,6 +25,8 @@
> > > >   * @shmem: Transmit/Receive shared memory area
> > > >   * @shmem_lock: Lock to protect access to Tx/Rx shared memory area
> > > >   * @func_id: smc/hvc call function id
> > > > + * @irq: Optional; employed when platforms indicates msg completion by 
> > > > intr.
> > > > + * @tx_complete: Optional, employed only when irq is valid.
> > > >   */
> > > >
> > > >  struct scmi_smc {
> > > > @@ -30,8 +34,19 @@ struct scmi_smc {
> > > >   struct scmi_shared_mem __iomem *shmem;
> > > >   struct mutex shmem_lock;
> > > >   u32 func_id;
> > > > + int irq;
> > > > + struct completion tx_complete;
> > > >  };
> > > >
> > > > +static irqreturn_t smc_msg_done_isr(int irq, void *data)
> > > > +{
> > > > + struct scmi_smc *scmi_info = data;
> > > > +
> > > > + complete(_info->tx_complete);
> > > > +
> > > > + return IRQ_HANDLED;
> > > > +}
> > > > +
> > > >  static bool smc_chan_available(struct device *dev, int idx)
> > > >  {
> > > >   struct device_node *np = of_parse_phandle(dev->of_node, "shmem", 
> > > > 0);
> > > > @@ -79,6 +94,20 @@ static int smc_chan_setup(struct scmi_chan_info 
> > > > *cinfo, struct device *dev,
> > > >   if (ret < 0)
> > > >   return ret;
> > > >
> > > > + /* Optional feature -- signal message completion using an 
> > > > interrupt */
> > > > + ret = of_irq_get_byname(cdev->of_node, "msg-serviced");
> > >
> > > So, looks like it is mandatory if "interrupts" is used. Please update the
> > > binding or if that is not the practice followed elsewhere, drop search by
> > > name.
> >
> > Well, I can certainly change the comment. I do not want it to be
> > "mandatory" if just interrupts are used.
> >  The reason I prefer using "interrupt-names" is that this allows
> > unforeseen use of future additional interrupts w/o caring about order
> > in the interrupts DT node. If you are absolutely positive that there
> > will never be other interrupts used  in the future for the SCMI node
> > then I will drop it.
> >

Good point, please make it required property then if "interrupts" property
is present.

>
> What about the future possibility of adding p2a notifications handling
> to SMC transport, won't that need some other IRQ (and shmem) ?
>

Indeed it needs. Since this Tx completion interrupt is optional and may not
be present, better to fix the name so that when Rx/notification interrupt
is added in future, we can identify them easily.

--
Regards,
Sudeep


Re: [PATCH v1 2/2] firmware: arm_scmi: Augment SMC/HVC to allow optional interrupt

2020-11-11 Thread Cristian Marussi
On Wed, Nov 11, 2020 at 11:45:24AM -0500, Jim Quinlan wrote:
> On Wed, Nov 11, 2020 at 5:42 AM Sudeep Holla  wrote:
> >
> > On Tue, Nov 10, 2020 at 01:38:19PM -0500, Jim Quinlan wrote:
> > > The SMC/HVC SCMI transport is modified to allow the completion of an SCMI
> > > message to be indicated by an interrupt rather than the return of the smc
> > > call.  This accommodates the existing behavior of the BrcmSTB SCMI
> > > "platform" whose SW is already out in the field and cannot be changed.
> > >
> > > Signed-off-by: Jim Quinlan 
> > > ---
> > >  drivers/firmware/arm_scmi/smc.c | 31 +++
> > >  1 file changed, 31 insertions(+)
> > >
> > > diff --git a/drivers/firmware/arm_scmi/smc.c 
> > > b/drivers/firmware/arm_scmi/smc.c
> > > index 82a82a5dc86a..3bf935dbd00e 100644
> > > --- a/drivers/firmware/arm_scmi/smc.c
> > > +++ b/drivers/firmware/arm_scmi/smc.c
> > > @@ -9,9 +9,11 @@
> > >  #include 
> > >  #include 
> > >  #include 
> > > +#include 
> > >  #include 
> > >  #include 
> > >  #include 
> > > +#include 
> > >  #include 
> > >
> > >  #include "common.h"
> > > @@ -23,6 +25,8 @@
> > >   * @shmem: Transmit/Receive shared memory area
> > >   * @shmem_lock: Lock to protect access to Tx/Rx shared memory area
> > >   * @func_id: smc/hvc call function id
> > > + * @irq: Optional; employed when platforms indicates msg completion by 
> > > intr.
> > > + * @tx_complete: Optional, employed only when irq is valid.
> > >   */
> > >
> > >  struct scmi_smc {
> > > @@ -30,8 +34,19 @@ struct scmi_smc {
> > >   struct scmi_shared_mem __iomem *shmem;
> > >   struct mutex shmem_lock;
> > >   u32 func_id;
> > > + int irq;
> > > + struct completion tx_complete;
> > >  };
> > >
> > > +static irqreturn_t smc_msg_done_isr(int irq, void *data)
> > > +{
> > > + struct scmi_smc *scmi_info = data;
> > > +
> > > + complete(_info->tx_complete);
> > > +
> > > + return IRQ_HANDLED;
> > > +}
> > > +
> > >  static bool smc_chan_available(struct device *dev, int idx)
> > >  {
> > >   struct device_node *np = of_parse_phandle(dev->of_node, "shmem", 0);
> > > @@ -79,6 +94,20 @@ static int smc_chan_setup(struct scmi_chan_info 
> > > *cinfo, struct device *dev,
> > >   if (ret < 0)
> > >   return ret;
> > >
> > > + /* Optional feature -- signal message completion using an interrupt 
> > > */
> > > + ret = of_irq_get_byname(cdev->of_node, "msg-serviced");
> >
> > So, looks like it is mandatory if "interrupts" is used. Please update the
> > binding or if that is not the practice followed elsewhere, drop search by
> > name.
> 
> Well, I can certainly change the comment. I do not want it to be
> "mandatory" if just interrupts are used.
>  The reason I prefer using "interrupt-names" is that this allows
> unforeseen use of future additional interrupts w/o caring about order
> in the interrupts DT node.  If you are absolutely positive that there
> will never be other interrupts used  in the future for the SCMI node
> then I will drop it.
> 

What about the future possibility of adding p2a notifications handling
to SMC transport, won't that need some other IRQ (and shmem) ?

Regards

Cristian

> >
> > Also I prefer full name "message-serviced" if possible, not strong
> > opinion.
> 
> Will do.
> 
> >
> >
> > > + if (ret > 0) {
> > > + scmi_info->irq = ret;
> >
> > May be set this only if we succeed setting up handler ? I mean move this
> > down.
> 
> Will do.
> 
> Regards,
> Jim Quinlan
> Broadcom STB
> 
> 
> >
> >
> > Other than these, the changes look fine.
> >
> > --
> > Regards,
> > Sudeep




Re: [PATCH v1 2/2] firmware: arm_scmi: Augment SMC/HVC to allow optional interrupt

2020-11-11 Thread Jim Quinlan
On Wed, Nov 11, 2020 at 5:42 AM Sudeep Holla  wrote:
>
> On Tue, Nov 10, 2020 at 01:38:19PM -0500, Jim Quinlan wrote:
> > The SMC/HVC SCMI transport is modified to allow the completion of an SCMI
> > message to be indicated by an interrupt rather than the return of the smc
> > call.  This accommodates the existing behavior of the BrcmSTB SCMI
> > "platform" whose SW is already out in the field and cannot be changed.
> >
> > Signed-off-by: Jim Quinlan 
> > ---
> >  drivers/firmware/arm_scmi/smc.c | 31 +++
> >  1 file changed, 31 insertions(+)
> >
> > diff --git a/drivers/firmware/arm_scmi/smc.c 
> > b/drivers/firmware/arm_scmi/smc.c
> > index 82a82a5dc86a..3bf935dbd00e 100644
> > --- a/drivers/firmware/arm_scmi/smc.c
> > +++ b/drivers/firmware/arm_scmi/smc.c
> > @@ -9,9 +9,11 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >
> >  #include "common.h"
> > @@ -23,6 +25,8 @@
> >   * @shmem: Transmit/Receive shared memory area
> >   * @shmem_lock: Lock to protect access to Tx/Rx shared memory area
> >   * @func_id: smc/hvc call function id
> > + * @irq: Optional; employed when platforms indicates msg completion by 
> > intr.
> > + * @tx_complete: Optional, employed only when irq is valid.
> >   */
> >
> >  struct scmi_smc {
> > @@ -30,8 +34,19 @@ struct scmi_smc {
> >   struct scmi_shared_mem __iomem *shmem;
> >   struct mutex shmem_lock;
> >   u32 func_id;
> > + int irq;
> > + struct completion tx_complete;
> >  };
> >
> > +static irqreturn_t smc_msg_done_isr(int irq, void *data)
> > +{
> > + struct scmi_smc *scmi_info = data;
> > +
> > + complete(_info->tx_complete);
> > +
> > + return IRQ_HANDLED;
> > +}
> > +
> >  static bool smc_chan_available(struct device *dev, int idx)
> >  {
> >   struct device_node *np = of_parse_phandle(dev->of_node, "shmem", 0);
> > @@ -79,6 +94,20 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, 
> > struct device *dev,
> >   if (ret < 0)
> >   return ret;
> >
> > + /* Optional feature -- signal message completion using an interrupt */
> > + ret = of_irq_get_byname(cdev->of_node, "msg-serviced");
>
> So, looks like it is mandatory if "interrupts" is used. Please update the
> binding or if that is not the practice followed elsewhere, drop search by
> name.

Well, I can certainly change the comment. I do not want it to be
"mandatory" if just interrupts are used.
 The reason I prefer using "interrupt-names" is that this allows
unforeseen use of future additional interrupts w/o caring about order
in the interrupts DT node.  If you are absolutely positive that there
will never be other interrupts used  in the future for the SCMI node
then I will drop it.

>
> Also I prefer full name "message-serviced" if possible, not strong
> opinion.

Will do.

>
>
> > + if (ret > 0) {
> > + scmi_info->irq = ret;
>
> May be set this only if we succeed setting up handler ? I mean move this
> down.

Will do.

Regards,
Jim Quinlan
Broadcom STB


>
>
> Other than these, the changes look fine.
>
> --
> Regards,
> Sudeep


smime.p7s
Description: S/MIME Cryptographic Signature


Re: [PATCH v1 2/2] firmware: arm_scmi: Augment SMC/HVC to allow optional interrupt

2020-11-11 Thread Sudeep Holla
On Tue, Nov 10, 2020 at 01:38:19PM -0500, Jim Quinlan wrote:
> The SMC/HVC SCMI transport is modified to allow the completion of an SCMI
> message to be indicated by an interrupt rather than the return of the smc
> call.  This accommodates the existing behavior of the BrcmSTB SCMI
> "platform" whose SW is already out in the field and cannot be changed.
>
> Signed-off-by: Jim Quinlan 
> ---
>  drivers/firmware/arm_scmi/smc.c | 31 +++
>  1 file changed, 31 insertions(+)
>
> diff --git a/drivers/firmware/arm_scmi/smc.c b/drivers/firmware/arm_scmi/smc.c
> index 82a82a5dc86a..3bf935dbd00e 100644
> --- a/drivers/firmware/arm_scmi/smc.c
> +++ b/drivers/firmware/arm_scmi/smc.c
> @@ -9,9 +9,11 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>
>  #include "common.h"
> @@ -23,6 +25,8 @@
>   * @shmem: Transmit/Receive shared memory area
>   * @shmem_lock: Lock to protect access to Tx/Rx shared memory area
>   * @func_id: smc/hvc call function id
> + * @irq: Optional; employed when platforms indicates msg completion by intr.
> + * @tx_complete: Optional, employed only when irq is valid.
>   */
>
>  struct scmi_smc {
> @@ -30,8 +34,19 @@ struct scmi_smc {
>   struct scmi_shared_mem __iomem *shmem;
>   struct mutex shmem_lock;
>   u32 func_id;
> + int irq;
> + struct completion tx_complete;
>  };
>
> +static irqreturn_t smc_msg_done_isr(int irq, void *data)
> +{
> + struct scmi_smc *scmi_info = data;
> +
> + complete(_info->tx_complete);
> +
> + return IRQ_HANDLED;
> +}
> +
>  static bool smc_chan_available(struct device *dev, int idx)
>  {
>   struct device_node *np = of_parse_phandle(dev->of_node, "shmem", 0);
> @@ -79,6 +94,20 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, 
> struct device *dev,
>   if (ret < 0)
>   return ret;
>
> + /* Optional feature -- signal message completion using an interrupt */
> + ret = of_irq_get_byname(cdev->of_node, "msg-serviced");

So, looks like it is mandatory if "interrupts" is used. Please update the
binding or if that is not the practice followed elsewhere, drop search by
name. Also I prefer full name "message-serviced" if possible, not strong
opinion.

> + if (ret > 0) {
> + scmi_info->irq = ret;

May be set this only if we succeed setting up handler ? I mean move this
down.

Other than these, the changes look fine.

--
Regards,
Sudeep


[PATCH v1 2/2] firmware: arm_scmi: Augment SMC/HVC to allow optional interrupt

2020-11-10 Thread Jim Quinlan
The SMC/HVC SCMI transport is modified to allow the completion of an SCMI
message to be indicated by an interrupt rather than the return of the smc
call.  This accommodates the existing behavior of the BrcmSTB SCMI
"platform" whose SW is already out in the field and cannot be changed.

Signed-off-by: Jim Quinlan 
---
 drivers/firmware/arm_scmi/smc.c | 31 +++
 1 file changed, 31 insertions(+)

diff --git a/drivers/firmware/arm_scmi/smc.c b/drivers/firmware/arm_scmi/smc.c
index 82a82a5dc86a..3bf935dbd00e 100644
--- a/drivers/firmware/arm_scmi/smc.c
+++ b/drivers/firmware/arm_scmi/smc.c
@@ -9,9 +9,11 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include "common.h"
@@ -23,6 +25,8 @@
  * @shmem: Transmit/Receive shared memory area
  * @shmem_lock: Lock to protect access to Tx/Rx shared memory area
  * @func_id: smc/hvc call function id
+ * @irq: Optional; employed when platforms indicates msg completion by intr.
+ * @tx_complete: Optional, employed only when irq is valid.
  */
 
 struct scmi_smc {
@@ -30,8 +34,19 @@ struct scmi_smc {
struct scmi_shared_mem __iomem *shmem;
struct mutex shmem_lock;
u32 func_id;
+   int irq;
+   struct completion tx_complete;
 };
 
+static irqreturn_t smc_msg_done_isr(int irq, void *data)
+{
+   struct scmi_smc *scmi_info = data;
+
+   complete(_info->tx_complete);
+
+   return IRQ_HANDLED;
+}
+
 static bool smc_chan_available(struct device *dev, int idx)
 {
struct device_node *np = of_parse_phandle(dev->of_node, "shmem", 0);
@@ -79,6 +94,20 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, 
struct device *dev,
if (ret < 0)
return ret;
 
+   /* Optional feature -- signal message completion using an interrupt */
+   ret = of_irq_get_byname(cdev->of_node, "msg-serviced");
+   if (ret > 0) {
+   scmi_info->irq = ret;
+   ret = devm_request_irq(dev, ret, smc_msg_done_isr,
+  IRQF_NO_SUSPEND,
+  dev_name(dev),
+  scmi_info);
+   if (ret) {
+   dev_err(dev, "failed to setup SCMI smc irq\n");
+   return ret;
+   }
+   init_completion(_info->tx_complete);
+   }
scmi_info->func_id = func_id;
scmi_info->cinfo = cinfo;
mutex_init(_info->shmem_lock);
@@ -111,6 +140,8 @@ static int smc_send_message(struct scmi_chan_info *cinfo,
shmem_tx_prepare(scmi_info->shmem, xfer);
 
arm_smccc_1_1_invoke(scmi_info->func_id, 0, 0, 0, 0, 0, 0, 0, );
+   if (scmi_info->irq)
+   wait_for_completion(_info->tx_complete);
scmi_rx_callback(scmi_info->cinfo, shmem_read_header(scmi_info->shmem));
 
mutex_unlock(_info->shmem_lock);
-- 
2.17.1



smime.p7s
Description: S/MIME Cryptographic Signature