* [PATCH 0/2] apple-mailbox: add support for atomc mailbox operations @ 2022-09-05 16:48 Russell King (Oracle) 2022-09-05 16:48 ` [PATCH 1/2] mailbox: apple: Implement flush() operation Russell King 2022-09-05 16:48 ` [PATCH 2/2] mailbox: apple: Implement poll_data() operation Russell King 0 siblings, 2 replies; 6+ messages in thread From: Russell King (Oracle) @ 2022-09-05 16:48 UTC (permalink / raw) To: Jassi Brar Cc: Alyssa Rosenzweig, asahi, Hector Martin, linux-arm-kernel, Sven Peter Hi, This series adds support for atomic mailbox operations to the Apple mailbox driver. drivers/mailbox/apple-mailbox.c | 64 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last! _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] mailbox: apple: Implement flush() operation 2022-09-05 16:48 [PATCH 0/2] apple-mailbox: add support for atomc mailbox operations Russell King (Oracle) @ 2022-09-05 16:48 ` Russell King 2022-09-05 16:58 ` Sven Peter 2022-09-05 16:48 ` [PATCH 2/2] mailbox: apple: Implement poll_data() operation Russell King 1 sibling, 1 reply; 6+ messages in thread From: Russell King @ 2022-09-05 16:48 UTC (permalink / raw) To: Jassi Brar Cc: Hector Martin, Sven Peter, Alyssa Rosenzweig, asahi, linux-arm-kernel From: Hector Martin <marcan@marcan.st> This allows clients to use the atomic-safe mailbox API style. Signed-off-by: Hector Martin <marcan@marcan.st> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> --- drivers/mailbox/apple-mailbox.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c index 496c4951ccb1..33e7acf71e3e 100644 --- a/drivers/mailbox/apple-mailbox.c +++ b/drivers/mailbox/apple-mailbox.c @@ -17,6 +17,7 @@ */ #include <linux/apple-mailbox.h> +#include <linux/delay.h> #include <linux/device.h> #include <linux/gfp.h> #include <linux/interrupt.h> @@ -112,6 +113,14 @@ static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox) return !(mbox_ctrl & apple_mbox->hw->control_full); } +static bool apple_mbox_hw_send_empty(struct apple_mbox *apple_mbox) +{ + u32 mbox_ctrl = + readl_relaxed(apple_mbox->regs + apple_mbox->hw->a2i_control); + + return mbox_ctrl & apple_mbox->hw->control_empty; +} + static int apple_mbox_hw_send(struct apple_mbox *apple_mbox, struct apple_mbox_msg *msg) { @@ -219,6 +228,23 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data) return IRQ_HANDLED; } +static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) +{ + struct apple_mbox *apple_mbox = chan->con_priv; + unsigned long deadline = jiffies + msecs_to_jiffies(timeout); + + while (time_before(jiffies, deadline)) { + if (apple_mbox_hw_send_empty(apple_mbox)) { + mbox_chan_txdone(&apple_mbox->chan, 0); + return 0; + } + + udelay(1); + } + + return -ETIME; +} + static int apple_mbox_chan_startup(struct mbox_chan *chan) { struct apple_mbox *apple_mbox = chan->con_priv; @@ -250,6 +276,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan) static const struct mbox_chan_ops apple_mbox_ops = { .send_data = apple_mbox_chan_send_data, + .flush = apple_mbox_chan_flush, .startup = apple_mbox_chan_startup, .shutdown = apple_mbox_chan_shutdown, }; -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] mailbox: apple: Implement flush() operation 2022-09-05 16:48 ` [PATCH 1/2] mailbox: apple: Implement flush() operation Russell King @ 2022-09-05 16:58 ` Sven Peter 0 siblings, 0 replies; 6+ messages in thread From: Sven Peter @ 2022-09-05 16:58 UTC (permalink / raw) To: Russell King, Jassi Brar Cc: Hector Martin, Alyssa Rosenzweig, asahi, linux-arm-kernel On Mon, Sep 5, 2022, at 18:48, Russell King wrote: > From: Hector Martin <marcan@marcan.st> > > This allows clients to use the atomic-safe mailbox API style. > > Signed-off-by: Hector Martin <marcan@marcan.st> > Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> > --- Reviewed-by: Sven Peter <sven@svenpeter.dev> _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] mailbox: apple: Implement poll_data() operation 2022-09-05 16:48 [PATCH 0/2] apple-mailbox: add support for atomc mailbox operations Russell King (Oracle) 2022-09-05 16:48 ` [PATCH 1/2] mailbox: apple: Implement flush() operation Russell King @ 2022-09-05 16:48 ` Russell King 2022-09-05 17:03 ` Sven Peter 1 sibling, 1 reply; 6+ messages in thread From: Russell King @ 2022-09-05 16:48 UTC (permalink / raw) To: Jassi Brar Cc: Hector Martin, Sven Peter, Alyssa Rosenzweig, asahi, linux-arm-kernel From: Hector Martin <marcan@marcan.st> This allows clients running in atomic context to poll for messages to arrive. Signed-off-by: Hector Martin <marcan@marcan.st> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> --- drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c index 33e7acf71e3e..1c14ff63f3d3 100644 --- a/drivers/mailbox/apple-mailbox.c +++ b/drivers/mailbox/apple-mailbox.c @@ -26,6 +26,7 @@ #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> +#include <linux/spinlock.h> #include <linux/types.h> #define APPLE_ASC_MBOX_CONTROL_FULL BIT(16) @@ -101,6 +102,7 @@ struct apple_mbox { struct device *dev; struct mbox_controller controller; + spinlock_t rx_lock; }; static const struct of_device_id apple_mbox_of_match[]; @@ -204,13 +206,16 @@ static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) return IRQ_HANDLED; } -static irqreturn_t apple_mbox_recv_irq(int irq, void *data) +static int apple_mbox_poll(struct apple_mbox *apple_mbox) { - struct apple_mbox *apple_mbox = data; + struct apple_mbox_msg msg; + int ret = 0; - while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) + while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) { mbox_chan_received_data(&apple_mbox->chan, (void *)&msg); + ret++; + } /* * The interrupt will keep firing even if there are no more messages @@ -225,9 +230,33 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data) apple_mbox->regs + apple_mbox->hw->irq_ack); } + return ret; +} + +static irqreturn_t apple_mbox_recv_irq(int irq, void *data) +{ + struct apple_mbox *apple_mbox = data; + + spin_lock(&apple_mbox->rx_lock); + apple_mbox_poll(apple_mbox); + spin_unlock(&apple_mbox->rx_lock); + return IRQ_HANDLED; } +static bool apple_mbox_chan_peek_data(struct mbox_chan *chan) +{ + struct apple_mbox *apple_mbox = chan->con_priv; + unsigned long flags; + int ret; + + spin_lock_irqsave(&apple_mbox->rx_lock, flags); + ret = apple_mbox_poll(apple_mbox); + spin_unlock_irqrestore(&apple_mbox->rx_lock, flags); + + return ret > 0; +} + static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) { struct apple_mbox *apple_mbox = chan->con_priv; @@ -276,6 +305,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan) static const struct mbox_chan_ops apple_mbox_ops = { .send_data = apple_mbox_chan_send_data, + .peek_data = apple_mbox_chan_peek_data, .flush = apple_mbox_chan_flush, .startup = apple_mbox_chan_startup, .shutdown = apple_mbox_chan_shutdown, @@ -331,6 +361,7 @@ static int apple_mbox_probe(struct platform_device *pdev) mbox->controller.txdone_irq = true; mbox->controller.of_xlate = apple_mbox_of_xlate; mbox->chan.con_priv = mbox; + spin_lock_init(&mbox->rx_lock); irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev)); if (!irqname) -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] mailbox: apple: Implement poll_data() operation 2022-09-05 16:48 ` [PATCH 2/2] mailbox: apple: Implement poll_data() operation Russell King @ 2022-09-05 17:03 ` Sven Peter 2022-09-06 7:58 ` Russell King (Oracle) 0 siblings, 1 reply; 6+ messages in thread From: Sven Peter @ 2022-09-05 17:03 UTC (permalink / raw) To: Russell King, Jassi Brar Cc: Hector Martin, Alyssa Rosenzweig, asahi, linux-arm-kernel On Mon, Sep 5, 2022, at 18:48, Russell King wrote: > From: Hector Martin <marcan@marcan.st> > > This allows clients running in atomic context to poll for messages to > arrive. > > Signed-off-by: Hector Martin <marcan@marcan.st> > Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Reviewed-by: Sven Peter <sven@svenpeter.dev> with one small comment below: > --- > drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- > 1 file changed, 34 insertions(+), 3 deletions(-) > > diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c > index 33e7acf71e3e..1c14ff63f3d3 100644 > --- a/drivers/mailbox/apple-mailbox.c > +++ b/drivers/mailbox/apple-mailbox.c > @@ -26,6 +26,7 @@ > #include <linux/module.h> > #include <linux/of.h> > #include <linux/platform_device.h> > +#include <linux/spinlock.h> > #include <linux/types.h> > > #define APPLE_ASC_MBOX_CONTROL_FULL BIT(16) > @@ -101,6 +102,7 @@ struct apple_mbox { > > struct device *dev; > struct mbox_controller controller; > + spinlock_t rx_lock; > }; > > static const struct of_device_id apple_mbox_of_match[]; > @@ -204,13 +206,16 @@ static irqreturn_t apple_mbox_send_empty_irq(int > irq, void *data) > return IRQ_HANDLED; > } > > -static irqreturn_t apple_mbox_recv_irq(int irq, void *data) > +static int apple_mbox_poll(struct apple_mbox *apple_mbox) > { > - struct apple_mbox *apple_mbox = data; > + small nit: there's a spurious white line here > struct apple_mbox_msg msg; > + int ret = 0; > > - while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) > + while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) { > mbox_chan_received_data(&apple_mbox->chan, (void *)&msg); > + ret++; > + } > > /* > * The interrupt will keep firing even if there are no more messages > @@ -225,9 +230,33 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data) > apple_mbox->regs + apple_mbox->hw->irq_ack); > } > > + return ret; > +} > + > +static irqreturn_t apple_mbox_recv_irq(int irq, void *data) > +{ > + struct apple_mbox *apple_mbox = data; > + > + spin_lock(&apple_mbox->rx_lock); > + apple_mbox_poll(apple_mbox); > + spin_unlock(&apple_mbox->rx_lock); > + > return IRQ_HANDLED; > } > > +static bool apple_mbox_chan_peek_data(struct mbox_chan *chan) > +{ > + struct apple_mbox *apple_mbox = chan->con_priv; > + unsigned long flags; > + int ret; > + > + spin_lock_irqsave(&apple_mbox->rx_lock, flags); > + ret = apple_mbox_poll(apple_mbox); > + spin_unlock_irqrestore(&apple_mbox->rx_lock, flags); > + > + return ret > 0; > +} > + > static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) > { > struct apple_mbox *apple_mbox = chan->con_priv; > @@ -276,6 +305,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan) > > static const struct mbox_chan_ops apple_mbox_ops = { > .send_data = apple_mbox_chan_send_data, > + .peek_data = apple_mbox_chan_peek_data, > .flush = apple_mbox_chan_flush, > .startup = apple_mbox_chan_startup, > .shutdown = apple_mbox_chan_shutdown, > @@ -331,6 +361,7 @@ static int apple_mbox_probe(struct platform_device *pdev) > mbox->controller.txdone_irq = true; > mbox->controller.of_xlate = apple_mbox_of_xlate; > mbox->chan.con_priv = mbox; > + spin_lock_init(&mbox->rx_lock); > > irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev)); > if (!irqname) > -- > 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] mailbox: apple: Implement poll_data() operation 2022-09-05 17:03 ` Sven Peter @ 2022-09-06 7:58 ` Russell King (Oracle) 0 siblings, 0 replies; 6+ messages in thread From: Russell King (Oracle) @ 2022-09-06 7:58 UTC (permalink / raw) To: Sven Peter Cc: Jassi Brar, Hector Martin, Alyssa Rosenzweig, asahi, linux-arm-kernel On Mon, Sep 05, 2022 at 07:03:39PM +0200, Sven Peter wrote: > > > On Mon, Sep 5, 2022, at 18:48, Russell King wrote: > > From: Hector Martin <marcan@marcan.st> > > > > This allows clients running in atomic context to poll for messages to > > arrive. > > > > Signed-off-by: Hector Martin <marcan@marcan.st> > > Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> > > Reviewed-by: Sven Peter <sven@svenpeter.dev> > > with one small comment below: > > > --- > > drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- > > 1 file changed, 34 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c > > index 33e7acf71e3e..1c14ff63f3d3 100644 > > --- a/drivers/mailbox/apple-mailbox.c > > +++ b/drivers/mailbox/apple-mailbox.c > > @@ -26,6 +26,7 @@ > > #include <linux/module.h> > > #include <linux/of.h> > > #include <linux/platform_device.h> > > +#include <linux/spinlock.h> > > #include <linux/types.h> > > > > #define APPLE_ASC_MBOX_CONTROL_FULL BIT(16) > > @@ -101,6 +102,7 @@ struct apple_mbox { > > > > struct device *dev; > > struct mbox_controller controller; > > + spinlock_t rx_lock; > > }; > > > > static const struct of_device_id apple_mbox_of_match[]; > > @@ -204,13 +206,16 @@ static irqreturn_t apple_mbox_send_empty_irq(int > > irq, void *data) > > return IRQ_HANDLED; > > } > > > > -static irqreturn_t apple_mbox_recv_irq(int irq, void *data) > > +static int apple_mbox_poll(struct apple_mbox *apple_mbox) > > { > > - struct apple_mbox *apple_mbox = data; > > + > > small nit: there's a spurious white line here Thanks, well spotted. Will fix. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last! _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-09-06 7:59 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-09-05 16:48 [PATCH 0/2] apple-mailbox: add support for atomc mailbox operations Russell King (Oracle) 2022-09-05 16:48 ` [PATCH 1/2] mailbox: apple: Implement flush() operation Russell King 2022-09-05 16:58 ` Sven Peter 2022-09-05 16:48 ` [PATCH 2/2] mailbox: apple: Implement poll_data() operation Russell King 2022-09-05 17:03 ` Sven Peter 2022-09-06 7:58 ` Russell King (Oracle)
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).