linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sudeep Holla <sudeep.holla@arm.com>
To: Ashwin Chaugule <ashwin.chaugule@linaro.org>,
	"jaswinder.singh@linaro.org" <jaswinder.singh@linaro.org>
Cc: Sudeep Holla <sudeep.holla@arm.com>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"patches@linaro.org" <patches@linaro.org>,
	"linaro-acpi@lists.linaro.org" <linaro-acpi@lists.linaro.org>,
	"rjw@rjwysocki.net" <rjw@rjwysocki.net>,
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
	"broonie@kernel.org" <broonie@kernel.org>,
	"lv.zheng@intel.com" <lv.zheng@intel.com>
Subject: Re: [Linaro-acpi] [PATCH v10 1/1] Mailbox: Add support for Platform Communication Channel
Date: Tue, 11 Nov 2014 10:30:32 +0000	[thread overview]
Message-ID: <5461E548.2040204@arm.com> (raw)
In-Reply-To: <1415371964-4451-2-git-send-email-ashwin.chaugule@linaro.org>

Hi Ashwin,

On 07/11/14 14:52, Ashwin Chaugule wrote:
> ACPI 5.0+ spec defines a generic mode of communication
> between the OS and a platform such as the BMC. This medium
> (PCC) is typically used by CPPC (ACPI CPU Performance management),
> RAS (ACPI reliability protocol) and MPST (ACPI Memory power
> states).
>
> This patch adds PCC support as a Mailbox Controller.
>
> Reviewed-by: Mark Brown <broonie@kernel.org>
> Signed-off-by: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> ---
>   drivers/mailbox/Kconfig   |  12 ++
>   drivers/mailbox/Makefile  |   2 +
>   drivers/mailbox/mailbox.c |   4 +-
>   drivers/mailbox/mailbox.h |  16 ++
>   drivers/mailbox/pcc.c     | 367 ++++++++++++++++++++++++++++++++++++++++++++++
>   5 files changed, 398 insertions(+), 3 deletions(-)
>   create mode 100644 drivers/mailbox/mailbox.h
>   create mode 100644 drivers/mailbox/pcc.c
>
> diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
> index 9fd9c67..c04fed9 100644
> --- a/drivers/mailbox/Kconfig
> +++ b/drivers/mailbox/Kconfig
> @@ -33,4 +33,16 @@ config OMAP_MBOX_KFIFO_SIZE
>            Specify the default size of mailbox's kfifo buffers (bytes).
>            This can also be changed at runtime (via the mbox_kfifo_size
>            module parameter).
> +
> +config PCC
> +       bool "Platform Communication Channel Driver"
> +       depends on ACPI

I am bit confused here, though I prefer PCC to depend on ACPI, I have
seen discussion in this thread about using PCC without ACPI, how will
that work ?

> +       help
> +         ACPI 5.0+ spec defines a generic mode of communication
> +         between the OS and a platform such as the BMC. This medium
> +         (PCC) is typically used by CPPC (ACPI CPU Performance management),
> +         RAS (ACPI reliability protocol) and MPST (ACPI Memory power
> +         states). Select this driver if your platform implements the
> +         PCC clients mentioned above.
> +
>   endif

[...]

> diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c
> new file mode 100644
> index 0000000..49074cd0
> --- /dev/null
> +++ b/drivers/mailbox/pcc.c
> @@ -0,0 +1,367 @@
> +/*
> + *     Copyright (C) 2014 Linaro Ltd.
> + *     Author: Ashwin Chaugule <ashwin.chaugule@linaro.org>
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation; either version 2 of the License, or
> + *  (at your option) any later version.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  PCC (Platform Communication Channel) is defined in the ACPI 5.0+
> + *  specification. It is a mailbox like mechanism to allow clients
> + *  such as CPPC (Collaborative Processor Performance Control), RAS
> + *  (Reliability, Availability and Serviceability) and MPST (Memory
> + *  Node Power State Table) to talk to the platform (e.g. BMC) through
> + *  shared memory regions as defined in the PCC table entries. The PCC
> + *  specification supports a Doorbell mechanism for the PCC clients
> + *  to notify the platform about new data. This Doorbell information
> + *  is also specified in each PCC table entry. See pcc_send_data()
> + *  and pcc_tx_done() for basic mode of operation.
> + *
> + *  For more details about PCC, please see the ACPI specification from
> + *  http://www.uefi.org/ACPIv5.1 Section 14.
> + *
> + *  This file implements PCC as a Mailbox controller and allows for PCC
> + *  clients to be implemented as its Mailbox Client Channels.
> + */
> +
> +#include <linux/acpi.h>
> +#include <linux/delay.h>
> +#include <linux/io.h>
> +#include <linux/init.h>
> +#include <linux/platform_device.h>
> +#include <linux/mailbox_controller.h>
> +#include <linux/mailbox_client.h>
> +
> +#include "mailbox.h"
> +
> +#define MAX_PCC_SUBSPACES      256
> +#define PCCS_SS_SIG_MAGIC      0x50434300
> +#define PCC_CMD_COMPLETE       0x1
> +
> +static struct mbox_chan pcc_mbox_chan[MAX_PCC_SUBSPACES];

Really, do you want to allocate 256 structures of mbox_chan even on
systems with just 1 - 2 channels(typically that would be the case) ?

> +static struct mbox_controller pcc_mbox_ctrl = {};
> +

[...]

> +
> +/**
> + * pcc_tx_done - Callback from Mailbox controller code to
> + *             check if PCC message transmission completed.
> + * @chan: Pointer to Mailbox channel on which previous
> + *             transmission occurred.
> + *
> + * Return: TRUE if succeeded.
> + */
> +static bool pcc_tx_done(struct mbox_chan *chan)
> +{
> +       struct acpi_pcct_hw_reduced *pcct_ss = chan->con_priv;
> +       struct acpi_pcct_shared_memory *generic_comm_base =
> +               (struct acpi_pcct_shared_memory *) pcct_ss->base_address;

IIUC, the PCCT table has the physical base Address of the shared memory
range in the PCC subspace structures. Can you use that directly here ?
Or are you mapping that memory elsewhere and updating the mapped address
to the table ?

> +       u16 cmd_delay = pcct_ss->min_turnaround_time;
> +       unsigned int retries = 0;
> +
> +       /* Try a few times while waiting for platform to consume */
> +       while (!(readw_relaxed(&generic_comm_base->status)

This will explode if the pcct_ss->base_address is not mapped.

> +                   & PCC_CMD_COMPLETE)) {
> +
> +               if (retries++ < 5)
> +                       udelay(cmd_delay);
> +               else {
> +                       /*
> +                        * If the remote is dead, this will cause the Mbox
> +                        * controller to timeout after mbox client.tx_tout
> +                        * msecs.
> +                        */
> +                       pr_err("PCC platform did not respond.\n");
> +                       return false;
> +               }
> +       }
> +       return true;
> +}

In general you can isolate all the access to the shared memory in the
protocol layer. In that case you might have to use mbox_client_txdone
instead of this pcc_tx_done.

> +
> +/**
> + * get_subspace_id - Given a Mailbox channel, find out the
> + *             PCC subspace id.
> + * @chan: Pointer to Mailbox Channel from which we want
> + *             the index.
> + * Return: Errno if not found, else positive index number.
> + */
> +static int get_subspace_id(struct mbox_chan *chan)
> +{
> +       int id = chan - pcc_mbox_chan;
> +
> +       if (id < 0 || id > pcc_mbox_ctrl.num_chans)
> +               return -ENOENT;
> +
> +       return id;
> +}
> +
> +/**
> + * pcc_send_data - Called from Mailbox Controller code to finally
> + *     transmit data over channel.
> + * @chan: Pointer to Mailbox channel over which to send data.
> + * @data: Actual data to be written over channel.
> + *
> + * Return: Err if something failed else 0 for success.
> + */
> +static int pcc_send_data(struct mbox_chan *chan, void *data)
> +{
> +       struct acpi_pcct_hw_reduced *pcct_ss = chan->con_priv;
> +       struct acpi_pcct_shared_memory *generic_comm_base =
> +               (struct acpi_pcct_shared_memory *) pcct_ss->base_address;
> +       struct acpi_generic_address doorbell;
> +       u64 doorbell_preserve;
> +       u64 doorbell_val;
> +       u64 doorbell_write;
> +       u16 cmd = *(u16 *) data;
> +       u16 ss_idx = -1;
> +
> +       ss_idx = get_subspace_id(chan);
> +
> +       if (ss_idx < 0) {
> +               pr_err("Invalid Subspace ID from PCC client\n");
> +               return -EINVAL;
> +       }
> +
> +       doorbell = pcct_ss->doorbell_register;
> +       doorbell_preserve = pcct_ss->preserve_mask;
> +       doorbell_write = pcct_ss->write_mask;
> +
> +       /* Write to the shared comm region. */
> +       writew(cmd, &generic_comm_base->command);
> +
> +       /* Write Subspace MAGIC value so platform can identify destination. */
> +       writel((PCCS_SS_SIG_MAGIC | ss_idx), &generic_comm_base->signature);
> +
> +       /* Flip CMD COMPLETE bit */
> +       writew(0, &generic_comm_base->status);
> +

IMO it's not clean to modify only first 3 elements namely: Signature,
Command and Status while the Communication Space is updated elsewhere.
It's better to have all of them in one place if possible as mentioned above.

> +       /* Sync notification from OSPM to Platform. */
> +       acpi_read(&doorbell_val, &doorbell);
> +       acpi_write((doorbell_val & doorbell_preserve) | doorbell_write,
> +                       &doorbell);
> +

Only the above 2 must be part of the controller driver, the remaining as
I mentioned can be move to the protocol/client layer, thoughts ?

> +       return 0;
> +}
> +
> +static struct mbox_chan_ops pcc_chan_ops = {
> +       .send_data = pcc_send_data,
> +       .last_tx_done = pcc_tx_done,
> +};
> +

[...]

> +/**
> + * acpi_pcc_probe - Parse the ACPI tree for the PCCT.
> + *
> + * Return: 0 for Success, else errno.
> + */
> +static int __init acpi_pcc_probe(void)
> +{
> +       acpi_status status = AE_OK;
> +       acpi_size pcct_tbl_header_size;
> +       int count;
> +       struct acpi_table_pcct *pcct_tbl;
> +
> +       /* Search for PCCT */
> +       status = acpi_get_table_with_size(ACPI_SIG_PCCT, 0,
> +                       (struct acpi_table_header **)&pcct_tbl,
> +                       &pcct_tbl_header_size);
> +
> +       if (ACPI_FAILURE(status) || !pcct_tbl) {
> +               pr_warn("PCCT header not found.\n");
> +               return -ENODEV;
> +       }
> +
> +       count = acpi_table_parse_entries(ACPI_SIG_PCCT,
> +                       sizeof(struct acpi_table_pcct),

s/struct acpi_table_pcct/*pcct_tbl/

In general, the interrupt part of the PCCT SS is not considered in this
patch. It's better to see/discuss how that can be fit into the mailbox
framework, though it could be follow up patch.

Regards,
Sudeep


  parent reply	other threads:[~2014-11-11 10:30 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-07 14:52 [PATCH v10 0/1] PCC: Platform Communication Channel Ashwin Chaugule
2014-11-07 14:52 ` [PATCH v10 1/1] Mailbox: Add support for " Ashwin Chaugule
2014-11-09 13:48   ` Jassi Brar
2014-11-09 15:20     ` Ashwin Chaugule
2014-11-09 16:18       ` Jassi Brar
2014-11-09 17:22         ` Ashwin Chaugule
2014-11-10  4:13           ` Jassi Brar
2014-11-10 12:57             ` Ashwin Chaugule
2014-11-10 13:39               ` Jassi Brar
2014-11-10 13:53                 ` Ashwin Chaugule
2014-11-10 14:16                   ` Jassi Brar
2014-11-10 14:47                     ` Ashwin Chaugule
2014-11-10 17:44                       ` Jassi Brar
2014-11-10 20:13                         ` Mark Brown
2014-11-10 20:29                           ` [Linaro-acpi] " Arnd Bergmann
2014-11-11  4:31                             ` Jassi Brar
2014-11-11  4:04                           ` Jassi Brar
2014-11-11 13:02                             ` Ashwin Chaugule
2014-11-11 13:57                               ` Jassi Brar
2014-11-11 16:33                                 ` [Linaro-acpi] " Arnd Bergmann
2014-11-11 17:39                                   ` Jassi Brar
2014-11-11 17:54                                     ` Arnd Bergmann
2014-11-11 19:08                                       ` Jassi Brar
2014-11-11 19:22                                         ` Ashwin Chaugule
2014-11-11 20:38                                         ` Arnd Bergmann
2014-11-11 17:53                                   ` Mark Brown
2014-11-11 10:30   ` Sudeep Holla [this message]
2014-11-11 13:18     ` Ashwin Chaugule
2014-11-11 15:01       ` Sudeep Holla
2014-11-11 20:25         ` Arnd Bergmann
2014-11-12 13:32           ` Sudeep Holla
2014-11-12 13:48             ` Ashwin Chaugule
2014-11-12 14:03               ` Sudeep Holla
2014-11-12 18:25           ` [Linaro-acpi] " Ashwin Chaugule
2014-11-12 18:26             ` Mark Brown
2014-11-12 19:04             ` Jassi Brar
2014-11-12 19:16               ` Ashwin Chaugule
2014-11-11 17:29     ` Mark Brown
2014-11-11 18:07       ` Sudeep Holla
2014-11-11 15:12   ` Jassi Brar
2014-11-11 15:19     ` Ashwin Chaugule
2014-11-11 15:25       ` Jassi Brar

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=5461E548.2040204@arm.com \
    --to=sudeep.holla@arm.com \
    --cc=arnd@arndb.de \
    --cc=ashwin.chaugule@linaro.org \
    --cc=broonie@kernel.org \
    --cc=jaswinder.singh@linaro.org \
    --cc=linaro-acpi@lists.linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=lv.zheng@intel.com \
    --cc=patches@linaro.org \
    --cc=rjw@rjwysocki.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).