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