All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jassi Brar <jassisinghbrar@gmail.com>
To: mgross@linux.intel.com
Cc: markgross@kernel.org, "arnd@arndb.de" <arnd@arndb.de>,
	bp@suse.de, damien.lemoal@wdc.com, dragan.cvetic@xilinx.com,
	Greg KH <gregkh@linuxfoundation.org>,
	Jonathan Corbet <corbet@lwn.net>,
	palmerdabbelt@google.com, paul.walmsley@sifive.com,
	Peng Fan <peng.fan@nxp.com>, Rob Herring <robh+dt@kernel.org>,
	Shawn Guo <shawnguo@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Daniele Alessandrelli <daniele.alessandrelli@intel.com>
Subject: Re: [PATCH v6 03/34] mailbox: vpu-ipc-mailbox: Add support for Intel VPU IPC mailbox
Date: Sun, 14 Feb 2021 22:54:54 -0600	[thread overview]
Message-ID: <CABb+yY1MLxArMY7g7HY06Tn5aABwpmUuXN9KddHZpW-_Mmu2iA@mail.gmail.com> (raw)
In-Reply-To: <20210212222304.110194-4-mgross@linux.intel.com>

On Fri, Feb 12, 2021 at 4:23 PM <mgross@linux.intel.com> wrote:
>
> From: Daniele Alessandrelli <daniele.alessandrelli@intel.com>
>
> Add mailbox controller enabling inter-processor communication (IPC)
> between the CPU (aka, the Application Processor - AP) and the VPU on
> Intel Movidius SoCs like Keem Bay.
>
> The controller uses HW FIFOs to enable such communication. Specifically,
> there are two FIFOs, one for the CPU and one for VPU. Each FIFO can hold
> 128 entries (messages) of 32-bit each (but only 26 bits are actually
> usable, since the 6 least-significant bits are reserved for the overflow
> detection mechanism, more info below).
>
> When the Linux kernel on the AP needs to send messages to the VPU
> firmware, it writes them to the VPU FIFO; similarly, when the VPU
> firmware needs to send messages to the AP, it writes them to the CPU
> FIFO.
>
> It's important to note that the AP is not the only one that can write to
> the VPU FIFO: other components within the SoC can write to it too. Each
> of these components (including the AP) has a unique 6-bit processor ID
> associated to it. The VPU HW FIFO expects the last 6 bits of each 32-bit
> FIFO entry to contain the processor ID of the sender.
>
> Therefore, sending a message from the AP to the VPU works as follows:
>
> 1. The message must be a 32-bit value with the last 6-bit set to 0 (in
>    practice, the message is meant to be a 32-bit address value, aligned
>    to 64 bytes; but this is not really relevant for this mailbox
>    controller).
>
> 2. The AP adds its processor ID to the 32-bit message being sent:
>    M = m | AP_ProcID
>
> 3. The sender writes the message (M) to the TIM_IPC_FIFO register of the
>    VPU FIFO.
>
> 4. The HW atomically checks if the FIFO is full and if not it writes it
>    to the actual FIFO; if the FIFO is full, the HW reads the ProcID
>    from M and then sets the corresponding bit of TIM_IPC_FIFO_OF_FLAG0,
>    to signal that the write failed, because the FIFO was full.
>
> 5. The AP reads the TIM_IPC_FIFO_OF_FLAG0 register and checks if the
>    bit corresponding to its ProcID has been set (in order to know if the
>    TX succeeded or failed); if the bit is set, the AP clears it.
>
> Note: as briefly mentioned above, the 32-bit value is meant to be a 32-
> bit physical address (64-byte aligned). This address points to a
> predefined struct (i.e., the IPC packet) in shared memory. However,
> since this struct is not HW dependent (it's just the struct the VPU
> firmware expects and in theory it could change if a different VPU FW is
> used), it's not defined here, but in the Keem Bay IPC driver, which is
> the mailbox client for this controller.
>
> The AP is notified of pending messages in the CPU FIFO by means of the
> 'FIFO-not-empty' interrupt, which is generated by the CPU FIFO while not
> empty. This interrupt is cleared automatically once all messages have
> been read from the FIFO (i.e., the FIFO has been emptied).
>
> The hardware doesn't provide an TX done IRQ (i.e., an IRQ that allows
> the VPU firmware to notify the AP that the message put into the VPU FIFO
> has been received); however the AP can ensure that the message has been
> successfully put into the VPU FIFO (and therefore transmitted) by
> checking the VPU FIFO status register (TIM_IPC_FIFO_OF_FLAG0) to ensure
> that writing the message didn't cause the FIFO to overflow (as described
> above).
>
I don't remember the last time I saw such a detailed explanation! Thanks.

> Therefore, the mailbox controller is configured as capable of tx_done
> IRQs and a tasklet is used to simulate the tx_done IRQ. The tasklet is
> activated by send_data() right after the message has been put into the
> VPU FIFO and the VPU FIFO status registers has been checked. If an
> overflow is reported by the status register, the tasklet passes -EBUSY
> to mbox_chan_txdone(), to notify the mailbox client of the failed TX.
>
> The client should therefore register a tx_done() callback to properly
> handle failed transmissions.
>
> Note: the 'txdone_poll' mechanism cannot be used because it doesn't
> provide a way to report a failed transmission.
>
IIUIC, maybe the solution is simpler .... What if we set txdone_poll.
Always return success in send_data(). And check if we overflew the
fifo in last_tx_done(). If we did overflow, try to rewrite the data
and check again. Return true, if not overflew this time, otherwise
return false so that mailbox api can ask us to try again in next
last_tx_done(). This way we can do away with the tasklet and, more
importantly, avoid send_data() failures and retries on clients' part.

Cheers!

  reply	other threads:[~2021-02-15  4:56 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-12 22:22 [PATCH v6 00/34] Intel Vision Processing base enabling mgross
2021-02-12 22:22 ` [PATCH v6 01/34] Add Vision Processing Unit (VPU) documentation mgross
2021-02-12 22:22 ` [PATCH v6 02/34] dt-bindings: mailbox: Add Intel VPU IPC mailbox bindings mgross
2021-03-05 20:50   ` Rob Herring
2021-02-12 22:22 ` [PATCH v6 03/34] mailbox: vpu-ipc-mailbox: Add support for Intel VPU IPC mailbox mgross
2021-02-15  4:54   ` Jassi Brar [this message]
2021-02-18 12:02     ` Alessandrelli, Daniele
2021-02-18 21:09       ` Jassi Brar
2021-02-18 22:40         ` mark gross
2021-02-12 22:22 ` [PATCH v6 04/34] dt-bindings: Add bindings for Keem Bay IPC driver mgross
2021-03-05 21:01   ` Rob Herring
2021-03-08 20:20     ` mark gross
2021-04-12 21:24       ` Jassi Brar
2021-04-20 22:14         ` mark gross
2021-04-21 13:55           ` mark gross
2021-04-21 14:05             ` Jassi Brar
2021-04-21 15:29               ` Alessandrelli, Daniele
2021-02-12 22:22 ` [PATCH v6 05/34] keembay-ipc: Add Keem Bay IPC module mgross
2021-02-12 22:22 ` [PATCH v6 06/34] dt-bindings: Add bindings for Keem Bay VPU IPC driver mgross
2021-02-12 22:22 ` [PATCH v6 07/34] keembay-vpu-ipc: Add Keem Bay VPU IPC module mgross
2021-02-12 22:22 ` [PATCH v6 08/34] misc: xlink-pcie: Add documentation for XLink PCIe driver mgross
2021-02-12 22:22 ` [PATCH v6 09/34] misc: xlink-pcie: lh: Add PCIe EPF driver for Local Host mgross
2021-02-12 22:22 ` [PATCH v6 10/34] misc: xlink-pcie: lh: Add PCIe EP DMA functionality mgross
2021-02-12 22:22 ` [PATCH v6 11/34] misc: xlink-pcie: lh: Add core communication logic mgross
2021-02-12 22:22 ` [PATCH v6 12/34] misc: xlink-pcie: lh: Prepare changes for adding remote host driver mgross
2021-02-12 22:22 ` [PATCH v6 13/34] misc: xlink-pcie: rh: Add PCIe EP driver for Remote Host mgross
2021-02-12 22:22 ` [PATCH v6 14/34] misc: xlink-pcie: rh: Add core communication logic mgross
2021-02-12 22:22 ` [PATCH v6 15/34] misc: xlink-pcie: Add XLink API interface mgross
2021-02-12 22:22 ` [PATCH v6 16/34] misc: xlink-pcie: Add asynchronous event notification support for XLink mgross
2021-02-12 22:22 ` [PATCH v6 17/34] xlink-ipc: Add xlink ipc device tree bindings mgross
2021-03-05 21:11   ` Rob Herring
2021-02-12 22:22 ` [PATCH v6 18/34] xlink-ipc: Add xlink ipc driver mgross
2021-02-12 22:22 ` [PATCH v6 19/34] xlink-core: Add xlink core device tree bindings mgross
2021-03-05 21:03   ` Rob Herring
2021-03-08 20:31     ` mark gross
2021-04-12 21:32   ` Dave Hansen
2021-04-20 22:08     ` Gross, Mark
2021-02-12 22:22 ` [PATCH v6 20/34] xlink-core: Add xlink core driver xLink mgross
2021-02-14 17:52   ` Randy Dunlap
2021-02-17 23:29     ` mark gross
2021-02-12 22:22 ` [PATCH v6 21/34] xlink-core: Enable xlink protocol over pcie mgross
2021-02-12 22:22 ` [PATCH v6 22/34] xlink-core: Enable VPU IP management and runtime control mgross
2021-02-12 22:22 ` [PATCH v6 23/34] xlink-core: add async channel and events mgross
2021-02-12 22:22 ` [PATCH v6 24/34] dt-bindings: misc: Add Keem Bay vpumgr mgross
2021-02-12 22:22 ` [PATCH v6 25/34] misc: Add Keem Bay VPU manager mgross
2021-02-14 17:39   ` Randy Dunlap
2021-02-17 23:30     ` mark gross
2021-02-12 22:22 ` [PATCH v6 26/34] dt-bindings: misc: intel_tsens: Add tsens thermal bindings documentation mgross
2021-02-12 22:22 ` [PATCH v6 27/34] misc: Tsens ARM host thermal driver mgross
2021-02-14 17:44   ` Randy Dunlap
2021-02-17 23:33     ` mark gross
2021-02-12 22:22 ` [PATCH v6 28/34] misc: Intel tsens IA host driver mgross
2021-02-14 17:45   ` Randy Dunlap
2021-02-17 23:34     ` mark gross
2021-02-12 22:22 ` [PATCH v6 29/34] Intel tsens i2c slave driver mgross
2021-02-14 17:41   ` Randy Dunlap
2021-02-17 23:35     ` mark gross
2021-02-12 22:23 ` [PATCH v6 30/34] misc:intel_tsens: Intel Keem Bay tsens driver mgross
2021-02-14 17:42   ` Randy Dunlap
2021-02-17 23:36     ` mark gross
2021-02-12 22:23 ` [PATCH v6 31/34] Intel Keembay XLink SMBus driver mgross
2021-02-12 22:23 ` [PATCH v6 32/34] dt-bindings: misc: hddl_dev: Add hddl device management documentation mgross
2021-03-05 21:20   ` Rob Herring
2021-02-12 22:23 ` [PATCH v6 33/34] misc: Hddl device management for local host mgross
2021-02-14 17:47   ` Randy Dunlap
2021-02-17 23:38     ` mark gross
2021-02-12 22:23 ` [PATCH v6 34/34] misc: HDDL device management for IA host mgross
2021-02-14 17:48   ` Randy Dunlap
2021-02-17 23:39     ` mark gross
2021-07-09 18:17 ` [PATCH v6 00/34] Intel Vision Processing base enabling mark gross

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=CABb+yY1MLxArMY7g7HY06Tn5aABwpmUuXN9KddHZpW-_Mmu2iA@mail.gmail.com \
    --to=jassisinghbrar@gmail.com \
    --cc=arnd@arndb.de \
    --cc=bp@suse.de \
    --cc=corbet@lwn.net \
    --cc=damien.lemoal@wdc.com \
    --cc=daniele.alessandrelli@intel.com \
    --cc=dragan.cvetic@xilinx.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=markgross@kernel.org \
    --cc=mgross@linux.intel.com \
    --cc=palmerdabbelt@google.com \
    --cc=paul.walmsley@sifive.com \
    --cc=peng.fan@nxp.com \
    --cc=robh+dt@kernel.org \
    --cc=shawnguo@kernel.org \
    /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.