Thread (1 message) 1 message, 1 author, 2017-02-07

Re: [PATCH 4/4] drivers/mailbox: Add ASpeed mailbox driver

From: Cyril Bur <hidden>
Date: 2017-02-07 22:57:09
Also in: openbmc

On Tue, 2017-02-07 at 16:10 +1030, Joel Stanley wrote:
On Thu, Jan 12, 2017 at 10:59 AM, Cyril Bur [off-list ref] wrote:
quoted
This provides access to the mbox registers on the ast2400 and ast2500
boards.
Hey Joel,

Thanks for review, just one thing, I'll fixup the rest.

Cyril
s/boards/SoCs/
quoted
This driver allows arbitrary reads and writes to the 16 data registers as
the other end may have configured the mbox hardware to provide an
interrupt when a specific register gets written to.

Signed-off-by: Cyril Bur <redacted>
Send this to lkml as well next time you submit.
quoted
---
 drivers/mailbox/Kconfig       |   9 ++
 drivers/mailbox/Makefile      |   2 +
 drivers/mailbox/aspeed-mbox.c | 334 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 345 insertions(+)
 create mode 100644 drivers/mailbox/aspeed-mbox.c
diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
index ceff415f201c..10a7f3f2765c 100644
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -152,4 +152,13 @@ config BCM_PDC_MBOX
          Mailbox implementation for the Broadcom PDC ring manager,
          which provides access to various offload engines on Broadcom
          SoCs. Say Y here if you want to use the Broadcom PDC.
+
+config ASPEED_MBOX
Call this ASPEED_LPC_MAILBOX, as it's a in the LPC IP block.
I think I'll stick with ASPEED_LPC_MBOX, the rest of the file uses MBOX
more widely when talking about controllers.
quoted
+       depends on (ARCH_ASPEED || COMPILE_TEST) && REGMAP && MFD_SYSCON
+       bool "Aspeed ast2400/2500 Mailbox Controller"
Call this Aspeed LPC Mailbox Controller, as the layout is shared by
SoCs other than the 2500 and 2400.
quoted
+       default "y"
+       ---help---
+         Provides a driver for the MBOX registers found on Aspeed SOCs
+         (AST2400 and AST2500). This driver provides a device for aspeed
+         mbox registers
 endif
diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile
index 7dde4f609ae8..db5b4f3f29e0 100644
--- a/drivers/mailbox/Makefile
+++ b/drivers/mailbox/Makefile
@@ -31,3 +31,5 @@ obj-$(CONFIG_HI6220_MBOX)     += hi6220-mailbox.o
 obj-$(CONFIG_BCM_PDC_MBOX)     += bcm-pdc-mailbox.o

 obj-$(CONFIG_TEGRA_HSP_MBOX)   += tegra-hsp.o
+
+obj-$(CONFIG_ASPEED_MBOX)      += aspeed-mbox.o
diff --git a/drivers/mailbox/aspeed-mbox.c b/drivers/mailbox/aspeed-mbox.c
new file mode 100644
index 000000000000..c4ee6ba228ea
--- /dev/null
+++ b/drivers/mailbox/aspeed-mbox.c
+
+static ssize_t aspeed_mbox_read(struct file *file, char __user *buf,
+                               size_t count, loff_t *ppos)
+{
+       struct aspeed_mbox *mbox = file_mbox(file);
+       char __user *p = buf;
+       ssize_t ret;
+       int i;
+
+       if (!access_ok(VERIFY_WRITE, buf, count))
+               return -EFAULT;
As discussed in the LPC driver review:

 "And don't call access_ok(), it's racy and no driver should ever do that."

Make sure all of the things you fixed in that driver are fixed in this one.
quoted
+
+       if (count + *ppos > ASPEED_MBOX_NUM_REGS)
+               return -EINVAL;
+
+       if (file->f_flags & O_NONBLOCK) {
+               if (!(aspeed_mbox_inb(mbox, ASPEED_MBOX_BMC_CTRL) &
+                               ASPEED_MBOX_CTRL_RECV))
+                       return -EAGAIN;
+       } else if (wait_event_interruptible(mbox->queue,
+                               aspeed_mbox_inb(mbox, ASPEED_MBOX_BMC_CTRL) &
+                               ASPEED_MBOX_CTRL_RECV)) {
+               return -ERESTARTSYS;
+       }
+
+       mutex_lock(&mbox->mutex);
+
+       for (i = *ppos; count > 0 && i < ASPEED_MBOX_NUM_REGS; i++) {
+               uint8_t reg = aspeed_mbox_inb(mbox, ASPEED_MBOX_DATA_0 + (i * 4));
+
+               ret = __put_user(reg, p);
+               if (ret)
+                       goto out_unlock;
+
+               p++;
+               count--;
+       }
+
+       /* ASPEED_MBOX_CTRL_RECV bit is W1C, this also unmasks in 1 step */
W1C? Write to clear?
quoted
+       aspeed_mbox_outb(mbox, ASPEED_MBOX_CTRL_RECV, ASPEED_MBOX_BMC_CTRL);
+       ret = p - buf;
+
+out_unlock:
+       mutex_unlock(&mbox->mutex);
+       return ret;
+}
+
+module_platform_driver(aspeed_mbox_driver);
+
+MODULE_DEVICE_TABLE(of, aspeed_mbox_match);
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Cyril Bur [off-list ref]");
+MODULE_DESCRIPTION("ASpeed mailbox device driver");
ASPEED or Aspeed.
quoted
--
2.11.0
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help