All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cristian Marussi <cristian.marussi@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, sudeep.holla@arm.com,
	james.quinlan@broadcom.com, Jonathan.Cameron@huawei.com,
	f.fainelli@gmail.com, etienne.carriere@linaro.org,
	souvik.chakravarty@arm.com, wleavitt@marvell.com,
	peter.hilber@opensynergy.com, nicola.mazzucato@arm.com,
	tarek.el-sherbiny@arm.com
Subject: Re: [PATCH v3 0/9] Introduce a unified API for SCMI Server testing
Date: Fri, 7 Oct 2022 16:37:46 +0100	[thread overview]
Message-ID: <Y0BHynXmexuqKEqJ@e120937-lin> (raw)
In-Reply-To: <CAKfTPtAt4803k1WpQru+8Sg5PFkSXaSF6b6wNeyu6yCiypVUEw@mail.gmail.com>

On Fri, Oct 07, 2022 at 04:23:33PM +0200, Vincent Guittot wrote:
> Hi Cristian,
> 

Hi Vincent

thanks for give it a try !

> On Sat, 3 Sept 2022 at 20:31, Cristian Marussi <cristian.marussi@arm.com> wrote:
> >
> > Hi all,
> >
> > This series aims to introduce a new SCMI unified userspace interface meant
> > to ease testing an SCMI Server implementation for compliance, fuzzing etc.,
> > from the perspective of the OSPM agent (non-secure world only ...)
> >
> > It is proposed as a testing/development facility, it is NOT meant to be a
> > feature to use in production, but only enabled in Kconfig for test
> > deployments.
> >
> > Currently an SCMI Compliance Suite like the one at [1] can only work by
> > injecting SCMI messages at the SCMI transport layer using the mailbox test
> > driver (CONFIG_MAILBOX_TEST) via its few debugfs entries and looking at
> > the related replies from the SCMI backend Server.
> >
> 
> ...
> 
> >
> > In V2 the runtime enable/disable switching capability has been removed
> > (for now) since still not deemed to be stable/reliable enough: as a
> > consequence when SCMI Raw support is compiled in, the regular SCMI stack
> > drivers are now inhibited permanently for that Kernel.
> >
> > A quick and trivial example from the shell...reading from a sensor
> > injecting a properly crafted packet in raw mode:
> >
> >         # INJECT THE SENSOR_READING MESSAGE FOR SENSOR ID=1 (binary little endian)
> >         root@deb-buster-arm64:~# echo -e -n \\x06\\x54\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00 > /sys/kernel/debug/scmi_raw/message
> 
> I have tried your patchset with an SCMI server using an optee-os
> transport channel but I have a timed out error when trying your
> example above to read sensor1
> 
> #  echo -e -n \\x06\\x54\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00
> > /sys/kernel/debug/scmi_raw/message
> # [   93.306690] arm-scmi firmware:scmi0: timed out in RAW response -
> HDR:00005406
> 
> and there no response available when trying to read it with
> # cat /sys/kernel/debug/scmi_raw/message
> 

is there anything cat'ting /sys/kernel/debug/scmi_raw/errors ?

> 
> The sensor 1 can be successfully read in normal mode:
> # cat /sys/class/hwmon/hwmon0/temp1_input
> 25000
> #
> 
> In both case, the SCMI server received the requests and replied successfully
> 
> Could it be that you process the answer differently in case of raw mode ?
> 

Well, absolutely, when in raw mode the reply is picked up directly into
the RX path and copied in a message queue to be read from asyncrhnously
later via debugfs.

... mmm I think I found the problem...the reply is picked up on the RX *IRQ*
path as of now...but in optee/SMC there is no interrupt (sometime there is in
SMC) and the reply is instead read back straight away (transport is marked as
sync_cmds_completed_on_ret=true in fact).... so this is the issue probably ...
I have NOT tested on anything but mailbox and virtio till now...and I
missed this possibility that this NO-irq reply was a thing even when NOT
in polling mode (which I do not support)...my bad :<

Ok, next week I'll rework the series to fix this big_BUG and some other minor
things...in the meantime if you want to try this snippet down below...

... this won't definitely be the final patch but it could let you experiment
more (only build tested though )

Thanks for testing !
Cristian

--->8-------

diff --git a/drivers/firmware/arm_scmi/raw_mode.c b/drivers/firmware/arm_scmi/raw_mode.c
index 13eeebe4b7a8..b9fcb66a1b6a 100644
--- a/drivers/firmware/arm_scmi/raw_mode.c
+++ b/drivers/firmware/arm_scmi/raw_mode.c
@@ -197,6 +197,8 @@ struct scmi_dbg_raw_data {
        size_t rx_size;
 };
 
+void scmi_raw_message_report(void *r, struct scmi_xfer *xfer, unsigned int idx);
+
 static inline
 struct scmi_raw_buffer *scmi_raw_buffer_get(struct scmi_raw_mode_info *raw,
                                            unsigned int idx)
@@ -389,22 +391,34 @@ static void scmi_xfer_raw_worker(struct work_struct *work)
 
                xfer = rw->xfer;
 
-               /*
-                * Waiters are queued by wait-deadline at the end, so some of
-                * them could have been already expired when processed, BUT we
-                * have to check the completion status anyway just in case a
-                * virtually expired (aged) transaction was indeed completed
-                * fine and we'll have to wait for the asynchronous part (if
-                * any).
-                */
-               aging = jiffies - rw->start_jiffies;
-               tmo = max_tmo > aging ? max_tmo - aging : 0;
-
-               if ((tmo && !wait_for_completion_timeout(&xfer->done, tmo)) ||
-                   (!tmo && !try_wait_for_completion(&xfer->done))) {
-                       dev_err(dev, "timed out in RAW response - HDR:%08X\n",
-                               pack_scmi_header(&xfer->hdr));
-                       ret = -ETIMEDOUT;
+               if (!raw->desc->sync_cmds_completed_on_ret) {
+                       /*
+                        * Waiters are queued by wait-deadline at the end, so some of
+                        * them could have been already expired when processed, BUT we
+                        * have to check the completion status anyway just in case a
+                        * virtually expired (aged) transaction was indeed completed
+                        * fine and we'll have to wait for the asynchronous part (if
+                        * any).
+                        */
+                       aging = jiffies - rw->start_jiffies;
+                       tmo = max_tmo > aging ? max_tmo - aging : 0;
+
+                       if ((tmo &&
+                            !wait_for_completion_timeout(&xfer->done, tmo)) ||
+                            (!tmo && !try_wait_for_completion(&xfer->done))) {
+                               dev_err(dev,
+                                       "timed out in RAW response - HDR:%08X\n",
+                                       pack_scmi_header(&xfer->hdr));
+                               ret = -ETIMEDOUT;
+                       }
+               } else {
+                       raw->desc->ops->fetch_response(rw->cinfo, xfer);
+                       /* Trace polled replies. */
+                       trace_scmi_msg_dump(xfer->hdr.protocol_id, xfer->hdr.id,
+                                           "RESP",
+                                           xfer->hdr.seq, xfer->hdr.status,
+                                           xfer->rx.buf, xfer->rx.len);
+                       scmi_raw_message_report(raw, xfer, SCMI_RAW_REPLY_QUEUE);
                }
 
                /* Avoid unneeded async waits */


---8<-------


WARNING: multiple messages have this Message-ID (diff)
From: Cristian Marussi <cristian.marussi@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, sudeep.holla@arm.com,
	james.quinlan@broadcom.com, Jonathan.Cameron@huawei.com,
	f.fainelli@gmail.com, etienne.carriere@linaro.org,
	souvik.chakravarty@arm.com, wleavitt@marvell.com,
	peter.hilber@opensynergy.com, nicola.mazzucato@arm.com,
	tarek.el-sherbiny@arm.com
Subject: Re: [PATCH v3 0/9] Introduce a unified API for SCMI Server testing
Date: Fri, 7 Oct 2022 16:37:46 +0100	[thread overview]
Message-ID: <Y0BHynXmexuqKEqJ@e120937-lin> (raw)
In-Reply-To: <CAKfTPtAt4803k1WpQru+8Sg5PFkSXaSF6b6wNeyu6yCiypVUEw@mail.gmail.com>

On Fri, Oct 07, 2022 at 04:23:33PM +0200, Vincent Guittot wrote:
> Hi Cristian,
> 

Hi Vincent

thanks for give it a try !

> On Sat, 3 Sept 2022 at 20:31, Cristian Marussi <cristian.marussi@arm.com> wrote:
> >
> > Hi all,
> >
> > This series aims to introduce a new SCMI unified userspace interface meant
> > to ease testing an SCMI Server implementation for compliance, fuzzing etc.,
> > from the perspective of the OSPM agent (non-secure world only ...)
> >
> > It is proposed as a testing/development facility, it is NOT meant to be a
> > feature to use in production, but only enabled in Kconfig for test
> > deployments.
> >
> > Currently an SCMI Compliance Suite like the one at [1] can only work by
> > injecting SCMI messages at the SCMI transport layer using the mailbox test
> > driver (CONFIG_MAILBOX_TEST) via its few debugfs entries and looking at
> > the related replies from the SCMI backend Server.
> >
> 
> ...
> 
> >
> > In V2 the runtime enable/disable switching capability has been removed
> > (for now) since still not deemed to be stable/reliable enough: as a
> > consequence when SCMI Raw support is compiled in, the regular SCMI stack
> > drivers are now inhibited permanently for that Kernel.
> >
> > A quick and trivial example from the shell...reading from a sensor
> > injecting a properly crafted packet in raw mode:
> >
> >         # INJECT THE SENSOR_READING MESSAGE FOR SENSOR ID=1 (binary little endian)
> >         root@deb-buster-arm64:~# echo -e -n \\x06\\x54\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00 > /sys/kernel/debug/scmi_raw/message
> 
> I have tried your patchset with an SCMI server using an optee-os
> transport channel but I have a timed out error when trying your
> example above to read sensor1
> 
> #  echo -e -n \\x06\\x54\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00
> > /sys/kernel/debug/scmi_raw/message
> # [   93.306690] arm-scmi firmware:scmi0: timed out in RAW response -
> HDR:00005406
> 
> and there no response available when trying to read it with
> # cat /sys/kernel/debug/scmi_raw/message
> 

is there anything cat'ting /sys/kernel/debug/scmi_raw/errors ?

> 
> The sensor 1 can be successfully read in normal mode:
> # cat /sys/class/hwmon/hwmon0/temp1_input
> 25000
> #
> 
> In both case, the SCMI server received the requests and replied successfully
> 
> Could it be that you process the answer differently in case of raw mode ?
> 

Well, absolutely, when in raw mode the reply is picked up directly into
the RX path and copied in a message queue to be read from asyncrhnously
later via debugfs.

... mmm I think I found the problem...the reply is picked up on the RX *IRQ*
path as of now...but in optee/SMC there is no interrupt (sometime there is in
SMC) and the reply is instead read back straight away (transport is marked as
sync_cmds_completed_on_ret=true in fact).... so this is the issue probably ...
I have NOT tested on anything but mailbox and virtio till now...and I
missed this possibility that this NO-irq reply was a thing even when NOT
in polling mode (which I do not support)...my bad :<

Ok, next week I'll rework the series to fix this big_BUG and some other minor
things...in the meantime if you want to try this snippet down below...

... this won't definitely be the final patch but it could let you experiment
more (only build tested though )

Thanks for testing !
Cristian

--->8-------

diff --git a/drivers/firmware/arm_scmi/raw_mode.c b/drivers/firmware/arm_scmi/raw_mode.c
index 13eeebe4b7a8..b9fcb66a1b6a 100644
--- a/drivers/firmware/arm_scmi/raw_mode.c
+++ b/drivers/firmware/arm_scmi/raw_mode.c
@@ -197,6 +197,8 @@ struct scmi_dbg_raw_data {
        size_t rx_size;
 };
 
+void scmi_raw_message_report(void *r, struct scmi_xfer *xfer, unsigned int idx);
+
 static inline
 struct scmi_raw_buffer *scmi_raw_buffer_get(struct scmi_raw_mode_info *raw,
                                            unsigned int idx)
@@ -389,22 +391,34 @@ static void scmi_xfer_raw_worker(struct work_struct *work)
 
                xfer = rw->xfer;
 
-               /*
-                * Waiters are queued by wait-deadline at the end, so some of
-                * them could have been already expired when processed, BUT we
-                * have to check the completion status anyway just in case a
-                * virtually expired (aged) transaction was indeed completed
-                * fine and we'll have to wait for the asynchronous part (if
-                * any).
-                */
-               aging = jiffies - rw->start_jiffies;
-               tmo = max_tmo > aging ? max_tmo - aging : 0;
-
-               if ((tmo && !wait_for_completion_timeout(&xfer->done, tmo)) ||
-                   (!tmo && !try_wait_for_completion(&xfer->done))) {
-                       dev_err(dev, "timed out in RAW response - HDR:%08X\n",
-                               pack_scmi_header(&xfer->hdr));
-                       ret = -ETIMEDOUT;
+               if (!raw->desc->sync_cmds_completed_on_ret) {
+                       /*
+                        * Waiters are queued by wait-deadline at the end, so some of
+                        * them could have been already expired when processed, BUT we
+                        * have to check the completion status anyway just in case a
+                        * virtually expired (aged) transaction was indeed completed
+                        * fine and we'll have to wait for the asynchronous part (if
+                        * any).
+                        */
+                       aging = jiffies - rw->start_jiffies;
+                       tmo = max_tmo > aging ? max_tmo - aging : 0;
+
+                       if ((tmo &&
+                            !wait_for_completion_timeout(&xfer->done, tmo)) ||
+                            (!tmo && !try_wait_for_completion(&xfer->done))) {
+                               dev_err(dev,
+                                       "timed out in RAW response - HDR:%08X\n",
+                                       pack_scmi_header(&xfer->hdr));
+                               ret = -ETIMEDOUT;
+                       }
+               } else {
+                       raw->desc->ops->fetch_response(rw->cinfo, xfer);
+                       /* Trace polled replies. */
+                       trace_scmi_msg_dump(xfer->hdr.protocol_id, xfer->hdr.id,
+                                           "RESP",
+                                           xfer->hdr.seq, xfer->hdr.status,
+                                           xfer->rx.buf, xfer->rx.len);
+                       scmi_raw_message_report(raw, xfer, SCMI_RAW_REPLY_QUEUE);
                }
 
                /* Avoid unneeded async waits */


---8<-------


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2022-10-07 15:37 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-03 18:30 [PATCH v3 0/9] Introduce a unified API for SCMI Server testing Cristian Marussi
2022-09-03 18:30 ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 1/9] firmware: arm_scmi: Refactor xfer in-flight registration routines Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 2/9] firmware: arm_scmi: Simplify chan_available transport operation Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 3/9] firmware: arm_scmi: Use dedicated devices to initialize channels Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 4/9] firmware: arm_scmi: Add xfer raw helpers Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 5/9] firmware: arm_scmi: Move errors defs and code to common.h Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 6/9] firmware: arm_scmi: Add raw transmission support Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 7/9] firmware: arm_scmi: Add debugfs ABI documentation for Raw mode Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 8/9] firmware: arm_scmi: Reject SCMI drivers while in " Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-09-03 18:30 ` [PATCH v3 9/9] firmware: arm_scmi: Call Raw mode hooks from the core stack Cristian Marussi
2022-09-03 18:30   ` Cristian Marussi
2022-10-07 14:23 ` [PATCH v3 0/9] Introduce a unified API for SCMI Server testing Vincent Guittot
2022-10-07 14:23   ` Vincent Guittot
2022-10-07 15:37   ` Cristian Marussi [this message]
2022-10-07 15:37     ` Cristian Marussi
2022-10-07 15:58     ` Vincent Guittot
2022-10-07 15:58       ` Vincent Guittot
2022-10-07 16:07       ` Cristian Marussi
2022-10-07 16:07         ` Cristian Marussi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y0BHynXmexuqKEqJ@e120937-lin \
    --to=cristian.marussi@arm.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=etienne.carriere@linaro.org \
    --cc=f.fainelli@gmail.com \
    --cc=james.quinlan@broadcom.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nicola.mazzucato@arm.com \
    --cc=peter.hilber@opensynergy.com \
    --cc=souvik.chakravarty@arm.com \
    --cc=sudeep.holla@arm.com \
    --cc=tarek.el-sherbiny@arm.com \
    --cc=vincent.guittot@linaro.org \
    --cc=wleavitt@marvell.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.