Thread (21 messages) 21 messages, 5 authors, 2018-08-02

[PATCH v8 4/4] mailbox: Add support for i.MX7D messaging unit

flat view

From: jassisinghbrar@gmail.com (Jassi Brar)
Date: 2018-08-01 07:02:20
Also in: linux-devicetree

On Wed, Aug 1, 2018 at 11:01 AM, Oleksij Rempel [off-list ref] wrote:
On Tue, Jul 31, 2018 at 09:51:37PM +0530, Jassi Brar wrote:
quoted
quoted
The Mailbox controller is able to send messages (up to 4 32 bit words)
between the endpoints.

This driver was tested using the mailbox-test driver sending messages
between the Cortex-A7 and the Cortex-M4.
Do we need something MU specific here?
I mean MU doesn't really care if the endpoints are CA, CR or CM. So,
maybe just the two-line ritual intro to MU?
Till now, every additional word about MU added more disagreement in this
topic. I prefer the reduced variant.
OK, but we don't usually specify "tested on ..." but leave details of
the controller, in the new driver commit.

quoted
quoted
+
+static void imx_mu_txdb_work(struct work_struct *work)
+{
+       struct imx_mu_con_priv *cp =
+                       container_of(work, struct imx_mu_con_priv, work);
+       mbox_chan_txdone(cp->chan, 0);
+}
The api assumes a controller have same type of channels. So we are
having to do this here.
I am not sure, but would declaring two mailbox controllers (one with
doorbells and the other data channels) work?
I was thinking about it and decided that this pain was not worth it.
OK.

But just fyi, a common use of doorbell is to hint the master to take
actions like reset, suspend or expect some periodic broadcast or some
hotpath where we wouldn't want to sleep.
Another usecase is data transfer (where speed matters) via
doorbell+shmem, having to sleep after each packet is going to kill
performance.

quoted
If not, at least we could use a tasklet instead of a work queue?
ok. probably it is better to fix the mailbox framework.... may be not right
now.
No, the framework is fine. MU is the only controller that has two
types of channels.

quoted
quoted
+
+static int imx_mu_startup(struct mbox_chan *chan)
+{
+       struct imx_mu_priv *priv = to_imx_mu_priv(chan->mbox);
+       struct imx_mu_con_priv *cp = chan->con_priv;
+       int ret;
+
+       if (cp->type == IMX_MU_TYPE_TXDB) {
+               /* Tx doorbell don't have ACK support */
+               INIT_WORK(&cp->work, imx_mu_txdb_work);
+               return 0;
+       }
+
+       cp->irq_desc = kasprintf(GFP_KERNEL, "imx_mu_chan[%i-%i]", cp->type,
+                                cp->idx);
+       if (!cp->irq_desc)
+               return -ENOMEM;
Probably you won't do but still .... name of irq is but one channel
property. So you could set it in probe() and avoid creating another
situation when startup could fail.
You mean, fail on probe with no mem is better then fail on startup? Why?
Fail early :)
But if you just have irq_name[8] in the channel struct, it won't even
fail in probe. And is more consistent with other channel
initialisations..... you see name of irq doesn't change across channel
requests.

But OK, I am running out of energy and interest.

quoted
quoted
+
+static void imx_mu_shutdown(struct mbox_chan *chan)
+{
+       struct imx_mu_priv *priv = to_imx_mu_priv(chan->mbox);
+       struct imx_mu_con_priv *cp = chan->con_priv;
+
+       if (IMX_MU_TYPE_TXDB == cp->type)
nit: usually we do (cp->type == IMX_MU_TYPE_TXDB)
why? I do it with simple reason:
this error will be detected by compiler
if (IMX_MU_TYPE_TXDB = cp->type)

this error will silently fail
if (cp->type = IMX_MU_TYPE_TXDB)
Because it reads like
     if (2 is equal to the variable)
instead of
    if (the variable is equal to 2)

Most developers prefer latter. In fact you too, in startup()
So please atleast make it consistent either way.

Cheers!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help