Re: [PATCH 4/4] drivers/mailbox: Add ASpeed mailbox driver
From: Joel Stanley <hidden>
Date: 2017-02-07 05:40:25
Also in:
openbmc
On Thu, Jan 12, 2017 at 10:59 AM, Cyril Bur [off-list ref] wrote:
This provides access to the mbox registers on the ast2400 and ast2500 boards.
s/boards/SoCs/
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 hunk
--- 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.cdiff --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.
+ 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 hunk
+ 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 endifdiff --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.odiff --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.
+
+ 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?
+ 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.
-- 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