Thread (16 messages) 16 messages, 5 authors, 2020-02-15

Re: [PATCH v6 2/6] mailbox: sun6i-msgbox: Add a new mailbox driver

From: Jassi Brar <jassisinghbrar@gmail.com>
Date: 2020-02-15 04:47:41
Also in: linux-arm-kernel, lkml

On Fri, Feb 14, 2020 at 9:48 PM Samuel Holland [off-list ref] wrote:
On 2/12/20 8:18 PM, Samuel Holland wrote:
quoted
Jassi,

On 2/12/20 8:02 PM, Jassi Brar wrote:
quoted
On Sun, Jan 12, 2020 at 11:18 PM Samuel Holland [off-list ref] wrote:
quoted
+static int sun6i_msgbox_send_data(struct mbox_chan *chan, void *data)
+{
+       struct sun6i_msgbox *mbox = to_sun6i_msgbox(chan);
+       int n = channel_number(chan);
+       uint32_t msg = *(uint32_t *)data;
+
+       /* Using a channel backwards gets the hardware into a bad state. */
+       if (WARN_ON_ONCE(!(readl(mbox->regs + CTRL_REG(n)) & CTRL_TX(n))))
+               return 0;
+
+       /* We cannot post a new message if the FIFO is full. */
+       if (readl(mbox->regs + FIFO_STAT_REG(n)) & FIFO_STAT_MASK) {
+               mbox_dbg(mbox, "Channel %d busy sending 0x%08x\n", n, msg);
+               return -EBUSY;
+       }
+
This check should go into sun6i_msgbox_last_tx_done().
send_data() assumes all is clear to send next packet.
sun6i_msgbox_last_tx_done() already checks that the FIFO is completely empty (as
the big comment explains). So this error could only be hit in the knows_txdone
== true case, if the client pipelines multiple messages by calling
mbox_client_txdone() before the message is actually removed from the FIFO.

From the comments in mailbox_controller.h, this kind of usage looks to be
unsupported. In that case, I could remove the check entirely. Does that sound right?
After more thought, I would prefer to keep the check. It is fast/simple, and it
keeps the hardware from getting into an inconsistent state. Silently dropping
messages sounds like a poor quality of implementation.
If the FIFO becomes full after calling send_data(),  then
last_tx_done() should not only check remote's irq status but also
check that the data has been consumed from the FIFO locally (hence the
check becomes redundant in send_data). Otherwise the last_tx_done is
incomplete.  And you actually end up writing more code (error handling
and resubmission instead of the api managing it all transparently)
send_data() is documented in mailbox_controller.h as returning EBUSY,
error is usually returned for s/w check (like mssg too big for fifo),
not h/w events.
and I see multiple other mailbox controllers implementing the same or a similar check.
That it encourages next developer to repeat, is another reason to do
it right this time. Otherwise, I can live with that check in
send_data.
If
that is not the way you intend for the API to work, then please update the
comments in mailbox_controller.h.
Mailbox implementations follow no spec. There may be prudent need to
return from send_data, but practically I haven't come across any(?)
platform that can't do without the check in send_data.

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