All of lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Simon Glass <sjg@chromium.org>
Cc: trini@konsulko.com, etienne.carriere@st.com, u-boot@lists.denx.de
Subject: Re: [PATCH 07/10] test: dm: add SCMI base protocol test
Date: Tue, 11 Jul 2023 10:02:26 +0900	[thread overview]
Message-ID: <ZKyqIpct19sbSv9F@laputa> (raw)
In-Reply-To: <CAPnjgZ0H6xyOJ01u0EhHm1LPk_P6uHbwoNxT8+Y_JtaXY7C7Pw@mail.gmail.com>

Hi Simon,

On Mon, Jul 10, 2023 at 01:45:58PM -0600, Simon Glass wrote:
> Hi,
> 
> On Sun, 9 Jul 2023 at 20:04, AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> >
> > On Fri, Jul 07, 2023 at 11:35:49AM -0600, Simon Glass wrote:
> > > Hi,
> > >
> > > On Tue, 4 Jul 2023 at 03:35, AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> > > >
> > > > Hi Simon,
> > > >
> > > > On Mon, Jul 03, 2023 at 02:30:57PM +0100, Simon Glass wrote:
> > > > > Hi,
> > > > >
> > > > > On Mon, 3 Jul 2023 at 01:57, AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> > > > > >
> > > > > > On Thu, Jun 29, 2023 at 08:09:58PM +0100, Simon Glass wrote:
> > > > > > > Hi AKASHI,
> > > > > > >
> > > > > > > On Wed, 28 Jun 2023 at 01:49, AKASHI Takahiro
> > > > > > > <takahiro.akashi@linaro.org> wrote:
> > > > > > > >
> > > > > > > > Added is a new unit test for SCMI base protocol, which will exercise all
> > > > > > > > the commands provided by the protocol, except SCMI_BASE_NOTIFY_ERRORS.
> > > > > > > >   $ ut dm scmi_base
> > > > > > > > It is assumed that test.dtb is used as sandbox's device tree.
> > > > > > > >
> > > > > > > > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> > > > > > > > ---
> > > > > > > >  test/dm/scmi.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++
> > > > > > > >  1 file changed, 112 insertions(+)
> > > > > > > >
> > > > > > > > diff --git a/test/dm/scmi.c b/test/dm/scmi.c
> > > > > > > > index 881be3171b7c..563017bb63e0 100644
> > > > > > > > --- a/test/dm/scmi.c
> > > > > > > > +++ b/test/dm/scmi.c
> > > > > > > > @@ -16,6 +16,9 @@
> > > > > > > >  #include <clk.h>
> > > > > > > >  #include <dm.h>
> > > > > > > >  #include <reset.h>
> > > > > > > > +#include <scmi_agent.h>
> > > > > > > > +#include <scmi_agent-uclass.h>
> > > > > > > > +#include <scmi_protocols.h>
> > > > > > > >  #include <asm/scmi_test.h>
> > > > > > > >  #include <dm/device-internal.h>
> > > > > > > >  #include <dm/test.h>
> > > > > > > > @@ -95,6 +98,115 @@ static int dm_test_scmi_sandbox_agent(struct unit_test_state *uts)
> > > > > > > >  }
> > > > > > > >  DM_TEST(dm_test_scmi_sandbox_agent, UT_TESTF_SCAN_FDT);
> > > > > > > >
> > > > > > > > +static int dm_test_scmi_base(struct unit_test_state *uts)
> > > > > > > > +{
> > > > > > > > +       struct udevice *agent_dev, *base;
> > > > > > > > +       struct scmi_agent_priv *priv;
> > > > > > > > +       const struct scmi_base_ops *ops;
> > > > > > > > +       u32 version, num_agents, num_protocols, impl_version;
> > > > > > > > +       u32 attributes, agent_id;
> > > > > > > > +       char vendor[SCMI_BASE_NAME_LENGTH_MAX],
> > > > > > > > +            agent_name[SCMI_BASE_NAME_LENGTH_MAX];
> > > > > > > > +       u8 *protocols;
> > > > > > > > +       int ret;
> > > > > > > > +
> > > > > > > > +       /* preparation */
> > > > > > > > +       ut_assertok(uclass_get_device_by_name(UCLASS_SCMI_AGENT, "scmi",
> > > > > > > > +                                             &agent_dev));
> > > > > > > > +       ut_assertnonnull(agent_dev);
> > > > > > > > +       ut_assertnonnull(priv = dev_get_uclass_plat(agent_dev));
> > > > > > > > +       ut_assertnonnull(base = scmi_get_protocol(agent_dev,
> > > > > > > > +                                                 SCMI_PROTOCOL_ID_BASE));
> > > > > > > > +       ut_assertnonnull(ops = dev_get_driver_ops(base));
> > > > > > > > +
> > > > > > > > +       /* version */
> > > > > > > > +       ret = (*ops->protocol_version)(base, &version);
> > > > > > >
> > > > > > > Can you add uclass helpers to call each of the methods? That is how it
> > > > > > > is commonly done. You should not be calling ops->xxx directly here.
> > > > > >
> > > > > > Yes, I will add inline functions instead.
> > > > >
> > > > > I don't mean inline...see all the other uclasses which define a
> > > >
> > > > Okay, I will *real* functions.
> > > >
> > > > > function which is implemented in the uclass. It is confusing when one
> > > > > uclass does something different. People might copy this style and then
> > > > > the code base diverges. Did you not notice this when looking around
> > > > > the source tree?
> > > >
> > > > But one concern came up in my mind.
> > > > Contrary to ordinary "device controllers", there exists only a single
> > > > implementation of driver for each of "udevice"'s associated with SCMI
> > > > protocols including the base protocol.
> > > >
> > > > So if I follow your suggestion, the code (base.c) might look like:
> > > > ===
> > > > static int __scmi_base_discover_vendor(struct udevice *dev, u8 *vendor)
> > > > {
> > > >   ...
> > > > }
> > > >
> > > > struct scmi_base_ops scmi_base_ops = {
> > > >
> > > >   .base_discover_vendor = __scmi_base_discover_vendor,
> > > >
> > > > }
> > > >
> > > > int scmi_base_discover_vendor(struct udevice *dev, u8 *vendor)
> > > > {
> > > >   struct scmi_base_ops *ops;
> > > >
> > > >   ops = scmi_base_dev_ops(dev);
> > > >
> > > >   return ops->base_discover_vendor(dev, vendor);
> > > > }
> > > > ===
> > > >
> > > > We will have to have similar definitions for every operation in ops.
> > > > It looks quite weird to me as there are always pairs of functions,
> > > > like __scmi_base_discover_vendor() and scmi_base_discover_vendor().
> > >
> > > Yes I understand that you only have one driver at present. Is there
> > > not a sandbox driver?
> >
> > No.
> > Please remember that SCMI protocol drivers on U-Boot are nothing but
> > stubs that makes a call to SCMI servers, supporting common communication
> > channel interfaces for different transports (either OP-TEE, SMCCC or mailbox).
> >
> > Sandbox driver, if is properly named, is also implemented as a sort of
> > transport layer, where a invocation is replaced with a function call which
> > mimicks one of specific commands in SCMI protocol on behalf of a real SCMI server.
> >
> > In this sense, there will exist only a single driver under the current
> > form of framework forever.
> 
> OK, so driver model is used for the transport but not the top-level
> driver? I see.

I'm not sure if you fully understand.
Yes, transports, or interchangeably named as a channel, are modeled
as U-Boot devices as you see in drivers/firmware/scmi/*_agent.c
(Their names, *_agent, are misleading in my opinion as their functionality
is purely a transport method to SCMI server. An agent means, in SCMI jargon,
a user or client of SCMI server.)

On top of that, each SCMI protocol, the base protocol in my patch set,
is also modeled as a U-Boot device.
You can see another example, say, in drivers/firmware/clk/clk_scmi.c.

Since there is no corresponding uclass for the base protocol, I create
a new one (UCLASS_SCMI_BASE) even though it may not be seen an concrete
device object.

> >
> > >
> > > >
> > > > We can avoid this redundant code easily by eliminating "ops" abstraction.
> > > > But as far as I remember, you insist that every driver that complies
> > > > to U-Boot driver model should have a "ops".
> > > >
> > > > What do you make of this?
> > >
> > > Well there are some exceptions, but yes that is the idea. Operations
> > > should be in a 'ops' struct and documented and implemented in a
> > > consistent way.
> >
> > Is it your choice that I should keep "ops" structure in this specific
> > implementation?
> 
> I can't actually find this patch on patchwork.

Indeed (why?), but you have already seen it.
https://lists.denx.de/pipermail/u-boot/2023-June/521288.html

> But yes, you do need a function for each ops call. They should be used
> in the tests, which should not directly call functions using
> ops->xxx()

Even though there is no practical benefit to do so. Right?

-Takahiro Akashi

> 
> Regards,
> Simon

  reply	other threads:[~2023-07-11  1:02 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-28  0:48 [PATCH 00/10] firmware: scmi: add SCMI base protocol support AKASHI Takahiro
2023-06-28  0:48 ` [PATCH 01/10] firmware: scmi: implement SCMI base protocol AKASHI Takahiro
2023-06-29 19:09   ` Simon Glass
2023-07-03  0:37     ` AKASHI Takahiro
2023-06-28  0:48 ` [PATCH 02/10] firmware: scmi: framework for installing additional protocols AKASHI Takahiro
2023-06-28  0:48 ` [PATCH 03/10] firmware: scmi: install base protocol to SCMI agent AKASHI Takahiro
2023-06-28  0:48 ` [PATCH 04/10] sandbox: remove SCMI base node definition from test.dts AKASHI Takahiro
2023-06-29 19:10   ` Simon Glass
2023-06-28  0:48 ` [PATCH 05/10] firmware: scmi: fake base protocol commands on sandbox AKASHI Takahiro
2023-06-29 19:09   ` Simon Glass
2023-06-28  0:48 ` [PATCH 06/10] test: dm: simplify SCMI unit test " AKASHI Takahiro
2023-06-29 19:09   ` Simon Glass
2023-06-28  0:48 ` [PATCH 07/10] test: dm: add SCMI base protocol test AKASHI Takahiro
2023-06-29 19:09   ` Simon Glass
2023-07-03  0:57     ` AKASHI Takahiro
2023-07-03 13:30       ` Simon Glass
2023-07-04  2:35         ` AKASHI Takahiro
2023-07-07 17:35           ` Simon Glass
2023-07-10  2:04             ` AKASHI Takahiro
2023-07-10 19:45               ` Simon Glass
2023-07-11  1:02                 ` AKASHI Takahiro [this message]
     [not found]                   ` <CAPnjgZ3HyYBRU0nQmauC1KBd-krOOJAORmbSRUki=KUHc+=TMw@mail.gmail.com>
2023-07-14  0:41                     ` AKASHI Takahiro
2023-07-15 23:40                       ` Simon Glass
2023-06-28  0:48 ` [PATCH 08/10] cmd: add scmi command for SCMI firmware AKASHI Takahiro
2023-06-29 19:10   ` Simon Glass
2023-07-03  0:55     ` AKASHI Takahiro
2023-07-03 13:30       ` Simon Glass
2023-07-04  1:26         ` AKASHI Takahiro
2023-07-07 17:35           ` Simon Glass
2023-07-10  1:46             ` AKASHI Takahiro
2023-06-28  0:48 ` [PATCH 09/10] doc: cmd: add documentation for scmi AKASHI Takahiro
2023-06-29 19:10   ` Simon Glass
2023-07-03  1:19     ` AKASHI Takahiro
2023-07-03 13:30       ` Simon Glass
2023-07-04  2:05         ` AKASHI Takahiro
2023-07-07 17:35           ` Simon Glass
2023-06-28  0:48 ` [PATCH 10/10] test: dm: add scmi command test AKASHI Takahiro
2023-06-29 19:10   ` Simon Glass

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=ZKyqIpct19sbSv9F@laputa \
    --to=takahiro.akashi@linaro.org \
    --cc=etienne.carriere@st.com \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /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.