linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sudeep Holla <sudeep.holla@arm.com>
To: Julien Thierry <julien.thierry@arm.com>,
	ALKML <linux-arm-kernel@lists.infradead.org>,
	LKML <linux-kernel@vger.kernel.org>,
	DTML <devicetree@vger.kernel.org>
Cc: Sudeep Holla <sudeep.holla@arm.com>, Nishanth Menon <nm@ti.com>,
	Harb Abdulhamid <harba@codeaurora.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Jassi Brar <jassisinghbrar@gmail.com>,
	Ryan Harkin <Ryan.Harkin@arm.com>,
	Roy Franz <roy.franz@cavium.com>, Loc Ho <lho@apm.com>,
	Alexey Klimov <alexey.klimov@arm.com>
Subject: Re: [PATCH v2 03/18] firmware: arm_scmi: add basic driver infrastructure for SCMI
Date: Tue, 5 Sep 2017 11:26:16 +0100	[thread overview]
Message-ID: <e566e6b9-fc0e-bafd-4549-beb03d17adf5@arm.com> (raw)
In-Reply-To: <e05e75d4-e4ec-41b0-6983-63afeddd82f6@arm.com>

Hi Julien,

Thanks for reviewing this.

On 05/09/17 11:03, Julien Thierry wrote:
> Hi Sudeep,
> 
> I am not sure what the patch does is correct when having a big endian
> kernel dealing with scmi_shared_mem. Unless there is a reason not to
> have SCMI with big endian kernel, please see remarks below.
> 

No the intention at least is to have it working even with big endian
kernel. I found couple of issues when testing after this was posted.
They are already fixed in [1]


[...]

>> +/**
>> + * scmi_rx_callback() - mailbox client callback for receive messages
>> + *
>> + * @cl: client pointer
>> + * @m: mailbox message
>> + *
>> + * Processes one received message to appropriate transfer information
>> and
>> + * signals completion of the transfer.
>> + *
>> + * NOTE: This function will be invoked in IRQ context, hence should be
>> + * as optimal as possible.
>> + */
>> +static void scmi_rx_callback(struct mbox_client *cl, void *m)
>> +{
>> +    u16 xfer_id;
>> +    struct scmi_xfer *xfer;
>> +    struct scmi_info *info = client_to_scmi_info(cl);
>> +    struct scmi_xfers_info *minfo = &info->minfo;
>> +    struct device *dev = info->dev;
>> +    struct scmi_shared_mem *mem = info->tx_payload;
>> +
>> +    xfer_id = MSG_XTRACT_TOKEN(mem->msg_header);
>> +
> 
> Don't we need to convert msg_header to cpu endian?
> 

Indeed, already fixed as mentioned above.

>> +    /*
>> +     * Are we even expecting this?
>> +     */
>> +    if (!test_bit(xfer_id, minfo->xfer_alloc_table)) {
>> +        dev_err(dev, "message for %d is not expected!\n", xfer_id);
>> +        return;
>> +    }
>> +
>> +    xfer = &minfo->xfer_block[xfer_id];
>> +
>> +    scmi_dump_header_dbg(dev, &xfer->hdr);
>> +    /* Is the message of valid length? */
>> +    if (xfer->rx.len > info->desc->max_msg_size) {
>> +        dev_err(dev, "unable to handle %zu xfer(max %d)\n",
>> +            xfer->rx.len, info->desc->max_msg_size);
>> +        return;
>> +    }
>> +
>> +    scmi_fetch_response(xfer, mem);
>> +    complete(&xfer->done);
>> +}
>> +
>> +/**
>> + * pack_scmi_header() - packs and returns 32-bit header
>> + *
>> + * @hdr: pointer to header containing all the information on message id,
>> + *    protocol id and sequence id.
>> + */
>> +static inline u32 pack_scmi_header(struct scmi_msg_hdr *hdr)
>> +{
>> +    return ((hdr->id & MSG_ID_MASK) << MSG_ID_SHIFT) |
>> +       ((hdr->seq & MSG_TOKEN_ID_MASK) << MSG_TOKEN_ID_SHIFT) |
>> +       ((hdr->protocol_id & MSG_PROTOCOL_ID_MASK) <<
>> MSG_PROTOCOL_ID_SHIFT);
>> +}
>> +
>> +/**
>> + * scmi_tx_prepare() - mailbox client callback to prepare for the
>> transfer
>> + *
>> + * @cl: client pointer
>> + * @m: mailbox message
>> + *
>> + * This function prepares the shared memory which contains the header
>> and the
>> + * payload.
>> + */
>> +static void scmi_tx_prepare(struct mbox_client *cl, void *m)
>> +{
>> +    struct scmi_xfer *t = m;
>> +    struct scmi_info *info = client_to_scmi_info(cl);
>> +    struct scmi_shared_mem *mem = info->tx_payload;
>> +
>> +    mem->channel_status = 0x0; /* Mark channel busy + clear error */
>> +    mem->flags = t->hdr.poll_completion ? 0 :
>> SCMI_SHMEM_FLAG_INTR_ENABLED;
>> +    mem->length = sizeof(mem->msg_header) + t->tx.len;
>> +    mem->msg_header = cpu_to_le32(pack_scmi_header(&t->hdr));
>> +    if (t->tx.buf)
>> +        memcpy_toio(mem->msg_payload, t->tx.buf, t->tx.len);
>> +}
> 
> I thought every member of scmi_shared_mem should be in le, not just the
> header.
> If that is the case, why do mem->length and mem->flags not get converted
> to le?
> If it is not the case, should they be of type __le32?
> 
> (same remark applies in scmi_fetch_response for mem->length)
> 

Agreed and already fixed, sorry for that. I am planning to repost after
4.14-rc1. and hence waiting with fixes.

>> +
>> +/**
>> + * scmi_one_xfer_get() - Allocate one message
>> + *
>> + * @handle: SCMI entity handle
>> + *
>> + * Helper function which is used by various command functions that are
>> + * exposed to clients of this driver for allocating a message traffic
>> event.
>> + *
>> + * This function can sleep depending on pending requests already in
>> the system
>> + * for the SCMI entity. Further, this also holds a spinlock to maintain
>> + * integrity of internal data structures.
>> + *
>> + * Return: 0 if all went fine, else corresponding error.
>> + */
>> +static struct scmi_xfer *scmi_one_xfer_get(const struct scmi_handle
>> *handle)
>> +{
>> +    u16 xfer_id;
>> +    int ret, timeout;
>> +    struct scmi_xfer *xfer;
>> +    unsigned long flags, bit_pos;
>> +    struct scmi_info *info = handle_to_scmi_info(handle);
>> +    struct scmi_xfers_info *minfo = &info->minfo;
>> +
>> +    /*
>> +     * Ensure we have only controlled number of pending messages.
>> +     * Ideally, we might just have to wait a single message, be
>> +     * conservative and wait 5 times that..
>> +     */
>> +    timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms) * 5;
>> +    ret = down_timeout(&minfo->sem_xfer_count, timeout);
>> +    if (ret < 0)
>> +        return ERR_PTR(ret);
>> +
>> +    /* Keep the locked section as small as possible */
>> +    spin_lock_irqsave(&minfo->xfer_lock, flags);
>> +    bit_pos = find_first_zero_bit(minfo->xfer_alloc_table,
>> +                      info->desc->max_msg);
>> +    if (bit_pos == info->desc->max_msg) {
>> +        spin_unlock_irqrestore(&minfo->xfer_lock, flags);
>> +        return ERR_PTR(-ENOMEM);
>> +    }
>> +    set_bit(bit_pos, minfo->xfer_alloc_table);
>> +    spin_unlock_irqrestore(&minfo->xfer_lock, flags);
>> +
> 
> Is it needed to disable IRQs here? Since the callback called in IRQ
> context only reads the xfer_alloc_table without modification nor taking
> locks, can't we just do spin_lock/spin_unlock?
> 

Yes we can for now. I started adding notification support where we may
need to allocate(i.e. assign from the pre-allocated buffer) in IRQ
context. I left it as is though I removed notifications as I haven't
tested it.

-- 
Regards,
Sudeep

[1] https://git.kernel.org/sudeep.holla/linux/h/for-list/arm_scmi

  reply	other threads:[~2017-09-05 10:25 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-04 14:31 [PATCH v2 00/18] firmware: ARM System Control and Management Interface(SCMI) support Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 01/18] dt-bindings: mailbox: add support for mailbox client shared memory Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 02/18] dt-bindings: arm: add support for ARM System Control and Management Interface(SCMI) protocol Sudeep Holla
2017-08-10 19:28   ` Rob Herring
2017-08-11  9:36     ` Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 03/18] firmware: arm_scmi: add basic driver infrastructure for SCMI Sudeep Holla
2017-08-08  2:46   ` Jassi Brar
2017-08-08  9:29     ` Sudeep Holla
2017-08-08 11:27       ` Jassi Brar
2017-09-05 10:03   ` Julien Thierry
2017-09-05 10:26     ` Sudeep Holla [this message]
2017-08-04 14:31 ` [PATCH v2 04/18] firmware: arm_scmi: add common infrastructure and support for base protocol Sudeep Holla
2017-09-05 13:39   ` Julien Thierry
2017-09-05 13:45     ` Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 05/18] firmware: arm_scmi: add initial support for performance protocol Sudeep Holla
2017-09-05 15:04   ` Julien Thierry
2017-09-05 15:56     ` Julien Thierry
2017-09-05 16:54       ` Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 06/18] firmware: arm_scmi: add initial support for clock protocol Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 07/18] firmware: arm_scmi: add initial support for power protocol Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 08/18] firmware: arm_scmi: add initial support for sensor protocol Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 09/18] firmware: arm_scmi: probe and initialise all the supported protocols Sudeep Holla
2017-09-06  9:41   ` Julien Thierry
2017-09-06 13:31     ` Sudeep Holla
2017-09-06 13:41       ` Julien Thierry
2017-08-04 14:31 ` [PATCH v2 10/18] firmware: arm_scmi: add support for polling based SCMI transfers Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 11/18] firmware: arm_scmi: add option for polling based performance domain operations Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 12/18] firmware: arm_scmi: refactor in preparation to support per-protocol channels Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 13/18] firmware: arm_scmi: add per-protocol channels support using idr objects Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 14/18] firmware: arm_scmi: add device power domain support using genpd Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 15/18] clk: add support for clocks provided by SCMI Sudeep Holla
2017-09-01  0:19   ` Stephen Boyd
2017-09-04 13:37     ` Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 16/18] hwmon: add support for sensors exported via ARM SCMI Sudeep Holla
2017-08-04 19:32   ` Guenter Roeck
2017-08-07 12:25     ` Sudeep Holla
2017-08-14 15:09       ` Sudeep Holla
2017-08-14 18:04         ` Guenter Roeck
2017-08-04 14:31 ` [PATCH v2 17/18] cpufreq: add support for CPU DVFS based on SCMI message protocol Sudeep Holla
2017-08-09  4:18   ` Viresh Kumar
2017-08-09  9:59     ` Sudeep Holla
2017-08-09 10:06       ` Viresh Kumar
2017-08-09 10:15         ` Sudeep Holla
2017-08-04 14:31 ` [PATCH v2 18/18] cpufreq: scmi: add support for fast frequency switching Sudeep Holla
2017-08-09  4:28   ` Viresh Kumar
2017-08-09 10:09     ` Sudeep Holla
2017-08-09 10:13       ` Viresh Kumar
2017-08-09 10:17         ` Sudeep Holla

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=e566e6b9-fc0e-bafd-4549-beb03d17adf5@arm.com \
    --to=sudeep.holla@arm.com \
    --cc=Ryan.Harkin@arm.com \
    --cc=alexey.klimov@arm.com \
    --cc=arnd@arndb.de \
    --cc=devicetree@vger.kernel.org \
    --cc=harba@codeaurora.org \
    --cc=jassisinghbrar@gmail.com \
    --cc=julien.thierry@arm.com \
    --cc=lho@apm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nm@ti.com \
    --cc=roy.franz@cavium.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 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).