162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (C) 2005-2006 by Texas Instruments */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _CPPI_DMA_H_
562306a36Sopenharmony_ci#define _CPPI_DMA_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/slab.h>
862306a36Sopenharmony_ci#include <linux/list.h>
962306a36Sopenharmony_ci#include <linux/errno.h>
1062306a36Sopenharmony_ci#include <linux/dmapool.h>
1162306a36Sopenharmony_ci#include <linux/dmaengine.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "musb_core.h"
1462306a36Sopenharmony_ci#include "musb_dma.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* CPPI RX/TX state RAM */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct cppi_tx_stateram {
1962306a36Sopenharmony_ci	u32 tx_head;			/* "DMA packet" head descriptor */
2062306a36Sopenharmony_ci	u32 tx_buf;
2162306a36Sopenharmony_ci	u32 tx_current;			/* current descriptor */
2262306a36Sopenharmony_ci	u32 tx_buf_current;
2362306a36Sopenharmony_ci	u32 tx_info;			/* flags, remaining buflen */
2462306a36Sopenharmony_ci	u32 tx_rem_len;
2562306a36Sopenharmony_ci	u32 tx_dummy;			/* unused */
2662306a36Sopenharmony_ci	u32 tx_complete;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct cppi_rx_stateram {
3062306a36Sopenharmony_ci	u32 rx_skipbytes;
3162306a36Sopenharmony_ci	u32 rx_head;
3262306a36Sopenharmony_ci	u32 rx_sop;			/* "DMA packet" head descriptor */
3362306a36Sopenharmony_ci	u32 rx_current;			/* current descriptor */
3462306a36Sopenharmony_ci	u32 rx_buf_current;
3562306a36Sopenharmony_ci	u32 rx_len_len;
3662306a36Sopenharmony_ci	u32 rx_cnt_cnt;
3762306a36Sopenharmony_ci	u32 rx_complete;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* hw_options bits in CPPI buffer descriptors */
4162306a36Sopenharmony_ci#define CPPI_SOP_SET	((u32)(1 << 31))
4262306a36Sopenharmony_ci#define CPPI_EOP_SET	((u32)(1 << 30))
4362306a36Sopenharmony_ci#define CPPI_OWN_SET	((u32)(1 << 29))	/* owned by cppi */
4462306a36Sopenharmony_ci#define CPPI_EOQ_MASK	((u32)(1 << 28))
4562306a36Sopenharmony_ci#define CPPI_ZERO_SET	((u32)(1 << 23))	/* rx saw zlp; tx issues one */
4662306a36Sopenharmony_ci#define CPPI_RXABT_MASK	((u32)(1 << 19))	/* need more rx buffers */
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define CPPI_RECV_PKTLEN_MASK 0xFFFF
4962306a36Sopenharmony_ci#define CPPI_BUFFER_LEN_MASK 0xFFFF
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define CPPI_TEAR_READY ((u32)(1 << 31))
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* CPPI data structure definitions */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define	CPPI_DESCRIPTOR_ALIGN	16	/* bytes; 5-dec docs say 4-byte align */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct cppi_descriptor {
5862306a36Sopenharmony_ci	/* hardware overlay */
5962306a36Sopenharmony_ci	u32		hw_next;	/* next buffer descriptor Pointer */
6062306a36Sopenharmony_ci	u32		hw_bufp;	/* i/o buffer pointer */
6162306a36Sopenharmony_ci	u32		hw_off_len;	/* buffer_offset16, buffer_length16 */
6262306a36Sopenharmony_ci	u32		hw_options;	/* flags:  SOP, EOP etc*/
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	struct cppi_descriptor *next;
6562306a36Sopenharmony_ci	dma_addr_t	dma;		/* address of this descriptor */
6662306a36Sopenharmony_ci	u32		buflen;		/* for RX: original buffer length */
6762306a36Sopenharmony_ci} __attribute__ ((aligned(CPPI_DESCRIPTOR_ALIGN)));
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistruct cppi;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/* CPPI  Channel Control structure */
7362306a36Sopenharmony_cistruct cppi_channel {
7462306a36Sopenharmony_ci	struct dma_channel	channel;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	/* back pointer to the DMA controller structure */
7762306a36Sopenharmony_ci	struct cppi		*controller;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* which direction of which endpoint? */
8062306a36Sopenharmony_ci	struct musb_hw_ep	*hw_ep;
8162306a36Sopenharmony_ci	bool			transmit;
8262306a36Sopenharmony_ci	u8			index;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	/* DMA modes:  RNDIS or "transparent" */
8562306a36Sopenharmony_ci	u8			is_rndis;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* book keeping for current transfer request */
8862306a36Sopenharmony_ci	dma_addr_t		buf_dma;
8962306a36Sopenharmony_ci	u32			buf_len;
9062306a36Sopenharmony_ci	u32			maxpacket;
9162306a36Sopenharmony_ci	u32			offset;		/* dma requested */
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	void __iomem		*state_ram;	/* CPPI state */
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	struct cppi_descriptor	*freelist;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	/* BD management fields */
9862306a36Sopenharmony_ci	struct cppi_descriptor	*head;
9962306a36Sopenharmony_ci	struct cppi_descriptor	*tail;
10062306a36Sopenharmony_ci	struct cppi_descriptor	*last_processed;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	/* use tx_complete in host role to track endpoints waiting for
10362306a36Sopenharmony_ci	 * FIFONOTEMPTY to clear.
10462306a36Sopenharmony_ci	 */
10562306a36Sopenharmony_ci	struct list_head	tx_complete;
10662306a36Sopenharmony_ci};
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/* CPPI DMA controller object */
10962306a36Sopenharmony_cistruct cppi {
11062306a36Sopenharmony_ci	struct dma_controller		controller;
11162306a36Sopenharmony_ci	void __iomem			*mregs;		/* Mentor regs */
11262306a36Sopenharmony_ci	void __iomem			*tibase;	/* TI/CPPI regs */
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	int				irq;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	struct cppi_channel		tx[4];
11762306a36Sopenharmony_ci	struct cppi_channel		rx[4];
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	struct dma_pool			*pool;
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	struct list_head		tx_complete;
12262306a36Sopenharmony_ci};
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistruct cppi41_dma_channel {
12562306a36Sopenharmony_ci	struct dma_channel channel;
12662306a36Sopenharmony_ci	struct cppi41_dma_controller *controller;
12762306a36Sopenharmony_ci	struct musb_hw_ep *hw_ep;
12862306a36Sopenharmony_ci	struct dma_chan *dc;
12962306a36Sopenharmony_ci	dma_cookie_t cookie;
13062306a36Sopenharmony_ci	u8 port_num;
13162306a36Sopenharmony_ci	u8 is_tx;
13262306a36Sopenharmony_ci	u8 is_allocated;
13362306a36Sopenharmony_ci	u8 usb_toggle;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	dma_addr_t buf_addr;
13662306a36Sopenharmony_ci	u32 total_len;
13762306a36Sopenharmony_ci	u32 prog_len;
13862306a36Sopenharmony_ci	u32 transferred;
13962306a36Sopenharmony_ci	u32 packet_sz;
14062306a36Sopenharmony_ci	struct list_head tx_check;
14162306a36Sopenharmony_ci	int tx_zlp;
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#endif				/* end of ifndef _CPPI_DMA_H_ */
145