xref: /openbmc/linux/drivers/usb/musb/cppi_dma.h (revision d4255ac3)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2550a7375SFelipe Balbi /* Copyright (C) 2005-2006 by Texas Instruments */
3550a7375SFelipe Balbi 
4550a7375SFelipe Balbi #ifndef _CPPI_DMA_H_
5550a7375SFelipe Balbi #define _CPPI_DMA_H_
6550a7375SFelipe Balbi 
7550a7375SFelipe Balbi #include <linux/slab.h>
8550a7375SFelipe Balbi #include <linux/list.h>
9550a7375SFelipe Balbi #include <linux/errno.h>
10550a7375SFelipe Balbi #include <linux/dmapool.h>
11239d2218SBin Liu #include <linux/dmaengine.h>
12550a7375SFelipe Balbi 
13550a7375SFelipe Balbi #include "musb_core.h"
14239d2218SBin Liu #include "musb_dma.h"
15550a7375SFelipe Balbi 
16550a7375SFelipe Balbi /* CPPI RX/TX state RAM */
17550a7375SFelipe Balbi 
18550a7375SFelipe Balbi struct cppi_tx_stateram {
19550a7375SFelipe Balbi 	u32 tx_head;			/* "DMA packet" head descriptor */
20550a7375SFelipe Balbi 	u32 tx_buf;
21550a7375SFelipe Balbi 	u32 tx_current;			/* current descriptor */
22550a7375SFelipe Balbi 	u32 tx_buf_current;
23550a7375SFelipe Balbi 	u32 tx_info;			/* flags, remaining buflen */
24550a7375SFelipe Balbi 	u32 tx_rem_len;
25550a7375SFelipe Balbi 	u32 tx_dummy;			/* unused */
26550a7375SFelipe Balbi 	u32 tx_complete;
27550a7375SFelipe Balbi };
28550a7375SFelipe Balbi 
29550a7375SFelipe Balbi struct cppi_rx_stateram {
30550a7375SFelipe Balbi 	u32 rx_skipbytes;
31550a7375SFelipe Balbi 	u32 rx_head;
32550a7375SFelipe Balbi 	u32 rx_sop;			/* "DMA packet" head descriptor */
33550a7375SFelipe Balbi 	u32 rx_current;			/* current descriptor */
34550a7375SFelipe Balbi 	u32 rx_buf_current;
35550a7375SFelipe Balbi 	u32 rx_len_len;
36550a7375SFelipe Balbi 	u32 rx_cnt_cnt;
37550a7375SFelipe Balbi 	u32 rx_complete;
38550a7375SFelipe Balbi };
39550a7375SFelipe Balbi 
40550a7375SFelipe Balbi /* hw_options bits in CPPI buffer descriptors */
41550a7375SFelipe Balbi #define CPPI_SOP_SET	((u32)(1 << 31))
42550a7375SFelipe Balbi #define CPPI_EOP_SET	((u32)(1 << 30))
43550a7375SFelipe Balbi #define CPPI_OWN_SET	((u32)(1 << 29))	/* owned by cppi */
44550a7375SFelipe Balbi #define CPPI_EOQ_MASK	((u32)(1 << 28))
45550a7375SFelipe Balbi #define CPPI_ZERO_SET	((u32)(1 << 23))	/* rx saw zlp; tx issues one */
46550a7375SFelipe Balbi #define CPPI_RXABT_MASK	((u32)(1 << 19))	/* need more rx buffers */
47550a7375SFelipe Balbi 
48550a7375SFelipe Balbi #define CPPI_RECV_PKTLEN_MASK 0xFFFF
49550a7375SFelipe Balbi #define CPPI_BUFFER_LEN_MASK 0xFFFF
50550a7375SFelipe Balbi 
51550a7375SFelipe Balbi #define CPPI_TEAR_READY ((u32)(1 << 31))
52550a7375SFelipe Balbi 
53550a7375SFelipe Balbi /* CPPI data structure definitions */
54550a7375SFelipe Balbi 
55550a7375SFelipe Balbi #define	CPPI_DESCRIPTOR_ALIGN	16	/* bytes; 5-dec docs say 4-byte align */
56550a7375SFelipe Balbi 
57550a7375SFelipe Balbi struct cppi_descriptor {
58550a7375SFelipe Balbi 	/* hardware overlay */
59550a7375SFelipe Balbi 	u32		hw_next;	/* next buffer descriptor Pointer */
60550a7375SFelipe Balbi 	u32		hw_bufp;	/* i/o buffer pointer */
61550a7375SFelipe Balbi 	u32		hw_off_len;	/* buffer_offset16, buffer_length16 */
62550a7375SFelipe Balbi 	u32		hw_options;	/* flags:  SOP, EOP etc*/
63550a7375SFelipe Balbi 
64550a7375SFelipe Balbi 	struct cppi_descriptor *next;
65550a7375SFelipe Balbi 	dma_addr_t	dma;		/* address of this descriptor */
66550a7375SFelipe Balbi 	u32		buflen;		/* for RX: original buffer length */
67550a7375SFelipe Balbi } __attribute__ ((aligned(CPPI_DESCRIPTOR_ALIGN)));
68550a7375SFelipe Balbi 
69550a7375SFelipe Balbi 
70550a7375SFelipe Balbi struct cppi;
71550a7375SFelipe Balbi 
72550a7375SFelipe Balbi /* CPPI  Channel Control structure */
73550a7375SFelipe Balbi struct cppi_channel {
74550a7375SFelipe Balbi 	struct dma_channel	channel;
75550a7375SFelipe Balbi 
76550a7375SFelipe Balbi 	/* back pointer to the DMA controller structure */
77550a7375SFelipe Balbi 	struct cppi		*controller;
78550a7375SFelipe Balbi 
79550a7375SFelipe Balbi 	/* which direction of which endpoint? */
80550a7375SFelipe Balbi 	struct musb_hw_ep	*hw_ep;
81550a7375SFelipe Balbi 	bool			transmit;
82550a7375SFelipe Balbi 	u8			index;
83550a7375SFelipe Balbi 
84550a7375SFelipe Balbi 	/* DMA modes:  RNDIS or "transparent" */
85550a7375SFelipe Balbi 	u8			is_rndis;
86550a7375SFelipe Balbi 
87550a7375SFelipe Balbi 	/* book keeping for current transfer request */
88550a7375SFelipe Balbi 	dma_addr_t		buf_dma;
89550a7375SFelipe Balbi 	u32			buf_len;
90550a7375SFelipe Balbi 	u32			maxpacket;
91550a7375SFelipe Balbi 	u32			offset;		/* dma requested */
92550a7375SFelipe Balbi 
93550a7375SFelipe Balbi 	void __iomem		*state_ram;	/* CPPI state */
94550a7375SFelipe Balbi 
95550a7375SFelipe Balbi 	struct cppi_descriptor	*freelist;
96550a7375SFelipe Balbi 
97550a7375SFelipe Balbi 	/* BD management fields */
98550a7375SFelipe Balbi 	struct cppi_descriptor	*head;
99550a7375SFelipe Balbi 	struct cppi_descriptor	*tail;
100550a7375SFelipe Balbi 	struct cppi_descriptor	*last_processed;
101550a7375SFelipe Balbi 
102550a7375SFelipe Balbi 	/* use tx_complete in host role to track endpoints waiting for
103550a7375SFelipe Balbi 	 * FIFONOTEMPTY to clear.
104550a7375SFelipe Balbi 	 */
105550a7375SFelipe Balbi 	struct list_head	tx_complete;
106550a7375SFelipe Balbi };
107550a7375SFelipe Balbi 
108550a7375SFelipe Balbi /* CPPI DMA controller object */
109550a7375SFelipe Balbi struct cppi {
110550a7375SFelipe Balbi 	struct dma_controller		controller;
111550a7375SFelipe Balbi 	void __iomem			*mregs;		/* Mentor regs */
112550a7375SFelipe Balbi 	void __iomem			*tibase;	/* TI/CPPI regs */
113550a7375SFelipe Balbi 
11491e9c4feSSergei Shtylyov 	int				irq;
11591e9c4feSSergei Shtylyov 
116c767c1c6SDavid Brownell 	struct cppi_channel		tx[4];
117c767c1c6SDavid Brownell 	struct cppi_channel		rx[4];
118550a7375SFelipe Balbi 
119550a7375SFelipe Balbi 	struct dma_pool			*pool;
120550a7375SFelipe Balbi 
121550a7375SFelipe Balbi 	struct list_head		tx_complete;
122550a7375SFelipe Balbi };
123550a7375SFelipe Balbi 
124239d2218SBin Liu struct cppi41_dma_channel {
125239d2218SBin Liu 	struct dma_channel channel;
126239d2218SBin Liu 	struct cppi41_dma_controller *controller;
127239d2218SBin Liu 	struct musb_hw_ep *hw_ep;
128239d2218SBin Liu 	struct dma_chan *dc;
129239d2218SBin Liu 	dma_cookie_t cookie;
130239d2218SBin Liu 	u8 port_num;
131239d2218SBin Liu 	u8 is_tx;
132239d2218SBin Liu 	u8 is_allocated;
133239d2218SBin Liu 	u8 usb_toggle;
134239d2218SBin Liu 
135239d2218SBin Liu 	dma_addr_t buf_addr;
136239d2218SBin Liu 	u32 total_len;
137239d2218SBin Liu 	u32 prog_len;
138239d2218SBin Liu 	u32 transferred;
139239d2218SBin Liu 	u32 packet_sz;
140239d2218SBin Liu 	struct list_head tx_check;
141239d2218SBin Liu 	int tx_zlp;
142239d2218SBin Liu };
143239d2218SBin Liu 
144550a7375SFelipe Balbi #endif				/* end of ifndef _CPPI_DMA_H_ */
145