From: Nikita Shubin Date: Fri, 7 Jun 2024 10:52:16 +0000 (+0300) Subject: mailbox: qemu-mailbox: Add request channel X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=30b4b558ffd77c0c3d321037278b5840570fa479;p=linux.git mailbox: qemu-mailbox: Add request channel As we have no capabilites of asking via mailbox interface we should allow requesting it directly from mailbox driver. Signed-off-by: Nikita Shubin --- diff --git a/drivers/mailbox/qemu-mailbox.c b/drivers/mailbox/qemu-mailbox.c index 2f6ade55126ff..999310989d897 100644 --- a/drivers/mailbox/qemu-mailbox.c +++ b/drivers/mailbox/qemu-mailbox.c @@ -15,6 +15,8 @@ #include #include +#include + #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 index 0000000000000..8d805f8bb5615 --- /dev/null +++ b/include/acpi/qemu-mailbox.h @@ -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 +#include + +#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 */