- arm: added mhu-v2 controller driver
mhu_db fix kfree by using devm_ variant - stm32-ipcc: misc cleanup -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE6EwehDt/SOnwFyTyf9lkf8eYP5UFAl/avkwACgkQf9lkf8eY P5USjg//f8MnFaIl5rR46AN7O8Z21doqu/6v1FN22I6l27ygn7yBZP9T8vg2LCbP j0e2iH6DivQimI+lxfHfV5Xqb8VFljLmbElx82OwA3ZpMHzAP2Uml9EinYqb3xdX E3ZXWFo4EJRev4xJJoNhDqw4NFflPII0iRNES0J/fMpRBARz2pExCJbpebDqX2Gr SyP2odQ8PpBErwY+ASjt7XFGL41LxeFCcCY95hO6rTZ/OUCRaZ/967YidQgEC1hm pypgpK8rITfueRHTOm4jroNEnGa2HcJ4zcN/0p7P8ZVy8gDLDGy/mDJm43/Q74/O 1+3VTzP8RFsIdkhmuSX5jHyhRc0z7eo3a08cv4ugTT33wFEv6mcqdiMbQfM/JC/p 3hJxhyaz3jgpR33lNuBEFkzCeVSSaKKbTRcNic08Wn4gPh32ALc7AbXzBMnri5FN AkNU2r7cE+nDw/S4B/InFuiUwpwozByAhVj7RpOFJ+jmLb5shaBZmKntSjit3uIN mYynz5vLv7UauY3NLb0+Gap7XVG6MRVz7eSMYSPM02sa9ZhMOqRjqisKAFBvWhzr mNhk8M0KcpWJF1rdLvG4RmPfY31+OcfWJRMqWnj+Kti4IGXVC2dCVYow2MpneCW6 5GrXn0XoezLciH/A+Ah41N1TbMyVCLvlSeNl7GFrezOQHga0zW4= =DF7i -----END PGP SIGNATURE----- Merge tag 'mailbox-v5.11' of git://git.linaro.org/landing-teams/working/fujitsu/integration Pull mailbox updates from Jassi Brar: - arm: added mhu-v2 controller driver - arm_mhu_db: fix kfree by using devm_ variant - stm32-ipcc: misc cleanup * tag 'mailbox-v5.11' of git://git.linaro.org/landing-teams/working/fujitsu/integration: mailbox: arm_mhuv2: Add driver dt-bindings: mailbox : arm,mhuv2: Add bindings mailbox: stm32-ipcc: cast void pointers to unsigned long mailbox: stm32-ipcc: remove duplicate error message mailbox: stm32-ipcc: add COMPILE_TEST dependency mailbox: arm_mhu_db: Fix mhu_db_shutdown by replacing kfree with devm_kfree
This commit is contained in:
Коммит
83005cd6bc
|
@ -0,0 +1,209 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/mailbox/arm,mhuv2.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: ARM MHUv2 Mailbox Controller
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Tushar Khandelwal <tushar.khandelwal@arm.com>
|
||||||
|
- Viresh Kumar <viresh.kumar@linaro.org>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
The Arm Message Handling Unit (MHU) Version 2 is a mailbox controller that has
|
||||||
|
between 1 and 124 channel windows (each 32-bit wide) to provide unidirectional
|
||||||
|
communication with remote processor(s), where the number of channel windows
|
||||||
|
are implementation dependent.
|
||||||
|
|
||||||
|
Given the unidirectional nature of the controller, an MHUv2 mailbox may only
|
||||||
|
be written to or read from. If a pair of MHU controllers is implemented
|
||||||
|
between two processing elements to provide bidirectional communication, these
|
||||||
|
must be specified as two separate mailboxes.
|
||||||
|
|
||||||
|
If the interrupts property is present in device tree node, then its treated as
|
||||||
|
a "receiver" mailbox, otherwise a "sender".
|
||||||
|
|
||||||
|
An MHU controller must be specified along with the supported transport
|
||||||
|
protocols. The transport protocols determine the method of data transmission
|
||||||
|
as well as the number of provided mailbox channels.
|
||||||
|
|
||||||
|
Following are the possible transport protocols.
|
||||||
|
|
||||||
|
- Data-transfer: Each transfer is made of one or more words, using one or more
|
||||||
|
channel windows.
|
||||||
|
|
||||||
|
- Doorbell: Each transfer is made up of single bit flag, using any one of the
|
||||||
|
bits in a channel window. A channel window can support up to 32 doorbells
|
||||||
|
and the entire window shall be used in doorbell protocol. Optionally, data
|
||||||
|
may be transmitted through a shared memory region, wherein the MHU is used
|
||||||
|
strictly as an interrupt generation mechanism but that is out of the scope
|
||||||
|
of these bindings.
|
||||||
|
|
||||||
|
# We need a select here so we don't match all nodes with 'arm,primecell'
|
||||||
|
select:
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
enum:
|
||||||
|
- arm,mhuv2-tx
|
||||||
|
- arm,mhuv2-rx
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
oneOf:
|
||||||
|
- description: Sender mode
|
||||||
|
items:
|
||||||
|
- const: arm,mhuv2-tx
|
||||||
|
- const: arm,primecell
|
||||||
|
|
||||||
|
- description: Receiver-mode
|
||||||
|
items:
|
||||||
|
- const: arm,mhuv2-rx
|
||||||
|
- const: arm,primecell
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
description: |
|
||||||
|
The MHUv2 controller always implements an interrupt in the "receiver"
|
||||||
|
mode, while the interrupt in the "sender" mode was not available in the
|
||||||
|
version MHUv2.0, but the later versions do have it.
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clock-names:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
arm,mhuv2-protocols:
|
||||||
|
$ref: /schemas/types.yaml#/definitions/uint32-matrix
|
||||||
|
description: |
|
||||||
|
The MHUv2 controller may contain up to 124 channel windows (each 32-bit
|
||||||
|
wide). The hardware and the DT bindings allows any combination of those to
|
||||||
|
be used for various transport protocols.
|
||||||
|
|
||||||
|
This property allows a platform to describe how these channel windows are
|
||||||
|
used in various transport protocols. The entries in this property shall be
|
||||||
|
present as an array of tuples, where each tuple describes details about
|
||||||
|
one of the transport protocol being implemented over some channel
|
||||||
|
window(s).
|
||||||
|
|
||||||
|
The first field of a tuple signifies the transfer protocol, 0 is reserved
|
||||||
|
for doorbell protocol, and 1 is reserved for data-transfer protocol.
|
||||||
|
Using any other value in the first field of a tuple makes it invalid.
|
||||||
|
|
||||||
|
The second field of a tuple signifies the number of channel windows where
|
||||||
|
the protocol would be used and should be set to a non zero value. For
|
||||||
|
doorbell protocol this field signifies the number of 32-bit channel
|
||||||
|
windows that implement the doorbell protocol. For data-transfer protocol,
|
||||||
|
this field signifies the number of 32-bit channel windows that implement
|
||||||
|
the data-transfer protocol.
|
||||||
|
|
||||||
|
The total number of channel windows specified here shouldn't be more than
|
||||||
|
the ones implemented by the platform, though one can specify lesser number
|
||||||
|
of windows here than what the platform implements.
|
||||||
|
|
||||||
|
mhu: mailbox@2b1f0000 {
|
||||||
|
...
|
||||||
|
|
||||||
|
arm,mhuv2-protocols = <0 2>, <1 1>, <1 5>, <1 7>;
|
||||||
|
}
|
||||||
|
|
||||||
|
The above example defines the protocols of an ARM MHUv2 mailbox
|
||||||
|
controller, where a total of 15 channel windows are used. The first two
|
||||||
|
windows are used in doorbell protocol (64 doorbells), followed by 1, 5 and
|
||||||
|
7 windows (separately) used in data-transfer protocol.
|
||||||
|
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 124
|
||||||
|
items:
|
||||||
|
items:
|
||||||
|
- enum: [ 0, 1 ]
|
||||||
|
- minimum: 0
|
||||||
|
maximum: 124
|
||||||
|
|
||||||
|
|
||||||
|
'#mbox-cells':
|
||||||
|
description: |
|
||||||
|
It is always set to 2. The first argument in the consumers 'mboxes'
|
||||||
|
property represents the channel window group, which may be used in
|
||||||
|
doorbell, or data-transfer protocol, and the second argument (only
|
||||||
|
relevant in doorbell protocol, should be 0 otherwise) represents the
|
||||||
|
doorbell number within the 32 bit wide channel window.
|
||||||
|
|
||||||
|
From the example given above for arm,mhuv2-protocols, here is how a client
|
||||||
|
node can reference them.
|
||||||
|
|
||||||
|
mboxes = <&mhu 0 5>; // Channel Window Group 0, doorbell 5.
|
||||||
|
mboxes = <&mhu 1 7>; // Channel Window Group 1, doorbell 7.
|
||||||
|
mboxes = <&mhu 2 0>; // Channel Window Group 2, data transfer protocol with 1 window.
|
||||||
|
mboxes = <&mhu 3 0>; // Channel Window Group 3, data transfer protocol with 5 windows.
|
||||||
|
mboxes = <&mhu 4 0>; // Channel Window Group 4, data transfer protocol with 7 windows.
|
||||||
|
|
||||||
|
const: 2
|
||||||
|
|
||||||
|
if:
|
||||||
|
# Interrupt is compulsory for receiver
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
contains:
|
||||||
|
const: arm,mhuv2-rx
|
||||||
|
then:
|
||||||
|
required:
|
||||||
|
- interrupts
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- '#mbox-cells'
|
||||||
|
- arm,mhuv2-protocols
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
# Multiple transport protocols implemented by the mailbox controllers
|
||||||
|
- |
|
||||||
|
soc {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
|
||||||
|
mhu_tx: mailbox@2b1f0000 {
|
||||||
|
#mbox-cells = <2>;
|
||||||
|
compatible = "arm,mhuv2-tx", "arm,primecell";
|
||||||
|
reg = <0 0x2b1f0000 0 0x1000>;
|
||||||
|
clocks = <&clock 0>;
|
||||||
|
clock-names = "apb_pclk";
|
||||||
|
interrupts = <0 45 4>;
|
||||||
|
arm,mhuv2-protocols = <1 5>, <1 2>, <1 5>, <1 7>, <0 2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
mhu_rx: mailbox@2b1f1000 {
|
||||||
|
#mbox-cells = <2>;
|
||||||
|
compatible = "arm,mhuv2-rx", "arm,primecell";
|
||||||
|
reg = <0 0x2b1f1000 0 0x1000>;
|
||||||
|
clocks = <&clock 0>;
|
||||||
|
clock-names = "apb_pclk";
|
||||||
|
interrupts = <0 46 4>;
|
||||||
|
arm,mhuv2-protocols = <1 1>, <1 7>, <0 2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
mhu_client: scb@2e000000 {
|
||||||
|
compatible = "fujitsu,mb86s70-scb-1.0";
|
||||||
|
reg = <0 0x2e000000 0 0x4000>;
|
||||||
|
|
||||||
|
mboxes =
|
||||||
|
//data-transfer protocol with 5 windows, mhu-tx
|
||||||
|
<&mhu_tx 2 0>,
|
||||||
|
//data-transfer protocol with 7 windows, mhu-tx
|
||||||
|
<&mhu_tx 3 0>,
|
||||||
|
//doorbell protocol channel 4, doorbell 27, mhu-tx
|
||||||
|
<&mhu_tx 4 27>,
|
||||||
|
//data-transfer protocol with 1 window, mhu-rx
|
||||||
|
<&mhu_rx 0 0>;
|
||||||
|
};
|
||||||
|
};
|
|
@ -10524,6 +10524,15 @@ F: drivers/mailbox/
|
||||||
F: include/linux/mailbox_client.h
|
F: include/linux/mailbox_client.h
|
||||||
F: include/linux/mailbox_controller.h
|
F: include/linux/mailbox_controller.h
|
||||||
|
|
||||||
|
MAILBOX ARM MHUv2
|
||||||
|
M: Viresh Kumar <viresh.kumar@linaro.org>
|
||||||
|
M: Tushar Khandelwal <Tushar.Khandelwal@arm.com>
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/mailbox/arm_mhuv2.c
|
||||||
|
F: include/linux/mailbox/arm_mhuv2_message.h
|
||||||
|
F: Documentation/devicetree/bindings/mailbox/arm,mhuv2.yaml
|
||||||
|
|
||||||
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
||||||
M: Michael Kerrisk <mtk.manpages@gmail.com>
|
M: Michael Kerrisk <mtk.manpages@gmail.com>
|
||||||
L: linux-man@vger.kernel.org
|
L: linux-man@vger.kernel.org
|
||||||
|
|
|
@ -16,6 +16,13 @@ config ARM_MHU
|
||||||
The controller has 3 mailbox channels, the last of which can be
|
The controller has 3 mailbox channels, the last of which can be
|
||||||
used in Secure mode only.
|
used in Secure mode only.
|
||||||
|
|
||||||
|
config ARM_MHU_V2
|
||||||
|
tristate "ARM MHUv2 Mailbox"
|
||||||
|
depends on ARM_AMBA
|
||||||
|
help
|
||||||
|
Say Y here if you want to build the ARM MHUv2 controller driver,
|
||||||
|
which provides unidirectional mailboxes between processing elements.
|
||||||
|
|
||||||
config IMX_MBOX
|
config IMX_MBOX
|
||||||
tristate "i.MX Mailbox"
|
tristate "i.MX Mailbox"
|
||||||
depends on ARCH_MXC || COMPILE_TEST
|
depends on ARCH_MXC || COMPILE_TEST
|
||||||
|
@ -201,7 +208,7 @@ config BCM_FLEXRM_MBOX
|
||||||
|
|
||||||
config STM32_IPCC
|
config STM32_IPCC
|
||||||
tristate "STM32 IPCC Mailbox"
|
tristate "STM32 IPCC Mailbox"
|
||||||
depends on MACH_STM32MP157
|
depends on MACH_STM32MP157 || COMPILE_TEST
|
||||||
help
|
help
|
||||||
Mailbox implementation for STMicroelectonics STM32 family chips
|
Mailbox implementation for STMicroelectonics STM32 family chips
|
||||||
with hardware for Inter-Processor Communication Controller (IPCC)
|
with hardware for Inter-Processor Communication Controller (IPCC)
|
||||||
|
|
|
@ -7,6 +7,8 @@ obj-$(CONFIG_MAILBOX_TEST) += mailbox-test.o
|
||||||
|
|
||||||
obj-$(CONFIG_ARM_MHU) += arm_mhu.o arm_mhu_db.o
|
obj-$(CONFIG_ARM_MHU) += arm_mhu.o arm_mhu_db.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_ARM_MHU_V2) += arm_mhuv2.o
|
||||||
|
|
||||||
obj-$(CONFIG_IMX_MBOX) += imx-mailbox.o
|
obj-$(CONFIG_IMX_MBOX) += imx-mailbox.o
|
||||||
|
|
||||||
obj-$(CONFIG_ARMADA_37XX_RWTM_MBOX) += armada-37xx-rwtm-mailbox.o
|
obj-$(CONFIG_ARMADA_37XX_RWTM_MBOX) += armada-37xx-rwtm-mailbox.o
|
||||||
|
|
|
@ -180,7 +180,7 @@ static void mhu_db_shutdown(struct mbox_chan *chan)
|
||||||
|
|
||||||
/* Reset channel */
|
/* Reset channel */
|
||||||
mhu_db_mbox_clear_irq(chan);
|
mhu_db_mbox_clear_irq(chan);
|
||||||
kfree(chan->con_priv);
|
devm_kfree(mbox->dev, chan->con_priv);
|
||||||
chan->con_priv = NULL;
|
chan->con_priv = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -144,11 +144,11 @@ static irqreturn_t stm32_ipcc_tx_irq(int irq, void *data)
|
||||||
|
|
||||||
static int stm32_ipcc_send_data(struct mbox_chan *link, void *data)
|
static int stm32_ipcc_send_data(struct mbox_chan *link, void *data)
|
||||||
{
|
{
|
||||||
unsigned int chan = (unsigned int)link->con_priv;
|
unsigned long chan = (unsigned long)link->con_priv;
|
||||||
struct stm32_ipcc *ipcc = container_of(link->mbox, struct stm32_ipcc,
|
struct stm32_ipcc *ipcc = container_of(link->mbox, struct stm32_ipcc,
|
||||||
controller);
|
controller);
|
||||||
|
|
||||||
dev_dbg(ipcc->controller.dev, "%s: chan:%d\n", __func__, chan);
|
dev_dbg(ipcc->controller.dev, "%s: chan:%lu\n", __func__, chan);
|
||||||
|
|
||||||
/* set channel n occupied */
|
/* set channel n occupied */
|
||||||
stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XSCR,
|
stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XSCR,
|
||||||
|
@ -163,7 +163,7 @@ static int stm32_ipcc_send_data(struct mbox_chan *link, void *data)
|
||||||
|
|
||||||
static int stm32_ipcc_startup(struct mbox_chan *link)
|
static int stm32_ipcc_startup(struct mbox_chan *link)
|
||||||
{
|
{
|
||||||
unsigned int chan = (unsigned int)link->con_priv;
|
unsigned long chan = (unsigned long)link->con_priv;
|
||||||
struct stm32_ipcc *ipcc = container_of(link->mbox, struct stm32_ipcc,
|
struct stm32_ipcc *ipcc = container_of(link->mbox, struct stm32_ipcc,
|
||||||
controller);
|
controller);
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -183,7 +183,7 @@ static int stm32_ipcc_startup(struct mbox_chan *link)
|
||||||
|
|
||||||
static void stm32_ipcc_shutdown(struct mbox_chan *link)
|
static void stm32_ipcc_shutdown(struct mbox_chan *link)
|
||||||
{
|
{
|
||||||
unsigned int chan = (unsigned int)link->con_priv;
|
unsigned long chan = (unsigned long)link->con_priv;
|
||||||
struct stm32_ipcc *ipcc = container_of(link->mbox, struct stm32_ipcc,
|
struct stm32_ipcc *ipcc = container_of(link->mbox, struct stm32_ipcc,
|
||||||
controller);
|
controller);
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ static int stm32_ipcc_probe(struct platform_device *pdev)
|
||||||
struct device_node *np = dev->of_node;
|
struct device_node *np = dev->of_node;
|
||||||
struct stm32_ipcc *ipcc;
|
struct stm32_ipcc *ipcc;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
unsigned int i;
|
unsigned long i;
|
||||||
int ret;
|
int ret;
|
||||||
u32 ip_ver;
|
u32 ip_ver;
|
||||||
static const char * const irq_name[] = {"rx", "tx"};
|
static const char * const irq_name[] = {"rx", "tx"};
|
||||||
|
@ -257,9 +257,6 @@ static int stm32_ipcc_probe(struct platform_device *pdev)
|
||||||
for (i = 0; i < IPCC_IRQ_NUM; i++) {
|
for (i = 0; i < IPCC_IRQ_NUM; i++) {
|
||||||
ipcc->irqs[i] = platform_get_irq_byname(pdev, irq_name[i]);
|
ipcc->irqs[i] = platform_get_irq_byname(pdev, irq_name[i]);
|
||||||
if (ipcc->irqs[i] < 0) {
|
if (ipcc->irqs[i] < 0) {
|
||||||
if (ipcc->irqs[i] != -EPROBE_DEFER)
|
|
||||||
dev_err(dev, "no IRQ specified %s\n",
|
|
||||||
irq_name[i]);
|
|
||||||
ret = ipcc->irqs[i];
|
ret = ipcc->irqs[i];
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
|
@ -268,7 +265,7 @@ static int stm32_ipcc_probe(struct platform_device *pdev)
|
||||||
irq_thread[i], IRQF_ONESHOT,
|
irq_thread[i], IRQF_ONESHOT,
|
||||||
dev_name(dev), ipcc);
|
dev_name(dev), ipcc);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "failed to request irq %d (%d)\n", i, ret);
|
dev_err(dev, "failed to request irq %lu (%d)\n", i, ret);
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
/*
|
||||||
|
* ARM MHUv2 Mailbox Message
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Arm Ltd.
|
||||||
|
* Copyright (C) 2020 Linaro Ltd.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LINUX_ARM_MHUV2_MESSAGE_H_
|
||||||
|
#define _LINUX_ARM_MHUV2_MESSAGE_H_
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
/* Data structure for data-transfer protocol */
|
||||||
|
struct arm_mhuv2_mbox_msg {
|
||||||
|
void *data;
|
||||||
|
size_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _LINUX_ARM_MHUV2_MESSAGE_H_ */
|
Загрузка…
Ссылка в новой задаче