Re: [PATCH v1 2/2] firmware: arm_scmi: Augment SMC/HVC to allow optional interrupt
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
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
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
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
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