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 08/10] cmd: add scmi command for SCMI firmware
Date: Mon, 3 Jul 2023 09:55:07 +0900	[thread overview]
Message-ID: <ZKIca_cir_JDLP2_@laputa> (raw)
In-Reply-To: <CAPnjgZ1HmbXy8zD0NOfurCHrCmC+qrObH4PbReZGCgKepxGb7g@mail.gmail.com>

On Thu, Jun 29, 2023 at 08:10:00PM +0100, Simon Glass wrote:
> Hi AKASHI,
> 
> On Wed, 28 Jun 2023 at 01:49, AKASHI Takahiro
> <takahiro.akashi@linaro.org> wrote:
> >
> > This command, "scmi", provides a command line interface to various SCMI
> > protocols. It supports at least initially SCMI base protocol with the sub
> > command, "base", and is intended mainly for debug purpose.
> >
> > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> > ---
> >  cmd/Kconfig  |   8 ++
> >  cmd/Makefile |   1 +
> >  cmd/scmi.c   | 373 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 382 insertions(+)
> >  create mode 100644 cmd/scmi.c
> >
> > diff --git a/cmd/Kconfig b/cmd/Kconfig
> > index 02e54f1e50fe..065470a76295 100644
> > --- a/cmd/Kconfig
> > +++ b/cmd/Kconfig
> > @@ -2504,6 +2504,14 @@ config CMD_CROS_EC
> >           a number of sub-commands for performing EC tasks such as
> >           updating its flash, accessing a small saved context area
> >           and talking to the I2C bus behind the EC (if there is one).
> > +
> > +config CMD_SCMI
> > +       bool "Enable scmi command"
> > +       depends on SCMI_FIRMWARE
> > +       default n
> > +       help
> > +         This command provides user interfaces to several SCMI protocols,
> > +         including Base protocol.
> 
> Please mention what is SCMI

I will give a full spelling.

> >  endmenu
> >
> >  menu "Filesystem commands"
> > diff --git a/cmd/Makefile b/cmd/Makefile
> > index 6c37521b4e2b..826e0b74b587 100644
> > --- a/cmd/Makefile
> > +++ b/cmd/Makefile
> > @@ -156,6 +156,7 @@ obj-$(CONFIG_CMD_SATA) += sata.o
> >  obj-$(CONFIG_CMD_NVME) += nvme.o
> >  obj-$(CONFIG_SANDBOX) += sb.o
> >  obj-$(CONFIG_CMD_SF) += sf.o
> > +obj-$(CONFIG_CMD_SCMI) += scmi.o
> >  obj-$(CONFIG_CMD_SCSI) += scsi.o disk.o
> >  obj-$(CONFIG_CMD_SHA1SUM) += sha1sum.o
> >  obj-$(CONFIG_CMD_SEAMA) += seama.o
> > diff --git a/cmd/scmi.c b/cmd/scmi.c
> > new file mode 100644
> > index 000000000000..c97f77e97d95
> > --- /dev/null
> > +++ b/cmd/scmi.c
> > @@ -0,0 +1,373 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + *  SCMI utility command
> > + *
> > + *  Copyright (c) 2023 Linaro Limited
> > + *             Author: AKASHI Takahiro
> > + */
> > +
> > +#include <common.h>
> > +#include <command.h>
> > +#include <dm/device.h>
> > +#include <dm/uclass.h> /* uclass_get_device */
> 
> Goes before linux/bitfield.h

Can you tell me why?

> > +#include <exports.h>
> > +#include <scmi_agent.h>
> > +#include <scmi_agent-uclass.h>
> > +#include <asm/types.h>
> > +#include <linux/bitfield.h>
> > +#include <linux/bitops.h>
> > +
> > +static struct udevice *agent;
> > +static struct udevice *base_proto;
> > +static const struct scmi_base_ops *ops;
> > +
> > +struct {
> > +       enum scmi_std_protocol id;
> > +       const char *name;
> > +} protocol_name[] = {
> > +       {SCMI_PROTOCOL_ID_BASE, "Base"},
> > +       {SCMI_PROTOCOL_ID_POWER_DOMAIN, "Power domain management"},
> > +       {SCMI_PROTOCOL_ID_SYSTEM, "System power management"},
> > +       {SCMI_PROTOCOL_ID_PERF, "Performance domain management"},
> > +       {SCMI_PROTOCOL_ID_CLOCK, "Clock management"},
> > +       {SCMI_PROTOCOL_ID_SENSOR, "Sensor management"},
> > +       {SCMI_PROTOCOL_ID_RESET_DOMAIN, "Reset domain management"},
> > +       {SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN, "Voltage domain management"},
> > +};
> > +
> > +/**
> > + * scmi_convert_id_to_string() - get the name of SCMI protocol
> > + *
> > + * @id:                Protocol ID
> > + *
> > + * Get the printable name of the protocol, @id
> > + *
> > + * Return:     Name string on success, NULL on failure
> > + */
> > +static const char *scmi_convert_id_to_string(enum scmi_std_protocol id)
> 
> scmi_lookup_id?

Not sure your intention.
The name above gives us exactly what this function does for pretty printing
instead of a number.
I think that 'lookup' implies we try to determine if the id exists or not.

> > +{
> > +       int i;
> > +
> > +       for (i = 0; i < ARRAY_SIZE(protocol_name); i++)
> > +               if (id == protocol_name[i].id)
> > +                       return protocol_name[i].name;
> > +
> > +       return NULL;
> > +}
> > +
> > +/**
> > + * do_scmi_base_info() - get the information of SCMI services
> > + *
> > + * @cmdtp:     Command table
> > + * @flag:      Command flag
> > + * @argc:      Number of arguments
> > + * @argv:      Argument array
> > + *
> > + * Get the information of SCMI services using various interfaces
> > + * provided by the Base protocol.
> > + *
> > + * Return:     CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> > + */
> > +static int do_scmi_base_info(struct cmd_tbl *cmdtp, int flag, int argc,
> > +                            char * const argv[])
> > +{
> > +       u32 agent_id, num_protocols;
> > +       u8 agent_name[SCMI_BASE_NAME_LENGTH_MAX], *protocols;
> > +       int i, ret;
> > +
> > +       if (argc != 1)
> > +               return CMD_RET_USAGE;
> > +
> > +       printf("SCMI device: %s\n", agent->name);
> > +       printf("  protocol version: 0x%x\n", scmi_version(agent));
> > +       printf("  # of agents: %d\n", scmi_num_agents(agent));
> > +       for (i = 0; i < scmi_num_agents(agent); i++) {
> > +               ret = (*ops->base_discover_agent)(base_proto, i, &agent_id,
> > +                                                 agent_name);
> > +               if (ret) {
> > +                       if (ret != -EOPNOTSUPP)
> > +                               printf("base_discover_agent() failed for id: %d (%d)\n",
> > +                                      i, ret);
> > +                       break;
> > +               }
> > +               printf("    %c%2d: %s\n", i == scmi_agent_id(agent) ? '>' : ' ',
> > +                      i, agent_name);
> > +       }
> > +       printf("  # of protocols: %d\n", scmi_num_protocols(agent));
> > +       num_protocols = scmi_num_protocols(agent);
> > +       protocols = scmi_protocols(agent);
> > +       if (protocols)
> > +               for (i = 0; i < num_protocols; i++)
> > +                       printf("      %s\n",
> > +                              scmi_convert_id_to_string(protocols[i]));
> > +       printf("  vendor: %s\n", scmi_vendor(agent));
> > +       printf("  sub vendor: %s\n", scmi_sub_vendor(agent));
> > +       printf("  impl version: 0x%x\n", scmi_impl_version(agent));
> > +
> > +       return CMD_RET_SUCCESS;
> > +}
> > +
> > +/**
> > + * do_scmi_base_set_dev() - set access permission to device
> > + *
> > + * @cmdtp:     Command table
> > + * @flag:      Command flag
> > + * @argc:      Number of arguments
> > + * @argv:      Argument array
> > + *
> > + * Set access permission to device with SCMI_BASE_SET_DEVICE_PERMISSIONS
> > + *
> > + * Return:     CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> > + */
> > +static int do_scmi_base_set_dev(struct cmd_tbl *cmdtp, int flag, int argc,
> > +                               char * const argv[])
> > +{
> > +       u32 agent_id, device_id, flags, attributes;
> > +       char *end;
> > +       int ret;
> > +
> > +       if (argc != 4)
> > +               return CMD_RET_USAGE;
> > +
> > +       agent_id = simple_strtoul(argv[1], &end, 16);
> > +       if (*end != '\0')
> > +               return CMD_RET_USAGE;
> > +
> > +       device_id = simple_strtoul(argv[2], &end, 16);
> > +       if (*end != '\0')
> > +               return CMD_RET_USAGE;
> > +
> > +       flags = simple_strtoul(argv[3], &end, 16);
> > +       if (*end != '\0')
> > +               return CMD_RET_USAGE;
> > +
> > +       ret = (*ops->protocol_message_attrs)(base_proto,
> > +                                            SCMI_BASE_SET_DEVICE_PERMISSIONS,
> > +                                            &attributes);
> > +       if (ret) {
> > +               printf("This operation is not supported\n");
> > +               return CMD_RET_FAILURE;
> > +       }
> > +
> > +       ret = (*ops->base_set_device_permissions)(base_proto, agent_id,
> > +                                                 device_id, flags);
> 
> Please use helpers rather than using ops directly.

Okay.

-Takahiro Akashi

> Regards,
> Simon

  reply	other threads:[~2023-07-03  0:55 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
     [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 [this message]
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=ZKIca_cir_JDLP2_@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.