xref: /OK3568_Linux_fs/kernel/include/linux/dma/ti-cppi5.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * CPPI5 descriptors interface
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __TI_CPPI5_H__
9*4882a593Smuzhiyun #define __TI_CPPI5_H__
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/bitops.h>
12*4882a593Smuzhiyun #include <linux/printk.h>
13*4882a593Smuzhiyun #include <linux/bug.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /**
16*4882a593Smuzhiyun  * struct cppi5_desc_hdr_t - Descriptor header, present in all types of
17*4882a593Smuzhiyun  *			     descriptors
18*4882a593Smuzhiyun  * @pkt_info0:		Packet info word 0 (n/a in Buffer desc)
19*4882a593Smuzhiyun  * @pkt_info0:		Packet info word 1 (n/a in Buffer desc)
20*4882a593Smuzhiyun  * @pkt_info0:		Packet info word 2 (n/a in Buffer desc)
21*4882a593Smuzhiyun  * @src_dst_tag:	Packet info word 3 (n/a in Buffer desc)
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun struct cppi5_desc_hdr_t {
24*4882a593Smuzhiyun 	u32 pkt_info0;
25*4882a593Smuzhiyun 	u32 pkt_info1;
26*4882a593Smuzhiyun 	u32 pkt_info2;
27*4882a593Smuzhiyun 	u32 src_dst_tag;
28*4882a593Smuzhiyun } __packed;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /**
31*4882a593Smuzhiyun  * struct cppi5_host_desc_t - Host-mode packet and buffer descriptor definition
32*4882a593Smuzhiyun  * @hdr:		Descriptor header
33*4882a593Smuzhiyun  * @next_desc:		word 4/5: Linking word
34*4882a593Smuzhiyun  * @buf_ptr:		word 6/7: Buffer pointer
35*4882a593Smuzhiyun  * @buf_info1:		word 8: Buffer valid data length
36*4882a593Smuzhiyun  * @org_buf_len:	word 9: Original buffer length
37*4882a593Smuzhiyun  * @org_buf_ptr:	word 10/11: Original buffer pointer
38*4882a593Smuzhiyun  * @epib[0]:		Extended Packet Info Data (optional, 4 words), and/or
39*4882a593Smuzhiyun  *			Protocol Specific Data (optional, 0-128 bytes in
40*4882a593Smuzhiyun  *			multiples of 4), and/or
41*4882a593Smuzhiyun  *			Other Software Data (0-N bytes, optional)
42*4882a593Smuzhiyun  */
43*4882a593Smuzhiyun struct cppi5_host_desc_t {
44*4882a593Smuzhiyun 	struct cppi5_desc_hdr_t hdr;
45*4882a593Smuzhiyun 	u64 next_desc;
46*4882a593Smuzhiyun 	u64 buf_ptr;
47*4882a593Smuzhiyun 	u32 buf_info1;
48*4882a593Smuzhiyun 	u32 org_buf_len;
49*4882a593Smuzhiyun 	u64 org_buf_ptr;
50*4882a593Smuzhiyun 	u32 epib[];
51*4882a593Smuzhiyun } __packed;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define CPPI5_DESC_MIN_ALIGN			(16U)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_EPIB_SIZE		(16U)
56*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE	(128U)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_TYPE_SHIFT		(30U)
59*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_TYPE_MASK		GENMASK(31, 30)
60*4882a593Smuzhiyun #define   CPPI5_INFO0_DESC_TYPE_VAL_HOST	(1U)
61*4882a593Smuzhiyun #define   CPPI5_INFO0_DESC_TYPE_VAL_MONO	(2U)
62*4882a593Smuzhiyun #define   CPPI5_INFO0_DESC_TYPE_VAL_TR		(3U)
63*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_EPIB_PRESENT		BIT(29)
64*4882a593Smuzhiyun /*
65*4882a593Smuzhiyun  * Protocol Specific Words location:
66*4882a593Smuzhiyun  * 0 - located in the descriptor,
67*4882a593Smuzhiyun  * 1 = located in the SOP Buffer immediately prior to the data.
68*4882a593Smuzhiyun  */
69*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_PSINFO_LOCATION	BIT(28)
70*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT	(22U)
71*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK	GENMASK(27, 22)
72*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_PKTLEN_SHIFT		(0)
73*4882a593Smuzhiyun #define CPPI5_INFO0_HDESC_PKTLEN_MASK		GENMASK(21, 0)
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_PKTERROR_SHIFT		(28U)
76*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_PKTERROR_MASK		GENMASK(31, 28)
77*4882a593Smuzhiyun #define CPPI5_INFO1_HDESC_PSFLGS_SHIFT		(24U)
78*4882a593Smuzhiyun #define CPPI5_INFO1_HDESC_PSFLGS_MASK		GENMASK(27, 24)
79*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_PKTID_SHIFT		(14U)
80*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_PKTID_MASK		GENMASK(23, 14)
81*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_FLOWID_SHIFT		(0)
82*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_FLOWID_MASK		GENMASK(13, 0)
83*4882a593Smuzhiyun #define CPPI5_INFO1_DESC_FLOWID_DEFAULT		CPPI5_INFO1_DESC_FLOWID_MASK
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define CPPI5_INFO2_HDESC_PKTTYPE_SHIFT		(27U)
86*4882a593Smuzhiyun #define CPPI5_INFO2_HDESC_PKTTYPE_MASK		GENMASK(31, 27)
87*4882a593Smuzhiyun /* Return Policy: 0 - Entire packet 1 - Each buffer */
88*4882a593Smuzhiyun #define CPPI5_INFO2_HDESC_RETPOLICY		BIT(18)
89*4882a593Smuzhiyun /*
90*4882a593Smuzhiyun  * Early Return:
91*4882a593Smuzhiyun  * 0 = desc pointers should be returned after all reads have been completed
92*4882a593Smuzhiyun  * 1 = desc pointers should be returned immediately upon fetching
93*4882a593Smuzhiyun  * the descriptor and beginning to transfer data.
94*4882a593Smuzhiyun  */
95*4882a593Smuzhiyun #define CPPI5_INFO2_HDESC_EARLYRET		BIT(17)
96*4882a593Smuzhiyun /*
97*4882a593Smuzhiyun  * Return Push Policy:
98*4882a593Smuzhiyun  * 0 = Descriptor must be returned to tail of queue
99*4882a593Smuzhiyun  * 1 = Descriptor must be returned to head of queue
100*4882a593Smuzhiyun  */
101*4882a593Smuzhiyun #define CPPI5_INFO2_DESC_RETPUSHPOLICY		BIT(16)
102*4882a593Smuzhiyun #define CPPI5_INFO2_DESC_RETP_MASK		GENMASK(18, 16)
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define CPPI5_INFO2_DESC_RETQ_SHIFT		(0)
105*4882a593Smuzhiyun #define CPPI5_INFO2_DESC_RETQ_MASK		GENMASK(15, 0)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define CPPI5_INFO3_DESC_SRCTAG_SHIFT		(16U)
108*4882a593Smuzhiyun #define CPPI5_INFO3_DESC_SRCTAG_MASK		GENMASK(31, 16)
109*4882a593Smuzhiyun #define CPPI5_INFO3_DESC_DSTTAG_SHIFT		(0)
110*4882a593Smuzhiyun #define CPPI5_INFO3_DESC_DSTTAG_MASK		GENMASK(15, 0)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #define CPPI5_BUFINFO1_HDESC_DATA_LEN_SHIFT	(0)
113*4882a593Smuzhiyun #define CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK	GENMASK(27, 0)
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #define CPPI5_OBUFINFO0_HDESC_BUF_LEN_SHIFT	(0)
116*4882a593Smuzhiyun #define CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK	GENMASK(27, 0)
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /**
119*4882a593Smuzhiyun  * struct cppi5_desc_epib_t - Host Packet Descriptor Extended Packet Info Block
120*4882a593Smuzhiyun  * @timestamp:		word 0: application specific timestamp
121*4882a593Smuzhiyun  * @sw_info0:		word 1: Software Info 0
122*4882a593Smuzhiyun  * @sw_info1:		word 1: Software Info 1
123*4882a593Smuzhiyun  * @sw_info2:		word 1: Software Info 2
124*4882a593Smuzhiyun  */
125*4882a593Smuzhiyun struct cppi5_desc_epib_t {
126*4882a593Smuzhiyun 	u32 timestamp;	/* w0: application specific timestamp */
127*4882a593Smuzhiyun 	u32 sw_info0;	/* w1: Software Info 0 */
128*4882a593Smuzhiyun 	u32 sw_info1;	/* w2: Software Info 1 */
129*4882a593Smuzhiyun 	u32 sw_info2;	/* w3: Software Info 2 */
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /**
133*4882a593Smuzhiyun  * struct cppi5_monolithic_desc_t - Monolithic-mode packet descriptor
134*4882a593Smuzhiyun  * @hdr:		Descriptor header
135*4882a593Smuzhiyun  * @epib[0]:		Extended Packet Info Data (optional, 4 words), and/or
136*4882a593Smuzhiyun  *			Protocol Specific Data (optional, 0-128 bytes in
137*4882a593Smuzhiyun  *			multiples of 4), and/or
138*4882a593Smuzhiyun  *			Other Software Data (0-N bytes, optional)
139*4882a593Smuzhiyun  */
140*4882a593Smuzhiyun struct cppi5_monolithic_desc_t {
141*4882a593Smuzhiyun 	struct cppi5_desc_hdr_t hdr;
142*4882a593Smuzhiyun 	u32 epib[];
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define CPPI5_INFO2_MDESC_DATA_OFFSET_SHIFT	(18U)
146*4882a593Smuzhiyun #define CPPI5_INFO2_MDESC_DATA_OFFSET_MASK	GENMASK(26, 18)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*
149*4882a593Smuzhiyun  * Reload Count:
150*4882a593Smuzhiyun  * 0 = Finish the packet and place the descriptor back on the return queue
151*4882a593Smuzhiyun  * 1-0x1ff = Vector to the Reload Index and resume processing
152*4882a593Smuzhiyun  * 0x1ff indicates perpetual loop, infinite reload until the channel is stopped
153*4882a593Smuzhiyun  */
154*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDCNT_SHIFT		(20U)
155*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDCNT_MASK		GENMASK(28, 20)
156*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDCNT_MAX		(0x1ff)
157*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDCNT_INFINITE	CPPI5_INFO0_TRDESC_RLDCNT_MAX
158*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDIDX_SHIFT		(14U)
159*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDIDX_MASK		GENMASK(19, 14)
160*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_RLDIDX_MAX		(0x3f)
161*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_LASTIDX_SHIFT	(0)
162*4882a593Smuzhiyun #define CPPI5_INFO0_TRDESC_LASTIDX_MASK		GENMASK(13, 0)
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #define CPPI5_INFO1_TRDESC_RECSIZE_SHIFT	(24U)
165*4882a593Smuzhiyun #define CPPI5_INFO1_TRDESC_RECSIZE_MASK		GENMASK(26, 24)
166*4882a593Smuzhiyun #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_16B	(0)
167*4882a593Smuzhiyun #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_32B	(1U)
168*4882a593Smuzhiyun #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_64B	(2U)
169*4882a593Smuzhiyun #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_128B	(3U)
170*4882a593Smuzhiyun 
cppi5_desc_dump(void * desc,u32 size)171*4882a593Smuzhiyun static inline void cppi5_desc_dump(void *desc, u32 size)
172*4882a593Smuzhiyun {
173*4882a593Smuzhiyun 	print_hex_dump(KERN_ERR, "dump udmap_desc: ", DUMP_PREFIX_NONE,
174*4882a593Smuzhiyun 		       32, 4, desc, size, false);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #define CPPI5_TDCM_MARKER			(0x1)
178*4882a593Smuzhiyun /**
179*4882a593Smuzhiyun  * cppi5_desc_is_tdcm - check if the paddr indicates Teardown Complete Message
180*4882a593Smuzhiyun  * @paddr: Physical address of the packet popped from the ring
181*4882a593Smuzhiyun  *
182*4882a593Smuzhiyun  * Returns true if the address indicates TDCM
183*4882a593Smuzhiyun  */
cppi5_desc_is_tdcm(dma_addr_t paddr)184*4882a593Smuzhiyun static inline bool cppi5_desc_is_tdcm(dma_addr_t paddr)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	return (paddr & CPPI5_TDCM_MARKER) ? true : false;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun /**
190*4882a593Smuzhiyun  * cppi5_desc_get_type - get descriptor type
191*4882a593Smuzhiyun  * @desc_hdr: packet descriptor/TR header
192*4882a593Smuzhiyun  *
193*4882a593Smuzhiyun  * Returns descriptor type:
194*4882a593Smuzhiyun  * CPPI5_INFO0_DESC_TYPE_VAL_HOST
195*4882a593Smuzhiyun  * CPPI5_INFO0_DESC_TYPE_VAL_MONO
196*4882a593Smuzhiyun  * CPPI5_INFO0_DESC_TYPE_VAL_TR
197*4882a593Smuzhiyun  */
cppi5_desc_get_type(struct cppi5_desc_hdr_t * desc_hdr)198*4882a593Smuzhiyun static inline u32 cppi5_desc_get_type(struct cppi5_desc_hdr_t *desc_hdr)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	return (desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_TYPE_MASK) >>
201*4882a593Smuzhiyun 		CPPI5_INFO0_HDESC_TYPE_SHIFT;
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /**
205*4882a593Smuzhiyun  * cppi5_desc_get_errflags - get Error Flags from Desc
206*4882a593Smuzhiyun  * @desc_hdr: packet/TR descriptor header
207*4882a593Smuzhiyun  *
208*4882a593Smuzhiyun  * Returns Error Flags from Packet/TR Descriptor
209*4882a593Smuzhiyun  */
cppi5_desc_get_errflags(struct cppi5_desc_hdr_t * desc_hdr)210*4882a593Smuzhiyun static inline u32 cppi5_desc_get_errflags(struct cppi5_desc_hdr_t *desc_hdr)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun 	return (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTERROR_MASK) >>
213*4882a593Smuzhiyun 		CPPI5_INFO1_DESC_PKTERROR_SHIFT;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /**
217*4882a593Smuzhiyun  * cppi5_desc_get_pktids - get Packet and Flow ids from Desc
218*4882a593Smuzhiyun  * @desc_hdr: packet/TR descriptor header
219*4882a593Smuzhiyun  * @pkt_id: Packet ID
220*4882a593Smuzhiyun  * @flow_id: Flow ID
221*4882a593Smuzhiyun  *
222*4882a593Smuzhiyun  * Returns Packet and Flow ids from packet/TR descriptor
223*4882a593Smuzhiyun  */
cppi5_desc_get_pktids(struct cppi5_desc_hdr_t * desc_hdr,u32 * pkt_id,u32 * flow_id)224*4882a593Smuzhiyun static inline void cppi5_desc_get_pktids(struct cppi5_desc_hdr_t *desc_hdr,
225*4882a593Smuzhiyun 					 u32 *pkt_id, u32 *flow_id)
226*4882a593Smuzhiyun {
227*4882a593Smuzhiyun 	*pkt_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTID_MASK) >>
228*4882a593Smuzhiyun 		   CPPI5_INFO1_DESC_PKTID_SHIFT;
229*4882a593Smuzhiyun 	*flow_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_FLOWID_MASK) >>
230*4882a593Smuzhiyun 		    CPPI5_INFO1_DESC_FLOWID_SHIFT;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /**
234*4882a593Smuzhiyun  * cppi5_desc_set_pktids - set Packet and Flow ids in Desc
235*4882a593Smuzhiyun  * @desc_hdr: packet/TR descriptor header
236*4882a593Smuzhiyun  * @pkt_id: Packet ID
237*4882a593Smuzhiyun  * @flow_id: Flow ID
238*4882a593Smuzhiyun  */
cppi5_desc_set_pktids(struct cppi5_desc_hdr_t * desc_hdr,u32 pkt_id,u32 flow_id)239*4882a593Smuzhiyun static inline void cppi5_desc_set_pktids(struct cppi5_desc_hdr_t *desc_hdr,
240*4882a593Smuzhiyun 					 u32 pkt_id, u32 flow_id)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun 	desc_hdr->pkt_info1 &= ~(CPPI5_INFO1_DESC_PKTID_MASK |
243*4882a593Smuzhiyun 				 CPPI5_INFO1_DESC_FLOWID_MASK);
244*4882a593Smuzhiyun 	desc_hdr->pkt_info1 |= (pkt_id << CPPI5_INFO1_DESC_PKTID_SHIFT) &
245*4882a593Smuzhiyun 				CPPI5_INFO1_DESC_PKTID_MASK;
246*4882a593Smuzhiyun 	desc_hdr->pkt_info1 |= (flow_id << CPPI5_INFO1_DESC_FLOWID_SHIFT) &
247*4882a593Smuzhiyun 				CPPI5_INFO1_DESC_FLOWID_MASK;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun /**
251*4882a593Smuzhiyun  * cppi5_desc_set_retpolicy - set Packet Return Policy in Desc
252*4882a593Smuzhiyun  * @desc_hdr: packet/TR descriptor header
253*4882a593Smuzhiyun  * @flags: fags, supported values
254*4882a593Smuzhiyun  *  CPPI5_INFO2_HDESC_RETPOLICY
255*4882a593Smuzhiyun  *  CPPI5_INFO2_HDESC_EARLYRET
256*4882a593Smuzhiyun  *  CPPI5_INFO2_DESC_RETPUSHPOLICY
257*4882a593Smuzhiyun  * @return_ring_id: Packet Return Queue/Ring id, value 0xFFFF reserved
258*4882a593Smuzhiyun  */
cppi5_desc_set_retpolicy(struct cppi5_desc_hdr_t * desc_hdr,u32 flags,u32 return_ring_id)259*4882a593Smuzhiyun static inline void cppi5_desc_set_retpolicy(struct cppi5_desc_hdr_t *desc_hdr,
260*4882a593Smuzhiyun 					    u32 flags, u32 return_ring_id)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	desc_hdr->pkt_info2 &= ~(CPPI5_INFO2_DESC_RETP_MASK |
263*4882a593Smuzhiyun 				 CPPI5_INFO2_DESC_RETQ_MASK);
264*4882a593Smuzhiyun 	desc_hdr->pkt_info2 |= flags & CPPI5_INFO2_DESC_RETP_MASK;
265*4882a593Smuzhiyun 	desc_hdr->pkt_info2 |= return_ring_id & CPPI5_INFO2_DESC_RETQ_MASK;
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /**
269*4882a593Smuzhiyun  * cppi5_desc_get_tags_ids - get Packet Src/Dst Tags from Desc
270*4882a593Smuzhiyun  * @desc_hdr: packet/TR descriptor header
271*4882a593Smuzhiyun  * @src_tag_id: Source Tag
272*4882a593Smuzhiyun  * @dst_tag_id: Dest Tag
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * Returns Packet Src/Dst Tags from packet/TR descriptor
275*4882a593Smuzhiyun  */
cppi5_desc_get_tags_ids(struct cppi5_desc_hdr_t * desc_hdr,u32 * src_tag_id,u32 * dst_tag_id)276*4882a593Smuzhiyun static inline void cppi5_desc_get_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
277*4882a593Smuzhiyun 					   u32 *src_tag_id, u32 *dst_tag_id)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun 	if (src_tag_id)
280*4882a593Smuzhiyun 		*src_tag_id = (desc_hdr->src_dst_tag &
281*4882a593Smuzhiyun 			      CPPI5_INFO3_DESC_SRCTAG_MASK) >>
282*4882a593Smuzhiyun 			      CPPI5_INFO3_DESC_SRCTAG_SHIFT;
283*4882a593Smuzhiyun 	if (dst_tag_id)
284*4882a593Smuzhiyun 		*dst_tag_id = desc_hdr->src_dst_tag &
285*4882a593Smuzhiyun 			      CPPI5_INFO3_DESC_DSTTAG_MASK;
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun /**
289*4882a593Smuzhiyun  * cppi5_desc_set_tags_ids - set Packet Src/Dst Tags in HDesc
290*4882a593Smuzhiyun  * @desc_hdr: packet/TR descriptor header
291*4882a593Smuzhiyun  * @src_tag_id: Source Tag
292*4882a593Smuzhiyun  * @dst_tag_id: Dest Tag
293*4882a593Smuzhiyun  *
294*4882a593Smuzhiyun  * Returns Packet Src/Dst Tags from packet/TR descriptor
295*4882a593Smuzhiyun  */
cppi5_desc_set_tags_ids(struct cppi5_desc_hdr_t * desc_hdr,u32 src_tag_id,u32 dst_tag_id)296*4882a593Smuzhiyun static inline void cppi5_desc_set_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
297*4882a593Smuzhiyun 					   u32 src_tag_id, u32 dst_tag_id)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun 	desc_hdr->src_dst_tag = (src_tag_id << CPPI5_INFO3_DESC_SRCTAG_SHIFT) &
300*4882a593Smuzhiyun 				CPPI5_INFO3_DESC_SRCTAG_MASK;
301*4882a593Smuzhiyun 	desc_hdr->src_dst_tag |= dst_tag_id & CPPI5_INFO3_DESC_DSTTAG_MASK;
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun /**
305*4882a593Smuzhiyun  * cppi5_hdesc_calc_size - Calculate Host Packet Descriptor size
306*4882a593Smuzhiyun  * @epib: is EPIB present
307*4882a593Smuzhiyun  * @psdata_size: PSDATA size
308*4882a593Smuzhiyun  * @sw_data_size: SWDATA size
309*4882a593Smuzhiyun  *
310*4882a593Smuzhiyun  * Returns required Host Packet Descriptor size
311*4882a593Smuzhiyun  * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
312*4882a593Smuzhiyun  */
cppi5_hdesc_calc_size(bool epib,u32 psdata_size,u32 sw_data_size)313*4882a593Smuzhiyun static inline u32 cppi5_hdesc_calc_size(bool epib, u32 psdata_size,
314*4882a593Smuzhiyun 					u32 sw_data_size)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun 	u32 desc_size;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	if (psdata_size > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE)
319*4882a593Smuzhiyun 		return 0;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	desc_size = sizeof(struct cppi5_host_desc_t) + psdata_size +
322*4882a593Smuzhiyun 		    sw_data_size;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	if (epib)
325*4882a593Smuzhiyun 		desc_size += CPPI5_INFO0_HDESC_EPIB_SIZE;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	return ALIGN(desc_size, CPPI5_DESC_MIN_ALIGN);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /**
331*4882a593Smuzhiyun  * cppi5_hdesc_init - Init Host Packet Descriptor size
332*4882a593Smuzhiyun  * @desc: Host packet descriptor
333*4882a593Smuzhiyun  * @flags: supported values
334*4882a593Smuzhiyun  *	CPPI5_INFO0_HDESC_EPIB_PRESENT
335*4882a593Smuzhiyun  *	CPPI5_INFO0_HDESC_PSINFO_LOCATION
336*4882a593Smuzhiyun  * @psdata_size: PSDATA size
337*4882a593Smuzhiyun  *
338*4882a593Smuzhiyun  * Returns required Host Packet Descriptor size
339*4882a593Smuzhiyun  * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
340*4882a593Smuzhiyun  */
cppi5_hdesc_init(struct cppi5_host_desc_t * desc,u32 flags,u32 psdata_size)341*4882a593Smuzhiyun static inline void cppi5_hdesc_init(struct cppi5_host_desc_t *desc, u32 flags,
342*4882a593Smuzhiyun 				    u32 psdata_size)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun 	desc->hdr.pkt_info0 = (CPPI5_INFO0_DESC_TYPE_VAL_HOST <<
345*4882a593Smuzhiyun 			       CPPI5_INFO0_HDESC_TYPE_SHIFT) | (flags);
346*4882a593Smuzhiyun 	desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
347*4882a593Smuzhiyun 				CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
348*4882a593Smuzhiyun 				CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
349*4882a593Smuzhiyun 	desc->next_desc = 0;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun /**
353*4882a593Smuzhiyun  * cppi5_hdesc_update_flags - Replace descriptor flags
354*4882a593Smuzhiyun  * @desc: Host packet descriptor
355*4882a593Smuzhiyun  * @flags: supported values
356*4882a593Smuzhiyun  *	CPPI5_INFO0_HDESC_EPIB_PRESENT
357*4882a593Smuzhiyun  *	CPPI5_INFO0_HDESC_PSINFO_LOCATION
358*4882a593Smuzhiyun  */
cppi5_hdesc_update_flags(struct cppi5_host_desc_t * desc,u32 flags)359*4882a593Smuzhiyun static inline void cppi5_hdesc_update_flags(struct cppi5_host_desc_t *desc,
360*4882a593Smuzhiyun 					    u32 flags)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun 	desc->hdr.pkt_info0 &= ~(CPPI5_INFO0_HDESC_EPIB_PRESENT |
363*4882a593Smuzhiyun 				 CPPI5_INFO0_HDESC_PSINFO_LOCATION);
364*4882a593Smuzhiyun 	desc->hdr.pkt_info0 |= flags;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun /**
368*4882a593Smuzhiyun  * cppi5_hdesc_update_psdata_size - Replace PSdata size
369*4882a593Smuzhiyun  * @desc: Host packet descriptor
370*4882a593Smuzhiyun  * @psdata_size: PSDATA size
371*4882a593Smuzhiyun  */
372*4882a593Smuzhiyun static inline void
cppi5_hdesc_update_psdata_size(struct cppi5_host_desc_t * desc,u32 psdata_size)373*4882a593Smuzhiyun cppi5_hdesc_update_psdata_size(struct cppi5_host_desc_t *desc, u32 psdata_size)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun 	desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
376*4882a593Smuzhiyun 	desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
377*4882a593Smuzhiyun 				CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
378*4882a593Smuzhiyun 				CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun /**
382*4882a593Smuzhiyun  * cppi5_hdesc_get_psdata_size - get PSdata size in bytes
383*4882a593Smuzhiyun  * @desc: Host packet descriptor
384*4882a593Smuzhiyun  */
cppi5_hdesc_get_psdata_size(struct cppi5_host_desc_t * desc)385*4882a593Smuzhiyun static inline u32 cppi5_hdesc_get_psdata_size(struct cppi5_host_desc_t *desc)
386*4882a593Smuzhiyun {
387*4882a593Smuzhiyun 	u32 psdata_size = 0;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
390*4882a593Smuzhiyun 		psdata_size = (desc->hdr.pkt_info0 &
391*4882a593Smuzhiyun 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
392*4882a593Smuzhiyun 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	return (psdata_size << 2);
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun /**
398*4882a593Smuzhiyun  * cppi5_hdesc_get_pktlen - get Packet Length from HDesc
399*4882a593Smuzhiyun  * @desc: Host packet descriptor
400*4882a593Smuzhiyun  *
401*4882a593Smuzhiyun  * Returns Packet Length from Host Packet Descriptor
402*4882a593Smuzhiyun  */
cppi5_hdesc_get_pktlen(struct cppi5_host_desc_t * desc)403*4882a593Smuzhiyun static inline u32 cppi5_hdesc_get_pktlen(struct cppi5_host_desc_t *desc)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun 	return (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PKTLEN_MASK);
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun /**
409*4882a593Smuzhiyun  * cppi5_hdesc_set_pktlen - set Packet Length in HDesc
410*4882a593Smuzhiyun  * @desc: Host packet descriptor
411*4882a593Smuzhiyun  */
cppi5_hdesc_set_pktlen(struct cppi5_host_desc_t * desc,u32 pkt_len)412*4882a593Smuzhiyun static inline void cppi5_hdesc_set_pktlen(struct cppi5_host_desc_t *desc,
413*4882a593Smuzhiyun 					  u32 pkt_len)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun 	desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PKTLEN_MASK;
416*4882a593Smuzhiyun 	desc->hdr.pkt_info0 |= (pkt_len & CPPI5_INFO0_HDESC_PKTLEN_MASK);
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun /**
420*4882a593Smuzhiyun  * cppi5_hdesc_get_psflags - get Protocol Specific Flags from HDesc
421*4882a593Smuzhiyun  * @desc: Host packet descriptor
422*4882a593Smuzhiyun  *
423*4882a593Smuzhiyun  * Returns Protocol Specific Flags from Host Packet Descriptor
424*4882a593Smuzhiyun  */
cppi5_hdesc_get_psflags(struct cppi5_host_desc_t * desc)425*4882a593Smuzhiyun static inline u32 cppi5_hdesc_get_psflags(struct cppi5_host_desc_t *desc)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun 	return (desc->hdr.pkt_info1 & CPPI5_INFO1_HDESC_PSFLGS_MASK) >>
428*4882a593Smuzhiyun 		CPPI5_INFO1_HDESC_PSFLGS_SHIFT;
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun /**
432*4882a593Smuzhiyun  * cppi5_hdesc_set_psflags - set Protocol Specific Flags in HDesc
433*4882a593Smuzhiyun  * @desc: Host packet descriptor
434*4882a593Smuzhiyun  */
cppi5_hdesc_set_psflags(struct cppi5_host_desc_t * desc,u32 ps_flags)435*4882a593Smuzhiyun static inline void cppi5_hdesc_set_psflags(struct cppi5_host_desc_t *desc,
436*4882a593Smuzhiyun 					   u32 ps_flags)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun 	desc->hdr.pkt_info1 &= ~CPPI5_INFO1_HDESC_PSFLGS_MASK;
439*4882a593Smuzhiyun 	desc->hdr.pkt_info1 |= (ps_flags <<
440*4882a593Smuzhiyun 				CPPI5_INFO1_HDESC_PSFLGS_SHIFT) &
441*4882a593Smuzhiyun 				CPPI5_INFO1_HDESC_PSFLGS_MASK;
442*4882a593Smuzhiyun }
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /**
445*4882a593Smuzhiyun  * cppi5_hdesc_get_errflags - get Packet Type from HDesc
446*4882a593Smuzhiyun  * @desc: Host packet descriptor
447*4882a593Smuzhiyun  */
cppi5_hdesc_get_pkttype(struct cppi5_host_desc_t * desc)448*4882a593Smuzhiyun static inline u32 cppi5_hdesc_get_pkttype(struct cppi5_host_desc_t *desc)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun 	return (desc->hdr.pkt_info2 & CPPI5_INFO2_HDESC_PKTTYPE_MASK) >>
451*4882a593Smuzhiyun 		CPPI5_INFO2_HDESC_PKTTYPE_SHIFT;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun /**
455*4882a593Smuzhiyun  * cppi5_hdesc_get_errflags - set Packet Type in HDesc
456*4882a593Smuzhiyun  * @desc: Host packet descriptor
457*4882a593Smuzhiyun  * @pkt_type: Packet Type
458*4882a593Smuzhiyun  */
cppi5_hdesc_set_pkttype(struct cppi5_host_desc_t * desc,u32 pkt_type)459*4882a593Smuzhiyun static inline void cppi5_hdesc_set_pkttype(struct cppi5_host_desc_t *desc,
460*4882a593Smuzhiyun 					   u32 pkt_type)
461*4882a593Smuzhiyun {
462*4882a593Smuzhiyun 	desc->hdr.pkt_info2 &= ~CPPI5_INFO2_HDESC_PKTTYPE_MASK;
463*4882a593Smuzhiyun 	desc->hdr.pkt_info2 |=
464*4882a593Smuzhiyun 			(pkt_type << CPPI5_INFO2_HDESC_PKTTYPE_SHIFT) &
465*4882a593Smuzhiyun 			 CPPI5_INFO2_HDESC_PKTTYPE_MASK;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun /**
469*4882a593Smuzhiyun  * cppi5_hdesc_attach_buf - attach buffer to HDesc
470*4882a593Smuzhiyun  * @desc: Host packet descriptor
471*4882a593Smuzhiyun  * @buf: Buffer physical address
472*4882a593Smuzhiyun  * @buf_data_len: Buffer length
473*4882a593Smuzhiyun  * @obuf: Original Buffer physical address
474*4882a593Smuzhiyun  * @obuf_len: Original Buffer length
475*4882a593Smuzhiyun  *
476*4882a593Smuzhiyun  * Attaches buffer to Host Packet Descriptor
477*4882a593Smuzhiyun  */
cppi5_hdesc_attach_buf(struct cppi5_host_desc_t * desc,dma_addr_t buf,u32 buf_data_len,dma_addr_t obuf,u32 obuf_len)478*4882a593Smuzhiyun static inline void cppi5_hdesc_attach_buf(struct cppi5_host_desc_t *desc,
479*4882a593Smuzhiyun 					  dma_addr_t buf, u32 buf_data_len,
480*4882a593Smuzhiyun 					  dma_addr_t obuf, u32 obuf_len)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun 	desc->buf_ptr = buf;
483*4882a593Smuzhiyun 	desc->buf_info1 = buf_data_len & CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK;
484*4882a593Smuzhiyun 	desc->org_buf_ptr = obuf;
485*4882a593Smuzhiyun 	desc->org_buf_len = obuf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun 
cppi5_hdesc_get_obuf(struct cppi5_host_desc_t * desc,dma_addr_t * obuf,u32 * obuf_len)488*4882a593Smuzhiyun static inline void cppi5_hdesc_get_obuf(struct cppi5_host_desc_t *desc,
489*4882a593Smuzhiyun 					dma_addr_t *obuf, u32 *obuf_len)
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun 	*obuf = desc->org_buf_ptr;
492*4882a593Smuzhiyun 	*obuf_len = desc->org_buf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun 
cppi5_hdesc_reset_to_original(struct cppi5_host_desc_t * desc)495*4882a593Smuzhiyun static inline void cppi5_hdesc_reset_to_original(struct cppi5_host_desc_t *desc)
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun 	desc->buf_ptr = desc->org_buf_ptr;
498*4882a593Smuzhiyun 	desc->buf_info1 = desc->org_buf_len;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun /**
502*4882a593Smuzhiyun  * cppi5_hdesc_link_hbdesc - link Host Buffer Descriptor to HDesc
503*4882a593Smuzhiyun  * @desc: Host Packet Descriptor
504*4882a593Smuzhiyun  * @buf_desc: Host Buffer Descriptor physical address
505*4882a593Smuzhiyun  *
506*4882a593Smuzhiyun  * add and link Host Buffer Descriptor to HDesc
507*4882a593Smuzhiyun  */
cppi5_hdesc_link_hbdesc(struct cppi5_host_desc_t * desc,dma_addr_t hbuf_desc)508*4882a593Smuzhiyun static inline void cppi5_hdesc_link_hbdesc(struct cppi5_host_desc_t *desc,
509*4882a593Smuzhiyun 					   dma_addr_t hbuf_desc)
510*4882a593Smuzhiyun {
511*4882a593Smuzhiyun 	desc->next_desc = hbuf_desc;
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun static inline dma_addr_t
cppi5_hdesc_get_next_hbdesc(struct cppi5_host_desc_t * desc)515*4882a593Smuzhiyun cppi5_hdesc_get_next_hbdesc(struct cppi5_host_desc_t *desc)
516*4882a593Smuzhiyun {
517*4882a593Smuzhiyun 	return (dma_addr_t)desc->next_desc;
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun 
cppi5_hdesc_reset_hbdesc(struct cppi5_host_desc_t * desc)520*4882a593Smuzhiyun static inline void cppi5_hdesc_reset_hbdesc(struct cppi5_host_desc_t *desc)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun 	desc->hdr = (struct cppi5_desc_hdr_t) { 0 };
523*4882a593Smuzhiyun 	desc->next_desc = 0;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun /**
527*4882a593Smuzhiyun  * cppi5_hdesc_epib_present -  check if EPIB present
528*4882a593Smuzhiyun  * @desc_hdr: packet descriptor/TR header
529*4882a593Smuzhiyun  *
530*4882a593Smuzhiyun  * Returns true if EPIB present in the packet
531*4882a593Smuzhiyun  */
cppi5_hdesc_epib_present(struct cppi5_desc_hdr_t * desc_hdr)532*4882a593Smuzhiyun static inline bool cppi5_hdesc_epib_present(struct cppi5_desc_hdr_t *desc_hdr)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	return !!(desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_EPIB_PRESENT);
535*4882a593Smuzhiyun }
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun /**
538*4882a593Smuzhiyun  * cppi5_hdesc_get_psdata -  Get pointer on PSDATA
539*4882a593Smuzhiyun  * @desc: Host packet descriptor
540*4882a593Smuzhiyun  *
541*4882a593Smuzhiyun  * Returns pointer on PSDATA in HDesc.
542*4882a593Smuzhiyun  * NULL - if ps_data placed at the start of data buffer.
543*4882a593Smuzhiyun  */
cppi5_hdesc_get_psdata(struct cppi5_host_desc_t * desc)544*4882a593Smuzhiyun static inline void *cppi5_hdesc_get_psdata(struct cppi5_host_desc_t *desc)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun 	u32 psdata_size;
547*4882a593Smuzhiyun 	void *psdata;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	if (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION)
550*4882a593Smuzhiyun 		return NULL;
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	psdata_size = (desc->hdr.pkt_info0 &
553*4882a593Smuzhiyun 		       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
554*4882a593Smuzhiyun 		       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 	if (!psdata_size)
557*4882a593Smuzhiyun 		return NULL;
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 	psdata = &desc->epib;
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	if (cppi5_hdesc_epib_present(&desc->hdr))
562*4882a593Smuzhiyun 		psdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	return psdata;
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun /**
568*4882a593Smuzhiyun  * cppi5_hdesc_get_swdata -  Get pointer on swdata
569*4882a593Smuzhiyun  * @desc: Host packet descriptor
570*4882a593Smuzhiyun  *
571*4882a593Smuzhiyun  * Returns pointer on SWDATA in HDesc.
572*4882a593Smuzhiyun  * NOTE. It's caller responsibility to be sure hdesc actually has swdata.
573*4882a593Smuzhiyun  */
cppi5_hdesc_get_swdata(struct cppi5_host_desc_t * desc)574*4882a593Smuzhiyun static inline void *cppi5_hdesc_get_swdata(struct cppi5_host_desc_t *desc)
575*4882a593Smuzhiyun {
576*4882a593Smuzhiyun 	u32 psdata_size = 0;
577*4882a593Smuzhiyun 	void *swdata;
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
580*4882a593Smuzhiyun 		psdata_size = (desc->hdr.pkt_info0 &
581*4882a593Smuzhiyun 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
582*4882a593Smuzhiyun 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 	swdata = &desc->epib;
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun 	if (cppi5_hdesc_epib_present(&desc->hdr))
587*4882a593Smuzhiyun 		swdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	swdata += (psdata_size << 2);
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun 	return swdata;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun /* ================================== TR ================================== */
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun #define CPPI5_TR_TYPE_SHIFT			(0U)
597*4882a593Smuzhiyun #define CPPI5_TR_TYPE_MASK			GENMASK(3, 0)
598*4882a593Smuzhiyun #define CPPI5_TR_STATIC				BIT(4)
599*4882a593Smuzhiyun #define CPPI5_TR_WAIT				BIT(5)
600*4882a593Smuzhiyun #define CPPI5_TR_EVENT_SIZE_SHIFT		(6U)
601*4882a593Smuzhiyun #define CPPI5_TR_EVENT_SIZE_MASK		GENMASK(7, 6)
602*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER0_SHIFT			(8U)
603*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER0_MASK			GENMASK(9, 8)
604*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER0_TYPE_SHIFT		(10U)
605*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER0_TYPE_MASK		GENMASK(11, 10)
606*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER1_SHIFT			(12U)
607*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER1_MASK			GENMASK(13, 12)
608*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER1_TYPE_SHIFT		(14U)
609*4882a593Smuzhiyun #define CPPI5_TR_TRIGGER1_TYPE_MASK		GENMASK(15, 14)
610*4882a593Smuzhiyun #define CPPI5_TR_CMD_ID_SHIFT			(16U)
611*4882a593Smuzhiyun #define CPPI5_TR_CMD_ID_MASK			GENMASK(23, 16)
612*4882a593Smuzhiyun #define CPPI5_TR_CSF_FLAGS_SHIFT		(24U)
613*4882a593Smuzhiyun #define CPPI5_TR_CSF_FLAGS_MASK			GENMASK(31, 24)
614*4882a593Smuzhiyun #define   CPPI5_TR_CSF_SA_INDIRECT		BIT(0)
615*4882a593Smuzhiyun #define   CPPI5_TR_CSF_DA_INDIRECT		BIT(1)
616*4882a593Smuzhiyun #define   CPPI5_TR_CSF_SUPR_EVT			BIT(2)
617*4882a593Smuzhiyun #define   CPPI5_TR_CSF_EOL_ADV_SHIFT		(4U)
618*4882a593Smuzhiyun #define   CPPI5_TR_CSF_EOL_ADV_MASK		GENMASK(6, 4)
619*4882a593Smuzhiyun #define   CPPI5_TR_CSF_EOP			BIT(7)
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun /**
622*4882a593Smuzhiyun  * enum cppi5_tr_types - TR types
623*4882a593Smuzhiyun  * @CPPI5_TR_TYPE0:	One dimensional data move
624*4882a593Smuzhiyun  * @CPPI5_TR_TYPE1:	Two dimensional data move
625*4882a593Smuzhiyun  * @CPPI5_TR_TYPE2:	Three dimensional data move
626*4882a593Smuzhiyun  * @CPPI5_TR_TYPE3:	Four dimensional data move
627*4882a593Smuzhiyun  * @CPPI5_TR_TYPE4:	Four dimensional data move with data formatting
628*4882a593Smuzhiyun  * @CPPI5_TR_TYPE5:	Four dimensional Cache Warm
629*4882a593Smuzhiyun  * @CPPI5_TR_TYPE8:	Four Dimensional Block Move
630*4882a593Smuzhiyun  * @CPPI5_TR_TYPE9:	Four Dimensional Block Move with Repacking
631*4882a593Smuzhiyun  * @CPPI5_TR_TYPE10:	Two Dimensional Block Move
632*4882a593Smuzhiyun  * @CPPI5_TR_TYPE11:	Two Dimensional Block Move with Repacking
633*4882a593Smuzhiyun  * @CPPI5_TR_TYPE15:	Four Dimensional Block Move with Repacking and
634*4882a593Smuzhiyun  *			Indirection
635*4882a593Smuzhiyun  */
636*4882a593Smuzhiyun enum cppi5_tr_types {
637*4882a593Smuzhiyun 	CPPI5_TR_TYPE0 = 0,
638*4882a593Smuzhiyun 	CPPI5_TR_TYPE1,
639*4882a593Smuzhiyun 	CPPI5_TR_TYPE2,
640*4882a593Smuzhiyun 	CPPI5_TR_TYPE3,
641*4882a593Smuzhiyun 	CPPI5_TR_TYPE4,
642*4882a593Smuzhiyun 	CPPI5_TR_TYPE5,
643*4882a593Smuzhiyun 	/* type6-7: Reserved */
644*4882a593Smuzhiyun 	CPPI5_TR_TYPE8 = 8,
645*4882a593Smuzhiyun 	CPPI5_TR_TYPE9,
646*4882a593Smuzhiyun 	CPPI5_TR_TYPE10,
647*4882a593Smuzhiyun 	CPPI5_TR_TYPE11,
648*4882a593Smuzhiyun 	/* type12-14: Reserved */
649*4882a593Smuzhiyun 	CPPI5_TR_TYPE15 = 15,
650*4882a593Smuzhiyun 	CPPI5_TR_TYPE_MAX
651*4882a593Smuzhiyun };
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun /**
654*4882a593Smuzhiyun  * enum cppi5_tr_event_size - TR Flags EVENT_SIZE field specifies when an event
655*4882a593Smuzhiyun  *			      is generated for each TR.
656*4882a593Smuzhiyun  * @CPPI5_TR_EVENT_SIZE_COMPLETION:	When TR is complete and all status for
657*4882a593Smuzhiyun  * 					the TR has been received
658*4882a593Smuzhiyun  * @CPPI5_TR_EVENT_SIZE_ICNT1_DEC:	Type 0: when the last data transaction
659*4882a593Smuzhiyun  *					is sent for the TR
660*4882a593Smuzhiyun  *					Type 1-11: when ICNT1 is decremented
661*4882a593Smuzhiyun  * @CPPI5_TR_EVENT_SIZE_ICNT2_DEC:	Type 0-1,10-11: when the last data
662*4882a593Smuzhiyun  *					transaction is sent for the TR
663*4882a593Smuzhiyun  *					All other types: when ICNT2 is
664*4882a593Smuzhiyun  *					decremented
665*4882a593Smuzhiyun  * @CPPI5_TR_EVENT_SIZE_ICNT3_DEC:	Type 0-2,10-11: when the last data
666*4882a593Smuzhiyun  *					transaction is sent for the TR
667*4882a593Smuzhiyun  *					All other types: when ICNT3 is
668*4882a593Smuzhiyun  *					decremented
669*4882a593Smuzhiyun  */
670*4882a593Smuzhiyun enum cppi5_tr_event_size {
671*4882a593Smuzhiyun 	CPPI5_TR_EVENT_SIZE_COMPLETION,
672*4882a593Smuzhiyun 	CPPI5_TR_EVENT_SIZE_ICNT1_DEC,
673*4882a593Smuzhiyun 	CPPI5_TR_EVENT_SIZE_ICNT2_DEC,
674*4882a593Smuzhiyun 	CPPI5_TR_EVENT_SIZE_ICNT3_DEC,
675*4882a593Smuzhiyun 	CPPI5_TR_EVENT_SIZE_MAX
676*4882a593Smuzhiyun };
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun /**
679*4882a593Smuzhiyun  * enum cppi5_tr_trigger - TR Flags TRIGGERx field specifies the type of trigger
680*4882a593Smuzhiyun  *			   used to enable the TR to transfer data as specified
681*4882a593Smuzhiyun  *			   by TRIGGERx_TYPE field.
682*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_NONE:		No trigger
683*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_GLOBAL0:		Global trigger 0
684*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_GLOBAL1:		Global trigger 1
685*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_LOCAL_EVENT:	Local Event
686*4882a593Smuzhiyun  */
687*4882a593Smuzhiyun enum cppi5_tr_trigger {
688*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_NONE,
689*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_GLOBAL0,
690*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_GLOBAL1,
691*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_LOCAL_EVENT,
692*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_MAX
693*4882a593Smuzhiyun };
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun /**
696*4882a593Smuzhiyun  * enum cppi5_tr_trigger_type - TR Flags TRIGGERx_TYPE field specifies the type
697*4882a593Smuzhiyun  *				of data transfer that will be enabled by
698*4882a593Smuzhiyun  *				receiving a trigger as specified by TRIGGERx.
699*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC:	The second inner most loop (ICNT1) will
700*4882a593Smuzhiyun  *					be decremented by 1
701*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC:	The third inner most loop (ICNT2) will
702*4882a593Smuzhiyun  *					be decremented by 1
703*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC:	The outer most loop (ICNT3) will be
704*4882a593Smuzhiyun  *					decremented by 1
705*4882a593Smuzhiyun  * @CPPI5_TR_TRIGGER_TYPE_ALL:		The entire TR will be allowed to
706*4882a593Smuzhiyun  *					complete
707*4882a593Smuzhiyun  */
708*4882a593Smuzhiyun enum cppi5_tr_trigger_type {
709*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC,
710*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC,
711*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC,
712*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_TYPE_ALL,
713*4882a593Smuzhiyun 	CPPI5_TR_TRIGGER_TYPE_MAX
714*4882a593Smuzhiyun };
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun typedef u32 cppi5_tr_flags_t;
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun /**
719*4882a593Smuzhiyun  * struct cppi5_tr_type0_t - Type 0 (One dimensional data move) TR (16 byte)
720*4882a593Smuzhiyun  * @flags:		TR flags (type, triggers, event, configuration)
721*4882a593Smuzhiyun  * @icnt0:		Total loop iteration count for level 0 (innermost)
722*4882a593Smuzhiyun  * @_reserved:		Not used
723*4882a593Smuzhiyun  * @addr:		Starting address for the source data or destination data
724*4882a593Smuzhiyun  */
725*4882a593Smuzhiyun struct cppi5_tr_type0_t {
726*4882a593Smuzhiyun 	cppi5_tr_flags_t flags;
727*4882a593Smuzhiyun 	u16 icnt0;
728*4882a593Smuzhiyun 	u16 _reserved;
729*4882a593Smuzhiyun 	u64 addr;
730*4882a593Smuzhiyun } __aligned(16) __packed;
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun /**
733*4882a593Smuzhiyun  * struct cppi5_tr_type1_t - Type 1 (Two dimensional data move) TR (32 byte)
734*4882a593Smuzhiyun  * @flags:		TR flags (type, triggers, event, configuration)
735*4882a593Smuzhiyun  * @icnt0:		Total loop iteration count for level 0 (innermost)
736*4882a593Smuzhiyun  * @icnt1:		Total loop iteration count for level 1
737*4882a593Smuzhiyun  * @addr:		Starting address for the source data or destination data
738*4882a593Smuzhiyun  * @dim1:		Signed dimension for loop level 1
739*4882a593Smuzhiyun  */
740*4882a593Smuzhiyun struct cppi5_tr_type1_t {
741*4882a593Smuzhiyun 	cppi5_tr_flags_t flags;
742*4882a593Smuzhiyun 	u16 icnt0;
743*4882a593Smuzhiyun 	u16 icnt1;
744*4882a593Smuzhiyun 	u64 addr;
745*4882a593Smuzhiyun 	s32 dim1;
746*4882a593Smuzhiyun } __aligned(32) __packed;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun /**
749*4882a593Smuzhiyun  * struct cppi5_tr_type2_t - Type 2 (Three dimensional data move) TR (32 byte)
750*4882a593Smuzhiyun  * @flags:		TR flags (type, triggers, event, configuration)
751*4882a593Smuzhiyun  * @icnt0:		Total loop iteration count for level 0 (innermost)
752*4882a593Smuzhiyun  * @icnt1:		Total loop iteration count for level 1
753*4882a593Smuzhiyun  * @addr:		Starting address for the source data or destination data
754*4882a593Smuzhiyun  * @dim1:		Signed dimension for loop level 1
755*4882a593Smuzhiyun  * @icnt2:		Total loop iteration count for level 2
756*4882a593Smuzhiyun  * @_reserved:		Not used
757*4882a593Smuzhiyun  * @dim2:		Signed dimension for loop level 2
758*4882a593Smuzhiyun  */
759*4882a593Smuzhiyun struct cppi5_tr_type2_t {
760*4882a593Smuzhiyun 	cppi5_tr_flags_t flags;
761*4882a593Smuzhiyun 	u16 icnt0;
762*4882a593Smuzhiyun 	u16 icnt1;
763*4882a593Smuzhiyun 	u64 addr;
764*4882a593Smuzhiyun 	s32 dim1;
765*4882a593Smuzhiyun 	u16 icnt2;
766*4882a593Smuzhiyun 	u16 _reserved;
767*4882a593Smuzhiyun 	s32 dim2;
768*4882a593Smuzhiyun } __aligned(32) __packed;
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun /**
771*4882a593Smuzhiyun  * struct cppi5_tr_type3_t - Type 3 (Four dimensional data move) TR (32 byte)
772*4882a593Smuzhiyun  * @flags:		TR flags (type, triggers, event, configuration)
773*4882a593Smuzhiyun  * @icnt0:		Total loop iteration count for level 0 (innermost)
774*4882a593Smuzhiyun  * @icnt1:		Total loop iteration count for level 1
775*4882a593Smuzhiyun  * @addr:		Starting address for the source data or destination data
776*4882a593Smuzhiyun  * @dim1:		Signed dimension for loop level 1
777*4882a593Smuzhiyun  * @icnt2:		Total loop iteration count for level 2
778*4882a593Smuzhiyun  * @icnt3:		Total loop iteration count for level 3 (outermost)
779*4882a593Smuzhiyun  * @dim2:		Signed dimension for loop level 2
780*4882a593Smuzhiyun  * @dim3:		Signed dimension for loop level 3
781*4882a593Smuzhiyun  */
782*4882a593Smuzhiyun struct cppi5_tr_type3_t {
783*4882a593Smuzhiyun 	cppi5_tr_flags_t flags;
784*4882a593Smuzhiyun 	u16 icnt0;
785*4882a593Smuzhiyun 	u16 icnt1;
786*4882a593Smuzhiyun 	u64 addr;
787*4882a593Smuzhiyun 	s32 dim1;
788*4882a593Smuzhiyun 	u16 icnt2;
789*4882a593Smuzhiyun 	u16 icnt3;
790*4882a593Smuzhiyun 	s32 dim2;
791*4882a593Smuzhiyun 	s32 dim3;
792*4882a593Smuzhiyun } __aligned(32) __packed;
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun /**
795*4882a593Smuzhiyun  * struct cppi5_tr_type15_t - Type 15 (Four Dimensional Block Copy with
796*4882a593Smuzhiyun  *			      Repacking and Indirection Support) TR (64 byte)
797*4882a593Smuzhiyun  * @flags:		TR flags (type, triggers, event, configuration)
798*4882a593Smuzhiyun  * @icnt0:		Total loop iteration count for level 0 (innermost) for
799*4882a593Smuzhiyun  *			source
800*4882a593Smuzhiyun  * @icnt1:		Total loop iteration count for level 1 for source
801*4882a593Smuzhiyun  * @addr:		Starting address for the source data
802*4882a593Smuzhiyun  * @dim1:		Signed dimension for loop level 1 for source
803*4882a593Smuzhiyun  * @icnt2:		Total loop iteration count for level 2 for source
804*4882a593Smuzhiyun  * @icnt3:		Total loop iteration count for level 3 (outermost) for
805*4882a593Smuzhiyun  *			source
806*4882a593Smuzhiyun  * @dim2:		Signed dimension for loop level 2 for source
807*4882a593Smuzhiyun  * @dim3:		Signed dimension for loop level 3 for source
808*4882a593Smuzhiyun  * @_reserved:		Not used
809*4882a593Smuzhiyun  * @ddim1:		Signed dimension for loop level 1 for destination
810*4882a593Smuzhiyun  * @daddr:		Starting address for the destination data
811*4882a593Smuzhiyun  * @ddim2:		Signed dimension for loop level 2 for destination
812*4882a593Smuzhiyun  * @ddim3:		Signed dimension for loop level 3 for destination
813*4882a593Smuzhiyun  * @dicnt0:		Total loop iteration count for level 0 (innermost) for
814*4882a593Smuzhiyun  *			destination
815*4882a593Smuzhiyun  * @dicnt1:		Total loop iteration count for level 1 for destination
816*4882a593Smuzhiyun  * @dicnt2:		Total loop iteration count for level 2 for destination
817*4882a593Smuzhiyun  * @sicnt3:		Total loop iteration count for level 3 (outermost) for
818*4882a593Smuzhiyun  *			destination
819*4882a593Smuzhiyun  */
820*4882a593Smuzhiyun struct cppi5_tr_type15_t {
821*4882a593Smuzhiyun 	cppi5_tr_flags_t flags;
822*4882a593Smuzhiyun 	u16 icnt0;
823*4882a593Smuzhiyun 	u16 icnt1;
824*4882a593Smuzhiyun 	u64 addr;
825*4882a593Smuzhiyun 	s32 dim1;
826*4882a593Smuzhiyun 	u16 icnt2;
827*4882a593Smuzhiyun 	u16 icnt3;
828*4882a593Smuzhiyun 	s32 dim2;
829*4882a593Smuzhiyun 	s32 dim3;
830*4882a593Smuzhiyun 	u32 _reserved;
831*4882a593Smuzhiyun 	s32 ddim1;
832*4882a593Smuzhiyun 	u64 daddr;
833*4882a593Smuzhiyun 	s32 ddim2;
834*4882a593Smuzhiyun 	s32 ddim3;
835*4882a593Smuzhiyun 	u16 dicnt0;
836*4882a593Smuzhiyun 	u16 dicnt1;
837*4882a593Smuzhiyun 	u16 dicnt2;
838*4882a593Smuzhiyun 	u16 dicnt3;
839*4882a593Smuzhiyun } __aligned(64) __packed;
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun /**
842*4882a593Smuzhiyun  * struct cppi5_tr_resp_t - TR response record
843*4882a593Smuzhiyun  * @status:		Status type and info
844*4882a593Smuzhiyun  * @_reserved:		Not used
845*4882a593Smuzhiyun  * @cmd_id:		Command ID for the TR for TR identification
846*4882a593Smuzhiyun  * @flags:		Configuration Specific Flags
847*4882a593Smuzhiyun  */
848*4882a593Smuzhiyun struct cppi5_tr_resp_t {
849*4882a593Smuzhiyun 	u8 status;
850*4882a593Smuzhiyun 	u8 _reserved;
851*4882a593Smuzhiyun 	u8 cmd_id;
852*4882a593Smuzhiyun 	u8 flags;
853*4882a593Smuzhiyun } __packed;
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_STATUS_TYPE_SHIFT	(0U)
856*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_STATUS_TYPE_MASK	GENMASK(3, 0)
857*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_STATUS_INFO_SHIFT	(4U)
858*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_STATUS_INFO_MASK	GENMASK(7, 4)
859*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_CMDID_SHIFT		(16U)
860*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_CMDID_MASK		GENMASK(23, 16)
861*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_CFG_SPECIFIC_SHIFT	(24U)
862*4882a593Smuzhiyun #define CPPI5_TR_RESPONSE_CFG_SPECIFIC_MASK	GENMASK(31, 24)
863*4882a593Smuzhiyun 
864*4882a593Smuzhiyun /**
865*4882a593Smuzhiyun  * enum cppi5_tr_resp_status_type - TR Response Status Type field is used to
866*4882a593Smuzhiyun  *				    determine what type of status is being
867*4882a593Smuzhiyun  *				    returned.
868*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_NONE:		No error, completion: completed
869*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR:	Transfer Error, completion: none
870*4882a593Smuzhiyun  *						or partially completed
871*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR:	Aborted Error, completion: none
872*4882a593Smuzhiyun  *						or partially completed
873*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR:	Submission Error, completion:
874*4882a593Smuzhiyun  *						none
875*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR:	Unsupported Error, completion:
876*4882a593Smuzhiyun  *						none
877*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_TRANSFER_EXCEPTION: Transfer Exception, completion:
878*4882a593Smuzhiyun  *						partially completed
879*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS__TEARDOWN_FLUSH:	Teardown Flush, completion: none
880*4882a593Smuzhiyun  */
881*4882a593Smuzhiyun enum cppi5_tr_resp_status_type {
882*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_NONE,
883*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR,
884*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR,
885*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR,
886*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR,
887*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_TRANSFER_EXCEPTION,
888*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS__TEARDOWN_FLUSH,
889*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_MAX
890*4882a593Smuzhiyun };
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun /**
893*4882a593Smuzhiyun  * enum cppi5_tr_resp_status_submission - TR Response Status field values which
894*4882a593Smuzhiyun  *					  corresponds Submission Error
895*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0:	ICNT0 was 0
896*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL: Channel FIFO was full when TR
897*4882a593Smuzhiyun  *						received
898*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN:	Channel is not owned by the
899*4882a593Smuzhiyun  *						submitter
900*4882a593Smuzhiyun  */
901*4882a593Smuzhiyun enum cppi5_tr_resp_status_submission {
902*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0,
903*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL,
904*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN,
905*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_MAX
906*4882a593Smuzhiyun };
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun /**
909*4882a593Smuzhiyun  * enum cppi5_tr_resp_status_unsupported - TR Response Status field values which
910*4882a593Smuzhiyun  *					   corresponds Unsupported Error
911*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE:	TR Type not supported
912*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC:	STATIC not supported
913*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL:		EOL not supported
914*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC:	CONFIGURATION SPECIFIC
915*4882a593Smuzhiyun  *							not supported
916*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE:		AMODE not supported
917*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE:	ELTYPE not supported
918*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT:		DFMT not supported
919*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR:		SECTR not supported
920*4882a593Smuzhiyun  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC: AMODE SPECIFIC field
921*4882a593Smuzhiyun  *							not supported
922*4882a593Smuzhiyun  */
923*4882a593Smuzhiyun enum cppi5_tr_resp_status_unsupported {
924*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE,
925*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC,
926*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL,
927*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC,
928*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE,
929*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE,
930*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT,
931*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR,
932*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC,
933*4882a593Smuzhiyun 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_MAX
934*4882a593Smuzhiyun };
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun /**
937*4882a593Smuzhiyun  * cppi5_trdesc_calc_size - Calculate TR Descriptor size
938*4882a593Smuzhiyun  * @tr_count: number of TR records
939*4882a593Smuzhiyun  * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
940*4882a593Smuzhiyun  *
941*4882a593Smuzhiyun  * Returns required TR Descriptor size
942*4882a593Smuzhiyun  */
cppi5_trdesc_calc_size(u32 tr_count,u32 tr_size)943*4882a593Smuzhiyun static inline size_t cppi5_trdesc_calc_size(u32 tr_count, u32 tr_size)
944*4882a593Smuzhiyun {
945*4882a593Smuzhiyun 	/*
946*4882a593Smuzhiyun 	 * The Size of a TR descriptor is:
947*4882a593Smuzhiyun 	 * 1 x tr_size : the first 16 bytes is used by the packet info block +
948*4882a593Smuzhiyun 	 * tr_count x tr_size : Transfer Request Records +
949*4882a593Smuzhiyun 	 * tr_count x sizeof(struct cppi5_tr_resp_t) : Transfer Response Records
950*4882a593Smuzhiyun 	 */
951*4882a593Smuzhiyun 	return tr_size * (tr_count + 1) +
952*4882a593Smuzhiyun 		sizeof(struct cppi5_tr_resp_t) * tr_count;
953*4882a593Smuzhiyun }
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun /**
956*4882a593Smuzhiyun  * cppi5_trdesc_init - Init TR Descriptor
957*4882a593Smuzhiyun  * @desc: TR Descriptor
958*4882a593Smuzhiyun  * @tr_count: number of TR records
959*4882a593Smuzhiyun  * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
960*4882a593Smuzhiyun  * @reload_idx: Absolute index to jump to on the 2nd and following passes
961*4882a593Smuzhiyun  *		through the TR packet.
962*4882a593Smuzhiyun  * @reload_count: Number of times to jump from last entry to reload_idx. 0x1ff
963*4882a593Smuzhiyun  *		  indicates infinite looping.
964*4882a593Smuzhiyun  *
965*4882a593Smuzhiyun  * Init TR Descriptor
966*4882a593Smuzhiyun  */
cppi5_trdesc_init(struct cppi5_desc_hdr_t * desc_hdr,u32 tr_count,u32 tr_size,u32 reload_idx,u32 reload_count)967*4882a593Smuzhiyun static inline void cppi5_trdesc_init(struct cppi5_desc_hdr_t *desc_hdr,
968*4882a593Smuzhiyun 				     u32 tr_count, u32 tr_size, u32 reload_idx,
969*4882a593Smuzhiyun 				     u32 reload_count)
970*4882a593Smuzhiyun {
971*4882a593Smuzhiyun 	desc_hdr->pkt_info0 = CPPI5_INFO0_DESC_TYPE_VAL_TR <<
972*4882a593Smuzhiyun 			      CPPI5_INFO0_HDESC_TYPE_SHIFT;
973*4882a593Smuzhiyun 	desc_hdr->pkt_info0 |=
974*4882a593Smuzhiyun 			(reload_count << CPPI5_INFO0_TRDESC_RLDCNT_SHIFT) &
975*4882a593Smuzhiyun 			CPPI5_INFO0_TRDESC_RLDCNT_MASK;
976*4882a593Smuzhiyun 	desc_hdr->pkt_info0 |=
977*4882a593Smuzhiyun 			(reload_idx << CPPI5_INFO0_TRDESC_RLDIDX_SHIFT) &
978*4882a593Smuzhiyun 			CPPI5_INFO0_TRDESC_RLDIDX_MASK;
979*4882a593Smuzhiyun 	desc_hdr->pkt_info0 |= (tr_count - 1) & CPPI5_INFO0_TRDESC_LASTIDX_MASK;
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	desc_hdr->pkt_info1 |= ((ffs(tr_size >> 4) - 1) <<
982*4882a593Smuzhiyun 				CPPI5_INFO1_TRDESC_RECSIZE_SHIFT) &
983*4882a593Smuzhiyun 				CPPI5_INFO1_TRDESC_RECSIZE_MASK;
984*4882a593Smuzhiyun }
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun /**
987*4882a593Smuzhiyun  * cppi5_tr_init - Init TR record
988*4882a593Smuzhiyun  * @flags: Pointer to the TR's flags
989*4882a593Smuzhiyun  * @type: TR type
990*4882a593Smuzhiyun  * @static_tr: TR is static
991*4882a593Smuzhiyun  * @wait: Wait for TR completion before allow the next TR to start
992*4882a593Smuzhiyun  * @event_size: output event generation cfg
993*4882a593Smuzhiyun  * @cmd_id: TR identifier (application specifics)
994*4882a593Smuzhiyun  *
995*4882a593Smuzhiyun  * Init TR record
996*4882a593Smuzhiyun  */
cppi5_tr_init(cppi5_tr_flags_t * flags,enum cppi5_tr_types type,bool static_tr,bool wait,enum cppi5_tr_event_size event_size,u32 cmd_id)997*4882a593Smuzhiyun static inline void cppi5_tr_init(cppi5_tr_flags_t *flags,
998*4882a593Smuzhiyun 				 enum cppi5_tr_types type, bool static_tr,
999*4882a593Smuzhiyun 				 bool wait, enum cppi5_tr_event_size event_size,
1000*4882a593Smuzhiyun 				 u32 cmd_id)
1001*4882a593Smuzhiyun {
1002*4882a593Smuzhiyun 	*flags = type;
1003*4882a593Smuzhiyun 	*flags |= (event_size << CPPI5_TR_EVENT_SIZE_SHIFT) &
1004*4882a593Smuzhiyun 		  CPPI5_TR_EVENT_SIZE_MASK;
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 	*flags |= (cmd_id << CPPI5_TR_CMD_ID_SHIFT) &
1007*4882a593Smuzhiyun 		  CPPI5_TR_CMD_ID_MASK;
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	if (static_tr && (type == CPPI5_TR_TYPE8 || type == CPPI5_TR_TYPE9))
1010*4882a593Smuzhiyun 		*flags |= CPPI5_TR_STATIC;
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun 	if (wait)
1013*4882a593Smuzhiyun 		*flags |= CPPI5_TR_WAIT;
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun /**
1017*4882a593Smuzhiyun  * cppi5_tr_set_trigger - Configure trigger0/1 and trigger0/1_type
1018*4882a593Smuzhiyun  * @flags: Pointer to the TR's flags
1019*4882a593Smuzhiyun  * @trigger0: trigger0 selection
1020*4882a593Smuzhiyun  * @trigger0_type: type of data transfer that will be enabled by trigger0
1021*4882a593Smuzhiyun  * @trigger1: trigger1 selection
1022*4882a593Smuzhiyun  * @trigger1_type: type of data transfer that will be enabled by trigger1
1023*4882a593Smuzhiyun  *
1024*4882a593Smuzhiyun  * Configure the triggers for the TR
1025*4882a593Smuzhiyun  */
cppi5_tr_set_trigger(cppi5_tr_flags_t * flags,enum cppi5_tr_trigger trigger0,enum cppi5_tr_trigger_type trigger0_type,enum cppi5_tr_trigger trigger1,enum cppi5_tr_trigger_type trigger1_type)1026*4882a593Smuzhiyun static inline void cppi5_tr_set_trigger(cppi5_tr_flags_t *flags,
1027*4882a593Smuzhiyun 		enum cppi5_tr_trigger trigger0,
1028*4882a593Smuzhiyun 		enum cppi5_tr_trigger_type trigger0_type,
1029*4882a593Smuzhiyun 		enum cppi5_tr_trigger trigger1,
1030*4882a593Smuzhiyun 		enum cppi5_tr_trigger_type trigger1_type)
1031*4882a593Smuzhiyun {
1032*4882a593Smuzhiyun 	*flags &= ~(CPPI5_TR_TRIGGER0_MASK | CPPI5_TR_TRIGGER0_TYPE_MASK |
1033*4882a593Smuzhiyun 		    CPPI5_TR_TRIGGER1_MASK | CPPI5_TR_TRIGGER1_TYPE_MASK);
1034*4882a593Smuzhiyun 	*flags |= (trigger0 << CPPI5_TR_TRIGGER0_SHIFT) &
1035*4882a593Smuzhiyun 		  CPPI5_TR_TRIGGER0_MASK;
1036*4882a593Smuzhiyun 	*flags |= (trigger0_type << CPPI5_TR_TRIGGER0_TYPE_SHIFT) &
1037*4882a593Smuzhiyun 		  CPPI5_TR_TRIGGER0_TYPE_MASK;
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun 	*flags |= (trigger1 << CPPI5_TR_TRIGGER1_SHIFT) &
1040*4882a593Smuzhiyun 		  CPPI5_TR_TRIGGER1_MASK;
1041*4882a593Smuzhiyun 	*flags |= (trigger1_type << CPPI5_TR_TRIGGER1_TYPE_SHIFT) &
1042*4882a593Smuzhiyun 		  CPPI5_TR_TRIGGER1_TYPE_MASK;
1043*4882a593Smuzhiyun }
1044*4882a593Smuzhiyun 
1045*4882a593Smuzhiyun /**
1046*4882a593Smuzhiyun  * cppi5_tr_cflag_set - Update the Configuration specific flags
1047*4882a593Smuzhiyun  * @flags: Pointer to the TR's flags
1048*4882a593Smuzhiyun  * @csf: Configuration specific flags
1049*4882a593Smuzhiyun  *
1050*4882a593Smuzhiyun  * Set a bit in Configuration Specific Flags section of the TR flags.
1051*4882a593Smuzhiyun  */
cppi5_tr_csf_set(cppi5_tr_flags_t * flags,u32 csf)1052*4882a593Smuzhiyun static inline void cppi5_tr_csf_set(cppi5_tr_flags_t *flags, u32 csf)
1053*4882a593Smuzhiyun {
1054*4882a593Smuzhiyun 	*flags &= ~CPPI5_TR_CSF_FLAGS_MASK;
1055*4882a593Smuzhiyun 	*flags |= (csf << CPPI5_TR_CSF_FLAGS_SHIFT) &
1056*4882a593Smuzhiyun 		  CPPI5_TR_CSF_FLAGS_MASK;
1057*4882a593Smuzhiyun }
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun #endif /* __TI_CPPI5_H__ */
1060