lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 5 Nov 2019 09:49:53 +0200
From:   Tero Kristo <t-kristo@...com>
To:     Peter Ujfalusi <peter.ujfalusi@...com>, <vkoul@...nel.org>,
        <robh+dt@...nel.org>, <nm@...com>, <ssantosh@...nel.org>
CC:     <dan.j.williams@...el.com>, <dmaengine@...r.kernel.org>,
        <linux-arm-kernel@...ts.infradead.org>,
        <devicetree@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
        <grygorii.strashko@...com>, <lokeshvutla@...com>,
        <tony@...mide.com>, <j-keerthy@...com>
Subject: Re: [PATCH v4 07/15] dmaengine: ti: k3 PSI-L remote endpoint
 configuration

On 01/11/2019 10:41, Peter Ujfalusi wrote:
> In K3 architecture the DMA operates within threads. One end of the thread
> is UDMAP, the other is on the peripheral side.
> 
> The UDMAP channel configuration depends on the needs of the remote
> endpoint and it can be differ from peripheral to peripheral.
> 
> This patch adds database for am654 and j721e and small API to fetch the
> PSI-L endpoint configuration from the database which should only used by
> the DMA driver(s).
> 
> Another API is added for native peripherals to give possibility to pass new
> configuration for the threads they are using, which is needed to be able to
> handle changes caused by different firmware loaded for the peripheral for
> example.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@...com>
> ---
>   drivers/dma/ti/Kconfig         |   3 +
>   drivers/dma/ti/Makefile        |   1 +
>   drivers/dma/ti/k3-psil-am654.c | 172 ++++++++++++++++++++++++++
>   drivers/dma/ti/k3-psil-j721e.c | 219 +++++++++++++++++++++++++++++++++
>   drivers/dma/ti/k3-psil-priv.h  |  39 ++++++
>   drivers/dma/ti/k3-psil.c       |  97 +++++++++++++++
>   include/linux/dma/k3-psil.h    |  47 +++++++
>   7 files changed, 578 insertions(+)
>   create mode 100644 drivers/dma/ti/k3-psil-am654.c
>   create mode 100644 drivers/dma/ti/k3-psil-j721e.c
>   create mode 100644 drivers/dma/ti/k3-psil-priv.h
>   create mode 100644 drivers/dma/ti/k3-psil.c
>   create mode 100644 include/linux/dma/k3-psil.h
> 
> diff --git a/drivers/dma/ti/Kconfig b/drivers/dma/ti/Kconfig
> index d507c24fbf31..72f3d2728178 100644
> --- a/drivers/dma/ti/Kconfig
> +++ b/drivers/dma/ti/Kconfig
> @@ -34,5 +34,8 @@ config DMA_OMAP
>   	  Enable support for the TI sDMA (System DMA or DMA4) controller. This
>   	  DMA engine is found on OMAP and DRA7xx parts.
>   
> +config TI_K3_PSIL
> +	bool
> +
>   config TI_DMA_CROSSBAR
>   	bool
> diff --git a/drivers/dma/ti/Makefile b/drivers/dma/ti/Makefile
> index 113e59ec9c32..f8d912ad7eaf 100644
> --- a/drivers/dma/ti/Makefile
> +++ b/drivers/dma/ti/Makefile
> @@ -2,4 +2,5 @@
>   obj-$(CONFIG_TI_CPPI41) += cppi41.o
>   obj-$(CONFIG_TI_EDMA) += edma.o
>   obj-$(CONFIG_DMA_OMAP) += omap-dma.o
> +obj-$(CONFIG_TI_K3_PSIL) += k3-psil.o k3-psil-am654.o k3-psil-j721e.o
>   obj-$(CONFIG_TI_DMA_CROSSBAR) += dma-crossbar.o
> diff --git a/drivers/dma/ti/k3-psil-am654.c b/drivers/dma/ti/k3-psil-am654.c
> new file mode 100644
> index 000000000000..edd7fff36f44
> --- /dev/null
> +++ b/drivers/dma/ti/k3-psil-am654.c
> @@ -0,0 +1,172 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
> + *  Author: Peter Ujfalusi <peter.ujfalusi@...com>
> + */
> +
> +#include <linux/kernel.h>
> +
> +#include "k3-psil-priv.h"
> +
> +#define PSIL_PDMA_XY_TR(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_PDMA_XY,	\
> +		},					\
> +	}
> +
> +#define PSIL_PDMA_XY_PKT(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_PDMA_XY,	\
> +			.pkt_mode = 1,			\
> +		},					\
> +	}
> +
> +#define PSIL_ETHERNET(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_NATIVE,	\
> +			.pkt_mode = 1,			\
> +			.needs_epib = 1,		\
> +			.psd_size = 16,			\
> +		},					\
> +	}
> +
> +#define PSIL_SA2UL(x, tx)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_NATIVE,	\
> +			.pkt_mode = 1,			\
> +			.needs_epib = 1,		\
> +			.psd_size = 64,			\
> +			.notdpkt = tx,			\
> +		},					\
> +	}
> +
> +/* PSI-L source thread IDs, used for RX (DMA_DEV_TO_MEM) */
> +struct psil_ep am654_src_ep_map[] = {
> +	/* SA2UL */
> +	PSIL_SA2UL(0x4000, 0),
> +	PSIL_SA2UL(0x4001, 0),
> +	/* PRU_ICSSG0 */
> +	PSIL_ETHERNET(0x4100),
> +	PSIL_ETHERNET(0x4101),
> +	PSIL_ETHERNET(0x4102),
> +	PSIL_ETHERNET(0x4103),
> +	/* PRU_ICSSG1 */
> +	PSIL_ETHERNET(0x4200),
> +	PSIL_ETHERNET(0x4201),
> +	PSIL_ETHERNET(0x4202),
> +	PSIL_ETHERNET(0x4203),
> +	/* PRU_ICSSG2 */
> +	PSIL_ETHERNET(0x4300),
> +	PSIL_ETHERNET(0x4301),
> +	PSIL_ETHERNET(0x4302),
> +	PSIL_ETHERNET(0x4303),
> +	/* PDMA0 - McASPs */
> +	PSIL_PDMA_XY_TR(0x4400),
> +	PSIL_PDMA_XY_TR(0x4401),
> +	PSIL_PDMA_XY_TR(0x4402),
> +	/* PDMA1 - SPI0-4 */
> +	PSIL_PDMA_XY_PKT(0x4500),
> +	PSIL_PDMA_XY_PKT(0x4501),
> +	PSIL_PDMA_XY_PKT(0x4502),
> +	PSIL_PDMA_XY_PKT(0x4503),
> +	PSIL_PDMA_XY_PKT(0x4504),
> +	PSIL_PDMA_XY_PKT(0x4505),
> +	PSIL_PDMA_XY_PKT(0x4506),
> +	PSIL_PDMA_XY_PKT(0x4507),
> +	PSIL_PDMA_XY_PKT(0x4508),
> +	PSIL_PDMA_XY_PKT(0x4509),
> +	PSIL_PDMA_XY_PKT(0x450a),
> +	PSIL_PDMA_XY_PKT(0x450b),
> +	PSIL_PDMA_XY_PKT(0x450c),
> +	PSIL_PDMA_XY_PKT(0x450d),
> +	PSIL_PDMA_XY_PKT(0x450e),
> +	PSIL_PDMA_XY_PKT(0x450f),
> +	PSIL_PDMA_XY_PKT(0x4510),
> +	PSIL_PDMA_XY_PKT(0x4511),
> +	PSIL_PDMA_XY_PKT(0x4512),
> +	PSIL_PDMA_XY_PKT(0x4513),
> +	/* PDMA1 - USART0-2 */
> +	PSIL_PDMA_XY_PKT(0x4514),
> +	PSIL_PDMA_XY_PKT(0x4515),
> +	PSIL_PDMA_XY_PKT(0x4516),
> +	/* CPSW0 */
> +	PSIL_ETHERNET(0x7000),
> +	/* MCU_PDMA0 - ADCs */
> +	PSIL_PDMA_XY_TR(0x7100),
> +	PSIL_PDMA_XY_TR(0x7101),
> +	PSIL_PDMA_XY_TR(0x7102),
> +	PSIL_PDMA_XY_TR(0x7103),
> +	/* MCU_PDMA1 - MCU_SPI0-2 */
> +	PSIL_PDMA_XY_PKT(0x7200),
> +	PSIL_PDMA_XY_PKT(0x7201),
> +	PSIL_PDMA_XY_PKT(0x7202),
> +	PSIL_PDMA_XY_PKT(0x7203),
> +	PSIL_PDMA_XY_PKT(0x7204),
> +	PSIL_PDMA_XY_PKT(0x7205),
> +	PSIL_PDMA_XY_PKT(0x7206),
> +	PSIL_PDMA_XY_PKT(0x7207),
> +	PSIL_PDMA_XY_PKT(0x7208),
> +	PSIL_PDMA_XY_PKT(0x7209),
> +	PSIL_PDMA_XY_PKT(0x720a),
> +	PSIL_PDMA_XY_PKT(0x720b),
> +	/* MCU_PDMA1 - MCU_USART0 */
> +	PSIL_PDMA_XY_PKT(0x7212),
> +};
> +
> +/* PSI-L destination thread IDs, used for TX (DMA_MEM_TO_DEV) */
> +struct psil_ep am654_dst_ep_map[] = {
> +	/* SA2UL */
> +	PSIL_SA2UL(0xc000, 1),
> +	/* PRU_ICSSG0 */
> +	PSIL_ETHERNET(0xc100),
> +	PSIL_ETHERNET(0xc101),
> +	PSIL_ETHERNET(0xc102),
> +	PSIL_ETHERNET(0xc103),
> +	PSIL_ETHERNET(0xc104),
> +	PSIL_ETHERNET(0xc105),
> +	PSIL_ETHERNET(0xc106),
> +	PSIL_ETHERNET(0xc107),
> +	/* PRU_ICSSG1 */
> +	PSIL_ETHERNET(0xc200),
> +	PSIL_ETHERNET(0xc201),
> +	PSIL_ETHERNET(0xc202),
> +	PSIL_ETHERNET(0xc203),
> +	PSIL_ETHERNET(0xc204),
> +	PSIL_ETHERNET(0xc205),
> +	PSIL_ETHERNET(0xc206),
> +	PSIL_ETHERNET(0xc207),
> +	/* PRU_ICSSG2 */
> +	PSIL_ETHERNET(0xc300),
> +	PSIL_ETHERNET(0xc301),
> +	PSIL_ETHERNET(0xc302),
> +	PSIL_ETHERNET(0xc303),
> +	PSIL_ETHERNET(0xc304),
> +	PSIL_ETHERNET(0xc305),
> +	PSIL_ETHERNET(0xc306),
> +	PSIL_ETHERNET(0xc307),
> +	/* CPSW0 */
> +	PSIL_ETHERNET(0xf000),
> +	PSIL_ETHERNET(0xf001),
> +	PSIL_ETHERNET(0xf002),
> +	PSIL_ETHERNET(0xf003),
> +	PSIL_ETHERNET(0xf004),
> +	PSIL_ETHERNET(0xf005),
> +	PSIL_ETHERNET(0xf006),
> +	PSIL_ETHERNET(0xf007),
> +};
> +
> +struct psil_ep_map am654_ep_map = {
> +	.name = "am654",
> +	.src = am654_src_ep_map,
> +	.src_count = ARRAY_SIZE(am654_src_ep_map),
> +	.dst = am654_dst_ep_map,
> +	.dst_count = ARRAY_SIZE(am654_dst_ep_map),
> +};
> diff --git a/drivers/dma/ti/k3-psil-j721e.c b/drivers/dma/ti/k3-psil-j721e.c
> new file mode 100644
> index 000000000000..86e1ff57e197
> --- /dev/null
> +++ b/drivers/dma/ti/k3-psil-j721e.c
> @@ -0,0 +1,219 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
> + *  Author: Peter Ujfalusi <peter.ujfalusi@...com>
> + */
> +
> +#include <linux/kernel.h>
> +
> +#include "k3-psil-priv.h"
> +
> +#define PSIL_PDMA_XY_TR(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_PDMA_XY,	\
> +		},					\
> +	}
> +
> +#define PSIL_PDMA_XY_PKT(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_PDMA_XY,	\
> +			.pkt_mode = 1,			\
> +		},					\
> +	}
> +
> +#define PSIL_PDMA_MCASP(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_PDMA_XY,	\
> +			.pdma_acc32 = 1,		\
> +			.pdma_burst = 1,		\
> +		},					\
> +	}
> +
> +#define PSIL_ETHERNET(x)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_NATIVE,	\
> +			.pkt_mode = 1,			\
> +			.needs_epib = 1,		\
> +			.psd_size = 16,			\
> +		},					\
> +	}
> +
> +#define PSIL_SA2UL(x, tx)				\
> +	{						\
> +		.thread_id = x,				\
> +		.ep_config = {				\
> +			.ep_type = PSIL_EP_NATIVE,	\
> +			.pkt_mode = 1,			\
> +			.needs_epib = 1,		\
> +			.psd_size = 64,			\
> +			.notdpkt = tx,			\
> +		},					\
> +	}
> +
> +/* PSI-L source thread IDs, used for RX (DMA_DEV_TO_MEM) */
> +struct psil_ep j721e_src_ep_map[] = {
> +	/* SA2UL */
> +	PSIL_SA2UL(0x4000, 0),
> +	PSIL_SA2UL(0x4001, 0),
> +	/* PRU_ICSSG0 */
> +	PSIL_ETHERNET(0x4100),
> +	PSIL_ETHERNET(0x4101),
> +	PSIL_ETHERNET(0x4102),
> +	PSIL_ETHERNET(0x4103),
> +	/* PRU_ICSSG1 */
> +	PSIL_ETHERNET(0x4200),
> +	PSIL_ETHERNET(0x4201),
> +	PSIL_ETHERNET(0x4202),
> +	PSIL_ETHERNET(0x4203),
> +	/* PDMA6 (PSIL_PDMA_MCASP_G0) - McASP0-2 */
> +	PSIL_PDMA_MCASP(0x4400),
> +	PSIL_PDMA_MCASP(0x4401),
> +	PSIL_PDMA_MCASP(0x4402),
> +	/* PDMA7 (PSIL_PDMA_MCASP_G1) - McASP3-11 */
> +	PSIL_PDMA_MCASP(0x4500),
> +	PSIL_PDMA_MCASP(0x4501),
> +	PSIL_PDMA_MCASP(0x4502),
> +	PSIL_PDMA_MCASP(0x4503),
> +	PSIL_PDMA_MCASP(0x4504),
> +	PSIL_PDMA_MCASP(0x4505),
> +	PSIL_PDMA_MCASP(0x4506),
> +	PSIL_PDMA_MCASP(0x4507),
> +	PSIL_PDMA_MCASP(0x4508),
> +	/* PDMA8 (PDMA_MISC_G0) - SPI0-1 */
> +	PSIL_PDMA_XY_PKT(0x4600),
> +	PSIL_PDMA_XY_PKT(0x4601),
> +	PSIL_PDMA_XY_PKT(0x4602),
> +	PSIL_PDMA_XY_PKT(0x4603),
> +	PSIL_PDMA_XY_PKT(0x4604),
> +	PSIL_PDMA_XY_PKT(0x4605),
> +	PSIL_PDMA_XY_PKT(0x4606),
> +	PSIL_PDMA_XY_PKT(0x4607),
> +	/* PDMA9 (PDMA_MISC_G1) - SPI2-3 */
> +	PSIL_PDMA_XY_PKT(0x460c),
> +	PSIL_PDMA_XY_PKT(0x460d),
> +	PSIL_PDMA_XY_PKT(0x460e),
> +	PSIL_PDMA_XY_PKT(0x460f),
> +	PSIL_PDMA_XY_PKT(0x4610),
> +	PSIL_PDMA_XY_PKT(0x4611),
> +	PSIL_PDMA_XY_PKT(0x4612),
> +	PSIL_PDMA_XY_PKT(0x4613),
> +	/* PDMA10 (PDMA_MISC_G2) - SPI4-5 */
> +	PSIL_PDMA_XY_PKT(0x4618),
> +	PSIL_PDMA_XY_PKT(0x4619),
> +	PSIL_PDMA_XY_PKT(0x461a),
> +	PSIL_PDMA_XY_PKT(0x461b),
> +	PSIL_PDMA_XY_PKT(0x461c),
> +	PSIL_PDMA_XY_PKT(0x461d),
> +	PSIL_PDMA_XY_PKT(0x461e),
> +	PSIL_PDMA_XY_PKT(0x461f),
> +	/* PDMA11 (PDMA_MISC_G3) */
> +	PSIL_PDMA_XY_PKT(0x4624),
> +	PSIL_PDMA_XY_PKT(0x4625),
> +	PSIL_PDMA_XY_PKT(0x4626),
> +	PSIL_PDMA_XY_PKT(0x4627),
> +	PSIL_PDMA_XY_PKT(0x4628),
> +	PSIL_PDMA_XY_PKT(0x4629),
> +	PSIL_PDMA_XY_PKT(0x4630),
> +	PSIL_PDMA_XY_PKT(0x463a),
> +	/* PDMA13 (PDMA_USART_G0) - UART0-1 */
> +	PSIL_PDMA_XY_PKT(0x4700),
> +	PSIL_PDMA_XY_PKT(0x4701),
> +	/* PDMA14 (PDMA_USART_G1) - UART2-3 */
> +	PSIL_PDMA_XY_PKT(0x4702),
> +	PSIL_PDMA_XY_PKT(0x4703),
> +	/* PDMA15 (PDMA_USART_G2) - UART4-9 */
> +	PSIL_PDMA_XY_PKT(0x4704),
> +	PSIL_PDMA_XY_PKT(0x4705),
> +	PSIL_PDMA_XY_PKT(0x4706),
> +	PSIL_PDMA_XY_PKT(0x4707),
> +	PSIL_PDMA_XY_PKT(0x4708),
> +	PSIL_PDMA_XY_PKT(0x4709),
> +	/* CPSW9 */
> +	PSIL_ETHERNET(0x4a00),
> +	/* CPSW0 */
> +	PSIL_ETHERNET(0x7000),
> +	/* MCU_PDMA0 (MCU_PDMA_MISC_G0) - SPI0 */
> +	PSIL_PDMA_XY_PKT(0x7100),
> +	PSIL_PDMA_XY_PKT(0x7101),
> +	PSIL_PDMA_XY_PKT(0x7102),
> +	PSIL_PDMA_XY_PKT(0x7103),
> +	/* MCU_PDMA1 (MCU_PDMA_MISC_G1) - SPI1-2 */
> +	PSIL_PDMA_XY_PKT(0x7200),
> +	PSIL_PDMA_XY_PKT(0x7201),
> +	PSIL_PDMA_XY_PKT(0x7202),
> +	PSIL_PDMA_XY_PKT(0x7203),
> +	PSIL_PDMA_XY_PKT(0x7204),
> +	PSIL_PDMA_XY_PKT(0x7205),
> +	PSIL_PDMA_XY_PKT(0x7206),
> +	PSIL_PDMA_XY_PKT(0x7207),
> +	/* MCU_PDMA2 (MCU_PDMA_MISC_G2) - UART0 */
> +	PSIL_PDMA_XY_PKT(0x7300),
> +	/* MCU_PDMA_ADC - ADC0-1 */
> +	PSIL_PDMA_XY_TR(0x7400),
> +	PSIL_PDMA_XY_TR(0x7401),
> +	PSIL_PDMA_XY_TR(0x7402),
> +	PSIL_PDMA_XY_TR(0x7403),
> +	/* SA2UL */
> +	PSIL_SA2UL(0x7500, 0),
> +	PSIL_SA2UL(0x7501, 0),
> +};
> +
> +/* PSI-L destination thread IDs, used for TX (DMA_MEM_TO_DEV) */
> +struct psil_ep j721e_dst_ep_map[] = {
> +	/* SA2UL */
> +	PSIL_SA2UL(0xc000, 1),
> +	/* PRU_ICSSG0 */
> +	PSIL_ETHERNET(0xc100),
> +	PSIL_ETHERNET(0xc101),
> +	PSIL_ETHERNET(0xc102),
> +	PSIL_ETHERNET(0xc103),
> +	PSIL_ETHERNET(0xc104),
> +	PSIL_ETHERNET(0xc105),
> +	PSIL_ETHERNET(0xc106),
> +	PSIL_ETHERNET(0xc107),
> +	/* PRU_ICSSG1 */
> +	PSIL_ETHERNET(0xc200),
> +	PSIL_ETHERNET(0xc201),
> +	PSIL_ETHERNET(0xc202),
> +	PSIL_ETHERNET(0xc203),
> +	PSIL_ETHERNET(0xc204),
> +	PSIL_ETHERNET(0xc205),
> +	PSIL_ETHERNET(0xc206),
> +	PSIL_ETHERNET(0xc207),
> +	/* CPSW9 */
> +	PSIL_ETHERNET(0xca00),
> +	PSIL_ETHERNET(0xca01),
> +	PSIL_ETHERNET(0xca02),
> +	PSIL_ETHERNET(0xca03),
> +	PSIL_ETHERNET(0xca04),
> +	PSIL_ETHERNET(0xca05),
> +	PSIL_ETHERNET(0xca06),
> +	PSIL_ETHERNET(0xca07),
> +	/* CPSW0 */
> +	PSIL_ETHERNET(0xf000),
> +	PSIL_ETHERNET(0xf001),
> +	PSIL_ETHERNET(0xf002),
> +	PSIL_ETHERNET(0xf003),
> +	PSIL_ETHERNET(0xf004),
> +	PSIL_ETHERNET(0xf005),
> +	PSIL_ETHERNET(0xf006),
> +	PSIL_ETHERNET(0xf007),
> +	/* SA2UL */
> +	PSIL_SA2UL(0xf500, 1),
> +};
> +
> +struct psil_ep_map j721e_ep_map = {
> +	.name = "j721e",
> +	.src = j721e_src_ep_map,
> +	.src_count = ARRAY_SIZE(j721e_src_ep_map),
> +	.dst = j721e_dst_ep_map,
> +	.dst_count = ARRAY_SIZE(j721e_dst_ep_map),
> +};
> diff --git a/drivers/dma/ti/k3-psil-priv.h b/drivers/dma/ti/k3-psil-priv.h
> new file mode 100644
> index 000000000000..f74420653d8a
> --- /dev/null
> +++ b/drivers/dma/ti/k3-psil-priv.h
> @@ -0,0 +1,39 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
> + */
> +
> +#ifndef K3_PSIL_PRIV_H_
> +#define K3_PSIL_PRIV_H_
> +
> +#include <linux/dma/k3-psil.h>
> +
> +struct psil_ep {
> +	u32 thread_id;
> +	struct psil_endpoint_config ep_config;
> +};
> +
> +/**
> + * struct psil_ep_map - PSI-L thread ID configuration maps
> + * @name:	Name of the map, set it to the name of the SoC
> + * @src:	Array of source PSI-L thread configurations
> + * @src_count:	Number of entries in the src array
> + * @dst:	Array of destination PSI-L thread configurations
> + * @dst_count:	Number of entries in the dst array
> + *
> + * In case of symmetric configuration for a matching src/dst thread (for example
> + * 0x4400 and 0xc400) only the src configuration can be present. If no dst
> + * configuration found the code will look for (dst_thread_id & ~0x8000) to find
> + * the symmetric match.
> + */
> +struct psil_ep_map {
> +	char *name;
> +	struct psil_ep	*src;
> +	int src_count;
> +	struct psil_ep	*dst;
> +	int dst_count;
> +};
> +
> +struct psil_endpoint_config *psil_get_ep_config(u32 thread_id);
> +
> +#endif /* K3_PSIL_PRIV_H_ */
> diff --git a/drivers/dma/ti/k3-psil.c b/drivers/dma/ti/k3-psil.c
> new file mode 100644
> index 000000000000..e610022f09f4
> --- /dev/null
> +++ b/drivers/dma/ti/k3-psil.c
> @@ -0,0 +1,97 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
> + *  Author: Peter Ujfalusi <peter.ujfalusi@...com>
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/device.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/of.h>
> +
> +#include "k3-psil-priv.h"
> +
> +extern struct psil_ep_map am654_ep_map;
> +extern struct psil_ep_map j721e_ep_map;
> +
> +static DEFINE_MUTEX(ep_map_mutex);
> +static struct psil_ep_map *soc_ep_map;

So, you are only protecting the high level soc_ep_map pointer only. You 
don't need to protect the database itself via some usecounting or 
something, or are you doing it within the DMA driver?

-Tero

> +
> +struct psil_endpoint_config *psil_get_ep_config(u32 thread_id)
> +{
> +	int i;
> +
> +	mutex_lock(&ep_map_mutex);
> +	if (!soc_ep_map) {
> +		if (of_machine_is_compatible("ti,am654")) {
> +			soc_ep_map = &am654_ep_map;
> +		} else if (of_machine_is_compatible("ti,j721e")) {
> +			soc_ep_map = &j721e_ep_map;
> +		} else {
> +			pr_err("PSIL: No compatible machine found for map\n");
> +			return ERR_PTR(-ENOTSUPP);
> +		}
> +		pr_debug("%s: Using map for %s\n", __func__, soc_ep_map->name);
> +	}
> +	mutex_unlock(&ep_map_mutex);
> +
> +	if (thread_id & K3_PSIL_DST_THREAD_ID_OFFSET && soc_ep_map->dst) {
> +		/* check in destination thread map */
> +		for (i = 0; i < soc_ep_map->dst_count; i++) {
> +			if (soc_ep_map->dst[i].thread_id == thread_id)
> +				return &soc_ep_map->dst[i].ep_config;
> +		}
> +	}
> +
> +	thread_id &= ~K3_PSIL_DST_THREAD_ID_OFFSET;
> +	if (soc_ep_map->src) {
> +		for (i = 0; i < soc_ep_map->src_count; i++) {
> +			if (soc_ep_map->src[i].thread_id == thread_id)
> +				return &soc_ep_map->src[i].ep_config;
> +		}
> +	}
> +
> +	return ERR_PTR(-ENOENT);
> +}
> +EXPORT_SYMBOL(psil_get_ep_config);
> +
> +int psil_set_new_ep_config(struct device *dev, const char *name,
> +			   struct psil_endpoint_config *ep_config)
> +{
> +	struct psil_endpoint_config *dst_ep_config;
> +	struct of_phandle_args dma_spec;
> +	u32 thread_id;
> +	int index;
> +
> +	if (!dev || !dev->of_node)
> +		return -EINVAL;
> +
> +	index = of_property_match_string(dev->of_node, "dma-names", name);
> +	if (index < 0)
> +		return index;
> +
> +	if (of_parse_phandle_with_args(dev->of_node, "dmas", "#dma-cells",
> +				       index, &dma_spec))
> +		return -ENOENT;
> +
> +	thread_id = dma_spec.args[0];
> +
> +	dst_ep_config = psil_get_ep_config(thread_id);
> +	if (IS_ERR(dst_ep_config)) {
> +		pr_err("PSIL: thread ID 0x%04x not defined in map\n",
> +		       thread_id);
> +		of_node_put(dma_spec.np);
> +		return PTR_ERR(dst_ep_config);
> +	}
> +
> +	memcpy(dst_ep_config, ep_config, sizeof(*dst_ep_config));
> +
> +	of_node_put(dma_spec.np);
> +	return 0;
> +}
> +EXPORT_SYMBOL(psil_set_new_ep_config);
> +
> +MODULE_DESCRIPTION("TI K3 PSI-L endpoint database");
> +MODULE_AUTHOR("Peter Ujfalusi <peter.ujfalusi@...com>");
> +MODULE_LICENSE("GPL v2");
> diff --git a/include/linux/dma/k3-psil.h b/include/linux/dma/k3-psil.h
> new file mode 100644
> index 000000000000..16e9c8c6f839
> --- /dev/null
> +++ b/include/linux/dma/k3-psil.h
> @@ -0,0 +1,47 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + *  Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
> + */
> +
> +#ifndef K3_PSIL_H_
> +#define K3_PSIL_H_
> +
> +#include <linux/types.h>
> +
> +#define K3_PSIL_DST_THREAD_ID_OFFSET 0x8000
> +
> +struct device;
> +
> +/* Channel Throughput Levels */
> +enum udma_tp_level {
> +	UDMA_TP_NORMAL = 0,
> +	UDMA_TP_HIGH = 1,
> +	UDMA_TP_ULTRAHIGH = 2,
> +	UDMA_TP_LAST,
> +};
> +
> +enum psil_endpoint_type {
> +	PSIL_EP_NATIVE = 0,
> +	PSIL_EP_PDMA_XY,
> +	PSIL_EP_PDMA_MCAN,
> +	PSIL_EP_PDMA_AASRC,
> +};
> +
> +struct psil_endpoint_config {
> +	enum psil_endpoint_type ep_type;
> +
> +	unsigned pkt_mode:1;
> +	unsigned notdpkt:1;
> +	unsigned needs_epib:1;
> +	u32 psd_size;
> +	enum udma_tp_level channel_tpl;
> +
> +	/* PDMA properties, valid for PSIL_EP_PDMA_* */
> +	unsigned pdma_acc32:1;
> +	unsigned pdma_burst:1;
> +};
> +
> +int psil_set_new_ep_config(struct device *dev, const char *name,
> +			   struct psil_endpoint_config *ep_config);
> +
> +#endif /* K3_PSIL_H_ */
> 

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ