mailbox: qemu-mailbox: Add request channel
authorNikita Shubin <nikita.shubin@maquefel.me>
Fri, 7 Jun 2024 10:52:16 +0000 (13:52 +0300)
committerNikita Shubin <nikita.shubin@maquefel.me>
Mon, 17 Jun 2024 10:32:04 +0000 (13:32 +0300)
As we have no capabilites of asking via mailbox interface we should
allow requesting it directly from mailbox driver.

Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>
drivers/mailbox/qemu-mailbox.c
include/acpi/qemu-mailbox.h [new file with mode: 0644]

index 2f6ade55126ff3cf09cb2a5af02922deb53fb750..999310989d8973a8b6f86a417b65a855c86516b5 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/regmap.h>
 #include <linux/slab.h>
 
+#include <acpi/qemu-mailbox.h>
+
 #define QEMU_MBOX_MAX_CHAN_CNT         8
 
 #define QEMU_MBOX_CFG                  0x0
@@ -29,6 +31,8 @@ struct qemu_mbox {
        struct mbox_controller mbox;
 };
 
+static struct qemu_mbox *__mbox;
+
 static inline struct qemu_mbox *get_qemu_mbox(struct mbox_controller *mbox)
 {
        return container_of(mbox, struct qemu_mbox, mbox);
@@ -54,6 +58,25 @@ static irqreturn_t qemu_mbox_isr(int virq, void *data)
        return IRQ_HANDLED;
 }
 
+struct mbox_chan *qemu_mbox_request_channel(struct mbox_client *cl)
+{
+       struct qemu_mbox *mbox = __mbox;
+       struct mbox_chan *chan = ERR_PTR(-EBUSY);
+       unsigned int i;
+
+       if (!mbox)
+               return ERR_PTR(-ENOENT);
+
+       for (i = 0; i < mbox->mbox.num_chans; i++) {
+               chan = &mbox->mbox.chans[i];
+               if (mbox_bind_client(chan, cl) == 0)
+                       break;
+       }
+
+       return chan;
+}
+EXPORT_SYMBOL_GPL(qemu_mbox_request_channel);
+
 static int qemu_mbox_send_data(struct mbox_chan *link, void *data)
 {
        unsigned long chan = (unsigned long)link->con_priv;
diff --git a/include/acpi/qemu-mailbox.h b/include/acpi/qemu-mailbox.h
new file mode 100644 (file)
index 0000000..8d805f8
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Mailbox driver for QEMU Virtual PCI
+ */
+
+#ifndef _QEMU_MBOX_H
+#define _QEMU_MBOX_H
+
+#include <linux/mailbox_controller.h>
+#include <linux/mailbox_client.h>
+
+#if defined(CONFIG_QEMU_MBOX) || defined(CONFIG_QEMU_MBOX_MODULE)
+struct mbox_chan *qemu_mbox_request_channel(struct mbox_client *cl);
+#else
+static inline struct mbox_chan *
+qemu_mbox_request_channel(struct mbox_client *cl)
+{
+       return ERR_PTR(-ENODEV);
+}
+#endif
+
+#endif /* _QEMU_MBOX_H */