* [PATCH 0/7] mailbox: Improve the mbox core then introduce the goog-mba driver
@ 2026-07-14 22:21 Douglas Anderson
2026-07-14 22:21 ` [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1 Douglas Anderson
2026-07-14 22:21 ` [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings Douglas Anderson
0 siblings, 2 replies; 7+ messages in thread
From: Douglas Anderson @ 2026-07-14 22:21 UTC (permalink / raw)
To: Jassi Brar
Cc: Joonwon Kang, Subhash Jadavani, Tudor Ambarus, Lucas Wei,
Brian Norris, Peter Griffin, André Draszik, Douglas Anderson,
Conor Dooley, Krzysztof Kozlowski, Rob Herring, devicetree,
linux-arm-kernel, linux-kernel, linux-samsung-soc
The goal of this series is to land support for the goog-mba (MailBox
Array) IP block that's present in Pixel 10 phones.
As can be seen in the device-tree bindings for the goog-mba IP block,
the mailbox IP block in Pixel 10 phones is fairly sophisticated.
Notably:
* It has hardware features that support queuing, meaning that more
than one mailbox message can be pending at a time.
* The "channels" in a given mailbox array aren't homogeneous. Each
"channel" in the mailbox array can have a different amount of memory
for messages. Really, the "channels" in a mailbox are considered to
be full single-channel mailboxes and a grouping of mailboxes is
considered a "mailbox array" (hence the IP block being named "mba")
In order to cleanly support some of the sophisticated goog-mba
features, improvements are made to the mailbox core. Specifically,
support for mailbox controllers that can queue is added and also
support for mailbox drivers that have more than one sub-node is added.
This is a fairly big rewrite from the downstream MBA driver shipping
on Pixel 10 phones, which awkwardly makes due without the improvements
to the mailbox core. It has been lightly tested both by porting it to
an experimental downstream tree based on 7.1 and also by running it
directly upstream against a stripped down Pixel 10 device tree.
Douglas Anderson (7):
dt-bindings: mailbox: Don't require #mbox-cells to be 1
mailbox: Allow #mbox-cells = <0> without specifying a custom xlate
mailbox: Find a matching mailbox by fwnode rather than device
mailbox: Simplify circular queue math with mod arithmetic
mailbox: Add support for mailbox controllers that can queue
dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings
mailbox: goog-mba: Introduce the goog-mba mailbox driver
.../bindings/mailbox/google,mba.yaml | 216 +++++++
.../devicetree/bindings/mailbox/mailbox.txt | 6 +-
MAINTAINERS | 8 +
drivers/mailbox/Kconfig | 8 +
drivers/mailbox/Makefile | 2 +
drivers/mailbox/goog-mba-priv.h | 108 ++++
drivers/mailbox/goog-mba-trace.h | 183 ++++++
drivers/mailbox/goog-mba.c | 567 ++++++++++++++++++
drivers/mailbox/mailbox.c | 84 ++-
include/linux/mailbox/goog-mba-message.h | 38 ++
include/linux/mailbox_controller.h | 15 +-
11 files changed, 1209 insertions(+), 26 deletions(-)
create mode 100644 Documentation/devicetree/bindings/mailbox/google,mba.yaml
create mode 100644 drivers/mailbox/goog-mba-priv.h
create mode 100644 drivers/mailbox/goog-mba-trace.h
create mode 100644 drivers/mailbox/goog-mba.c
create mode 100644 include/linux/mailbox/goog-mba-message.h
--
2.55.0.141.g00534a21ce-goog
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1
2026-07-14 22:21 [PATCH 0/7] mailbox: Improve the mbox core then introduce the goog-mba driver Douglas Anderson
@ 2026-07-14 22:21 ` Douglas Anderson
2026-07-14 22:32 ` sashiko-bot
2026-07-14 22:21 ` [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings Douglas Anderson
1 sibling, 1 reply; 7+ messages in thread
From: Douglas Anderson @ 2026-07-14 22:21 UTC (permalink / raw)
To: Jassi Brar
Cc: Joonwon Kang, Subhash Jadavani, Tudor Ambarus, Lucas Wei,
Brian Norris, Peter Griffin, André Draszik, Douglas Anderson,
Conor Dooley, Krzysztof Kozlowski, Rob Herring, devicetree,
linux-kernel
Existing mailboxes have #mbox-cells and this makes sense if a mailbox
only exposes one channel. Update the bindings to match.
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
I assume this is worth doing (?). As noted [1], mailbox bindings are
already in the core schema, so what's here just provides extra context
and descriptions.
[1] https://lore.kernel.org/all/20260322-mailbox-v1-1-c6251f18187c@gmail.com/
Documentation/devicetree/bindings/mailbox/mailbox.txt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Documentation/devicetree/bindings/mailbox/mailbox.txt b/Documentation/devicetree/bindings/mailbox/mailbox.txt
index af8ecee2ac68..f50727e9686f 100644
--- a/Documentation/devicetree/bindings/mailbox/mailbox.txt
+++ b/Documentation/devicetree/bindings/mailbox/mailbox.txt
@@ -6,8 +6,7 @@ assign appropriate mailbox channel to client drivers.
* Mailbox Controller
Required property:
-- #mbox-cells: Must be at least 1. Number of cells in a mailbox
- specifier.
+- #mbox-cells: Number of cells in a mailbox specifier.
Example:
mailbox: mailbox {
@@ -19,7 +18,8 @@ Example:
* Mailbox Client
Required property:
-- mboxes: List of phandle and mailbox channel specifiers.
+- mboxes: List of phandle and mailbox channel specifiers. If #mbox-cells is 0
+ then a mailbox only provides one channel and only a phandle is needed.
Optional property:
- mbox-names: List of identifier strings for each mailbox channel.
--
2.55.0.141.g00534a21ce-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings
2026-07-14 22:21 [PATCH 0/7] mailbox: Improve the mbox core then introduce the goog-mba driver Douglas Anderson
2026-07-14 22:21 ` [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1 Douglas Anderson
@ 2026-07-14 22:21 ` Douglas Anderson
2026-07-15 4:51 ` Krzysztof Kozlowski
1 sibling, 1 reply; 7+ messages in thread
From: Douglas Anderson @ 2026-07-14 22:21 UTC (permalink / raw)
To: Jassi Brar
Cc: Joonwon Kang, Subhash Jadavani, Tudor Ambarus, Lucas Wei,
Brian Norris, Peter Griffin, André Draszik, Douglas Anderson,
Conor Dooley, Krzysztof Kozlowski, Rob Herring, devicetree,
linux-arm-kernel, linux-kernel, linux-samsung-soc
Introduce bindings for the MailBox Array IP block present in Laguna
SoCs (AKA "lga", AKA "Google Tensor G5").
Signed-off-by: Douglas Anderson <dianders@chromium.org>
---
.../bindings/mailbox/google,mba.yaml | 216 ++++++++++++++++++
1 file changed, 216 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mailbox/google,mba.yaml
diff --git a/Documentation/devicetree/bindings/mailbox/google,mba.yaml b/Documentation/devicetree/bindings/mailbox/google,mba.yaml
new file mode 100644
index 000000000000..6c4505a369e2
--- /dev/null
+++ b/Documentation/devicetree/bindings/mailbox/google,mba.yaml
@@ -0,0 +1,216 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+# Copyright 2025 Google LLC
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mailbox/google,mba.yaml#
+$schema: http://devicetree.org/meta-schemas/base.yaml#
+
+title: Google MailBox Array
+
+maintainers:
+ - Douglas Anderson <dianders@chromium.org>
+
+description: |
+ The Google MailBox Array (MBA) is an IP block in Google-designed SoCs
+ starting in Laguna (AKA "lga", AKA Google Tensor G5). In a typical SoC
+ that includes this IP block, there are a number of instances of the MBA
+ controller with each instance having slightly different hardware
+ parameters and intended for communication with a different remote
+ processor.
+
+ An MBA instance has a "host" that is defined as the processor "providing"
+ a "service". This is typically not the main Application Processor (AP) but
+ is instead some specialized co-processor in the SoC like the Central Power
+ Manager (CPM). A processor (like the AP) talking to the "host" of the MBA
+ is a "client" of the MBA. A given MBA instance only ever has one host, but
+ it may have several clients. For instance, the CPM (an MBA "host") may need
+ to send/receive mailbox messages not just from the AP but from other
+ processors in the SoC and each of these other processors can be "clients"
+ of the same MBA.
+
+ The "host" of an MBA instance has full access to everything in the MBA
+ instance. It can access its own private set of "host" MBA registers, the
+ "global" MBA registers (if they exist), and all of the "client" MBA
+ registers.
+
+ A "client" of an MBA instance has access to the "global" MBA registers (if
+ they exist) and one or more sets of "client" MBA registers.
+
+ These bindings are focused on describing the MBA from the point of view of
+ a single client.
+
+ As per above, a client may have access to several sets of MBA "client"
+ registers. Each set of "client" registers represents a logical mailbox
+ "channel". However, because each channel may have different configuration
+ parameters and a mailbox "channel" in typical usage means one of a number
+ of identical channels, each channel in a Google MailBox Array is typically
+ referred to as a full "mailbox" and the whole collection of mailboxes as
+ the "mailbox array".
+
+ Mailboxes in an MBA instance have these features:
+ * 1 to 256 32-bit words of shared memory.
+ * The ability for the client to ring the main doorbell of the host and be
+ notified when the host Acks the doorbell.
+ * The ability for the host to ring the main doorbell of the client and be
+ notified when the client Acks the doorbell.
+
+ Some mailboxes may also have the ability to have counted doorbells. This
+ means that the receiver of the doorbell can tell how many times it rung.
+ This is intended for implementing "queued" mailboxes. See below.
+
+ The MBA hardware doesn't have any specific directionality. That is to
+ say, both the host and the client have full read and write access to
+ their shared memory. All mailbox instances have doorbells going both from
+ the client to the host as well as the host to the client.
+
+ The mailboxes can only be used for communication if the host and client
+ both agree on conventions. These conventions are described in the
+ device tree as they describe how the remote firmware is expecting to
+ communicate.
+
+ Current known in-use conventions:
+ 1. An RX mailbox with payloads that are of a well-defined size.
+ On mailboxes of this type, the host is the only one to write shared
+ memory. After placing a fixed-size message in shared memory, it rings
+ the main doorbell of the client. The client reads the message and Acks
+ the doorbell.
+ 2. A TX mailbox with payloads that could vary in size.
+ On mailboxes of this type, the mailbox client is the only one to write
+ shared memory. The client always writes a payload to the start of shared
+ memory and rings the main host doorbell. The client then looks for the
+ host to Ack the doorbell. The clients of the mailbox have ways to know
+ the size of any given message.
+ 3. A half-duplex TX/RX mailbox. This is a mailbox that can switch between
+ convention #1 and #2 above. Since both sides write data to the start of
+ shared memory, the two sides must have some convention to know whose
+ turn it is to send a message.
+ 4. A "queued" RX mailbox with a payload of a well-defined size.
+ This type of mailbox is only possible if the MBA instance can count
+ doorbells. On mailboxes of this type, the host is the only one to write
+ shared memory. When the client doorbell rings, the client reads a
+ fixed-size from the next "slot" in shared memory and then updates its
+ internal state. The shared memory is treated as a circular queue.
+ 5. A "queued" TX mailbox with a payload of a well-defined size.
+ This type of mailbox is only possible if the MBA instance can count
+ doorbells. On mailboxes of this type, the mailbox client is the only one
+ to write shared memory. The shared memory is treated as a circular queue.
+ The client writes a fixed-sized payload to the next "slot" in the shared
+ memory (where the slot size is determined by the client's first transfer),
+ updates its internal state, and rings the host doorbell. The client can
+ keep writing more messages as long as the circular queue isn't full. The
+ client gets an interrupt when the host Acks a doorbell and can tell how
+ many doorbells still haven't been Acked.
+
+ Conventions will be supported with a small number of properties specified
+ for each mailbox.
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - google,lga-mailbox-array
+ - const: google,mailbox-array
+
+ reg:
+ minItems: 1
+ items:
+ - description: Host registers (not accessible to client)
+ - description: Global registers (not present on newer IP blocks)
+
+ ranges: true
+
+ "#address-cells":
+ const: 1
+
+ "#size-cells":
+ const: 1
+
+patternProperties:
+ "^mailbox@[0-9a-f]+$":
+ type: object
+ description:
+ Each sub-node is a single-channel mailbox.
+
+ properties:
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ "#mbox-cells":
+ const: 0
+
+ google,rx-payload-words:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ maximum: 256
+ default: 0
+ description:
+ The number of 32-bit words in each mailbox message from the remote
+ processor. May be 0 for doorbell-only. If not specified this is
+ assumed to be 0.
+
+ google,mba-queue-mode:
+ type: boolean
+ description:
+ The remote processor is expecting the shared memory to be treated
+ as a circular queue and that there may be several outstanding
+ messages at once. Only usable on instances with counted doorbell
+ interrupts.
+
+ required:
+ - reg
+ - interrupts
+ - "#mbox-cells"
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - ranges
+ - reg
+ - "#address-cells"
+ - "#size-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
+
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ cpm_ap_ns_mba: mailbox-array@5240000 {
+ compatible = "google,lga-mailbox-array", "google,mailbox-array";
+ reg = <0x0 0x05240000 0x0 0x00010000>,
+ <0x0 0x05250000 0x0 0x00010000>;
+ ranges = <0x0 0x0 0x05260000 0x00020000>;
+
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ cpm_ap_ns_req_mba_client_0: mailbox@0 {
+ reg = <0x0000 0x1000>;
+ interrupts = <GIC_SPI 250 IRQ_TYPE_LEVEL_HIGH 0>;
+
+ #mbox-cells = <0>;
+
+ google,mba-queue-mode;
+ };
+
+ cpm_ap_ns_resp_mba_client_1: mailbox@1000 {
+ reg = <0x1000 0x1000>;
+ interrupts = <GIC_SPI 251 IRQ_TYPE_LEVEL_HIGH 0>;
+
+ #mbox-cells = <0>;
+
+ google,rx-payload-words = <4>;
+ google,mba-queue-mode;
+ };
+ };
+ };
+
+...
--
2.55.0.141.g00534a21ce-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1
2026-07-14 22:21 ` [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1 Douglas Anderson
@ 2026-07-14 22:32 ` sashiko-bot
0 siblings, 0 replies; 7+ messages in thread
From: sashiko-bot @ 2026-07-14 22:32 UTC (permalink / raw)
To: Douglas Anderson; +Cc: conor+dt, devicetree, robh
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] The commit message contains a typo and is missing the value '0' after '#mbox-cells', making the sentence incomplete and confusing.
--
--- Patch [1]: [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1 ---
commit 6ada1cfb4e312b11f6e334039168356fbbe9bd88
Author: Douglas Anderson <dianders@chromium.org>
dt-bindings: mailbox: Don't require #mbox-cells to be 1
This commit updates the mailbox bindings to clarify that #mbox-cells does
not need to be strictly 1, allowing 0 when a mailbox only provides one
channel.
Link: https://lore.kernel.org/all/20260322-mailbox-v1-1-c6251f18187c@gmail.com/
> Existing mailboxes have #mbox-cells and this makes sense if a mailbox
> only exposes one channel. Update the bindings to match.
[Severity: Low]
This isn't a bug, but is this sentence missing the value 0 after #mbox-cells?
It currently reads as though the intended value was omitted, which makes the
description slightly confusing.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260714222338.2965707-1-dianders@chromium.org?part=1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings
2026-07-14 22:21 ` [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings Douglas Anderson
@ 2026-07-15 4:51 ` Krzysztof Kozlowski
2026-07-15 16:49 ` Doug Anderson
0 siblings, 1 reply; 7+ messages in thread
From: Krzysztof Kozlowski @ 2026-07-15 4:51 UTC (permalink / raw)
To: Douglas Anderson, Jassi Brar
Cc: Joonwon Kang, Subhash Jadavani, Tudor Ambarus, Lucas Wei,
Brian Norris, Peter Griffin, André Draszik, Conor Dooley,
Krzysztof Kozlowski, Rob Herring, devicetree, linux-arm-kernel,
linux-kernel, linux-samsung-soc
On 15/07/2026 00:21, Douglas Anderson wrote:
> Introduce bindings for the MailBox Array IP block present in Laguna
> SoCs (AKA "lga", AKA "Google Tensor G5").
>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> ---
>
> .../bindings/mailbox/google,mba.yaml | 216 ++++++++++++++++++
Filename must match compatible.
> 1 file changed, 216 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/mailbox/google,mba.yaml
>
> diff --git a/Documentation/devicetree/bindings/mailbox/google,mba.yaml b/Documentation/devicetree/bindings/mailbox/google,mba.yaml
> new file mode 100644
> index 000000000000..6c4505a369e2
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mailbox/google,mba.yaml
> @@ -0,0 +1,216 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +# Copyright 2025 Google LLC
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mailbox/google,mba.yaml#
> +$schema: http://devicetree.org/meta-schemas/base.yaml#
> +
> +title: Google MailBox Array
> +
> +maintainers:
> + - Douglas Anderson <dianders@chromium.org>
> +
> +description: |
> + The Google MailBox Array (MBA) is an IP block in Google-designed SoCs
> + starting in Laguna (AKA "lga", AKA Google Tensor G5). In a typical SoC
> + that includes this IP block, there are a number of instances of the MBA
> + controller with each instance having slightly different hardware
> + parameters and intended for communication with a different remote
> + processor.
> +
> + An MBA instance has a "host" that is defined as the processor "providing"
> + a "service". This is typically not the main Application Processor (AP) but
> + is instead some specialized co-processor in the SoC like the Central Power
> + Manager (CPM). A processor (like the AP) talking to the "host" of the MBA
> + is a "client" of the MBA. A given MBA instance only ever has one host, but
> + it may have several clients. For instance, the CPM (an MBA "host") may need
> + to send/receive mailbox messages not just from the AP but from other
> + processors in the SoC and each of these other processors can be "clients"
> + of the same MBA.
> +
> + The "host" of an MBA instance has full access to everything in the MBA
> + instance. It can access its own private set of "host" MBA registers, the
> + "global" MBA registers (if they exist), and all of the "client" MBA
> + registers.
> +
> + A "client" of an MBA instance has access to the "global" MBA registers (if
> + they exist) and one or more sets of "client" MBA registers.
> +
> + These bindings are focused on describing the MBA from the point of view of
> + a single client.
> +
> + As per above, a client may have access to several sets of MBA "client"
> + registers. Each set of "client" registers represents a logical mailbox
> + "channel". However, because each channel may have different configuration
> + parameters and a mailbox "channel" in typical usage means one of a number
> + of identical channels, each channel in a Google MailBox Array is typically
> + referred to as a full "mailbox" and the whole collection of mailboxes as
> + the "mailbox array".
> +
> + Mailboxes in an MBA instance have these features:
> + * 1 to 256 32-bit words of shared memory.
> + * The ability for the client to ring the main doorbell of the host and be
> + notified when the host Acks the doorbell.
> + * The ability for the host to ring the main doorbell of the client and be
> + notified when the client Acks the doorbell.
> +
> + Some mailboxes may also have the ability to have counted doorbells. This
> + means that the receiver of the doorbell can tell how many times it rung.
> + This is intended for implementing "queued" mailboxes. See below.
> +
> + The MBA hardware doesn't have any specific directionality. That is to
> + say, both the host and the client have full read and write access to
> + their shared memory. All mailbox instances have doorbells going both from
> + the client to the host as well as the host to the client.
> +
> + The mailboxes can only be used for communication if the host and client
> + both agree on conventions. These conventions are described in the
> + device tree as they describe how the remote firmware is expecting to
> + communicate.
> +
> + Current known in-use conventions:
> + 1. An RX mailbox with payloads that are of a well-defined size.
> + On mailboxes of this type, the host is the only one to write shared
> + memory. After placing a fixed-size message in shared memory, it rings
> + the main doorbell of the client. The client reads the message and Acks
> + the doorbell.
> + 2. A TX mailbox with payloads that could vary in size.
> + On mailboxes of this type, the mailbox client is the only one to write
> + shared memory. The client always writes a payload to the start of shared
> + memory and rings the main host doorbell. The client then looks for the
> + host to Ack the doorbell. The clients of the mailbox have ways to know
> + the size of any given message.
> + 3. A half-duplex TX/RX mailbox. This is a mailbox that can switch between
> + convention #1 and #2 above. Since both sides write data to the start of
> + shared memory, the two sides must have some convention to know whose
> + turn it is to send a message.
> + 4. A "queued" RX mailbox with a payload of a well-defined size.
> + This type of mailbox is only possible if the MBA instance can count
> + doorbells. On mailboxes of this type, the host is the only one to write
> + shared memory. When the client doorbell rings, the client reads a
> + fixed-size from the next "slot" in shared memory and then updates its
> + internal state. The shared memory is treated as a circular queue.
> + 5. A "queued" TX mailbox with a payload of a well-defined size.
> + This type of mailbox is only possible if the MBA instance can count
> + doorbells. On mailboxes of this type, the mailbox client is the only one
> + to write shared memory. The shared memory is treated as a circular queue.
> + The client writes a fixed-sized payload to the next "slot" in the shared
> + memory (where the slot size is determined by the client's first transfer),
> + updates its internal state, and rings the host doorbell. The client can
> + keep writing more messages as long as the circular queue isn't full. The
> + client gets an interrupt when the host Acks a doorbell and can tell how
> + many doorbells still haven't been Acked.
> +
> + Conventions will be supported with a small number of properties specified
> + for each mailbox.
> +
> +properties:
> + compatible:
> + items:
> + - enum:
> + - google,lga-mailbox-array
> + - const: google,mailbox-array
Don't use generic fallback. Just the SoCs.
> +
> + reg:
> + minItems: 1
> + items:
> + - description: Host registers (not accessible to client)
> + - description: Global registers (not present on newer IP blocks)
You have only one SoC. One SoC has only one IP block, no?
> +
> + ranges: true
> +
> + "#address-cells":
> + const: 1
> +
> + "#size-cells":
> + const: 1
> +
> +patternProperties:
> + "^mailbox@[0-9a-f]+$":
> + type: object
> + description:
> + Each sub-node is a single-channel mailbox.
This does not look like correct representation. You have one mailbox
controller with multiple mailboxes, not multiple mailbox controllers of
single channel boxes.
> +
> + properties:
> + reg:
> + maxItems: 1
> +
> + interrupts:
> + maxItems: 1
> +
> + "#mbox-cells":
> + const: 0
> +
> + google,rx-payload-words:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + maximum: 256
> + default: 0
> + description:
> + The number of 32-bit words in each mailbox message from the remote
> + processor. May be 0 for doorbell-only. If not specified this is
> + assumed to be 0.
> +
> + google,mba-queue-mode:
> + type: boolean
> + description:
> + The remote processor is expecting the shared memory to be treated
> + as a circular queue and that there may be several outstanding
> + messages at once. Only usable on instances with counted doorbell
> + interrupts.
> +
> + required:
> + - reg
> + - interrupts
> + - "#mbox-cells"
> +
> + additionalProperties: false
> +
> +required:
> + - compatible
> + - ranges
> + - reg
> + - "#address-cells"
> + - "#size-cells"
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> + #include <dt-bindings/interrupt-controller/irq.h>
> +
> + soc {
> + #address-cells = <2>;
> + #size-cells = <2>;
> +
> + cpm_ap_ns_mba: mailbox-array@5240000 {
Drop all unused labels.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings
2026-07-15 4:51 ` Krzysztof Kozlowski
@ 2026-07-15 16:49 ` Doug Anderson
2026-07-16 5:46 ` Krzysztof Kozlowski
0 siblings, 1 reply; 7+ messages in thread
From: Doug Anderson @ 2026-07-15 16:49 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Jassi Brar, Joonwon Kang, Subhash Jadavani, Tudor Ambarus,
Lucas Wei, Brian Norris, Peter Griffin, André Draszik,
Conor Dooley, Krzysztof Kozlowski, Rob Herring, devicetree,
linux-arm-kernel, linux-kernel, linux-samsung-soc
Hi,
On Tue, Jul 14, 2026 at 9:51 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On 15/07/2026 00:21, Douglas Anderson wrote:
> > Introduce bindings for the MailBox Array IP block present in Laguna
> > SoCs (AKA "lga", AKA "Google Tensor G5").
> >
> > Signed-off-by: Douglas Anderson <dianders@chromium.org>
> > ---
> >
> > .../bindings/mailbox/google,mba.yaml | 216 ++++++++++++++++++
>
> Filename must match compatible.
Whoops! Will fix in v2.
> > +properties:
> > + compatible:
> > + items:
> > + - enum:
> > + - google,lga-mailbox-array
> > + - const: google,mailbox-array
>
> Don't use generic fallback. Just the SoCs.
Sure, if you insist.
In general the "mba" hardware is designed with enough identification
registers that we should be able to autodetect which variant we're on.
Thus, my hope is to not ever need to reference the SoC-specific
variant in the driver itself. It's not the end of the world to use the
"google,lga-mailbox-array" as the generic, I guess...
I don't suppose I can change your mind here? If we take
"google,lga-mailbox-array" as the generic, then going foward a few
generations we end up with:
properties:
compatible:
oneOf:
- const: google,lga-mailbox-array
- items:
- enum:
- google,next-mailbox-array
- google,nextnext-mailbox-array
- google,another-mailbox-array
- const: google,lga-mailbox-array
If we keep "google,mailbox-array" as the generic, then going forward a
few generations we end up with this, which seems nicer / less
confusing:
properties:
compatible:
items:
- enum:
- google,lga-mailbox-array
- google,next-mailbox-array
- google,nextnext-mailbox-array
- google,another-mailbox-array
- const: google,mailbox-array
Sure, it means that if someone unexpectedly makes a new Google
mailbox-array that's totally incompatible then the
"google,mailbox-array" sounds too generic, but that doesn't feel like
the end of the world. You could call the new mailbox array designed in
the year 2037 the "google,2037-mailbox-array" and things would overall
be less confusing than using the "google,lga-mailbox-array" as the
generic.
> > + reg:
> > + minItems: 1
> > + items:
> > + - description: Host registers (not accessible to client)
> > + - description: Global registers (not present on newer IP blocks)
>
> You have only one SoC. One SoC has only one IP block, no?
Nope! There are several instances of the MBA IP block per SoC. I tried
to explain the situation exhaustively, but there's always the tradeoff
between explaining thoroughly and providing too much text.
To answer this specific question concretely, there is one MBA per
remote processor. Looking at the downstream DTS, I see at least these
MBA instances:
* AOC (Always On Compute)
* GSA (Google Security Anchor)
* GDMC (Google Debug Monitor Core)
* CPM (Central Power Manager)
Each of these 4 MBA instances has its own "global" registers.
To provide more context, each MBA instance can support communication
beyond just the AP (Apps Processor). For instance, the AOC's MBA
instance could be used to talk between the AOC and AP and also between
the AOC and CPM. Let's take this as an example. In this case:
* The AOC is the "host" of this MBA.
* The AP is a "client" of this MBA.
* The CPM is another "client" of this MBA.
The AOC is the only one with access to the "host" registers.
Everyone (AOC, AP, CPM in this case) has access to the read-only
"global" registers describing the MBA instance.
The clients have access to several banks of client registers, one per
mailbox they can access. The host (AOC in this case) also has access
to the client register spaces since that's where the shared message
memory is located.
The overall MBA instance is best identified by the address of the host
registers, even if the client (the AP in this case) can't access those
registers.
On newer versions of the IP block the "global" register bank was
removed and the read-only registers that were part of it were simply
copied to each client instance.
Does that clarify?
> > +
> > + ranges: true
> > +
> > + "#address-cells":
> > + const: 1
> > +
> > + "#size-cells":
> > + const: 1
> > +
> > +patternProperties:
> > + "^mailbox@[0-9a-f]+$":
> > + type: object
> > + description:
> > + Each sub-node is a single-channel mailbox.
>
> This does not look like correct representation. You have one mailbox
> controller with multiple mailboxes, not multiple mailbox controllers of
> single channel boxes.
I spent quite a bit of time debating this when rewriting the driver.
While we could certainly hack things into the existing "mailbox with a
bunch of channels", IMO it would be a worse representation of the
hardware.
I discussed this in the wall of text in this patch series, but
re-hashing it here:
Each "mailbox" in the mailbox array is more like a full-fledged
mailbox than a channel within a mailbox. Each (single-channel)
mailbox:
* Has its own client register space.
* Has its own interrupt.
* Can have a different amount of memory for messages.
* Can have its own conventions for communication.
If we tried to represent the mailbox array as a single mailbox with a
bunch of channels, each instance would have a different number of
"reg" entries and a different number of interrupts. We would also need
an array describing the communication conventions for each channel.
Can it be done? Yes. Is it ugly? Also, yes.
Further evidence that the hardware design intended "a bunch of
mailboxes" rather than "a mailbox with channels" is that the IP block
is called a "mailbox array". ;-)
> > +examples:
> > + - |
> > + #include <dt-bindings/interrupt-controller/arm-gic.h>
> > + #include <dt-bindings/interrupt-controller/irq.h>
> > +
> > + soc {
> > + #address-cells = <2>;
> > + #size-cells = <2>;
> > +
> > + cpm_ap_ns_mba: mailbox-array@5240000 {
>
> Drop all unused labels.
Sounds good.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings
2026-07-15 16:49 ` Doug Anderson
@ 2026-07-16 5:46 ` Krzysztof Kozlowski
0 siblings, 0 replies; 7+ messages in thread
From: Krzysztof Kozlowski @ 2026-07-16 5:46 UTC (permalink / raw)
To: Doug Anderson
Cc: Jassi Brar, Joonwon Kang, Subhash Jadavani, Tudor Ambarus,
Lucas Wei, Brian Norris, Peter Griffin, André Draszik,
Conor Dooley, Krzysztof Kozlowski, Rob Herring, devicetree,
linux-arm-kernel, linux-kernel, linux-samsung-soc
On 15/07/2026 18:49, Doug Anderson wrote:
> Hi,
>
> On Tue, Jul 14, 2026 at 9:51 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>>
>> On 15/07/2026 00:21, Douglas Anderson wrote:
>>> Introduce bindings for the MailBox Array IP block present in Laguna
>>> SoCs (AKA "lga", AKA "Google Tensor G5").
>>>
>>> Signed-off-by: Douglas Anderson <dianders@chromium.org>
>>> ---
>>>
>>> .../bindings/mailbox/google,mba.yaml | 216 ++++++++++++++++++
>>
>> Filename must match compatible.
>
> Whoops! Will fix in v2.
>
>
>>> +properties:
>>> + compatible:
>>> + items:
>>> + - enum:
>>> + - google,lga-mailbox-array
>>> + - const: google,mailbox-array
>>
>> Don't use generic fallback. Just the SoCs.
>
> Sure, if you insist.
>
> In general the "mba" hardware is designed with enough identification
> registers that we should be able to autodetect which variant we're on.
> Thus, my hope is to not ever need to reference the SoC-specific
> variant in the driver itself. It's not the end of the world to use the
> "google,lga-mailbox-array" as the generic, I guess...
>
> I don't suppose I can change your mind here? If we take
> "google,lga-mailbox-array" as the generic, then going foward a few
> generations we end up with:
>
> properties:
> compatible:
> oneOf:
> - const: google,lga-mailbox-array
> - items:
> - enum:
> - google,next-mailbox-array
> - google,nextnext-mailbox-array
> - google,another-mailbox-array
> - const: google,lga-mailbox-array
This is the expected appriach.
>
> If we keep "google,mailbox-array" as the generic, then going forward a
> few generations we end up with this, which seems nicer / less
> confusing:
>
> properties:
> compatible:
> items:
> - enum:
> - google,lga-mailbox-array
> - google,next-mailbox-array
> - google,nextnext-mailbox-array
> - google,another-mailbox-array
> - const: google,mailbox-array
It is the discouraged approach. I already have a few real examples for
Qualcomm when people added such generic mailbox and after some time it
turned out not generic. So people wanted to add an another generic one...
>
> Sure, it means that if someone unexpectedly makes a new Google
> mailbox-array that's totally incompatible then the
> "google,mailbox-array" sounds too generic, but that doesn't feel like
> the end of the world. You could call the new mailbox array designed in
And there is simple solution, just use SoC compatibles. Everything is
elegant, simple and accurate.
> the year 2037 the "google,2037-mailbox-array" and things would overall
> be less confusing than using the "google,lga-mailbox-array" as the
> generic.
>
>
>>> + reg:
>>> + minItems: 1
>>> + items:
>>> + - description: Host registers (not accessible to client)
>>> + - description: Global registers (not present on newer IP blocks)
>>
>> You have only one SoC. One SoC has only one IP block, no?
>
> Nope! There are several instances of the MBA IP block per SoC. I tried
> to explain the situation exhaustively, but there's always the tradeoff
> between explaining thoroughly and providing too much text.
That's ok, the "newer" is confusing.
>
> To answer this specific question concretely, there is one MBA per
> remote processor. Looking at the downstream DTS, I see at least these
> MBA instances:
> * AOC (Always On Compute)
> * GSA (Google Security Anchor)
> * GDMC (Google Debug Monitor Core)
> * CPM (Central Power Manager)
>
> Each of these 4 MBA instances has its own "global" registers.
>
> To provide more context, each MBA instance can support communication
> beyond just the AP (Apps Processor). For instance, the AOC's MBA
> instance could be used to talk between the AOC and AP and also between
> the AOC and CPM. Let's take this as an example. In this case:
>
> * The AOC is the "host" of this MBA.
> * The AP is a "client" of this MBA.
> * The CPM is another "client" of this MBA.
>
> The AOC is the only one with access to the "host" registers.
>
> Everyone (AOC, AP, CPM in this case) has access to the read-only
> "global" registers describing the MBA instance.
>
> The clients have access to several banks of client registers, one per
> mailbox they can access. The host (AOC in this case) also has access
> to the client register spaces since that's where the shared message
> memory is located.
>
> The overall MBA instance is best identified by the address of the host
> registers, even if the client (the AP in this case) can't access those
> registers.
>
> On newer versions of the IP block the "global" register bank was
> removed and the read-only registers that were part of it were simply
> copied to each client instance.
>
> Does that clarify?
Yeah, just s/on newer/on all/ ?
>
>
>>> +
>>> + ranges: true
>>> +
>>> + "#address-cells":
>>> + const: 1
>>> +
>>> + "#size-cells":
>>> + const: 1
>>> +
>>> +patternProperties:
>>> + "^mailbox@[0-9a-f]+$":
>>> + type: object
>>> + description:
>>> + Each sub-node is a single-channel mailbox.
>>
>> This does not look like correct representation. You have one mailbox
>> controller with multiple mailboxes, not multiple mailbox controllers of
>> single channel boxes.
>
> I spent quite a bit of time debating this when rewriting the driver.
> While we could certainly hack things into the existing "mailbox with a
> bunch of channels", IMO it would be a worse representation of the
> hardware.
>
> I discussed this in the wall of text in this patch series, but
> re-hashing it here:
>
> Each "mailbox" in the mailbox array is more like a full-fledged
> mailbox than a channel within a mailbox. Each (single-channel)
> mailbox:
> * Has its own client register space.
That's nothing special yet. Many providers of multiple resources have
these resources in dedicated registers. Arguing this, each GPIO in a
GPIO controller as well has its own register space so is basically a
GPIO controller on its own.
> * Has its own interrupt.
Just like GPIOs...
> * Can have a different amount of memory for messages.
> * Can have its own conventions for communication.
Well, this could be. But you still have one child per channel (cells=0)
and all children address space is in parent's space, so that's clear
indication. It's one controller with multiple, although some different,
channels.
>
> If we tried to represent the mailbox array as a single mailbox with a
> bunch of channels, each instance would have a different number of
> "reg" entries and a different number of interrupts. We would also need
No, you would have only one device node. Very clean solution instead of
100 children for each individual mailbox.
It's the same with clocks (TI) - you do not get device node per clock,
even if TI did it 10 years ago. You do not get here device node per channel.
> an array describing the communication conventions for each channel.
> Can it be done? Yes. Is it ugly? Also, yes.
>
> Further evidence that the hardware design intended "a bunch of
> mailboxes" rather than "a mailbox with channels" is that the IP block
> is called a "mailbox array". ;-)
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-07-16 5:47 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-14 22:21 [PATCH 0/7] mailbox: Improve the mbox core then introduce the goog-mba driver Douglas Anderson
2026-07-14 22:21 ` [PATCH 1/7] dt-bindings: mailbox: Don't require #mbox-cells to be 1 Douglas Anderson
2026-07-14 22:32 ` sashiko-bot
2026-07-14 22:21 ` [PATCH 6/7] dt-bindings: mailbox: goog-mba: Add goog-mba mailbox bindings Douglas Anderson
2026-07-15 4:51 ` Krzysztof Kozlowski
2026-07-15 16:49 ` Doug Anderson
2026-07-16 5:46 ` Krzysztof Kozlowski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox