Skip to contentSkip to conversation

APM X-Gene Mailbox driver

PATCH In review Feng Kan 7 participants 41 messages Apr 22, 2015 – Feb 25, 2016

Subsystems (4)
lore
Share & tools
lore

Feng Kan

author
#0 lore raw

v2 cover APM X-Gene Mailbox driver

This adds the mailbox driver for the APM X-Gene SoC

V2 change
- Add ACPI support
- use defines for reg offset

Feng Kan (4):
mailbox: add support for APM X-Gene platform mailbox driver
mailbox: xgene: add ACPI support for X-Gene mailbox driver
Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts
documentation
arm64: dts: mailbox device tree node for APM X-Gene platform.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  34 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 ++
 drivers/mailbox/Kconfig                            |  10 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 271 +++++++++++++++++++++
 5 files changed, 331 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
Signature · 1 line
1.9.1
author
#1 lore raw

PATCH v2 1/4 mailbox: add support for APM X-Gene platform mailbox driver

Add support for APM X-Gene platform mailbox driver.

---
 drivers/mailbox/Kconfig                 |  10 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 261 ++++++++++++++++++++++++++++++++
 3 files changed, 273 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +10 -0
index 84b0a2d..64120cc 100644
@@ -60,4 +60,14 @@ config ALTERA_MBOX
 	  An implementation of the Altera Mailbox soft core. It is used
 	  to send message between processors. Say Y here if you want to use the
 	  Altera mailbox support.
+
+config XGENE_SLIMPRO_MBOX
+	tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+	depends on ARCH_XGENE
+	help
+	  An implementation of the APM X-Gene Interprocessor Communication
+	  Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+	  It is used to send short messages between ARM64-bit cores and
+	  the SLIMpro Management Engine, primarily for PM. Say Y here if you
+	  want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index b18201e..1e0bed5 100644
@@ -11,3 +11,5 @@ obj-$(CONFIG_OMAP2PLUS_MBOX)	+= omap-mailbox.o
 obj-$(CONFIG_PCC)		+= pcc.o
 
 obj-$(CONFIG_ALTERA_MBOX)	+= mailbox-altera.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +261 -0

261 lines not on this page · raw message

Signature · 1 line
1.9.1
#2 lore raw

Re: [PATCH V2 1/4] mailbox: add support for APM X-Gene platform mailbox driver

Quoted 9 lines · Feng Kan
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
 
+static struct platform_driver slimpro_mbox_driver = {
+	.probe	= slimpro_mbox_probe,
+	.remove = slimpro_mbox_remove,
+	.driver	= {
+		.name = "xgene-slimpro-mbox",
+		.owner = THIS_MODULE,

drivers/mailbox/mailbox-xgene-slimpro.c line 258

Quoted 10 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+		.of_match_table = of_match_ptr(slimpro_of_match),
+	},
+};
+
+static int __init slimpro_mbox_init(void)
+{
+	return platform_driver_register(&slimpro_mbox_driver);
+}
+
+subsys_initcall(slimpro_mbox_init);

After a quick scan of this driver you'd expect something like

    static void __exit slimpro_mbox_exit(void)
    {
	platform_driver_unregister(&slimpro_mbox_driver);
    }
    module_exit(slimpro_mbox_exit);

too here. At least, I do. Is there some non-obvious (to me) reason this driver can't be unloaded if it is built as a module?

drivers/mailbox/mailbox-xgene-slimpro.c line 261

Quoted 2 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +2 -0
+MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");
+MODULE_LICENSE("GPL");

Thanks,

Paul Bolle

#3 lore raw

v3 cover mailbox: Add APM X-Gene platform mailbox driver

APM X-Gene SoC has a mailbox controller that provides communication mechanism for X-Gene Arm64 cores to communicate with X-Gene SoC's Cortex M3 (SLIMpro) processor.

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Changes since v2:
- Rebase Feng's patch set over v4.3-rc5
- Remove uneccessary 'inline' in function definition
- Use module_platform_driver instead of subsys_initcall
- Minor coding stype clean up

Changes since v1:
- Add ACPI support
- Use defines for reg offset

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  34 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 ++
 drivers/mailbox/Kconfig                            |   9 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 264 +++++++++++++++++++++
 5 files changed, 323 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
Signature · 1 line
1.9.1
#4 lore raw

PATCH v3 1/3 mailbox: Add support for APM X-Gene platform mailbox driver

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

[dhdang: rebase over 4.3-rc5, some minor changes to address comment in v2 patch set]

---
 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 264 ++++++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index bbec500..ae37d39 100644
@@ -71,4 +71,13 @@ config BCM2835_MBOX
 	  the services of the Videocore. Say Y here if you want to use the
 	  BCM2835 Mailbox.
 
+config XGENE_SLIMPRO_MBOX
+	tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+	depends on ARCH_XGENE
+	help
+	  An implementation of the APM X-Gene Interprocessor Communication
+	  Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+	  It is used to send short messages between ARM64-bit cores and
+	  the SLIMpro Management Engine, primarily for PM. Say Y here if you
+	  want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 8e6d822..6a78df7 100644
@@ -13,3 +13,5 @@ obj-$(CONFIG_PCC)		+= pcc.o
 obj-$(CONFIG_ALTERA_MBOX)	+= mailbox-altera.o
 
 obj-$(CONFIG_BCM2835_MBOX)	+= bcm2835-mailbox.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +264 -0

264 lines not on this page · raw message

Signature · 1 line
1.9.1
maintainer
#5 lore raw

Re: [PATCH v3 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 6 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

[dhdang: rebase over 4.3-rc5, some minor changes to address comment in v2 patch set]

Do you want this to go into git logs?

Quoted 3 lines

---

here is the right place for any history. And it is good practice to specify whatever changes were made from last revision.

drivers/mailbox/mailbox-xgene-slimpro.c line 51

Quoted 7 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;
+       void __iomem *reg;
+       int id;

You don't seem to really need 'id'.

Quoted 7 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +7 -0
+
+static void mb_chan_enable_int(struct slimpro_mbox_chan *mb_chan, u32 mask)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STATMASK);
+
+       val &= ~mask;
+       writel(val, mb_chan->reg + REG_DB_STATMASK);

drivers/mailbox/mailbox-xgene-slimpro.c line 91

Quoted 10 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+}
+
+static void mb_chan_disable_int(struct slimpro_mbox_chan *mb_chan, u32 mask)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STATMASK);
+
+       val |= mask;
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+}
+

These 2 functions are called just once. And do what other drivers usually inline. Wouldn't it be better to directly set & clear the bit when needed?

drivers/mailbox/mailbox-xgene-slimpro.c line 132

Quoted 5 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +5 -0
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan =
+                               (struct slimpro_mbox_chan *)chan->con_priv;
+

You don't need to typecast a void pointer. Here and elsewhere.

drivers/mailbox/mailbox-xgene-slimpro.c line 196

Quoted 5 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +4 -0
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);

You expect every platform to provide exactly 'MBOX_CNT' irqs and they must be different (because you don't 'SHARE' when you request). Usually developers relax either of the conditions.

drivers/mailbox/mailbox-xgene-slimpro.c line 255

Quoted 7 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .owner = THIS_MODULE,

No need to set .owner.

Cheers.

#6 lore raw

Re: [PATCH v3 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 8 lines · Jassi Brar
Quoted 6 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

[dhdang: rebase over 4.3-rc5, some minor changes to address comment in v2 patch set]

Do you want this to go into git logs?

Yes.

I will also rebase the patch set to v4.4-rc1.

Quoted 6 lines
Quoted 4 lines

---

here is the right place for any history. And it is good practice to specify whatever changes were made from last revision.

I will add change log into this section in next version of the patch.

Quoted 10 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 51

Quoted 9 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;
+       void __iomem *reg;
+       int id;

You don't seem to really need 'id'.

I will remove 'id'.

Quoted 14 lines
Quoted 14 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +12 -0
+
+static void mb_chan_enable_int(struct slimpro_mbox_chan *mb_chan, u32 mask)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STATMASK);
+
+       val &= ~mask;
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+}
+
+static void mb_chan_disable_int(struct slimpro_mbox_chan *mb_chan, u32 mask)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STATMASK);
Quoted 8 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 91

Quoted 5 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +5 -0
+
+       val |= mask;
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+}
+

These 2 functions are called just once. And do what other drivers usually inline. Wouldn't it be better to directly set & clear the bit when needed?

I will fold these 2 functions into their callers and then get rid of them.

Quoted 7 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 132

Quoted 6 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +5 -0
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan =
+                               (struct slimpro_mbox_chan *)chan->con_priv;
+

You don't need to typecast a void pointer. Here and elsewhere.

I will remove all the typecast of a void pointer in the driver.

Quoted 10 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 196

Quoted 7 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +4 -0
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);

You expect every platform to provide exactly 'MBOX_CNT' irqs and they must be different (because you don't 'SHARE' when you request). Usually developers relax either of the conditions.

I will relax the MBOX_CNT irqs restriction: Platform can provide less than MBOX_CNT irqs, which also means less than MBOX_CNT mailbox channels.

Quoted 10 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 255

Quoted 9 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .owner = THIS_MODULE,

No need to set .owner.

I will remove it.

Quoted 2 lines

Cheers.

Regards,
Duc Dang.

#7 lore raw

v4 cover mailbox: Add APM X-Gene platform mailbox driver

In reply to Jassi Brar

APM X-Gene SoC has a mailbox controller that provides communication mechanism for X-Gene Arm64 cores to communicate with X-Gene SoC's Cortex M3 (SLIMpro) processor.

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Fix error and address comment in documentation (xgene-slimpro-mailbox.txt)

Changes since v2:
- Rebase Feng's patch set over v4.3-rc5
- Remove uneccessary 'inline' in function definition
- Use module_platform_driver instead of subsys_initcall
- Minor coding stype clean up

Changes since v1:
- Add ACPI support
- Use defines for reg offset

Duc Dang (3):
mailbox: Add support for APM X-Gene platform mailbox driver
Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts
documentation
arm64: dts: mailbox device tree node for APM X-Gene platform.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  35 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 ++
 drivers/mailbox/Kconfig                            |   9 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 265 +++++++++++++++++++++
 5 files changed, 325 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
Signature · 1 line
1.9.1
#8 lore raw

PATCH v4 1/3 mailbox: Add support for APM X-Gene platform mailbox driver

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 265 ++++++++++++++++++++++++++++++++
 3 files changed, 276 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
 	  Test client to help with testing new Controller driver
 	  implementations.
 
+config XGENE_SLIMPRO_MBOX
+	tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+	depends on ARCH_XGENE
+	help
+	  An implementation of the APM X-Gene Interprocessor Communication
+	  Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+	  It is used to send short messages between ARM64-bit cores and
+	  the SLIMpro Management Engine, primarily for PM. Say Y here if you
+	  want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)	+= mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)	+= bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)		+= mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +265 -0

265 lines not on this page · raw message

Signature · 1 line
1.9.1
#9 lore raw

Re: [PATCH v4 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree…

Hi Duc,

[auto build test WARNING on robh/for-next]
[also build test WARNING on v4.4 next-20160115]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Duc-Dang/mailbox-Add-support-for-APM-X-Gene-platform-mailbox-driver/20160116-110535
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux for-next
config: arm64-allyesconfig (attached as .config)

reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm64

All warnings (new ones prefixed by >>):

>> WARNING: vmlinux.o(.data+0xfd6260): Section mismatch in reference from the variable slimpro_mbox_driver to the variable .init.text:$x

The variable slimpro_mbox_driver references
the variable __init $x
If the reference is valid then annotate the
variable with or __refdata (see linux/init.h) or name the variable:

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/octet-stream
Size: 46958 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160116/c613e700/attachment-0001.obj>

#10 lore raw

Re: [PATCH v4 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 15 lines · kbuild test robot

Hi Duc,

[auto build test WARNING on robh/for-next]
[also build test WARNING on v4.4 next-20160115]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Duc-Dang/mailbox-Add-support-for-APM-X-Gene-platform-mailbox-driver/20160116-110535
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux for-next
config: arm64-allyesconfig (attached as .config)

reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm64

Quoted 7 lines

All warnings (new ones prefixed by >>):

Quoted 1 line
Quoted 1 line

WARNING: vmlinux.o(.data+0xfd6260): Section mismatch in reference from the variable slimpro_mbox_driver to the variable .init.text:$x

The variable slimpro_mbox_driver references
the variable __init $x
If the reference is valid then annotate the
variable with or __refdata (see linux/init.h) or name the variable:

I fixed the build warning, will post and updated after further comment from Jassi.

I did not catch it before posting my patch because I did not compile with CONFIG_DEBUG_SECTION_MISMATCH=y. I will make sure I have this option enabled for my build process going forward.

Regards,
Duc Dang.

Quoted 5 lines

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

#11 lore raw

Re: [PATCH v4 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

In reply to Duc Dang

Hi Jassi,

Quoted 2 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Did you have a chance to look into this version 4 of my mail-box patch?

Regards,
Duc Dang.

Quoted 323 lines

---
Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 265 ++++++++++++++++++++++++++++++++
 3 files changed, 276 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
          Test client to help with testing new Controller driver
          implementations.
 
+config XGENE_SLIMPRO_MBOX
+       tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+       depends on ARCH_XGENE
+       help
+         An implementation of the APM X-Gene Interprocessor Communication
+         Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+         It is used to send short messages between ARM64-bit cores and
+         the SLIMpro Management Engine, primarily for PM. Say Y here if you
+         want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)     += mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)     += bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)         += mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +265 -1
new file mode 100644
index 0000000..a7b0c9e
@@ -0,0 +1,265 @@
+/*
+ * APM X-Gene SLIMpro MailBox Driver
+ *
+ * Copyright (c) 2015, Applied Micro Circuits Corporation
+ * Author: Feng Kan fkan at apm.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <linux/acpi.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mailbox_controller.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#define MBOX_CON_NAME                  "slimpro-mbox"
+#define MBOX_REG_SET_OFFSET            0x1000
+#define MBOX_CNT                       8
+#define MBOX_STATUS_AVAIL_MASK         BIT(16)
+#define MBOX_STATUS_ACK_MASK           BIT(0)
+
+/* Configuration and Status Registers */
+#define REG_DB_IN              0x00
+#define REG_DB_DIN0            0x04
+#define REG_DB_DIN1            0x08
+#define REG_DB_OUT             0x10
+#define REG_DB_DOUT0           0x14
+#define REG_DB_DOUT1           0x18
+#define REG_DB_STAT            0x20
+#define REG_DB_STATMASK                0x24
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;
+       void __iomem *reg;
+       int irq;
+       u32 rx_msg[3];
+};
+
+struct slimpro_mbox {
+       struct mbox_controller mb_ctrl;
+       struct slimpro_mbox_chan mc[MBOX_CNT];
+       struct mbox_chan chans[MBOX_CNT];
+};
+
+static void mb_chan_send_msg(struct slimpro_mbox_chan *mb_chan, u32 *msg)
+{
+       writel(msg[1], mb_chan->reg + REG_DB_DOUT0);
+       writel(msg[2], mb_chan->reg + REG_DB_DOUT1);
+       writel(msg[0], mb_chan->reg + REG_DB_OUT);
+}
+
+static void mb_chan_recv_msg(struct slimpro_mbox_chan *mb_chan)
+{
+       mb_chan->rx_msg[1] = readl(mb_chan->reg + REG_DB_DIN0);
+       mb_chan->rx_msg[2] = readl(mb_chan->reg + REG_DB_DIN1);
+       mb_chan->rx_msg[0] = readl(mb_chan->reg + REG_DB_IN);
+}
+
+static int mb_chan_status_ack(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_ACK_MASK) {
+               writel(MBOX_STATUS_ACK_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static int mb_chan_status_avail(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_AVAIL_MASK) {
+               mb_chan_recv_msg(mb_chan);
+               writel(MBOX_STATUS_AVAIL_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static irqreturn_t slimpro_mbox_irq(int irq, void *id)
+{
+       struct slimpro_mbox_chan *mb_chan = id;
+
+       if (mb_chan_status_ack(mb_chan))
+               mbox_chan_txdone(mb_chan->chan, 0);
+
+       if (mb_chan_status_avail(mb_chan))
+               mbox_chan_received_data(mb_chan->chan, mb_chan->rx_msg);
+
+       return IRQ_HANDLED;
+}
+
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+
+       mb_chan_send_msg(mb_chan, msg);
+       return 0;
+}
+
+static int slimpro_mbox_startup(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       int rc;
+       u32 val;
+
+       rc = devm_request_irq(mb_chan->dev, mb_chan->irq, slimpro_mbox_irq, 0,
+                             MBOX_CON_NAME, mb_chan);
+       if (unlikely(rc)) {
+               dev_err(mb_chan->dev, "failed to register mailbox interrupt %d\n",
+                       mb_chan->irq);
+               return rc;
+       }
+
+       /* Enable HW interrupt */
+       writel(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK,
+              mb_chan->reg + REG_DB_STAT);
+       /* Unmask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val &= ~(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       return 0;
+}
+
+static void slimpro_mbox_shutdown(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       u32 val;
+
+       /* Mask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val |= (MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       devm_free_irq(mb_chan->dev, mb_chan->irq, mb_chan);
+}
+
+static struct mbox_chan_ops slimpro_mbox_ops = {
+       .send_data = slimpro_mbox_send_data,
+       .startup = slimpro_mbox_startup,
+       .shutdown = slimpro_mbox_shutdown,
+};
+
+static int __init slimpro_mbox_probe(struct platform_device *pdev)
+{
+       struct slimpro_mbox *ctx;
+       struct resource *regs;
+       void __iomem *mb_base;
+       int rc;
+       int i;
+
+       ctx = devm_kzalloc(&pdev->dev, sizeof(struct slimpro_mbox), GFP_KERNEL);
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
+       platform_set_drvdata(pdev, ctx);
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mb_base = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
+       if (IS_ERR(mb_base))
+               return PTR_ERR(mb_base);
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);
+               if (ctx->mc[i].irq < 0) {
+                       if (i == 0) {
+                               dev_err(&pdev->dev, "no available IRQ\n");
+                               return -EINVAL;
+                       }
+                       dev_info(&pdev->dev, "no IRQ at index %d\n",
+                               ctx->mc[i].irq);
+                       break;
+               }
+
+               ctx->mc[i].dev = &pdev->dev;
+               ctx->mc[i].reg = mb_base + i * MBOX_REG_SET_OFFSET;
+               ctx->mc[i].chan = &ctx->chans[i];
+               ctx->chans[i].con_priv = &ctx->mc[i];
+       }
+
+       /* Setup mailbox controller */
+       ctx->mb_ctrl.dev = &pdev->dev;
+       ctx->mb_ctrl.chans = ctx->chans;
+       ctx->mb_ctrl.txdone_irq = true;
+       ctx->mb_ctrl.ops = &slimpro_mbox_ops;
+       ctx->mb_ctrl.num_chans = i;
+
+       rc = mbox_controller_register(&ctx->mb_ctrl);
+       if (rc) {
+               dev_err(&pdev->dev,
+                       "APM X-Gene SLIMpro MailBox register failed:%d\n", rc);
+               return rc;
+       }
+
+       dev_info(&pdev->dev, "APM X-Gene SLIMpro MailBox registered\n");
+       return 0;
+}
+
+static int slimpro_mbox_remove(struct platform_device *pdev)
+{
+       struct slimpro_mbox *smb = platform_get_drvdata(pdev);
+
+       mbox_controller_unregister(&smb->mb_ctrl);
+       return 0;
+}
+
+static const struct of_device_id slimpro_of_match[] = {
+       {.compatible = "apm,xgene-slimpro-mbox" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, slimpro_of_match);
+
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id slimpro_acpi_ids[] = {
+       {"APMC0D01", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(acpi, slimpro_acpi_ids);
+#endif
+
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .of_match_table = of_match_ptr(slimpro_of_match),
+               .acpi_match_table = ACPI_PTR(slimpro_acpi_ids)
+       },
+};
+
+static int __init slimpro_mbox_init(void)
+{
+       return platform_driver_register(&slimpro_mbox_driver);
+}
+
+static void __exit slimpro_mbox_exit(void)
+{
+       platform_driver_unregister(&slimpro_mbox_driver);
+}
+
+subsys_initcall(slimpro_mbox_init);
+module_exit(slimpro_mbox_exit);
+
+MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");
+MODULE_LICENSE("GPL");
--

1.9.1

maintainer
#12 lore raw

Re: [PATCH v4 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 8 lines · Duc Dang

Hi Jassi,

Quoted 2 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Did you have a chance to look into this version 4 of my mail-box patch?

Seems ok, please just fix the "section mismatch" warnings reported by the build-bot.

Thanks

#13 lore raw

v5 cover mailbox: Add APM X-Gene platform mailbox driver

APM X-Gene SoC has a mailbox controller that provides communication mechanism for X-Gene Arm64 cores to communicate with X-Gene SoC's Cortex M3 (SLIMpro) processor.

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Changes since v4:
- Rebase over v4.5-rc1
- Fix section mismatch warning during compiling
- Correctly print channel number when there is no IRQ for that channel
- Change node name to mailbox at 10540000
- Correct the number of IRQs in documentation

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Fix error and address comment in documentation (xgene-slimpro-mailbox.txt)

Changes since v2:
- Rebase Feng's patch set over v4.3-rc5
- Remove uneccessary 'inline' in function definition
- Use module_platform_driver instead of subsys_initcall
- Minor coding stype clean up

Changes since v1:
- Add ACPI support
- Use defines for reg offset

Duc Dang (3):
mailbox: Add support for APM X-Gene platform mailbox driver
Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts
documentation
arm64: dts: mailbox device tree node for APM X-Gene platform.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  35 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 ++
 drivers/mailbox/Kconfig                            |   9 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 264 +++++++++++++++++++++
 5 files changed, 324 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
Signature · 1 line
1.9.1
#14 lore raw

PATCH v5 1/3 mailbox: Add support for APM X-Gene platform mailbox driver

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v4:
- Rebase over v4.5-rc1
- Fix section mistmatch warning by removing __init in slimpro_mbox_probe declaration
- Correctly print channel number when there is no IRQ for that channel

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 264 ++++++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
 	  Test client to help with testing new Controller driver
 	  implementations.
 
+config XGENE_SLIMPRO_MBOX
+	tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+	depends on ARCH_XGENE
+	help
+	  An implementation of the APM X-Gene Interprocessor Communication
+	  Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+	  It is used to send short messages between ARM64-bit cores and
+	  the SLIMpro Management Engine, primarily for PM. Say Y here if you
+	  want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)	+= mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)	+= bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)		+= mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +264 -0

264 lines not on this page · raw message

Signature · 1 line
1.9.1
#15 lore raw

Re: [PATCH v5 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 113 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v4:
- Rebase over v4.5-rc1
- Fix section mistmatch warning by removing __init in slimpro_mbox_probe declaration
- Correctly print channel number when there is no IRQ for that channel

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 264 ++++++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
          Test client to help with testing new Controller driver
          implementations.
 
+config XGENE_SLIMPRO_MBOX
+       tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+       depends on ARCH_XGENE
+       help
+         An implementation of the APM X-Gene Interprocessor Communication
+         Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+         It is used to send short messages between ARM64-bit cores and
+         the SLIMpro Management Engine, primarily for PM. Say Y here if you
+         want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)     += mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)     += bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)         += mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +49 -0
new file mode 100644
index 0000000..0ea1eb8
@@ -0,0 +1,264 @@
+/*
+ * APM X-Gene SLIMpro MailBox Driver
+ *
+ * Copyright (c) 2015, Applied Micro Circuits Corporation
+ * Author: Feng Kan fkan at apm.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <linux/acpi.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mailbox_controller.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#define MBOX_CON_NAME                  "slimpro-mbox"
+#define MBOX_REG_SET_OFFSET            0x1000
+#define MBOX_CNT                       8
+#define MBOX_STATUS_AVAIL_MASK         BIT(16)
+#define MBOX_STATUS_ACK_MASK           BIT(0)
+
+/* Configuration and Status Registers */
+#define REG_DB_IN              0x00
+#define REG_DB_DIN0            0x04
+#define REG_DB_DIN1            0x08
+#define REG_DB_OUT             0x10
+#define REG_DB_DOUT0           0x14
+#define REG_DB_DOUT1           0x18
+#define REG_DB_STAT            0x20
+#define REG_DB_STATMASK                0x24
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;

drivers/mailbox/mailbox-xgene-slimpro.c line 59

Quoted 10 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+       void __iomem *reg;
+       int irq;
+       u32 rx_msg[3];
+};
+
+struct slimpro_mbox {
+       struct mbox_controller mb_ctrl;
+       struct slimpro_mbox_chan mc[MBOX_CNT];
+       struct mbox_chan chans[MBOX_CNT];
+};

The above two structure declaration could use kernel style documentation.

Quoted 4 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +4 -0
+
+static void mb_chan_send_msg(struct slimpro_mbox_chan *mb_chan, u32 *msg)
+{
+       writel(msg[1], mb_chan->reg + REG_DB_DOUT0);

drivers/mailbox/mailbox-xgene-slimpro.c line 73

Quoted 10 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+       writel(msg[2], mb_chan->reg + REG_DB_DOUT1);
+       writel(msg[0], mb_chan->reg + REG_DB_OUT);
+}
+
+static void mb_chan_recv_msg(struct slimpro_mbox_chan *mb_chan)
+{
+       mb_chan->rx_msg[1] = readl(mb_chan->reg + REG_DB_DIN0);
+       mb_chan->rx_msg[2] = readl(mb_chan->reg + REG_DB_DIN1);
+       mb_chan->rx_msg[0] = readl(mb_chan->reg + REG_DB_IN);
+}

Is there a requirement that operations in the above two functions be ordered? If not significant gains could be achieved by using writel/readl_relaxed(). Same comment for the rest of this driver.

Thanks,
Mathieu

Quoted 194 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +191 -1
+
+static int mb_chan_status_ack(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_ACK_MASK) {
+               writel(MBOX_STATUS_ACK_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static int mb_chan_status_avail(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_AVAIL_MASK) {
+               mb_chan_recv_msg(mb_chan);
+               writel(MBOX_STATUS_AVAIL_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static irqreturn_t slimpro_mbox_irq(int irq, void *id)
+{
+       struct slimpro_mbox_chan *mb_chan = id;
+
+       if (mb_chan_status_ack(mb_chan))
+               mbox_chan_txdone(mb_chan->chan, 0);
+
+       if (mb_chan_status_avail(mb_chan))
+               mbox_chan_received_data(mb_chan->chan, mb_chan->rx_msg);
+
+       return IRQ_HANDLED;
+}
+
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+
+       mb_chan_send_msg(mb_chan, msg);
+       return 0;
+}
+
+static int slimpro_mbox_startup(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       int rc;
+       u32 val;
+
+       rc = devm_request_irq(mb_chan->dev, mb_chan->irq, slimpro_mbox_irq, 0,
+                             MBOX_CON_NAME, mb_chan);
+       if (unlikely(rc)) {
+               dev_err(mb_chan->dev, "failed to register mailbox interrupt %d\n",
+                       mb_chan->irq);
+               return rc;
+       }
+
+       /* Enable HW interrupt */
+       writel(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK,
+              mb_chan->reg + REG_DB_STAT);
+       /* Unmask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val &= ~(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       return 0;
+}
+
+static void slimpro_mbox_shutdown(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       u32 val;
+
+       /* Mask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val |= (MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       devm_free_irq(mb_chan->dev, mb_chan->irq, mb_chan);
+}
+
+static struct mbox_chan_ops slimpro_mbox_ops = {
+       .send_data = slimpro_mbox_send_data,
+       .startup = slimpro_mbox_startup,
+       .shutdown = slimpro_mbox_shutdown,
+};
+
+static int slimpro_mbox_probe(struct platform_device *pdev)
+{
+       struct slimpro_mbox *ctx;
+       struct resource *regs;
+       void __iomem *mb_base;
+       int rc;
+       int i;
+
+       ctx = devm_kzalloc(&pdev->dev, sizeof(struct slimpro_mbox), GFP_KERNEL);
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
+       platform_set_drvdata(pdev, ctx);
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mb_base = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
+       if (IS_ERR(mb_base))
+               return PTR_ERR(mb_base);
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);
+               if (ctx->mc[i].irq < 0) {
+                       if (i == 0) {
+                               dev_err(&pdev->dev, "no available IRQ\n");
+                               return -EINVAL;
+                       }
+                       dev_info(&pdev->dev, "no IRQ for channel %d\n", i);
+                       break;
+               }
+
+               ctx->mc[i].dev = &pdev->dev;
+               ctx->mc[i].reg = mb_base + i * MBOX_REG_SET_OFFSET;
+               ctx->mc[i].chan = &ctx->chans[i];
+               ctx->chans[i].con_priv = &ctx->mc[i];
+       }
+
+       /* Setup mailbox controller */
+       ctx->mb_ctrl.dev = &pdev->dev;
+       ctx->mb_ctrl.chans = ctx->chans;
+       ctx->mb_ctrl.txdone_irq = true;
+       ctx->mb_ctrl.ops = &slimpro_mbox_ops;
+       ctx->mb_ctrl.num_chans = i;
+
+       rc = mbox_controller_register(&ctx->mb_ctrl);
+       if (rc) {
+               dev_err(&pdev->dev,
+                       "APM X-Gene SLIMpro MailBox register failed:%d\n", rc);
+               return rc;
+       }
+
+       dev_info(&pdev->dev, "APM X-Gene SLIMpro MailBox registered\n");
+       return 0;
+}
+
+static int slimpro_mbox_remove(struct platform_device *pdev)
+{
+       struct slimpro_mbox *smb = platform_get_drvdata(pdev);
+
+       mbox_controller_unregister(&smb->mb_ctrl);
+       return 0;
+}
+
+static const struct of_device_id slimpro_of_match[] = {
+       {.compatible = "apm,xgene-slimpro-mbox" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, slimpro_of_match);
+
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id slimpro_acpi_ids[] = {
+       {"APMC0D01", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(acpi, slimpro_acpi_ids);
+#endif
+
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .of_match_table = of_match_ptr(slimpro_of_match),
+               .acpi_match_table = ACPI_PTR(slimpro_acpi_ids)
+       },
+};
+
+static int __init slimpro_mbox_init(void)
+{
+       return platform_driver_register(&slimpro_mbox_driver);
+}
+
+static void __exit slimpro_mbox_exit(void)
+{
+       platform_driver_unregister(&slimpro_mbox_driver);
+}
+
+subsys_initcall(slimpro_mbox_init);
+module_exit(slimpro_mbox_exit);
+
+MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");
+MODULE_LICENSE("GPL");
--

1.9.1

#16 lore raw

Re: [PATCH v5 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 118 lines · Mathieu Poirier
Quoted 117 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v4:
- Rebase over v4.5-rc1
- Fix section mistmatch warning by removing __init in slimpro_mbox_probe declaration
- Correctly print channel number when there is no IRQ for that channel

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 264 ++++++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
          Test client to help with testing new Controller driver
          implementations.
 
+config XGENE_SLIMPRO_MBOX
+       tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+       depends on ARCH_XGENE
+       help
+         An implementation of the APM X-Gene Interprocessor Communication
+         Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+         It is used to send short messages between ARM64-bit cores and
+         the SLIMpro Management Engine, primarily for PM. Say Y here if you
+         want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)     += mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)     += bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)         += mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +53 -0
new file mode 100644
index 0000000..0ea1eb8
@@ -0,0 +1,264 @@
+/*
+ * APM X-Gene SLIMpro MailBox Driver
+ *
+ * Copyright (c) 2015, Applied Micro Circuits Corporation
+ * Author: Feng Kan fkan at apm.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <linux/acpi.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mailbox_controller.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#define MBOX_CON_NAME                  "slimpro-mbox"
+#define MBOX_REG_SET_OFFSET            0x1000
+#define MBOX_CNT                       8
+#define MBOX_STATUS_AVAIL_MASK         BIT(16)
+#define MBOX_STATUS_ACK_MASK           BIT(0)
+
+/* Configuration and Status Registers */
+#define REG_DB_IN              0x00
+#define REG_DB_DIN0            0x04
+#define REG_DB_DIN1            0x08
+#define REG_DB_OUT             0x10
+#define REG_DB_DOUT0           0x14
+#define REG_DB_DOUT1           0x18
+#define REG_DB_STAT            0x20
+#define REG_DB_STATMASK                0x24
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;
+       void __iomem *reg;
+       int irq;
+       u32 rx_msg[3];
+};
Quoted 8 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 59

Quoted 6 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
+
+struct slimpro_mbox {
+       struct mbox_controller mb_ctrl;
+       struct slimpro_mbox_chan mc[MBOX_CNT];
+       struct mbox_chan chans[MBOX_CNT];
+};

The above two structure declaration could use kernel style documentation.

Can you please clarify or give an example? I looked into several files in drivers/mailbox/ and drivers/irqchip but could not find what I need to tweak.

Quoted 11 lines
Quoted 11 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+
+static void mb_chan_send_msg(struct slimpro_mbox_chan *mb_chan, u32 *msg)
+{
+       writel(msg[1], mb_chan->reg + REG_DB_DOUT0);
+       writel(msg[2], mb_chan->reg + REG_DB_DOUT1);
+       writel(msg[0], mb_chan->reg + REG_DB_OUT);
+}
+
+static void mb_chan_recv_msg(struct slimpro_mbox_chan *mb_chan)
+{
Quoted 8 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 73

Quoted 4 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +4 -0
+       mb_chan->rx_msg[1] = readl(mb_chan->reg + REG_DB_DIN0);
+       mb_chan->rx_msg[2] = readl(mb_chan->reg + REG_DB_DIN1);
+       mb_chan->rx_msg[0] = readl(mb_chan->reg + REG_DB_IN);
+}

Is there a requirement that operations in the above two functions be ordered? If not significant gains could be achieved by using writel/readl_relaxed(). Same comment for the rest of this driver.

The 'writes' need to be in order as writing to REG_DB_OUT will trigger interrupt, so I want the other 2 'writes' complete before it.

After the receiver get the message, it will clear door bell available interrupt request, this will also trigger a door bell acknowledge interrupt. So the 'read' to get the message and the 'write' to clear the door bell available interrupt must be in order as well.

Regards,
Duc Dang.

Quoted 198 lines

Thanks,
Mathieu

Quoted 194 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +191 -1
+
+static int mb_chan_status_ack(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_ACK_MASK) {
+               writel(MBOX_STATUS_ACK_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static int mb_chan_status_avail(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_AVAIL_MASK) {
+               mb_chan_recv_msg(mb_chan);
+               writel(MBOX_STATUS_AVAIL_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static irqreturn_t slimpro_mbox_irq(int irq, void *id)
+{
+       struct slimpro_mbox_chan *mb_chan = id;
+
+       if (mb_chan_status_ack(mb_chan))
+               mbox_chan_txdone(mb_chan->chan, 0);
+
+       if (mb_chan_status_avail(mb_chan))
+               mbox_chan_received_data(mb_chan->chan, mb_chan->rx_msg);
+
+       return IRQ_HANDLED;
+}
+
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+
+       mb_chan_send_msg(mb_chan, msg);
+       return 0;
+}
+
+static int slimpro_mbox_startup(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       int rc;
+       u32 val;
+
+       rc = devm_request_irq(mb_chan->dev, mb_chan->irq, slimpro_mbox_irq, 0,
+                             MBOX_CON_NAME, mb_chan);
+       if (unlikely(rc)) {
+               dev_err(mb_chan->dev, "failed to register mailbox interrupt %d\n",
+                       mb_chan->irq);
+               return rc;
+       }
+
+       /* Enable HW interrupt */
+       writel(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK,
+              mb_chan->reg + REG_DB_STAT);
+       /* Unmask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val &= ~(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       return 0;
+}
+
+static void slimpro_mbox_shutdown(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       u32 val;
+
+       /* Mask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val |= (MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       devm_free_irq(mb_chan->dev, mb_chan->irq, mb_chan);
+}
+
+static struct mbox_chan_ops slimpro_mbox_ops = {
+       .send_data = slimpro_mbox_send_data,
+       .startup = slimpro_mbox_startup,
+       .shutdown = slimpro_mbox_shutdown,
+};
+
+static int slimpro_mbox_probe(struct platform_device *pdev)
+{
+       struct slimpro_mbox *ctx;
+       struct resource *regs;
+       void __iomem *mb_base;
+       int rc;
+       int i;
+
+       ctx = devm_kzalloc(&pdev->dev, sizeof(struct slimpro_mbox), GFP_KERNEL);
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
+       platform_set_drvdata(pdev, ctx);
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mb_base = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
+       if (IS_ERR(mb_base))
+               return PTR_ERR(mb_base);
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);
+               if (ctx->mc[i].irq < 0) {
+                       if (i == 0) {
+                               dev_err(&pdev->dev, "no available IRQ\n");
+                               return -EINVAL;
+                       }
+                       dev_info(&pdev->dev, "no IRQ for channel %d\n", i);
+                       break;
+               }
+
+               ctx->mc[i].dev = &pdev->dev;
+               ctx->mc[i].reg = mb_base + i * MBOX_REG_SET_OFFSET;
+               ctx->mc[i].chan = &ctx->chans[i];
+               ctx->chans[i].con_priv = &ctx->mc[i];
+       }
+
+       /* Setup mailbox controller */
+       ctx->mb_ctrl.dev = &pdev->dev;
+       ctx->mb_ctrl.chans = ctx->chans;
+       ctx->mb_ctrl.txdone_irq = true;
+       ctx->mb_ctrl.ops = &slimpro_mbox_ops;
+       ctx->mb_ctrl.num_chans = i;
+
+       rc = mbox_controller_register(&ctx->mb_ctrl);
+       if (rc) {
+               dev_err(&pdev->dev,
+                       "APM X-Gene SLIMpro MailBox register failed:%d\n", rc);
+               return rc;
+       }
+
+       dev_info(&pdev->dev, "APM X-Gene SLIMpro MailBox registered\n");
+       return 0;
+}
+
+static int slimpro_mbox_remove(struct platform_device *pdev)
+{
+       struct slimpro_mbox *smb = platform_get_drvdata(pdev);
+
+       mbox_controller_unregister(&smb->mb_ctrl);
+       return 0;
+}
+
+static const struct of_device_id slimpro_of_match[] = {
+       {.compatible = "apm,xgene-slimpro-mbox" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, slimpro_of_match);
+
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id slimpro_acpi_ids[] = {
+       {"APMC0D01", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(acpi, slimpro_acpi_ids);
+#endif
+
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .of_match_table = of_match_ptr(slimpro_of_match),
+               .acpi_match_table = ACPI_PTR(slimpro_acpi_ids)
+       },
+};
+
+static int __init slimpro_mbox_init(void)
+{
+       return platform_driver_register(&slimpro_mbox_driver);
+}
+
+static void __exit slimpro_mbox_exit(void)
+{
+       platform_driver_unregister(&slimpro_mbox_driver);
+}
+
+subsys_initcall(slimpro_mbox_init);
+module_exit(slimpro_mbox_exit);
+
+MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");
+MODULE_LICENSE("GPL");
--

1.9.1

#17 lore raw

Re: [PATCH v5 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 129 lines · Duc Dang
Quoted 118 lines · Mathieu Poirier
Quoted 117 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v4:
- Rebase over v4.5-rc1
- Fix section mistmatch warning by removing __init in slimpro_mbox_probe declaration
- Correctly print channel number when there is no IRQ for that channel

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 264 ++++++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
          Test client to help with testing new Controller driver
          implementations.
 
+config XGENE_SLIMPRO_MBOX
+       tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+       depends on ARCH_XGENE
+       help
+         An implementation of the APM X-Gene Interprocessor Communication
+         Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+         It is used to send short messages between ARM64-bit cores and
+         the SLIMpro Management Engine, primarily for PM. Say Y here if you
+         want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)     += mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)     += bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)         += mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +53 -0
new file mode 100644
index 0000000..0ea1eb8
@@ -0,0 +1,264 @@
+/*
+ * APM X-Gene SLIMpro MailBox Driver
+ *
+ * Copyright (c) 2015, Applied Micro Circuits Corporation
+ * Author: Feng Kan fkan at apm.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <linux/acpi.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mailbox_controller.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#define MBOX_CON_NAME                  "slimpro-mbox"
+#define MBOX_REG_SET_OFFSET            0x1000
+#define MBOX_CNT                       8
+#define MBOX_STATUS_AVAIL_MASK         BIT(16)
+#define MBOX_STATUS_ACK_MASK           BIT(0)
+
+/* Configuration and Status Registers */
+#define REG_DB_IN              0x00
+#define REG_DB_DIN0            0x04
+#define REG_DB_DIN1            0x08
+#define REG_DB_OUT             0x10
+#define REG_DB_DOUT0           0x14
+#define REG_DB_DOUT1           0x18
+#define REG_DB_STAT            0x20
+#define REG_DB_STATMASK                0x24
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;
+       void __iomem *reg;
+       int irq;
+       u32 rx_msg[3];
+};
Quoted 8 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 59

Quoted 6 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +6 -0
+
+struct slimpro_mbox {
+       struct mbox_controller mb_ctrl;
+       struct slimpro_mbox_chan mc[MBOX_CNT];
+       struct mbox_chan chans[MBOX_CNT];
+};

The above two structure declaration could use kernel style documentation.

Quoted 3 lines

Can you please clarify or give an example? I looked into several files in drivers/mailbox/ and drivers/irqchip but could not find what I need to tweak.

http://lxr.free-electrons.com/source/drivers/mailbox/mailbox-sti.c#L42

Quoted 229 lines
Quoted 12 lines
Quoted 12 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+
+static void mb_chan_send_msg(struct slimpro_mbox_chan *mb_chan, u32 *msg)
+{
+       writel(msg[1], mb_chan->reg + REG_DB_DOUT0);
+       writel(msg[2], mb_chan->reg + REG_DB_DOUT1);
+       writel(msg[0], mb_chan->reg + REG_DB_OUT);
+}
+
+static void mb_chan_recv_msg(struct slimpro_mbox_chan *mb_chan)
+{
Quoted 8 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 73

Quoted 4 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +4 -0
+       mb_chan->rx_msg[1] = readl(mb_chan->reg + REG_DB_DIN0);
+       mb_chan->rx_msg[2] = readl(mb_chan->reg + REG_DB_DIN1);
+       mb_chan->rx_msg[0] = readl(mb_chan->reg + REG_DB_IN);
+}

Is there a requirement that operations in the above two functions be ordered? If not significant gains could be achieved by using writel/readl_relaxed(). Same comment for the rest of this driver.

The 'writes' need to be in order as writing to REG_DB_OUT will trigger interrupt, so I want the other 2 'writes' complete before it.

After the receiver get the message, it will clear door bell available interrupt request, this will also trigger a door bell acknowledge interrupt. So the 'read' to get the message and the 'write' to clear the door bell available interrupt must be in order as well.

Regards,
Duc Dang.

Quoted 198 lines

Thanks,
Mathieu

Quoted 194 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +191 -1
+
+static int mb_chan_status_ack(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_ACK_MASK) {
+               writel(MBOX_STATUS_ACK_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static int mb_chan_status_avail(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_AVAIL_MASK) {
+               mb_chan_recv_msg(mb_chan);
+               writel(MBOX_STATUS_AVAIL_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static irqreturn_t slimpro_mbox_irq(int irq, void *id)
+{
+       struct slimpro_mbox_chan *mb_chan = id;
+
+       if (mb_chan_status_ack(mb_chan))
+               mbox_chan_txdone(mb_chan->chan, 0);
+
+       if (mb_chan_status_avail(mb_chan))
+               mbox_chan_received_data(mb_chan->chan, mb_chan->rx_msg);
+
+       return IRQ_HANDLED;
+}
+
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+
+       mb_chan_send_msg(mb_chan, msg);
+       return 0;
+}
+
+static int slimpro_mbox_startup(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       int rc;
+       u32 val;
+
+       rc = devm_request_irq(mb_chan->dev, mb_chan->irq, slimpro_mbox_irq, 0,
+                             MBOX_CON_NAME, mb_chan);
+       if (unlikely(rc)) {
+               dev_err(mb_chan->dev, "failed to register mailbox interrupt %d\n",
+                       mb_chan->irq);
+               return rc;
+       }
+
+       /* Enable HW interrupt */
+       writel(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK,
+              mb_chan->reg + REG_DB_STAT);
+       /* Unmask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val &= ~(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       return 0;
+}
+
+static void slimpro_mbox_shutdown(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       u32 val;
+
+       /* Mask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val |= (MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       devm_free_irq(mb_chan->dev, mb_chan->irq, mb_chan);
+}
+
+static struct mbox_chan_ops slimpro_mbox_ops = {
+       .send_data = slimpro_mbox_send_data,
+       .startup = slimpro_mbox_startup,
+       .shutdown = slimpro_mbox_shutdown,
+};
+
+static int slimpro_mbox_probe(struct platform_device *pdev)
+{
+       struct slimpro_mbox *ctx;
+       struct resource *regs;
+       void __iomem *mb_base;
+       int rc;
+       int i;
+
+       ctx = devm_kzalloc(&pdev->dev, sizeof(struct slimpro_mbox), GFP_KERNEL);
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
+       platform_set_drvdata(pdev, ctx);
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mb_base = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
+       if (IS_ERR(mb_base))
+               return PTR_ERR(mb_base);
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);
+               if (ctx->mc[i].irq < 0) {
+                       if (i == 0) {
+                               dev_err(&pdev->dev, "no available IRQ\n");
+                               return -EINVAL;
+                       }
+                       dev_info(&pdev->dev, "no IRQ for channel %d\n", i);
+                       break;
+               }
+
+               ctx->mc[i].dev = &pdev->dev;
+               ctx->mc[i].reg = mb_base + i * MBOX_REG_SET_OFFSET;
+               ctx->mc[i].chan = &ctx->chans[i];
+               ctx->chans[i].con_priv = &ctx->mc[i];
+       }
+
+       /* Setup mailbox controller */
+       ctx->mb_ctrl.dev = &pdev->dev;
+       ctx->mb_ctrl.chans = ctx->chans;
+       ctx->mb_ctrl.txdone_irq = true;
+       ctx->mb_ctrl.ops = &slimpro_mbox_ops;
+       ctx->mb_ctrl.num_chans = i;
+
+       rc = mbox_controller_register(&ctx->mb_ctrl);
+       if (rc) {
+               dev_err(&pdev->dev,
+                       "APM X-Gene SLIMpro MailBox register failed:%d\n", rc);
+               return rc;
+       }
+
+       dev_info(&pdev->dev, "APM X-Gene SLIMpro MailBox registered\n");
+       return 0;
+}
+
+static int slimpro_mbox_remove(struct platform_device *pdev)
+{
+       struct slimpro_mbox *smb = platform_get_drvdata(pdev);
+
+       mbox_controller_unregister(&smb->mb_ctrl);
+       return 0;
+}
+
+static const struct of_device_id slimpro_of_match[] = {
+       {.compatible = "apm,xgene-slimpro-mbox" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, slimpro_of_match);
+
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id slimpro_acpi_ids[] = {
+       {"APMC0D01", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(acpi, slimpro_acpi_ids);
+#endif
+
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .of_match_table = of_match_ptr(slimpro_of_match),
+               .acpi_match_table = ACPI_PTR(slimpro_acpi_ids)
+       },
+};
+
+static int __init slimpro_mbox_init(void)
+{
+       return platform_driver_register(&slimpro_mbox_driver);
+}
+
+static void __exit slimpro_mbox_exit(void)
+{
+       platform_driver_unregister(&slimpro_mbox_driver);
+}
+
+subsys_initcall(slimpro_mbox_init);
+module_exit(slimpro_mbox_exit);
+
+MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");
+MODULE_LICENSE("GPL");
--

1.9.1

#18 lore raw

Re: [PATCH v5 1/3] mailbox: Add support for APM X-Gene platform mailbox driver

Quoted 130 lines · Mathieu Poirier
Quoted 129 lines · Duc Dang
Quoted 126 lines · Mathieu Poirier
Quoted 113 lines · Duc Dang

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v4:
- Rebase over v4.5-rc1
- Fix section mistmatch warning by removing __init in slimpro_mbox_probe declaration
- Correctly print channel number when there is no IRQ for that channel

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 ++
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 264 ++++++++++++++++++++++++++++++++
 3 files changed, 275 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
          Test client to help with testing new Controller driver
          implementations.
 
+config XGENE_SLIMPRO_MBOX
+       tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+       depends on ARCH_XGENE
+       help
+         An implementation of the APM X-Gene Interprocessor Communication
+         Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+         It is used to send short messages between ARM64-bit cores and
+         the SLIMpro Management Engine, primarily for PM. Say Y here if you
+         want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)     += mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)     += bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)         += mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +49 -0
new file mode 100644
index 0000000..0ea1eb8
@@ -0,0 +1,264 @@
+/*
+ * APM X-Gene SLIMpro MailBox Driver
+ *
+ * Copyright (c) 2015, Applied Micro Circuits Corporation
+ * Author: Feng Kan fkan at apm.com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include <linux/acpi.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/mailbox_controller.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#define MBOX_CON_NAME                  "slimpro-mbox"
+#define MBOX_REG_SET_OFFSET            0x1000
+#define MBOX_CNT                       8
+#define MBOX_STATUS_AVAIL_MASK         BIT(16)
+#define MBOX_STATUS_ACK_MASK           BIT(0)
+
+/* Configuration and Status Registers */
+#define REG_DB_IN              0x00
+#define REG_DB_DIN0            0x04
+#define REG_DB_DIN1            0x08
+#define REG_DB_OUT             0x10
+#define REG_DB_DOUT0           0x14
+#define REG_DB_DOUT1           0x18
+#define REG_DB_STAT            0x20
+#define REG_DB_STATMASK                0x24
+
+struct slimpro_mbox_chan {
+       struct device *dev;
+       struct mbox_chan *chan;

drivers/mailbox/mailbox-xgene-slimpro.c line 59

Quoted 10 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+       void __iomem *reg;
+       int irq;
+       u32 rx_msg[3];
+};
+
+struct slimpro_mbox {
+       struct mbox_controller mb_ctrl;
+       struct slimpro_mbox_chan mc[MBOX_CNT];
+       struct mbox_chan chans[MBOX_CNT];
+};

The above two structure declaration could use kernel style documentation.

Quoted 5 lines
Quoted 3 lines

Can you please clarify or give an example? I looked into several files in drivers/mailbox/ and drivers/irqchip but could not find what I need to tweak.

http://lxr.free-electrons.com/source/drivers/mailbox/mailbox-sti.c#L42

I am modifying the structure defintion to add description and will post a new version shortly.

Regards,
Duc Dang.

Quoted 230 lines
Quoted 230 lines
Quoted 13 lines
Quoted 13 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +10 -0
+
+static void mb_chan_send_msg(struct slimpro_mbox_chan *mb_chan, u32 *msg)
+{
+       writel(msg[1], mb_chan->reg + REG_DB_DOUT0);
+       writel(msg[2], mb_chan->reg + REG_DB_DOUT1);
+       writel(msg[0], mb_chan->reg + REG_DB_OUT);
+}
+
+static void mb_chan_recv_msg(struct slimpro_mbox_chan *mb_chan)
+{
Quoted 8 lines

drivers/mailbox/mailbox-xgene-slimpro.c line 73

Quoted 4 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +4 -0
+       mb_chan->rx_msg[1] = readl(mb_chan->reg + REG_DB_DIN0);
+       mb_chan->rx_msg[2] = readl(mb_chan->reg + REG_DB_DIN1);
+       mb_chan->rx_msg[0] = readl(mb_chan->reg + REG_DB_IN);
+}

Is there a requirement that operations in the above two functions be ordered? If not significant gains could be achieved by using writel/readl_relaxed(). Same comment for the rest of this driver.

The 'writes' need to be in order as writing to REG_DB_OUT will trigger interrupt, so I want the other 2 'writes' complete before it.

After the receiver get the message, it will clear door bell available interrupt request, this will also trigger a door bell acknowledge interrupt. So the 'read' to get the message and the 'write' to clear the door bell available interrupt must be in order as well.

Regards,
Duc Dang.

Quoted 198 lines

Thanks,
Mathieu

Quoted 194 lines
drivers/mailbox/mailbox-xgene-slimpro.c new file +191 -1
+
+static int mb_chan_status_ack(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_ACK_MASK) {
+               writel(MBOX_STATUS_ACK_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static int mb_chan_status_avail(struct slimpro_mbox_chan *mb_chan)
+{
+       u32 val = readl(mb_chan->reg + REG_DB_STAT);
+
+       if (val & MBOX_STATUS_AVAIL_MASK) {
+               mb_chan_recv_msg(mb_chan);
+               writel(MBOX_STATUS_AVAIL_MASK, mb_chan->reg + REG_DB_STAT);
+               return 1;
+       }
+       return 0;
+}
+
+static irqreturn_t slimpro_mbox_irq(int irq, void *id)
+{
+       struct slimpro_mbox_chan *mb_chan = id;
+
+       if (mb_chan_status_ack(mb_chan))
+               mbox_chan_txdone(mb_chan->chan, 0);
+
+       if (mb_chan_status_avail(mb_chan))
+               mbox_chan_received_data(mb_chan->chan, mb_chan->rx_msg);
+
+       return IRQ_HANDLED;
+}
+
+static int slimpro_mbox_send_data(struct mbox_chan *chan, void *msg)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+
+       mb_chan_send_msg(mb_chan, msg);
+       return 0;
+}
+
+static int slimpro_mbox_startup(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       int rc;
+       u32 val;
+
+       rc = devm_request_irq(mb_chan->dev, mb_chan->irq, slimpro_mbox_irq, 0,
+                             MBOX_CON_NAME, mb_chan);
+       if (unlikely(rc)) {
+               dev_err(mb_chan->dev, "failed to register mailbox interrupt %d\n",
+                       mb_chan->irq);
+               return rc;
+       }
+
+       /* Enable HW interrupt */
+       writel(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK,
+              mb_chan->reg + REG_DB_STAT);
+       /* Unmask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val &= ~(MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       return 0;
+}
+
+static void slimpro_mbox_shutdown(struct mbox_chan *chan)
+{
+       struct slimpro_mbox_chan *mb_chan = chan->con_priv;
+       u32 val;
+
+       /* Mask doorbell status interrupt */
+       val = readl(mb_chan->reg + REG_DB_STATMASK);
+       val |= (MBOX_STATUS_ACK_MASK | MBOX_STATUS_AVAIL_MASK);
+       writel(val, mb_chan->reg + REG_DB_STATMASK);
+
+       devm_free_irq(mb_chan->dev, mb_chan->irq, mb_chan);
+}
+
+static struct mbox_chan_ops slimpro_mbox_ops = {
+       .send_data = slimpro_mbox_send_data,
+       .startup = slimpro_mbox_startup,
+       .shutdown = slimpro_mbox_shutdown,
+};
+
+static int slimpro_mbox_probe(struct platform_device *pdev)
+{
+       struct slimpro_mbox *ctx;
+       struct resource *regs;
+       void __iomem *mb_base;
+       int rc;
+       int i;
+
+       ctx = devm_kzalloc(&pdev->dev, sizeof(struct slimpro_mbox), GFP_KERNEL);
+       if (IS_ERR(ctx))
+               return PTR_ERR(ctx);
+
+       platform_set_drvdata(pdev, ctx);
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mb_base = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
+       if (IS_ERR(mb_base))
+               return PTR_ERR(mb_base);
+
+       /* Setup mailbox links */
+       for (i = 0; i < MBOX_CNT; i++) {
+               ctx->mc[i].irq = platform_get_irq(pdev, i);
+               if (ctx->mc[i].irq < 0) {
+                       if (i == 0) {
+                               dev_err(&pdev->dev, "no available IRQ\n");
+                               return -EINVAL;
+                       }
+                       dev_info(&pdev->dev, "no IRQ for channel %d\n", i);
+                       break;
+               }
+
+               ctx->mc[i].dev = &pdev->dev;
+               ctx->mc[i].reg = mb_base + i * MBOX_REG_SET_OFFSET;
+               ctx->mc[i].chan = &ctx->chans[i];
+               ctx->chans[i].con_priv = &ctx->mc[i];
+       }
+
+       /* Setup mailbox controller */
+       ctx->mb_ctrl.dev = &pdev->dev;
+       ctx->mb_ctrl.chans = ctx->chans;
+       ctx->mb_ctrl.txdone_irq = true;
+       ctx->mb_ctrl.ops = &slimpro_mbox_ops;
+       ctx->mb_ctrl.num_chans = i;
+
+       rc = mbox_controller_register(&ctx->mb_ctrl);
+       if (rc) {
+               dev_err(&pdev->dev,
+                       "APM X-Gene SLIMpro MailBox register failed:%d\n", rc);
+               return rc;
+       }
+
+       dev_info(&pdev->dev, "APM X-Gene SLIMpro MailBox registered\n");
+       return 0;
+}
+
+static int slimpro_mbox_remove(struct platform_device *pdev)
+{
+       struct slimpro_mbox *smb = platform_get_drvdata(pdev);
+
+       mbox_controller_unregister(&smb->mb_ctrl);
+       return 0;
+}
+
+static const struct of_device_id slimpro_of_match[] = {
+       {.compatible = "apm,xgene-slimpro-mbox" },
+       { },
+};
+MODULE_DEVICE_TABLE(of, slimpro_of_match);
+
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id slimpro_acpi_ids[] = {
+       {"APMC0D01", 0},
+       {}
+};
+MODULE_DEVICE_TABLE(acpi, slimpro_acpi_ids);
+#endif
+
+static struct platform_driver slimpro_mbox_driver = {
+       .probe  = slimpro_mbox_probe,
+       .remove = slimpro_mbox_remove,
+       .driver = {
+               .name = "xgene-slimpro-mbox",
+               .of_match_table = of_match_ptr(slimpro_of_match),
+               .acpi_match_table = ACPI_PTR(slimpro_acpi_ids)
+       },
+};
+
+static int __init slimpro_mbox_init(void)
+{
+       return platform_driver_register(&slimpro_mbox_driver);
+}
+
+static void __exit slimpro_mbox_exit(void)
+{
+       platform_driver_unregister(&slimpro_mbox_driver);
+}
+
+subsys_initcall(slimpro_mbox_init);
+module_exit(slimpro_mbox_exit);
+
+MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");
+MODULE_LICENSE("GPL");
--

1.9.1

#19 lore raw

v6 cover mailbox: Add APM X-Gene platform mailbox driver

In reply to Mathieu Poirier

APM X-Gene SoC has a mailbox controller that provides communication mechanism for X-Gene Arm64 cores to communicate with X-Gene SoC's Cortex M3 (SLIMpro) processor.

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Changes since v5:
- Add more description into SlimPRO
mailbox data structure

Changes since v4:
- Rebase over v4.5-rc1
- Fix section mismatch warning during compiling
- Correctly print channel number when there is no IRQ for that channel
- Change node name to mailbox at 10540000
- Correct the number of IRQs in documentation

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Fix error and address comment in documentation (xgene-slimpro-mailbox.txt)

Changes since v2:
- Rebase Feng's patch set over v4.3-rc5
- Remove uneccessary 'inline' in function definition
- Use module_platform_driver instead of subsys_initcall
- Minor coding stype clean up

Changes since v1:
- Add ACPI support
- Use defines for reg offset

Duc Dang (3):
mailbox: Add support for APM X-Gene platform mailbox driver
Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts
documentation
arm64: dts: mailbox device tree node for APM X-Gene platform.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  35 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 +
 drivers/mailbox/Kconfig                            |   9 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 284 +++++++++++++++++++++
 5 files changed, 344 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
Signature · 1 line
1.9.1
#20 lore raw

PATCH v6 1/3 mailbox: Add support for APM X-Gene platform mailbox driver

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

---
Changes since v5:
- Add description for struct slimpro_mbox_chan and struct slimpro_mbox

Changes since v4:
- Rebase over v4.5-rc1
- Fix section mistmatch warning by removing __init in slimpro_mbox_probe declaration
- Correctly print channel number when there is no IRQ for that channel

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove small functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Use subsys_initcall to guarantee mailbox driver will be registered before any other dependent driver is loaded.

 drivers/mailbox/Kconfig                 |   9 +
 drivers/mailbox/Makefile                |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c | 284 ++++++++++++++++++++++++++++++++
 3 files changed, 295 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c
drivers/mailbox/Kconfig +9 -0
index 546d05f..678e434 100644
@@ -85,4 +85,13 @@ config MAILBOX_TEST
 	  Test client to help with testing new Controller driver
 	  implementations.
 
+config XGENE_SLIMPRO_MBOX
+	tristate "APM SoC X-Gene SLIMpro Mailbox Controller"
+	depends on ARCH_XGENE
+	help
+	  An implementation of the APM X-Gene Interprocessor Communication
+	  Mailbox (IPCM) between the ARM 64-bit cores and SLIMpro controller.
+	  It is used to send short messages between ARM64-bit cores and
+	  the SLIMpro Management Engine, primarily for PM. Say Y here if you
+	  want to use the APM X-Gene SLIMpro IPCM support.
 endif
drivers/mailbox/Makefile +2 -0
index 92435ef..b602ef8 100644
@@ -17,3 +17,5 @@ obj-$(CONFIG_ALTERA_MBOX)	+= mailbox-altera.o
 obj-$(CONFIG_BCM2835_MBOX)	+= bcm2835-mailbox.o
 
 obj-$(CONFIG_STI_MBOX)		+= mailbox-sti.o
+
+obj-$(CONFIG_XGENE_SLIMPRO_MBOX) += mailbox-xgene-slimpro.o
drivers/mailbox/mailbox-xgene-slimpro.c new file +284 -0

284 lines not on this page · raw message

Signature · 1 line
1.9.1
#21 lore raw

PATCH v6 2/3 Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

In reply to Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

---
Changes since v5:
- None

Changes since v4:
- Rebase over v4.5-rc1
- Fix number of total interrupts in
introduction text
- Change node name to mailbox at 10540000

Changes since v3:
- Rebase over v4.4
- Change number of mailbox IRQs to 8
- Fix white spaces, typos.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +35 -0
new file mode 100644
index 0000000..e46451b
@@ -0,0 +1,35 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 8 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm,xgene-slimpro-mbox".
+
+- reg:		Contains the mailbox register address range.
+
+- interrupts:	8 interrupts must be from 0 to 7, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		mailbox: mailbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =  	<0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>,
+		};
Signature · 1 line
1.9.1
#22 lore raw

PATCH v6 3/3 arm64: dts: mailbox device tree node for APM X-Gene platform.

In reply to Duc Dang

Mailbox device tree node for APM X-Gene platform.

---
Changes since v5:
- None

Changes since v4:
- Rebase over v4.5-rc1
- Change node name to mailbox at 10540000

Changes since v3:
- Rebase over v4.4

 arch/arm64/boot/dts/apm/apm-storm.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
arch/arm64/boot/dts/apm/apm-storm.dtsi +14 -0
index fe30f76..d91338a 100644
@@ -691,6 +691,20 @@
 			msi-parent = <&msi>;
 		};
 
+		mailbox: mailbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =    <0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>;
+		};
+
 		serial0: serial at 1c020000 {
 			status = "disabled";
 			device_type = "serial";
Signature · 1 line
1.9.1
#23 lore raw

Re: [PATCH v6 3/3] arm64: dts: mailbox device tree node for APM X-Gene platform.

Quoted 2 lines · Duc Dang

Mailbox device tree node for APM X-Gene platform.

Hi Jassi,

Will you take this patch to your mailbox tree or you want me to include it into my git pull request to Olof/Arnd (arm-soc tree)?

Regards,
Duc Dang.

Quoted 45 lines

---
Changes since v5:
- None

Changes since v4:
- Rebase over v4.5-rc1
- Change node name to mailbox at 10540000

Changes since v3:
- Rebase over v4.4

 arch/arm64/boot/dts/apm/apm-storm.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
arch/arm64/boot/dts/apm/apm-storm.dtsi +14 -1
index fe30f76..d91338a 100644
@@ -691,6 +691,20 @@
                        msi-parent = <&msi>;
                };
 
+               mailbox: mailbox at 10540000 {
+                       compatible = "apm,xgene-slimpro-mbox";
+                       reg = <0x0 0x10540000 0x0 0xa000>;
+                       #mbox-cells = <1>;
+                       interrupts =    <0x0 0x0 0x4>,
+                                       <0x0 0x1 0x4>,
+                                       <0x0 0x2 0x4>,
+                                       <0x0 0x3 0x4>,
+                                       <0x0 0x4 0x4>,
+                                       <0x0 0x5 0x4>,
+                                       <0x0 0x6 0x4>,
+                                       <0x0 0x7 0x4>;
+               };
+
                serial0: serial at 1c020000 {
                        status = "disabled";
                        device_type = "serial";
--

1.9.1

#24 lore raw

Re: [PATCH v6 0/3] mailbox: Add APM X-Gene platform mailbox driver

In reply to Duc Dang
Quoted 6 lines · Duc Dang

APM X-Gene SoC has a mailbox controller that provides communication mechanism for X-Gene Arm64 cores to communicate with X-Gene SoC's Cortex M3 (SLIMpro) processor.

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Hi Jassi,

Are you fine with this version of the patch?

Regards,
Duc Dang.

Quoted 51 lines

Changes since v5:
- Add more description into SlimPRO
mailbox data structure

Changes since v4:
- Rebase over v4.5-rc1
- Fix section mismatch warning during compiling
- Correctly print channel number when there is no IRQ for that channel
- Change node name to mailbox at 10540000
- Correct the number of IRQs in documentation

Changes since v3:
- Rebase over v4.4
- Remove 'id' in slimpro_mbox_chan structure
- Remove functions that are only called once and fold them into the other callers
- Remove void* pointer type cast
- Relax the number of mailbox IRQs condition
- Fix error and address comment in documentation (xgene-slimpro-mailbox.txt)

Changes since v2:
- Rebase Feng's patch set over v4.3-rc5
- Remove uneccessary 'inline' in function definition
- Use module_platform_driver instead of subsys_initcall
- Minor coding stype clean up

Changes since v1:
- Add ACPI support
- Use defines for reg offset

Duc Dang (3):
mailbox: Add support for APM X-Gene platform mailbox driver
Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts
documentation
arm64: dts: mailbox device tree node for APM X-Gene platform.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  35 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 +
 drivers/mailbox/Kconfig                            |   9 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 284 +++++++++++++++++++++
 5 files changed, 344 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c

--
1.9.1

#25 lore raw

PATCH v5 2/3 Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

In reply to Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

---
Changes since v4:
- Rebase over v4.5-rc1
- Fix number of total interrupts in
introduction text
- Change node name to mailbox at 10540000

Changes since v3:
- Rebase over v4.4
- Change number of mailbox IRQs to 8
- Fix white spaces, typos.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +35 -0
new file mode 100644
index 0000000..e46451b
@@ -0,0 +1,35 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 8 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm,xgene-slimpro-mbox".
+
+- reg:		Contains the mailbox register address range.
+
+- interrupts:	8 interrupts must be from 0 to 7, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		mailbox: mailbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =  	<0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>,
+		};
Signature · 1 line
1.9.1
#26 lore raw

PATCH v5 3/3 arm64: dts: mailbox device tree node for APM X-Gene platform.

In reply to Duc Dang

Mailbox device tree node for APM X-Gene platform.

---
Changes since v4:
- Rebase over v4.5-rc1
- Change node name to mailbox at 10540000

Changes since v3:
- Rebase over v4.4

 arch/arm64/boot/dts/apm/apm-storm.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
arch/arm64/boot/dts/apm/apm-storm.dtsi +14 -0
index fe30f76..d91338a 100644
@@ -691,6 +691,20 @@
 			msi-parent = <&msi>;
 		};
 
+		mailbox: mailbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =    <0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>;
+		};
+
 		serial0: serial at 1c020000 {
 			status = "disabled";
 			device_type = "serial";
Signature · 1 line
1.9.1
#27 lore raw

PATCH v4 2/3 Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

In reply to Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

---
Changes since v3:
- Rebase over v4.4
- Change number of mailbox IRQs to 8
- Fix white spaces, typos.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +35 -0
new file mode 100644
index 0000000..91774d7
@@ -0,0 +1,35 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm,xgene-slimpro-mbox".
+
+- reg:		Contains the mailbox register address range.
+
+- interrupts:	8 interrupts must be from 0 to 7, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		slimpro-mbox: slimpro-mbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =  	<0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>,
+		};
Signature · 1 line
1.9.1
maintainer Acked-by on v4 2/3
#28 lore raw

Re: [PATCH v4 2/3] Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

Quoted 34 lines · Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

---
Changes since v3:
- Rebase over v4.4
- Change number of mailbox IRQs to 8
- Fix white spaces, typos.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +13 -0
new file mode 100644
index 0000000..91774d7
@@ -0,0 +1,35 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm,xgene-slimpro-mbox".
+
+- reg:		Contains the mailbox register address range.
+

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 23

Quoted 10 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +10 -0
+- interrupts:	8 interrupts must be from 0 to 7, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		slimpro-mbox: slimpro-mbox at 10540000 {

Nit: just use mailbox@ or mbox@ (whatever others are using) for node name. Otherwise:

#29 lore raw

Re: [PATCH v4 2/3] Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

Quoted 49 lines · Rob Herring
Quoted 34 lines · Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

---
Changes since v3:
- Rebase over v4.4
- Change number of mailbox IRQs to 8
- Fix white spaces, typos.

 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +13 -0
new file mode 100644
index 0000000..91774d7
@@ -0,0 +1,35 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:        Should be as "apm,xgene-slimpro-mbox".
+
+- reg:               Contains the mailbox register address range.
+

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 23

Quoted 10 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +10 -0
+- interrupts:        8 interrupts must be from 0 to 7, interrupt 0 define the
+             the interrupt for mailbox channel 0 and interrupt 1 for
+             mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:       only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+             slimpro-mbox: slimpro-mbox at 10540000 {

Nit: just use mailbox@ or mbox@ (whatever others are using) for node name. Otherwise:

Quoted 1 line

Thanks, Rob.

I will change the node name to mailbox at 10540000 in the document and DT as well in the next version.

Regards,
Duc Dang.

#30 lore raw

PATCH v4 3/3 arm64: dts: mailbox device tree node for APM X-Gene platform.

In reply to Duc Dang

Mailbox device tree node for APM X-Gene platform.

---
Changes since v3:
- Rebase over v4.4

 arch/arm64/boot/dts/apm/apm-storm.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
arch/arm64/boot/dts/apm/apm-storm.dtsi +14 -0
index 6c5ed11..42f3fa0 100644
@@ -642,6 +642,20 @@
 			msi-parent = <&msi>;
 		};
 
+		mailbox: slimpro-mbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =    <0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>;
+		};
+
 		serial0: serial at 1c020000 {
 			status = "disabled";
 			device_type = "serial";
Signature · 1 line
1.9.1
#31 lore raw

PATCH v3 2/3 Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

In reply to Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

[dhdang: rebase over 4.3-rc5]
---
 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 34 ++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +34 -0
new file mode 100644
index 0000000..d02a3d8
@@ -0,0 +1,34 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm, xgene-slimpro-mbox".
+
+- reg:		Contain the mailbox register address range.
+
+- interrupts:	7 interrupts must start from 0 to 6, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		slimpro-mbox: slimpro-mbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =  	<0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+		};
Signature · 1 line
1.9.1
maintainer
#32 lore raw

Re: [PATCH v3 2/3] Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

Quoted 17 lines · Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

[dhdang: rebase over 4.3-rc5]
---
 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 34 ++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +0 -0
new file mode 100644
index 0000000..d02a3d8

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 10

Quoted 10 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +10 -0
@@ -0,0 +1,34 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm, xgene-slimpro-mbox".
                                          ^

remove the space

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 12

Quoted 2 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +2 -0
+
+- reg:		Contain the mailbox register address range.

s/Contain/Contains/

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 16

Quoted 4 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +4 -0
+
+- interrupts:	7 interrupts must start from 0 to 6, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.

s/start/be/

Quoted 25 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +18 -0
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		slimpro-mbox: slimpro-mbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =  	<0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+		};
Signature · 6 lines
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#33 lore raw

Re: [PATCH v3 2/3] Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

Quoted 29 lines · Rob Herring
Quoted 17 lines · Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

[dhdang: rebase over 4.3-rc5]
---
 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 34 ++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +0 -0
new file mode 100644
index 0000000..d02a3d8

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 10

Quoted 10 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +10 -0
@@ -0,0 +1,34 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:        Should be as "apm, xgene-slimpro-mbox".
                                          ^
Quoted 1 line

remove the space

I will fix in next version of the patch.

Quoted 5 lines

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 12

Quoted 3 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +2 -0
+
+- reg:               Contain the mailbox register address range.

s/Contain/Contains/

Will change.

Quoted 7 lines

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 16

Quoted 5 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +4 -0
+
+- interrupts:        7 interrupts must start from 0 to 6, interrupt 0 define the
+             the interrupt for mailbox channel 0 and interrupt 1 for
+             mailbox channel 1 and so likewise for the reminder.

s/start/be/

Will change.

Quoted 22 lines
Quoted 22 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +18 -1
+
+- #mbox-cells:       only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+             slimpro-mbox: slimpro-mbox at 10540000 {
+                     compatible = "apm,xgene-slimpro-mbox";
+                     reg = <0x0 0x10540000 0x0 0xa000>;
+                     #mbox-cells = <1>;
+                     interrupts =    <0x0 0x0 0x4>,
+                                     <0x0 0x1 0x4>,
+                                     <0x0 0x2 0x4>,
+                                     <0x0 0x3 0x4>,
+                                     <0x0 0x4 0x4>,
+                                     <0x0 0x5 0x4>,
+                                     <0x0 0x6 0x4>,
+             };
--

1.9.1

Quoted 4 lines
Quoted 4 lines

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

Regards,
Duc Dang.

#34 lore raw

Re: [PATCH v3 2/3] Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

In reply to Rob Herring
Quoted 35 lines · Rob Herring
Quoted 17 lines · Duc Dang

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

[dhdang: rebase over 4.3-rc5]
---
 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 34 ++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +0 -0
new file mode 100644
index 0000000..d02a3d8

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 10

Quoted 10 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +10 -0
@@ -0,0 +1,34 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:        Should be as "apm, xgene-slimpro-mbox".
                                          ^

remove the space

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 12

Quoted 2 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +2 -0
+
+- reg:               Contain the mailbox register address range.
Quoted 8 lines

s/Contain/Contains/

Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt line 16

Quoted 4 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +4 -0
+
+- interrupts:        7 interrupts must start from 0 to 6, interrupt 0 define the
+             the interrupt for mailbox channel 0 and interrupt 1 for
+             mailbox channel 1 and so likewise for the reminder.

s/start/be/

Thanks, Rob.

I will post an updated version shortly.

Regards,
Duc Dang.

Quoted 26 lines
Quoted 26 lines
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +18 -1
+
+- #mbox-cells:       only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+             slimpro-mbox: slimpro-mbox at 10540000 {
+                     compatible = "apm,xgene-slimpro-mbox";
+                     reg = <0x0 0x10540000 0x0 0xa000>;
+                     #mbox-cells = <1>;
+                     interrupts =    <0x0 0x0 0x4>,
+                                     <0x0 0x1 0x4>,
+                                     <0x0 0x2 0x4>,
+                                     <0x0 0x3 0x4>,
+                                     <0x0 0x4 0x4>,
+                                     <0x0 0x5 0x4>,
+                                     <0x0 0x6 0x4>,
+             };
--

1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

#35 lore raw

PATCH v3 3/3 arm64: dts: mailbox device tree node for APM X-Gene platform.

In reply to Duc Dang

Mailbox device tree node for APM X-Gene platform.

[dhdang: rebase over 4.3-rc5]
---
 arch/arm64/boot/dts/apm/apm-storm.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
arch/arm64/boot/dts/apm/apm-storm.dtsi +14 -0
index d831bc2..b36e555 100644
@@ -604,6 +604,20 @@
 			msi-parent = <&msi>;
 		};
 
+		mailbox: slimpro-mbox at 10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =    <0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>;
+		};
+
 		serial0: serial at 1c020000 {
 			status = "disabled";
 			device_type = "serial";
Signature · 1 line
1.9.1
#36 lore raw

Re: [PATCH v3 0/3] mailbox: Add APM X-Gene platform mailbox driver

In reply to Duc Dang
Quoted 17 lines · Duc Dang

APM X-Gene SoC has a mailbox controller that provides communication mechanism for X-Gene Arm64 cores to communicate with X-Gene SoC's Cortex M3 (SLIMpro) processor.

X-Gene mailbox controller provides 8 mailbox channels, with each channel has a dedicated interrupt line.

Changes since v2:
- Rebase Feng's patch set over v4.3-rc5
- Remove uneccessary 'inline' in function definition
- Use module_platform_driver instead of subsys_initcall
- Minor coding stype clean up

Changes since v1:
- Add ACPI support
- Use defines for reg offset

Quoted 9 lines
 .../bindings/mailbox/xgene-slimpro-mailbox.txt     |  34 +++
 arch/arm64/boot/dts/apm/apm-storm.dtsi             |  14 ++
 drivers/mailbox/Kconfig                            |   9 +
 drivers/mailbox/Makefile                           |   2 +
 drivers/mailbox/mailbox-xgene-slimpro.c            | 264 +++++++++++++++++++++
 5 files changed, 323 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
 create mode 100644 drivers/mailbox/mailbox-xgene-slimpro.c

Hi Jassi, Paul,

Do you have any comment on this patch set?

Quoted 3 lines

--
1.9.1

Regards,
Duc dang.

#37 lore raw

Re: [PATCH v3 0/3] mailbox: Add APM X-Gene platform mailbox driver

Hi Duc,

Quoted 3 lines · Duc Dang

Hi Jassi, Paul,

Do you have any comment on this patch set?

Are you perhaps confusing me with another Paul?

(I think I made a minor comment or two on this series about half a year ago. But I'm not the maintainer here and it's the maintainers verdict that you're probably interested in mostly. So it's not clear to me why you specifically ask for my comment.)

Thanks,

Paul Bolle

author
#38 lore raw

PATCH v2 2/4 mailbox: xgene: add ACPI support for X-Gene mailbox driver

In reply to Feng Kan

Add ACPI support for APM X-Gene mailbox driver.

---
 drivers/mailbox/mailbox-xgene-slimpro.c | 10 ++++++++++
 1 file changed, 10 insertions(+)
drivers/mailbox/mailbox-xgene-slimpro.c +10 -0
index 49370e5..890f95b 100644
@@ -18,6 +18,7 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  *
  */
+#include <linux/acpi.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
@@ -240,6 +241,14 @@ static const struct of_device_id slimpro_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, slimpro_of_match);
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id slimpro_acpi_ids[] = {
+	{"APMC0D01", 0},
+	{}
+};
+MODULE_DEVICE_TABLE(acpi, slimpro_acpi_ids);
+#endif
+
 static struct platform_driver slimpro_mbox_driver = {
 	.probe	= slimpro_mbox_probe,
 	.remove = slimpro_mbox_remove,
@@ -247,6 +256,7 @@ static struct platform_driver slimpro_mbox_driver = {
 		.name = "xgene-slimpro-mbox",
 		.owner = THIS_MODULE,
 		.of_match_table = of_match_ptr(slimpro_of_match),
+		.acpi_match_table = ACPI_PTR(slimpro_acpi_ids)
 	},
 };
 
Signature · 1 line
1.9.1
author
#39 lore raw

PATCH v2 3/4 Documentation: mailbox: Add APM X-Gene SLIMpro mailbox dts documentation

In reply to Feng Kan

This adds the APM X-Gene SLIMpro mailbox device tree node documentation.

---
 .../bindings/mailbox/xgene-slimpro-mailbox.txt     | 34 ++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt
Documentation/devicetree/bindings/mailbox/xgene-slimpro-mailbox.txt new file +34 -0
new file mode 100644
index 0000000..d02a3d8
@@ -0,0 +1,34 @@
+The APM X-Gene SLIMpro mailbox is used to communicate messages between
+the ARM64 processors and the Cortex M3 (dubbed SLIMpro). It uses a simple
+interrupt based door bell mechanism and can exchange simple messages using the
+internal registers.
+
+There are total of 7 interrupts in this mailbox. Each used for an individual
+door bell (or mailbox channel).
+
+Required properties:
+- compatible:	Should be as "apm, xgene-slimpro-mbox".
+
+- reg:		Contain the mailbox register address range.
+
+- interrupts:	7 interrupts must start from 0 to 6, interrupt 0 define the
+		the interrupt for mailbox channel 0 and interrupt 1 for
+		mailbox channel 1 and so likewise for the reminder.
+
+- #mbox-cells:	only one to specify the mailbox channel number.
+
+Example:
+
+Mailbox Node:
+		slimpro-mbox: slimpro-mbox@10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =  	<0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+		};
Signature · 1 line
1.9.1
author
#40 lore raw

PATCH v2 4/4 arm64: dts: mailbox device tree node for APM X-Gene platform.

In reply to Feng Kan

Mailbox device tree node for APM X-Gene platform.

---
 arch/arm64/boot/dts/apm/apm-storm.dtsi | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
arch/arm64/boot/dts/apm/apm-storm.dtsi +14 -0
index c8d3e0e..92e7b6b 100644
@@ -489,6 +489,20 @@
 			clocks = <&pcie4clk 0>;
 		};
 
+		mailbox: slimpro-mbox@10540000 {
+			compatible = "apm,xgene-slimpro-mbox";
+			reg = <0x0 0x10540000 0x0 0xa000>;
+			#mbox-cells = <1>;
+			interrupts =    <0x0 0x0 0x4>,
+					<0x0 0x1 0x4>,
+					<0x0 0x2 0x4>,
+					<0x0 0x3 0x4>,
+					<0x0 0x4 0x4>,
+					<0x0 0x5 0x4>,
+					<0x0 0x6 0x4>,
+					<0x0 0x7 0x4>;
+		};
+
 		serial0: serial@1c020000 {
 			status = "disabled";
 			device_type = "serial";
Signature · 6 lines
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html