xref: /linux-6.15/include/linux/dma/ti-cppi5.h (revision f806bea3)
169bafc31SPeter Ujfalusi /* SPDX-License-Identifier: GPL-2.0 */
269bafc31SPeter Ujfalusi /*
369bafc31SPeter Ujfalusi  * CPPI5 descriptors interface
469bafc31SPeter Ujfalusi  *
57f317d34SAlexander A. Klimov  * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com
669bafc31SPeter Ujfalusi  */
769bafc31SPeter Ujfalusi 
869bafc31SPeter Ujfalusi #ifndef __TI_CPPI5_H__
969bafc31SPeter Ujfalusi #define __TI_CPPI5_H__
1069bafc31SPeter Ujfalusi 
1169bafc31SPeter Ujfalusi #include <linux/bitops.h>
1269bafc31SPeter Ujfalusi #include <linux/printk.h>
1369bafc31SPeter Ujfalusi #include <linux/bug.h>
1469bafc31SPeter Ujfalusi 
1569bafc31SPeter Ujfalusi /**
1669bafc31SPeter Ujfalusi  * struct cppi5_desc_hdr_t - Descriptor header, present in all types of
1769bafc31SPeter Ujfalusi  *			     descriptors
1869bafc31SPeter Ujfalusi  * @pkt_info0:		Packet info word 0 (n/a in Buffer desc)
1969bafc31SPeter Ujfalusi  * @pkt_info0:		Packet info word 1 (n/a in Buffer desc)
2069bafc31SPeter Ujfalusi  * @pkt_info0:		Packet info word 2 (n/a in Buffer desc)
2169bafc31SPeter Ujfalusi  * @src_dst_tag:	Packet info word 3 (n/a in Buffer desc)
2269bafc31SPeter Ujfalusi  */
2369bafc31SPeter Ujfalusi struct cppi5_desc_hdr_t {
2469bafc31SPeter Ujfalusi 	u32 pkt_info0;
2569bafc31SPeter Ujfalusi 	u32 pkt_info1;
2669bafc31SPeter Ujfalusi 	u32 pkt_info2;
2769bafc31SPeter Ujfalusi 	u32 src_dst_tag;
2869bafc31SPeter Ujfalusi } __packed;
2969bafc31SPeter Ujfalusi 
3069bafc31SPeter Ujfalusi /**
3169bafc31SPeter Ujfalusi  * struct cppi5_host_desc_t - Host-mode packet and buffer descriptor definition
3269bafc31SPeter Ujfalusi  * @hdr:		Descriptor header
3369bafc31SPeter Ujfalusi  * @next_desc:		word 4/5: Linking word
3469bafc31SPeter Ujfalusi  * @buf_ptr:		word 6/7: Buffer pointer
3569bafc31SPeter Ujfalusi  * @buf_info1:		word 8: Buffer valid data length
3669bafc31SPeter Ujfalusi  * @org_buf_len:	word 9: Original buffer length
3769bafc31SPeter Ujfalusi  * @org_buf_ptr:	word 10/11: Original buffer pointer
3869bafc31SPeter Ujfalusi  * @epib[0]:		Extended Packet Info Data (optional, 4 words), and/or
3969bafc31SPeter Ujfalusi  *			Protocol Specific Data (optional, 0-128 bytes in
4069bafc31SPeter Ujfalusi  *			multiples of 4), and/or
4169bafc31SPeter Ujfalusi  *			Other Software Data (0-N bytes, optional)
4269bafc31SPeter Ujfalusi  */
4369bafc31SPeter Ujfalusi struct cppi5_host_desc_t {
4469bafc31SPeter Ujfalusi 	struct cppi5_desc_hdr_t hdr;
4569bafc31SPeter Ujfalusi 	u64 next_desc;
4669bafc31SPeter Ujfalusi 	u64 buf_ptr;
4769bafc31SPeter Ujfalusi 	u32 buf_info1;
4869bafc31SPeter Ujfalusi 	u32 org_buf_len;
4969bafc31SPeter Ujfalusi 	u64 org_buf_ptr;
50a4147d85SGustavo A. R. Silva 	u32 epib[];
5169bafc31SPeter Ujfalusi } __packed;
5269bafc31SPeter Ujfalusi 
5369bafc31SPeter Ujfalusi #define CPPI5_DESC_MIN_ALIGN			(16U)
5469bafc31SPeter Ujfalusi 
5569bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_EPIB_SIZE		(16U)
5669bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE	(128U)
5769bafc31SPeter Ujfalusi 
5869bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_TYPE_SHIFT		(30U)
5969bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_TYPE_MASK		GENMASK(31, 30)
6069bafc31SPeter Ujfalusi #define   CPPI5_INFO0_DESC_TYPE_VAL_HOST	(1U)
6169bafc31SPeter Ujfalusi #define   CPPI5_INFO0_DESC_TYPE_VAL_MONO	(2U)
6269bafc31SPeter Ujfalusi #define   CPPI5_INFO0_DESC_TYPE_VAL_TR		(3U)
6369bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_EPIB_PRESENT		BIT(29)
6469bafc31SPeter Ujfalusi /*
6569bafc31SPeter Ujfalusi  * Protocol Specific Words location:
6669bafc31SPeter Ujfalusi  * 0 - located in the descriptor,
6769bafc31SPeter Ujfalusi  * 1 = located in the SOP Buffer immediately prior to the data.
6869bafc31SPeter Ujfalusi  */
6969bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_PSINFO_LOCATION	BIT(28)
7069bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT	(22U)
7169bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK	GENMASK(27, 22)
7269bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_PKTLEN_SHIFT		(0)
7369bafc31SPeter Ujfalusi #define CPPI5_INFO0_HDESC_PKTLEN_MASK		GENMASK(21, 0)
7469bafc31SPeter Ujfalusi 
7569bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_PKTERROR_SHIFT		(28U)
7669bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_PKTERROR_MASK		GENMASK(31, 28)
7769bafc31SPeter Ujfalusi #define CPPI5_INFO1_HDESC_PSFLGS_SHIFT		(24U)
7869bafc31SPeter Ujfalusi #define CPPI5_INFO1_HDESC_PSFLGS_MASK		GENMASK(27, 24)
7969bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_PKTID_SHIFT		(14U)
8069bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_PKTID_MASK		GENMASK(23, 14)
8169bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_FLOWID_SHIFT		(0)
8269bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_FLOWID_MASK		GENMASK(13, 0)
8369bafc31SPeter Ujfalusi #define CPPI5_INFO1_DESC_FLOWID_DEFAULT		CPPI5_INFO1_DESC_FLOWID_MASK
8469bafc31SPeter Ujfalusi 
8569bafc31SPeter Ujfalusi #define CPPI5_INFO2_HDESC_PKTTYPE_SHIFT		(27U)
8669bafc31SPeter Ujfalusi #define CPPI5_INFO2_HDESC_PKTTYPE_MASK		GENMASK(31, 27)
8769bafc31SPeter Ujfalusi /* Return Policy: 0 - Entire packet 1 - Each buffer */
8869bafc31SPeter Ujfalusi #define CPPI5_INFO2_HDESC_RETPOLICY		BIT(18)
8969bafc31SPeter Ujfalusi /*
9069bafc31SPeter Ujfalusi  * Early Return:
9169bafc31SPeter Ujfalusi  * 0 = desc pointers should be returned after all reads have been completed
9269bafc31SPeter Ujfalusi  * 1 = desc pointers should be returned immediately upon fetching
9369bafc31SPeter Ujfalusi  * the descriptor and beginning to transfer data.
9469bafc31SPeter Ujfalusi  */
9569bafc31SPeter Ujfalusi #define CPPI5_INFO2_HDESC_EARLYRET		BIT(17)
9669bafc31SPeter Ujfalusi /*
9769bafc31SPeter Ujfalusi  * Return Push Policy:
9869bafc31SPeter Ujfalusi  * 0 = Descriptor must be returned to tail of queue
9969bafc31SPeter Ujfalusi  * 1 = Descriptor must be returned to head of queue
10069bafc31SPeter Ujfalusi  */
10169bafc31SPeter Ujfalusi #define CPPI5_INFO2_DESC_RETPUSHPOLICY		BIT(16)
10269bafc31SPeter Ujfalusi #define CPPI5_INFO2_DESC_RETP_MASK		GENMASK(18, 16)
10369bafc31SPeter Ujfalusi 
10469bafc31SPeter Ujfalusi #define CPPI5_INFO2_DESC_RETQ_SHIFT		(0)
10569bafc31SPeter Ujfalusi #define CPPI5_INFO2_DESC_RETQ_MASK		GENMASK(15, 0)
10669bafc31SPeter Ujfalusi 
10769bafc31SPeter Ujfalusi #define CPPI5_INFO3_DESC_SRCTAG_SHIFT		(16U)
10869bafc31SPeter Ujfalusi #define CPPI5_INFO3_DESC_SRCTAG_MASK		GENMASK(31, 16)
10969bafc31SPeter Ujfalusi #define CPPI5_INFO3_DESC_DSTTAG_SHIFT		(0)
11069bafc31SPeter Ujfalusi #define CPPI5_INFO3_DESC_DSTTAG_MASK		GENMASK(15, 0)
11169bafc31SPeter Ujfalusi 
11269bafc31SPeter Ujfalusi #define CPPI5_BUFINFO1_HDESC_DATA_LEN_SHIFT	(0)
11369bafc31SPeter Ujfalusi #define CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK	GENMASK(27, 0)
11469bafc31SPeter Ujfalusi 
11569bafc31SPeter Ujfalusi #define CPPI5_OBUFINFO0_HDESC_BUF_LEN_SHIFT	(0)
11669bafc31SPeter Ujfalusi #define CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK	GENMASK(27, 0)
11769bafc31SPeter Ujfalusi 
11869bafc31SPeter Ujfalusi /**
11969bafc31SPeter Ujfalusi  * struct cppi5_desc_epib_t - Host Packet Descriptor Extended Packet Info Block
12069bafc31SPeter Ujfalusi  * @timestamp:		word 0: application specific timestamp
12169bafc31SPeter Ujfalusi  * @sw_info0:		word 1: Software Info 0
12269bafc31SPeter Ujfalusi  * @sw_info1:		word 1: Software Info 1
12369bafc31SPeter Ujfalusi  * @sw_info2:		word 1: Software Info 2
12469bafc31SPeter Ujfalusi  */
12569bafc31SPeter Ujfalusi struct cppi5_desc_epib_t {
12669bafc31SPeter Ujfalusi 	u32 timestamp;	/* w0: application specific timestamp */
12769bafc31SPeter Ujfalusi 	u32 sw_info0;	/* w1: Software Info 0 */
12869bafc31SPeter Ujfalusi 	u32 sw_info1;	/* w2: Software Info 1 */
12969bafc31SPeter Ujfalusi 	u32 sw_info2;	/* w3: Software Info 2 */
13069bafc31SPeter Ujfalusi };
13169bafc31SPeter Ujfalusi 
13269bafc31SPeter Ujfalusi /**
13369bafc31SPeter Ujfalusi  * struct cppi5_monolithic_desc_t - Monolithic-mode packet descriptor
13469bafc31SPeter Ujfalusi  * @hdr:		Descriptor header
13569bafc31SPeter Ujfalusi  * @epib[0]:		Extended Packet Info Data (optional, 4 words), and/or
13669bafc31SPeter Ujfalusi  *			Protocol Specific Data (optional, 0-128 bytes in
13769bafc31SPeter Ujfalusi  *			multiples of 4), and/or
13869bafc31SPeter Ujfalusi  *			Other Software Data (0-N bytes, optional)
13969bafc31SPeter Ujfalusi  */
14069bafc31SPeter Ujfalusi struct cppi5_monolithic_desc_t {
14169bafc31SPeter Ujfalusi 	struct cppi5_desc_hdr_t hdr;
142a4147d85SGustavo A. R. Silva 	u32 epib[];
14369bafc31SPeter Ujfalusi };
14469bafc31SPeter Ujfalusi 
14569bafc31SPeter Ujfalusi #define CPPI5_INFO2_MDESC_DATA_OFFSET_SHIFT	(18U)
14669bafc31SPeter Ujfalusi #define CPPI5_INFO2_MDESC_DATA_OFFSET_MASK	GENMASK(26, 18)
14769bafc31SPeter Ujfalusi 
14869bafc31SPeter Ujfalusi /*
14969bafc31SPeter Ujfalusi  * Reload Count:
15069bafc31SPeter Ujfalusi  * 0 = Finish the packet and place the descriptor back on the return queue
15169bafc31SPeter Ujfalusi  * 1-0x1ff = Vector to the Reload Index and resume processing
15269bafc31SPeter Ujfalusi  * 0x1ff indicates perpetual loop, infinite reload until the channel is stopped
15369bafc31SPeter Ujfalusi  */
15469bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDCNT_SHIFT		(20U)
15569bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDCNT_MASK		GENMASK(28, 20)
15669bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDCNT_MAX		(0x1ff)
15769bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDCNT_INFINITE	CPPI5_INFO0_TRDESC_RLDCNT_MAX
15869bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDIDX_SHIFT		(14U)
15969bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDIDX_MASK		GENMASK(19, 14)
16069bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_RLDIDX_MAX		(0x3f)
16169bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_LASTIDX_SHIFT	(0)
16269bafc31SPeter Ujfalusi #define CPPI5_INFO0_TRDESC_LASTIDX_MASK		GENMASK(13, 0)
16369bafc31SPeter Ujfalusi 
16469bafc31SPeter Ujfalusi #define CPPI5_INFO1_TRDESC_RECSIZE_SHIFT	(24U)
16569bafc31SPeter Ujfalusi #define CPPI5_INFO1_TRDESC_RECSIZE_MASK		GENMASK(26, 24)
16669bafc31SPeter Ujfalusi #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_16B	(0)
16769bafc31SPeter Ujfalusi #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_32B	(1U)
16869bafc31SPeter Ujfalusi #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_64B	(2U)
16969bafc31SPeter Ujfalusi #define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_128B	(3U)
17069bafc31SPeter Ujfalusi 
cppi5_desc_dump(void * desc,u32 size)17169bafc31SPeter Ujfalusi static inline void cppi5_desc_dump(void *desc, u32 size)
17269bafc31SPeter Ujfalusi {
17369bafc31SPeter Ujfalusi 	print_hex_dump(KERN_ERR, "dump udmap_desc: ", DUMP_PREFIX_NONE,
17469bafc31SPeter Ujfalusi 		       32, 4, desc, size, false);
17569bafc31SPeter Ujfalusi }
17669bafc31SPeter Ujfalusi 
17769bafc31SPeter Ujfalusi #define CPPI5_TDCM_MARKER			(0x1)
17869bafc31SPeter Ujfalusi /**
17969bafc31SPeter Ujfalusi  * cppi5_desc_is_tdcm - check if the paddr indicates Teardown Complete Message
18069bafc31SPeter Ujfalusi  * @paddr: Physical address of the packet popped from the ring
18169bafc31SPeter Ujfalusi  *
18269bafc31SPeter Ujfalusi  * Returns true if the address indicates TDCM
18369bafc31SPeter Ujfalusi  */
cppi5_desc_is_tdcm(dma_addr_t paddr)18469bafc31SPeter Ujfalusi static inline bool cppi5_desc_is_tdcm(dma_addr_t paddr)
18569bafc31SPeter Ujfalusi {
18669bafc31SPeter Ujfalusi 	return (paddr & CPPI5_TDCM_MARKER) ? true : false;
18769bafc31SPeter Ujfalusi }
18869bafc31SPeter Ujfalusi 
18969bafc31SPeter Ujfalusi /**
19069bafc31SPeter Ujfalusi  * cppi5_desc_get_type - get descriptor type
19169bafc31SPeter Ujfalusi  * @desc_hdr: packet descriptor/TR header
19269bafc31SPeter Ujfalusi  *
19369bafc31SPeter Ujfalusi  * Returns descriptor type:
19469bafc31SPeter Ujfalusi  * CPPI5_INFO0_DESC_TYPE_VAL_HOST
19569bafc31SPeter Ujfalusi  * CPPI5_INFO0_DESC_TYPE_VAL_MONO
19669bafc31SPeter Ujfalusi  * CPPI5_INFO0_DESC_TYPE_VAL_TR
19769bafc31SPeter Ujfalusi  */
cppi5_desc_get_type(struct cppi5_desc_hdr_t * desc_hdr)19869bafc31SPeter Ujfalusi static inline u32 cppi5_desc_get_type(struct cppi5_desc_hdr_t *desc_hdr)
19969bafc31SPeter Ujfalusi {
20069bafc31SPeter Ujfalusi 	return (desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_TYPE_MASK) >>
20169bafc31SPeter Ujfalusi 		CPPI5_INFO0_HDESC_TYPE_SHIFT;
20269bafc31SPeter Ujfalusi }
20369bafc31SPeter Ujfalusi 
20469bafc31SPeter Ujfalusi /**
20569bafc31SPeter Ujfalusi  * cppi5_desc_get_errflags - get Error Flags from Desc
20669bafc31SPeter Ujfalusi  * @desc_hdr: packet/TR descriptor header
20769bafc31SPeter Ujfalusi  *
20869bafc31SPeter Ujfalusi  * Returns Error Flags from Packet/TR Descriptor
20969bafc31SPeter Ujfalusi  */
cppi5_desc_get_errflags(struct cppi5_desc_hdr_t * desc_hdr)21069bafc31SPeter Ujfalusi static inline u32 cppi5_desc_get_errflags(struct cppi5_desc_hdr_t *desc_hdr)
21169bafc31SPeter Ujfalusi {
21269bafc31SPeter Ujfalusi 	return (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTERROR_MASK) >>
21369bafc31SPeter Ujfalusi 		CPPI5_INFO1_DESC_PKTERROR_SHIFT;
21469bafc31SPeter Ujfalusi }
21569bafc31SPeter Ujfalusi 
21669bafc31SPeter Ujfalusi /**
21769bafc31SPeter Ujfalusi  * cppi5_desc_get_pktids - get Packet and Flow ids from Desc
21869bafc31SPeter Ujfalusi  * @desc_hdr: packet/TR descriptor header
21969bafc31SPeter Ujfalusi  * @pkt_id: Packet ID
22069bafc31SPeter Ujfalusi  * @flow_id: Flow ID
22169bafc31SPeter Ujfalusi  *
22269bafc31SPeter Ujfalusi  * Returns Packet and Flow ids from packet/TR descriptor
22369bafc31SPeter Ujfalusi  */
cppi5_desc_get_pktids(struct cppi5_desc_hdr_t * desc_hdr,u32 * pkt_id,u32 * flow_id)22469bafc31SPeter Ujfalusi static inline void cppi5_desc_get_pktids(struct cppi5_desc_hdr_t *desc_hdr,
22569bafc31SPeter Ujfalusi 					 u32 *pkt_id, u32 *flow_id)
22669bafc31SPeter Ujfalusi {
22769bafc31SPeter Ujfalusi 	*pkt_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTID_MASK) >>
22869bafc31SPeter Ujfalusi 		   CPPI5_INFO1_DESC_PKTID_SHIFT;
22969bafc31SPeter Ujfalusi 	*flow_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_FLOWID_MASK) >>
23069bafc31SPeter Ujfalusi 		    CPPI5_INFO1_DESC_FLOWID_SHIFT;
23169bafc31SPeter Ujfalusi }
23269bafc31SPeter Ujfalusi 
23369bafc31SPeter Ujfalusi /**
23469bafc31SPeter Ujfalusi  * cppi5_desc_set_pktids - set Packet and Flow ids in Desc
23569bafc31SPeter Ujfalusi  * @desc_hdr: packet/TR descriptor header
23669bafc31SPeter Ujfalusi  * @pkt_id: Packet ID
23769bafc31SPeter Ujfalusi  * @flow_id: Flow ID
23869bafc31SPeter Ujfalusi  */
cppi5_desc_set_pktids(struct cppi5_desc_hdr_t * desc_hdr,u32 pkt_id,u32 flow_id)23969bafc31SPeter Ujfalusi static inline void cppi5_desc_set_pktids(struct cppi5_desc_hdr_t *desc_hdr,
24069bafc31SPeter Ujfalusi 					 u32 pkt_id, u32 flow_id)
24169bafc31SPeter Ujfalusi {
24269bafc31SPeter Ujfalusi 	desc_hdr->pkt_info1 &= ~(CPPI5_INFO1_DESC_PKTID_MASK |
24369bafc31SPeter Ujfalusi 				 CPPI5_INFO1_DESC_FLOWID_MASK);
24469bafc31SPeter Ujfalusi 	desc_hdr->pkt_info1 |= (pkt_id << CPPI5_INFO1_DESC_PKTID_SHIFT) &
24569bafc31SPeter Ujfalusi 				CPPI5_INFO1_DESC_PKTID_MASK;
24669bafc31SPeter Ujfalusi 	desc_hdr->pkt_info1 |= (flow_id << CPPI5_INFO1_DESC_FLOWID_SHIFT) &
24769bafc31SPeter Ujfalusi 				CPPI5_INFO1_DESC_FLOWID_MASK;
24869bafc31SPeter Ujfalusi }
24969bafc31SPeter Ujfalusi 
25069bafc31SPeter Ujfalusi /**
25169bafc31SPeter Ujfalusi  * cppi5_desc_set_retpolicy - set Packet Return Policy in Desc
25269bafc31SPeter Ujfalusi  * @desc_hdr: packet/TR descriptor header
25369bafc31SPeter Ujfalusi  * @flags: fags, supported values
25469bafc31SPeter Ujfalusi  *  CPPI5_INFO2_HDESC_RETPOLICY
25569bafc31SPeter Ujfalusi  *  CPPI5_INFO2_HDESC_EARLYRET
25669bafc31SPeter Ujfalusi  *  CPPI5_INFO2_DESC_RETPUSHPOLICY
25769bafc31SPeter Ujfalusi  * @return_ring_id: Packet Return Queue/Ring id, value 0xFFFF reserved
25869bafc31SPeter Ujfalusi  */
cppi5_desc_set_retpolicy(struct cppi5_desc_hdr_t * desc_hdr,u32 flags,u32 return_ring_id)25969bafc31SPeter Ujfalusi static inline void cppi5_desc_set_retpolicy(struct cppi5_desc_hdr_t *desc_hdr,
26069bafc31SPeter Ujfalusi 					    u32 flags, u32 return_ring_id)
26169bafc31SPeter Ujfalusi {
26269bafc31SPeter Ujfalusi 	desc_hdr->pkt_info2 &= ~(CPPI5_INFO2_DESC_RETP_MASK |
26369bafc31SPeter Ujfalusi 				 CPPI5_INFO2_DESC_RETQ_MASK);
26469bafc31SPeter Ujfalusi 	desc_hdr->pkt_info2 |= flags & CPPI5_INFO2_DESC_RETP_MASK;
26569bafc31SPeter Ujfalusi 	desc_hdr->pkt_info2 |= return_ring_id & CPPI5_INFO2_DESC_RETQ_MASK;
26669bafc31SPeter Ujfalusi }
26769bafc31SPeter Ujfalusi 
26869bafc31SPeter Ujfalusi /**
26969bafc31SPeter Ujfalusi  * cppi5_desc_get_tags_ids - get Packet Src/Dst Tags from Desc
27069bafc31SPeter Ujfalusi  * @desc_hdr: packet/TR descriptor header
27169bafc31SPeter Ujfalusi  * @src_tag_id: Source Tag
27269bafc31SPeter Ujfalusi  * @dst_tag_id: Dest Tag
27369bafc31SPeter Ujfalusi  *
27469bafc31SPeter Ujfalusi  * Returns Packet Src/Dst Tags from packet/TR descriptor
27569bafc31SPeter Ujfalusi  */
cppi5_desc_get_tags_ids(struct cppi5_desc_hdr_t * desc_hdr,u32 * src_tag_id,u32 * dst_tag_id)27669bafc31SPeter Ujfalusi static inline void cppi5_desc_get_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
27769bafc31SPeter Ujfalusi 					   u32 *src_tag_id, u32 *dst_tag_id)
27869bafc31SPeter Ujfalusi {
27969bafc31SPeter Ujfalusi 	if (src_tag_id)
28069bafc31SPeter Ujfalusi 		*src_tag_id = (desc_hdr->src_dst_tag &
28169bafc31SPeter Ujfalusi 			      CPPI5_INFO3_DESC_SRCTAG_MASK) >>
28269bafc31SPeter Ujfalusi 			      CPPI5_INFO3_DESC_SRCTAG_SHIFT;
28369bafc31SPeter Ujfalusi 	if (dst_tag_id)
28469bafc31SPeter Ujfalusi 		*dst_tag_id = desc_hdr->src_dst_tag &
28569bafc31SPeter Ujfalusi 			      CPPI5_INFO3_DESC_DSTTAG_MASK;
28669bafc31SPeter Ujfalusi }
28769bafc31SPeter Ujfalusi 
28869bafc31SPeter Ujfalusi /**
28969bafc31SPeter Ujfalusi  * cppi5_desc_set_tags_ids - set Packet Src/Dst Tags in HDesc
29069bafc31SPeter Ujfalusi  * @desc_hdr: packet/TR descriptor header
29169bafc31SPeter Ujfalusi  * @src_tag_id: Source Tag
29269bafc31SPeter Ujfalusi  * @dst_tag_id: Dest Tag
29369bafc31SPeter Ujfalusi  *
29469bafc31SPeter Ujfalusi  * Returns Packet Src/Dst Tags from packet/TR descriptor
29569bafc31SPeter Ujfalusi  */
cppi5_desc_set_tags_ids(struct cppi5_desc_hdr_t * desc_hdr,u32 src_tag_id,u32 dst_tag_id)29669bafc31SPeter Ujfalusi static inline void cppi5_desc_set_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
29769bafc31SPeter Ujfalusi 					   u32 src_tag_id, u32 dst_tag_id)
29869bafc31SPeter Ujfalusi {
29969bafc31SPeter Ujfalusi 	desc_hdr->src_dst_tag = (src_tag_id << CPPI5_INFO3_DESC_SRCTAG_SHIFT) &
30069bafc31SPeter Ujfalusi 				CPPI5_INFO3_DESC_SRCTAG_MASK;
30169bafc31SPeter Ujfalusi 	desc_hdr->src_dst_tag |= dst_tag_id & CPPI5_INFO3_DESC_DSTTAG_MASK;
30269bafc31SPeter Ujfalusi }
30369bafc31SPeter Ujfalusi 
30469bafc31SPeter Ujfalusi /**
30569bafc31SPeter Ujfalusi  * cppi5_hdesc_calc_size - Calculate Host Packet Descriptor size
30669bafc31SPeter Ujfalusi  * @epib: is EPIB present
30769bafc31SPeter Ujfalusi  * @psdata_size: PSDATA size
30869bafc31SPeter Ujfalusi  * @sw_data_size: SWDATA size
30969bafc31SPeter Ujfalusi  *
31069bafc31SPeter Ujfalusi  * Returns required Host Packet Descriptor size
31169bafc31SPeter Ujfalusi  * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
31269bafc31SPeter Ujfalusi  */
cppi5_hdesc_calc_size(bool epib,u32 psdata_size,u32 sw_data_size)31369bafc31SPeter Ujfalusi static inline u32 cppi5_hdesc_calc_size(bool epib, u32 psdata_size,
31469bafc31SPeter Ujfalusi 					u32 sw_data_size)
31569bafc31SPeter Ujfalusi {
31669bafc31SPeter Ujfalusi 	u32 desc_size;
31769bafc31SPeter Ujfalusi 
31869bafc31SPeter Ujfalusi 	if (psdata_size > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE)
31969bafc31SPeter Ujfalusi 		return 0;
32069bafc31SPeter Ujfalusi 
32169bafc31SPeter Ujfalusi 	desc_size = sizeof(struct cppi5_host_desc_t) + psdata_size +
32269bafc31SPeter Ujfalusi 		    sw_data_size;
32369bafc31SPeter Ujfalusi 
32469bafc31SPeter Ujfalusi 	if (epib)
32569bafc31SPeter Ujfalusi 		desc_size += CPPI5_INFO0_HDESC_EPIB_SIZE;
32669bafc31SPeter Ujfalusi 
32769bafc31SPeter Ujfalusi 	return ALIGN(desc_size, CPPI5_DESC_MIN_ALIGN);
32869bafc31SPeter Ujfalusi }
32969bafc31SPeter Ujfalusi 
33069bafc31SPeter Ujfalusi /**
33169bafc31SPeter Ujfalusi  * cppi5_hdesc_init - Init Host Packet Descriptor size
33269bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
33369bafc31SPeter Ujfalusi  * @flags: supported values
33469bafc31SPeter Ujfalusi  *	CPPI5_INFO0_HDESC_EPIB_PRESENT
33569bafc31SPeter Ujfalusi  *	CPPI5_INFO0_HDESC_PSINFO_LOCATION
33669bafc31SPeter Ujfalusi  * @psdata_size: PSDATA size
33769bafc31SPeter Ujfalusi  *
33869bafc31SPeter Ujfalusi  * Returns required Host Packet Descriptor size
33969bafc31SPeter Ujfalusi  * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
34069bafc31SPeter Ujfalusi  */
cppi5_hdesc_init(struct cppi5_host_desc_t * desc,u32 flags,u32 psdata_size)34169bafc31SPeter Ujfalusi static inline void cppi5_hdesc_init(struct cppi5_host_desc_t *desc, u32 flags,
34269bafc31SPeter Ujfalusi 				    u32 psdata_size)
34369bafc31SPeter Ujfalusi {
34469bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 = (CPPI5_INFO0_DESC_TYPE_VAL_HOST <<
34569bafc31SPeter Ujfalusi 			       CPPI5_INFO0_HDESC_TYPE_SHIFT) | (flags);
34669bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
34769bafc31SPeter Ujfalusi 				CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
34869bafc31SPeter Ujfalusi 				CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
34969bafc31SPeter Ujfalusi 	desc->next_desc = 0;
35069bafc31SPeter Ujfalusi }
35169bafc31SPeter Ujfalusi 
35269bafc31SPeter Ujfalusi /**
35369bafc31SPeter Ujfalusi  * cppi5_hdesc_update_flags - Replace descriptor flags
35469bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
35569bafc31SPeter Ujfalusi  * @flags: supported values
35669bafc31SPeter Ujfalusi  *	CPPI5_INFO0_HDESC_EPIB_PRESENT
35769bafc31SPeter Ujfalusi  *	CPPI5_INFO0_HDESC_PSINFO_LOCATION
35869bafc31SPeter Ujfalusi  */
cppi5_hdesc_update_flags(struct cppi5_host_desc_t * desc,u32 flags)35969bafc31SPeter Ujfalusi static inline void cppi5_hdesc_update_flags(struct cppi5_host_desc_t *desc,
36069bafc31SPeter Ujfalusi 					    u32 flags)
36169bafc31SPeter Ujfalusi {
36269bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 &= ~(CPPI5_INFO0_HDESC_EPIB_PRESENT |
36369bafc31SPeter Ujfalusi 				 CPPI5_INFO0_HDESC_PSINFO_LOCATION);
36469bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 |= flags;
36569bafc31SPeter Ujfalusi }
36669bafc31SPeter Ujfalusi 
36769bafc31SPeter Ujfalusi /**
36869bafc31SPeter Ujfalusi  * cppi5_hdesc_update_psdata_size - Replace PSdata size
36969bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
37069bafc31SPeter Ujfalusi  * @psdata_size: PSDATA size
37169bafc31SPeter Ujfalusi  */
37269bafc31SPeter Ujfalusi static inline void
cppi5_hdesc_update_psdata_size(struct cppi5_host_desc_t * desc,u32 psdata_size)37369bafc31SPeter Ujfalusi cppi5_hdesc_update_psdata_size(struct cppi5_host_desc_t *desc, u32 psdata_size)
37469bafc31SPeter Ujfalusi {
37569bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
37669bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
37769bafc31SPeter Ujfalusi 				CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
37869bafc31SPeter Ujfalusi 				CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
37969bafc31SPeter Ujfalusi }
38069bafc31SPeter Ujfalusi 
38169bafc31SPeter Ujfalusi /**
38269bafc31SPeter Ujfalusi  * cppi5_hdesc_get_psdata_size - get PSdata size in bytes
38369bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
38469bafc31SPeter Ujfalusi  */
cppi5_hdesc_get_psdata_size(struct cppi5_host_desc_t * desc)38569bafc31SPeter Ujfalusi static inline u32 cppi5_hdesc_get_psdata_size(struct cppi5_host_desc_t *desc)
38669bafc31SPeter Ujfalusi {
38769bafc31SPeter Ujfalusi 	u32 psdata_size = 0;
38869bafc31SPeter Ujfalusi 
38969bafc31SPeter Ujfalusi 	if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
39069bafc31SPeter Ujfalusi 		psdata_size = (desc->hdr.pkt_info0 &
39169bafc31SPeter Ujfalusi 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
39269bafc31SPeter Ujfalusi 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
39369bafc31SPeter Ujfalusi 
39469bafc31SPeter Ujfalusi 	return (psdata_size << 2);
39569bafc31SPeter Ujfalusi }
39669bafc31SPeter Ujfalusi 
39769bafc31SPeter Ujfalusi /**
39869bafc31SPeter Ujfalusi  * cppi5_hdesc_get_pktlen - get Packet Length from HDesc
39969bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
40069bafc31SPeter Ujfalusi  *
40169bafc31SPeter Ujfalusi  * Returns Packet Length from Host Packet Descriptor
40269bafc31SPeter Ujfalusi  */
cppi5_hdesc_get_pktlen(struct cppi5_host_desc_t * desc)40369bafc31SPeter Ujfalusi static inline u32 cppi5_hdesc_get_pktlen(struct cppi5_host_desc_t *desc)
40469bafc31SPeter Ujfalusi {
40569bafc31SPeter Ujfalusi 	return (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PKTLEN_MASK);
40669bafc31SPeter Ujfalusi }
40769bafc31SPeter Ujfalusi 
40869bafc31SPeter Ujfalusi /**
40969bafc31SPeter Ujfalusi  * cppi5_hdesc_set_pktlen - set Packet Length in HDesc
41069bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
41169bafc31SPeter Ujfalusi  */
cppi5_hdesc_set_pktlen(struct cppi5_host_desc_t * desc,u32 pkt_len)41269bafc31SPeter Ujfalusi static inline void cppi5_hdesc_set_pktlen(struct cppi5_host_desc_t *desc,
41369bafc31SPeter Ujfalusi 					  u32 pkt_len)
41469bafc31SPeter Ujfalusi {
41569bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PKTLEN_MASK;
41669bafc31SPeter Ujfalusi 	desc->hdr.pkt_info0 |= (pkt_len & CPPI5_INFO0_HDESC_PKTLEN_MASK);
41769bafc31SPeter Ujfalusi }
41869bafc31SPeter Ujfalusi 
41969bafc31SPeter Ujfalusi /**
42069bafc31SPeter Ujfalusi  * cppi5_hdesc_get_psflags - get Protocol Specific Flags from HDesc
42169bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
42269bafc31SPeter Ujfalusi  *
42369bafc31SPeter Ujfalusi  * Returns Protocol Specific Flags from Host Packet Descriptor
42469bafc31SPeter Ujfalusi  */
cppi5_hdesc_get_psflags(struct cppi5_host_desc_t * desc)42569bafc31SPeter Ujfalusi static inline u32 cppi5_hdesc_get_psflags(struct cppi5_host_desc_t *desc)
42669bafc31SPeter Ujfalusi {
42769bafc31SPeter Ujfalusi 	return (desc->hdr.pkt_info1 & CPPI5_INFO1_HDESC_PSFLGS_MASK) >>
42869bafc31SPeter Ujfalusi 		CPPI5_INFO1_HDESC_PSFLGS_SHIFT;
42969bafc31SPeter Ujfalusi }
43069bafc31SPeter Ujfalusi 
43169bafc31SPeter Ujfalusi /**
43269bafc31SPeter Ujfalusi  * cppi5_hdesc_set_psflags - set Protocol Specific Flags in HDesc
43369bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
43469bafc31SPeter Ujfalusi  */
cppi5_hdesc_set_psflags(struct cppi5_host_desc_t * desc,u32 ps_flags)43569bafc31SPeter Ujfalusi static inline void cppi5_hdesc_set_psflags(struct cppi5_host_desc_t *desc,
43669bafc31SPeter Ujfalusi 					   u32 ps_flags)
43769bafc31SPeter Ujfalusi {
43869bafc31SPeter Ujfalusi 	desc->hdr.pkt_info1 &= ~CPPI5_INFO1_HDESC_PSFLGS_MASK;
43969bafc31SPeter Ujfalusi 	desc->hdr.pkt_info1 |= (ps_flags <<
44069bafc31SPeter Ujfalusi 				CPPI5_INFO1_HDESC_PSFLGS_SHIFT) &
44169bafc31SPeter Ujfalusi 				CPPI5_INFO1_HDESC_PSFLGS_MASK;
44269bafc31SPeter Ujfalusi }
44369bafc31SPeter Ujfalusi 
44469bafc31SPeter Ujfalusi /**
44569bafc31SPeter Ujfalusi  * cppi5_hdesc_get_errflags - get Packet Type from HDesc
44669bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
44769bafc31SPeter Ujfalusi  */
cppi5_hdesc_get_pkttype(struct cppi5_host_desc_t * desc)44869bafc31SPeter Ujfalusi static inline u32 cppi5_hdesc_get_pkttype(struct cppi5_host_desc_t *desc)
44969bafc31SPeter Ujfalusi {
45069bafc31SPeter Ujfalusi 	return (desc->hdr.pkt_info2 & CPPI5_INFO2_HDESC_PKTTYPE_MASK) >>
45169bafc31SPeter Ujfalusi 		CPPI5_INFO2_HDESC_PKTTYPE_SHIFT;
45269bafc31SPeter Ujfalusi }
45369bafc31SPeter Ujfalusi 
45469bafc31SPeter Ujfalusi /**
45569bafc31SPeter Ujfalusi  * cppi5_hdesc_get_errflags - set Packet Type in HDesc
45669bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
45769bafc31SPeter Ujfalusi  * @pkt_type: Packet Type
45869bafc31SPeter Ujfalusi  */
cppi5_hdesc_set_pkttype(struct cppi5_host_desc_t * desc,u32 pkt_type)45969bafc31SPeter Ujfalusi static inline void cppi5_hdesc_set_pkttype(struct cppi5_host_desc_t *desc,
46069bafc31SPeter Ujfalusi 					   u32 pkt_type)
46169bafc31SPeter Ujfalusi {
46269bafc31SPeter Ujfalusi 	desc->hdr.pkt_info2 &= ~CPPI5_INFO2_HDESC_PKTTYPE_MASK;
46369bafc31SPeter Ujfalusi 	desc->hdr.pkt_info2 |=
46469bafc31SPeter Ujfalusi 			(pkt_type << CPPI5_INFO2_HDESC_PKTTYPE_SHIFT) &
46569bafc31SPeter Ujfalusi 			 CPPI5_INFO2_HDESC_PKTTYPE_MASK;
46669bafc31SPeter Ujfalusi }
46769bafc31SPeter Ujfalusi 
46869bafc31SPeter Ujfalusi /**
46969bafc31SPeter Ujfalusi  * cppi5_hdesc_attach_buf - attach buffer to HDesc
47069bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
47169bafc31SPeter Ujfalusi  * @buf: Buffer physical address
47269bafc31SPeter Ujfalusi  * @buf_data_len: Buffer length
47369bafc31SPeter Ujfalusi  * @obuf: Original Buffer physical address
47469bafc31SPeter Ujfalusi  * @obuf_len: Original Buffer length
47569bafc31SPeter Ujfalusi  *
47669bafc31SPeter Ujfalusi  * Attaches buffer to Host Packet Descriptor
47769bafc31SPeter Ujfalusi  */
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)47869bafc31SPeter Ujfalusi static inline void cppi5_hdesc_attach_buf(struct cppi5_host_desc_t *desc,
47969bafc31SPeter Ujfalusi 					  dma_addr_t buf, u32 buf_data_len,
48069bafc31SPeter Ujfalusi 					  dma_addr_t obuf, u32 obuf_len)
48169bafc31SPeter Ujfalusi {
48269bafc31SPeter Ujfalusi 	desc->buf_ptr = buf;
48369bafc31SPeter Ujfalusi 	desc->buf_info1 = buf_data_len & CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK;
48469bafc31SPeter Ujfalusi 	desc->org_buf_ptr = obuf;
48569bafc31SPeter Ujfalusi 	desc->org_buf_len = obuf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
48669bafc31SPeter Ujfalusi }
48769bafc31SPeter Ujfalusi 
cppi5_hdesc_get_obuf(struct cppi5_host_desc_t * desc,dma_addr_t * obuf,u32 * obuf_len)48869bafc31SPeter Ujfalusi static inline void cppi5_hdesc_get_obuf(struct cppi5_host_desc_t *desc,
48969bafc31SPeter Ujfalusi 					dma_addr_t *obuf, u32 *obuf_len)
49069bafc31SPeter Ujfalusi {
49169bafc31SPeter Ujfalusi 	*obuf = desc->org_buf_ptr;
49269bafc31SPeter Ujfalusi 	*obuf_len = desc->org_buf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
49369bafc31SPeter Ujfalusi }
49469bafc31SPeter Ujfalusi 
cppi5_hdesc_reset_to_original(struct cppi5_host_desc_t * desc)49569bafc31SPeter Ujfalusi static inline void cppi5_hdesc_reset_to_original(struct cppi5_host_desc_t *desc)
49669bafc31SPeter Ujfalusi {
49769bafc31SPeter Ujfalusi 	desc->buf_ptr = desc->org_buf_ptr;
49869bafc31SPeter Ujfalusi 	desc->buf_info1 = desc->org_buf_len;
49969bafc31SPeter Ujfalusi }
50069bafc31SPeter Ujfalusi 
50169bafc31SPeter Ujfalusi /**
50269bafc31SPeter Ujfalusi  * cppi5_hdesc_link_hbdesc - link Host Buffer Descriptor to HDesc
50369bafc31SPeter Ujfalusi  * @desc: Host Packet Descriptor
50469bafc31SPeter Ujfalusi  * @buf_desc: Host Buffer Descriptor physical address
50569bafc31SPeter Ujfalusi  *
50669bafc31SPeter Ujfalusi  * add and link Host Buffer Descriptor to HDesc
50769bafc31SPeter Ujfalusi  */
cppi5_hdesc_link_hbdesc(struct cppi5_host_desc_t * desc,dma_addr_t hbuf_desc)50869bafc31SPeter Ujfalusi static inline void cppi5_hdesc_link_hbdesc(struct cppi5_host_desc_t *desc,
50969bafc31SPeter Ujfalusi 					   dma_addr_t hbuf_desc)
51069bafc31SPeter Ujfalusi {
51169bafc31SPeter Ujfalusi 	desc->next_desc = hbuf_desc;
51269bafc31SPeter Ujfalusi }
51369bafc31SPeter Ujfalusi 
51469bafc31SPeter Ujfalusi static inline dma_addr_t
cppi5_hdesc_get_next_hbdesc(struct cppi5_host_desc_t * desc)51569bafc31SPeter Ujfalusi cppi5_hdesc_get_next_hbdesc(struct cppi5_host_desc_t *desc)
51669bafc31SPeter Ujfalusi {
51769bafc31SPeter Ujfalusi 	return (dma_addr_t)desc->next_desc;
51869bafc31SPeter Ujfalusi }
51969bafc31SPeter Ujfalusi 
cppi5_hdesc_reset_hbdesc(struct cppi5_host_desc_t * desc)52069bafc31SPeter Ujfalusi static inline void cppi5_hdesc_reset_hbdesc(struct cppi5_host_desc_t *desc)
52169bafc31SPeter Ujfalusi {
52269bafc31SPeter Ujfalusi 	desc->hdr = (struct cppi5_desc_hdr_t) { 0 };
52369bafc31SPeter Ujfalusi 	desc->next_desc = 0;
52469bafc31SPeter Ujfalusi }
52569bafc31SPeter Ujfalusi 
52669bafc31SPeter Ujfalusi /**
52769bafc31SPeter Ujfalusi  * cppi5_hdesc_epib_present -  check if EPIB present
52869bafc31SPeter Ujfalusi  * @desc_hdr: packet descriptor/TR header
52969bafc31SPeter Ujfalusi  *
53069bafc31SPeter Ujfalusi  * Returns true if EPIB present in the packet
53169bafc31SPeter Ujfalusi  */
cppi5_hdesc_epib_present(struct cppi5_desc_hdr_t * desc_hdr)53269bafc31SPeter Ujfalusi static inline bool cppi5_hdesc_epib_present(struct cppi5_desc_hdr_t *desc_hdr)
53369bafc31SPeter Ujfalusi {
53469bafc31SPeter Ujfalusi 	return !!(desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_EPIB_PRESENT);
53569bafc31SPeter Ujfalusi }
53669bafc31SPeter Ujfalusi 
53769bafc31SPeter Ujfalusi /**
53869bafc31SPeter Ujfalusi  * cppi5_hdesc_get_psdata -  Get pointer on PSDATA
53969bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
54069bafc31SPeter Ujfalusi  *
54169bafc31SPeter Ujfalusi  * Returns pointer on PSDATA in HDesc.
54269bafc31SPeter Ujfalusi  * NULL - if ps_data placed at the start of data buffer.
54369bafc31SPeter Ujfalusi  */
cppi5_hdesc_get_psdata(struct cppi5_host_desc_t * desc)54469bafc31SPeter Ujfalusi static inline void *cppi5_hdesc_get_psdata(struct cppi5_host_desc_t *desc)
54569bafc31SPeter Ujfalusi {
54669bafc31SPeter Ujfalusi 	u32 psdata_size;
54769bafc31SPeter Ujfalusi 	void *psdata;
54869bafc31SPeter Ujfalusi 
54969bafc31SPeter Ujfalusi 	if (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION)
55069bafc31SPeter Ujfalusi 		return NULL;
55169bafc31SPeter Ujfalusi 
55269bafc31SPeter Ujfalusi 	psdata_size = (desc->hdr.pkt_info0 &
55369bafc31SPeter Ujfalusi 		       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
55469bafc31SPeter Ujfalusi 		       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
55569bafc31SPeter Ujfalusi 
55669bafc31SPeter Ujfalusi 	if (!psdata_size)
55769bafc31SPeter Ujfalusi 		return NULL;
55869bafc31SPeter Ujfalusi 
55969bafc31SPeter Ujfalusi 	psdata = &desc->epib;
56069bafc31SPeter Ujfalusi 
56169bafc31SPeter Ujfalusi 	if (cppi5_hdesc_epib_present(&desc->hdr))
56269bafc31SPeter Ujfalusi 		psdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
56369bafc31SPeter Ujfalusi 
56469bafc31SPeter Ujfalusi 	return psdata;
56569bafc31SPeter Ujfalusi }
56669bafc31SPeter Ujfalusi 
56769bafc31SPeter Ujfalusi /**
56869bafc31SPeter Ujfalusi  * cppi5_hdesc_get_swdata -  Get pointer on swdata
56969bafc31SPeter Ujfalusi  * @desc: Host packet descriptor
57069bafc31SPeter Ujfalusi  *
57169bafc31SPeter Ujfalusi  * Returns pointer on SWDATA in HDesc.
57269bafc31SPeter Ujfalusi  * NOTE. It's caller responsibility to be sure hdesc actually has swdata.
57369bafc31SPeter Ujfalusi  */
cppi5_hdesc_get_swdata(struct cppi5_host_desc_t * desc)57469bafc31SPeter Ujfalusi static inline void *cppi5_hdesc_get_swdata(struct cppi5_host_desc_t *desc)
57569bafc31SPeter Ujfalusi {
57669bafc31SPeter Ujfalusi 	u32 psdata_size = 0;
57769bafc31SPeter Ujfalusi 	void *swdata;
57869bafc31SPeter Ujfalusi 
57969bafc31SPeter Ujfalusi 	if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
58069bafc31SPeter Ujfalusi 		psdata_size = (desc->hdr.pkt_info0 &
58169bafc31SPeter Ujfalusi 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
58269bafc31SPeter Ujfalusi 			       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
58369bafc31SPeter Ujfalusi 
58469bafc31SPeter Ujfalusi 	swdata = &desc->epib;
58569bafc31SPeter Ujfalusi 
58669bafc31SPeter Ujfalusi 	if (cppi5_hdesc_epib_present(&desc->hdr))
58769bafc31SPeter Ujfalusi 		swdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
58869bafc31SPeter Ujfalusi 
58969bafc31SPeter Ujfalusi 	swdata += (psdata_size << 2);
59069bafc31SPeter Ujfalusi 
59169bafc31SPeter Ujfalusi 	return swdata;
59269bafc31SPeter Ujfalusi }
59369bafc31SPeter Ujfalusi 
59469bafc31SPeter Ujfalusi /* ================================== TR ================================== */
59569bafc31SPeter Ujfalusi 
59669bafc31SPeter Ujfalusi #define CPPI5_TR_TYPE_SHIFT			(0U)
59769bafc31SPeter Ujfalusi #define CPPI5_TR_TYPE_MASK			GENMASK(3, 0)
59869bafc31SPeter Ujfalusi #define CPPI5_TR_STATIC				BIT(4)
59969bafc31SPeter Ujfalusi #define CPPI5_TR_WAIT				BIT(5)
60069bafc31SPeter Ujfalusi #define CPPI5_TR_EVENT_SIZE_SHIFT		(6U)
60169bafc31SPeter Ujfalusi #define CPPI5_TR_EVENT_SIZE_MASK		GENMASK(7, 6)
60269bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER0_SHIFT			(8U)
60369bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER0_MASK			GENMASK(9, 8)
60469bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER0_TYPE_SHIFT		(10U)
60569bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER0_TYPE_MASK		GENMASK(11, 10)
60669bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER1_SHIFT			(12U)
60769bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER1_MASK			GENMASK(13, 12)
60869bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER1_TYPE_SHIFT		(14U)
60969bafc31SPeter Ujfalusi #define CPPI5_TR_TRIGGER1_TYPE_MASK		GENMASK(15, 14)
61069bafc31SPeter Ujfalusi #define CPPI5_TR_CMD_ID_SHIFT			(16U)
61169bafc31SPeter Ujfalusi #define CPPI5_TR_CMD_ID_MASK			GENMASK(23, 16)
61269bafc31SPeter Ujfalusi #define CPPI5_TR_CSF_FLAGS_SHIFT		(24U)
61369bafc31SPeter Ujfalusi #define CPPI5_TR_CSF_FLAGS_MASK			GENMASK(31, 24)
61469bafc31SPeter Ujfalusi #define   CPPI5_TR_CSF_SA_INDIRECT		BIT(0)
61569bafc31SPeter Ujfalusi #define   CPPI5_TR_CSF_DA_INDIRECT		BIT(1)
61669bafc31SPeter Ujfalusi #define   CPPI5_TR_CSF_SUPR_EVT			BIT(2)
61769bafc31SPeter Ujfalusi #define   CPPI5_TR_CSF_EOL_ADV_SHIFT		(4U)
61869bafc31SPeter Ujfalusi #define   CPPI5_TR_CSF_EOL_ADV_MASK		GENMASK(6, 4)
619*f806bea3SVignesh Raghavendra #define   CPPI5_TR_CSF_EOL_ICNT0		BIT(4)
62069bafc31SPeter Ujfalusi #define   CPPI5_TR_CSF_EOP			BIT(7)
62169bafc31SPeter Ujfalusi 
62269bafc31SPeter Ujfalusi /**
62369bafc31SPeter Ujfalusi  * enum cppi5_tr_types - TR types
62469bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE0:	One dimensional data move
62569bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE1:	Two dimensional data move
62669bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE2:	Three dimensional data move
62769bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE3:	Four dimensional data move
62869bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE4:	Four dimensional data move with data formatting
62969bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE5:	Four dimensional Cache Warm
63069bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE8:	Four Dimensional Block Move
63169bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE9:	Four Dimensional Block Move with Repacking
63269bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE10:	Two Dimensional Block Move
63369bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE11:	Two Dimensional Block Move with Repacking
63469bafc31SPeter Ujfalusi  * @CPPI5_TR_TYPE15:	Four Dimensional Block Move with Repacking and
63569bafc31SPeter Ujfalusi  *			Indirection
63669bafc31SPeter Ujfalusi  */
63769bafc31SPeter Ujfalusi enum cppi5_tr_types {
63869bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE0 = 0,
63969bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE1,
64069bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE2,
64169bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE3,
64269bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE4,
64369bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE5,
64469bafc31SPeter Ujfalusi 	/* type6-7: Reserved */
64569bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE8 = 8,
64669bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE9,
64769bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE10,
64869bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE11,
64969bafc31SPeter Ujfalusi 	/* type12-14: Reserved */
65069bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE15 = 15,
65169bafc31SPeter Ujfalusi 	CPPI5_TR_TYPE_MAX
65269bafc31SPeter Ujfalusi };
65369bafc31SPeter Ujfalusi 
65469bafc31SPeter Ujfalusi /**
65569bafc31SPeter Ujfalusi  * enum cppi5_tr_event_size - TR Flags EVENT_SIZE field specifies when an event
65669bafc31SPeter Ujfalusi  *			      is generated for each TR.
65769bafc31SPeter Ujfalusi  * @CPPI5_TR_EVENT_SIZE_COMPLETION:	When TR is complete and all status for
65869bafc31SPeter Ujfalusi  * 					the TR has been received
65969bafc31SPeter Ujfalusi  * @CPPI5_TR_EVENT_SIZE_ICNT1_DEC:	Type 0: when the last data transaction
66069bafc31SPeter Ujfalusi  *					is sent for the TR
66169bafc31SPeter Ujfalusi  *					Type 1-11: when ICNT1 is decremented
66269bafc31SPeter Ujfalusi  * @CPPI5_TR_EVENT_SIZE_ICNT2_DEC:	Type 0-1,10-11: when the last data
66369bafc31SPeter Ujfalusi  *					transaction is sent for the TR
66469bafc31SPeter Ujfalusi  *					All other types: when ICNT2 is
66569bafc31SPeter Ujfalusi  *					decremented
66669bafc31SPeter Ujfalusi  * @CPPI5_TR_EVENT_SIZE_ICNT3_DEC:	Type 0-2,10-11: when the last data
66769bafc31SPeter Ujfalusi  *					transaction is sent for the TR
66869bafc31SPeter Ujfalusi  *					All other types: when ICNT3 is
66969bafc31SPeter Ujfalusi  *					decremented
67069bafc31SPeter Ujfalusi  */
67169bafc31SPeter Ujfalusi enum cppi5_tr_event_size {
67269bafc31SPeter Ujfalusi 	CPPI5_TR_EVENT_SIZE_COMPLETION,
67369bafc31SPeter Ujfalusi 	CPPI5_TR_EVENT_SIZE_ICNT1_DEC,
67469bafc31SPeter Ujfalusi 	CPPI5_TR_EVENT_SIZE_ICNT2_DEC,
67569bafc31SPeter Ujfalusi 	CPPI5_TR_EVENT_SIZE_ICNT3_DEC,
67669bafc31SPeter Ujfalusi 	CPPI5_TR_EVENT_SIZE_MAX
67769bafc31SPeter Ujfalusi };
67869bafc31SPeter Ujfalusi 
67969bafc31SPeter Ujfalusi /**
68069bafc31SPeter Ujfalusi  * enum cppi5_tr_trigger - TR Flags TRIGGERx field specifies the type of trigger
68169bafc31SPeter Ujfalusi  *			   used to enable the TR to transfer data as specified
68269bafc31SPeter Ujfalusi  *			   by TRIGGERx_TYPE field.
68369bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_NONE:		No trigger
68469bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_GLOBAL0:		Global trigger 0
68569bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_GLOBAL1:		Global trigger 1
68669bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_LOCAL_EVENT:	Local Event
68769bafc31SPeter Ujfalusi  */
68869bafc31SPeter Ujfalusi enum cppi5_tr_trigger {
68969bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_NONE,
69069bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_GLOBAL0,
69169bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_GLOBAL1,
69269bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_LOCAL_EVENT,
69369bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_MAX
69469bafc31SPeter Ujfalusi };
69569bafc31SPeter Ujfalusi 
69669bafc31SPeter Ujfalusi /**
69769bafc31SPeter Ujfalusi  * enum cppi5_tr_trigger_type - TR Flags TRIGGERx_TYPE field specifies the type
69869bafc31SPeter Ujfalusi  *				of data transfer that will be enabled by
69969bafc31SPeter Ujfalusi  *				receiving a trigger as specified by TRIGGERx.
70069bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC:	The second inner most loop (ICNT1) will
70169bafc31SPeter Ujfalusi  *					be decremented by 1
70269bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC:	The third inner most loop (ICNT2) will
70369bafc31SPeter Ujfalusi  *					be decremented by 1
70469bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC:	The outer most loop (ICNT3) will be
70569bafc31SPeter Ujfalusi  *					decremented by 1
70669bafc31SPeter Ujfalusi  * @CPPI5_TR_TRIGGER_TYPE_ALL:		The entire TR will be allowed to
70769bafc31SPeter Ujfalusi  *					complete
70869bafc31SPeter Ujfalusi  */
70969bafc31SPeter Ujfalusi enum cppi5_tr_trigger_type {
71069bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC,
71169bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC,
71269bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC,
71369bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_TYPE_ALL,
71469bafc31SPeter Ujfalusi 	CPPI5_TR_TRIGGER_TYPE_MAX
71569bafc31SPeter Ujfalusi };
71669bafc31SPeter Ujfalusi 
71769bafc31SPeter Ujfalusi typedef u32 cppi5_tr_flags_t;
71869bafc31SPeter Ujfalusi 
71969bafc31SPeter Ujfalusi /**
72069bafc31SPeter Ujfalusi  * struct cppi5_tr_type0_t - Type 0 (One dimensional data move) TR (16 byte)
72169bafc31SPeter Ujfalusi  * @flags:		TR flags (type, triggers, event, configuration)
72269bafc31SPeter Ujfalusi  * @icnt0:		Total loop iteration count for level 0 (innermost)
72369bafc31SPeter Ujfalusi  * @_reserved:		Not used
72469bafc31SPeter Ujfalusi  * @addr:		Starting address for the source data or destination data
72569bafc31SPeter Ujfalusi  */
72669bafc31SPeter Ujfalusi struct cppi5_tr_type0_t {
72769bafc31SPeter Ujfalusi 	cppi5_tr_flags_t flags;
72869bafc31SPeter Ujfalusi 	u16 icnt0;
72969bafc31SPeter Ujfalusi 	u16 _reserved;
73069bafc31SPeter Ujfalusi 	u64 addr;
73169bafc31SPeter Ujfalusi } __aligned(16) __packed;
73269bafc31SPeter Ujfalusi 
73369bafc31SPeter Ujfalusi /**
73469bafc31SPeter Ujfalusi  * struct cppi5_tr_type1_t - Type 1 (Two dimensional data move) TR (32 byte)
73569bafc31SPeter Ujfalusi  * @flags:		TR flags (type, triggers, event, configuration)
73669bafc31SPeter Ujfalusi  * @icnt0:		Total loop iteration count for level 0 (innermost)
73769bafc31SPeter Ujfalusi  * @icnt1:		Total loop iteration count for level 1
73869bafc31SPeter Ujfalusi  * @addr:		Starting address for the source data or destination data
73969bafc31SPeter Ujfalusi  * @dim1:		Signed dimension for loop level 1
74069bafc31SPeter Ujfalusi  */
74169bafc31SPeter Ujfalusi struct cppi5_tr_type1_t {
74269bafc31SPeter Ujfalusi 	cppi5_tr_flags_t flags;
74369bafc31SPeter Ujfalusi 	u16 icnt0;
74469bafc31SPeter Ujfalusi 	u16 icnt1;
74569bafc31SPeter Ujfalusi 	u64 addr;
74669bafc31SPeter Ujfalusi 	s32 dim1;
74769bafc31SPeter Ujfalusi } __aligned(32) __packed;
74869bafc31SPeter Ujfalusi 
74969bafc31SPeter Ujfalusi /**
75069bafc31SPeter Ujfalusi  * struct cppi5_tr_type2_t - Type 2 (Three dimensional data move) TR (32 byte)
75169bafc31SPeter Ujfalusi  * @flags:		TR flags (type, triggers, event, configuration)
75269bafc31SPeter Ujfalusi  * @icnt0:		Total loop iteration count for level 0 (innermost)
75369bafc31SPeter Ujfalusi  * @icnt1:		Total loop iteration count for level 1
75469bafc31SPeter Ujfalusi  * @addr:		Starting address for the source data or destination data
75569bafc31SPeter Ujfalusi  * @dim1:		Signed dimension for loop level 1
75669bafc31SPeter Ujfalusi  * @icnt2:		Total loop iteration count for level 2
75769bafc31SPeter Ujfalusi  * @_reserved:		Not used
75869bafc31SPeter Ujfalusi  * @dim2:		Signed dimension for loop level 2
75969bafc31SPeter Ujfalusi  */
76069bafc31SPeter Ujfalusi struct cppi5_tr_type2_t {
76169bafc31SPeter Ujfalusi 	cppi5_tr_flags_t flags;
76269bafc31SPeter Ujfalusi 	u16 icnt0;
76369bafc31SPeter Ujfalusi 	u16 icnt1;
76469bafc31SPeter Ujfalusi 	u64 addr;
76569bafc31SPeter Ujfalusi 	s32 dim1;
76669bafc31SPeter Ujfalusi 	u16 icnt2;
76769bafc31SPeter Ujfalusi 	u16 _reserved;
76869bafc31SPeter Ujfalusi 	s32 dim2;
76969bafc31SPeter Ujfalusi } __aligned(32) __packed;
77069bafc31SPeter Ujfalusi 
77169bafc31SPeter Ujfalusi /**
77269bafc31SPeter Ujfalusi  * struct cppi5_tr_type3_t - Type 3 (Four dimensional data move) TR (32 byte)
77369bafc31SPeter Ujfalusi  * @flags:		TR flags (type, triggers, event, configuration)
77469bafc31SPeter Ujfalusi  * @icnt0:		Total loop iteration count for level 0 (innermost)
77569bafc31SPeter Ujfalusi  * @icnt1:		Total loop iteration count for level 1
77669bafc31SPeter Ujfalusi  * @addr:		Starting address for the source data or destination data
77769bafc31SPeter Ujfalusi  * @dim1:		Signed dimension for loop level 1
77869bafc31SPeter Ujfalusi  * @icnt2:		Total loop iteration count for level 2
77969bafc31SPeter Ujfalusi  * @icnt3:		Total loop iteration count for level 3 (outermost)
78069bafc31SPeter Ujfalusi  * @dim2:		Signed dimension for loop level 2
78169bafc31SPeter Ujfalusi  * @dim3:		Signed dimension for loop level 3
78269bafc31SPeter Ujfalusi  */
78369bafc31SPeter Ujfalusi struct cppi5_tr_type3_t {
78469bafc31SPeter Ujfalusi 	cppi5_tr_flags_t flags;
78569bafc31SPeter Ujfalusi 	u16 icnt0;
78669bafc31SPeter Ujfalusi 	u16 icnt1;
78769bafc31SPeter Ujfalusi 	u64 addr;
78869bafc31SPeter Ujfalusi 	s32 dim1;
78969bafc31SPeter Ujfalusi 	u16 icnt2;
79069bafc31SPeter Ujfalusi 	u16 icnt3;
79169bafc31SPeter Ujfalusi 	s32 dim2;
79269bafc31SPeter Ujfalusi 	s32 dim3;
79369bafc31SPeter Ujfalusi } __aligned(32) __packed;
79469bafc31SPeter Ujfalusi 
79569bafc31SPeter Ujfalusi /**
79669bafc31SPeter Ujfalusi  * struct cppi5_tr_type15_t - Type 15 (Four Dimensional Block Copy with
79769bafc31SPeter Ujfalusi  *			      Repacking and Indirection Support) TR (64 byte)
79869bafc31SPeter Ujfalusi  * @flags:		TR flags (type, triggers, event, configuration)
79969bafc31SPeter Ujfalusi  * @icnt0:		Total loop iteration count for level 0 (innermost) for
80069bafc31SPeter Ujfalusi  *			source
80169bafc31SPeter Ujfalusi  * @icnt1:		Total loop iteration count for level 1 for source
80269bafc31SPeter Ujfalusi  * @addr:		Starting address for the source data
80369bafc31SPeter Ujfalusi  * @dim1:		Signed dimension for loop level 1 for source
80469bafc31SPeter Ujfalusi  * @icnt2:		Total loop iteration count for level 2 for source
80569bafc31SPeter Ujfalusi  * @icnt3:		Total loop iteration count for level 3 (outermost) for
80669bafc31SPeter Ujfalusi  *			source
80769bafc31SPeter Ujfalusi  * @dim2:		Signed dimension for loop level 2 for source
80869bafc31SPeter Ujfalusi  * @dim3:		Signed dimension for loop level 3 for source
80969bafc31SPeter Ujfalusi  * @_reserved:		Not used
81069bafc31SPeter Ujfalusi  * @ddim1:		Signed dimension for loop level 1 for destination
81169bafc31SPeter Ujfalusi  * @daddr:		Starting address for the destination data
81269bafc31SPeter Ujfalusi  * @ddim2:		Signed dimension for loop level 2 for destination
81369bafc31SPeter Ujfalusi  * @ddim3:		Signed dimension for loop level 3 for destination
81469bafc31SPeter Ujfalusi  * @dicnt0:		Total loop iteration count for level 0 (innermost) for
81569bafc31SPeter Ujfalusi  *			destination
81669bafc31SPeter Ujfalusi  * @dicnt1:		Total loop iteration count for level 1 for destination
81769bafc31SPeter Ujfalusi  * @dicnt2:		Total loop iteration count for level 2 for destination
81869bafc31SPeter Ujfalusi  * @sicnt3:		Total loop iteration count for level 3 (outermost) for
81969bafc31SPeter Ujfalusi  *			destination
82069bafc31SPeter Ujfalusi  */
82169bafc31SPeter Ujfalusi struct cppi5_tr_type15_t {
82269bafc31SPeter Ujfalusi 	cppi5_tr_flags_t flags;
82369bafc31SPeter Ujfalusi 	u16 icnt0;
82469bafc31SPeter Ujfalusi 	u16 icnt1;
82569bafc31SPeter Ujfalusi 	u64 addr;
82669bafc31SPeter Ujfalusi 	s32 dim1;
82769bafc31SPeter Ujfalusi 	u16 icnt2;
82869bafc31SPeter Ujfalusi 	u16 icnt3;
82969bafc31SPeter Ujfalusi 	s32 dim2;
83069bafc31SPeter Ujfalusi 	s32 dim3;
83169bafc31SPeter Ujfalusi 	u32 _reserved;
83269bafc31SPeter Ujfalusi 	s32 ddim1;
83369bafc31SPeter Ujfalusi 	u64 daddr;
83469bafc31SPeter Ujfalusi 	s32 ddim2;
83569bafc31SPeter Ujfalusi 	s32 ddim3;
83669bafc31SPeter Ujfalusi 	u16 dicnt0;
83769bafc31SPeter Ujfalusi 	u16 dicnt1;
83869bafc31SPeter Ujfalusi 	u16 dicnt2;
83969bafc31SPeter Ujfalusi 	u16 dicnt3;
84069bafc31SPeter Ujfalusi } __aligned(64) __packed;
84169bafc31SPeter Ujfalusi 
84269bafc31SPeter Ujfalusi /**
84369bafc31SPeter Ujfalusi  * struct cppi5_tr_resp_t - TR response record
84469bafc31SPeter Ujfalusi  * @status:		Status type and info
84569bafc31SPeter Ujfalusi  * @_reserved:		Not used
84669bafc31SPeter Ujfalusi  * @cmd_id:		Command ID for the TR for TR identification
84769bafc31SPeter Ujfalusi  * @flags:		Configuration Specific Flags
84869bafc31SPeter Ujfalusi  */
84969bafc31SPeter Ujfalusi struct cppi5_tr_resp_t {
85069bafc31SPeter Ujfalusi 	u8 status;
85169bafc31SPeter Ujfalusi 	u8 _reserved;
85269bafc31SPeter Ujfalusi 	u8 cmd_id;
85369bafc31SPeter Ujfalusi 	u8 flags;
85469bafc31SPeter Ujfalusi } __packed;
85569bafc31SPeter Ujfalusi 
85669bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_STATUS_TYPE_SHIFT	(0U)
85769bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_STATUS_TYPE_MASK	GENMASK(3, 0)
85869bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_STATUS_INFO_SHIFT	(4U)
85969bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_STATUS_INFO_MASK	GENMASK(7, 4)
86069bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_CMDID_SHIFT		(16U)
86169bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_CMDID_MASK		GENMASK(23, 16)
86269bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_CFG_SPECIFIC_SHIFT	(24U)
86369bafc31SPeter Ujfalusi #define CPPI5_TR_RESPONSE_CFG_SPECIFIC_MASK	GENMASK(31, 24)
86469bafc31SPeter Ujfalusi 
86569bafc31SPeter Ujfalusi /**
86669bafc31SPeter Ujfalusi  * enum cppi5_tr_resp_status_type - TR Response Status Type field is used to
86769bafc31SPeter Ujfalusi  *				    determine what type of status is being
86869bafc31SPeter Ujfalusi  *				    returned.
86969bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_NONE:		No error, completion: completed
87069bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR:	Transfer Error, completion: none
87169bafc31SPeter Ujfalusi  *						or partially completed
87269bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR:	Aborted Error, completion: none
87369bafc31SPeter Ujfalusi  *						or partially completed
87469bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR:	Submission Error, completion:
87569bafc31SPeter Ujfalusi  *						none
87669bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR:	Unsupported Error, completion:
87769bafc31SPeter Ujfalusi  *						none
87869bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_TRANSFER_EXCEPTION: Transfer Exception, completion:
87969bafc31SPeter Ujfalusi  *						partially completed
88069bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS__TEARDOWN_FLUSH:	Teardown Flush, completion: none
88169bafc31SPeter Ujfalusi  */
88269bafc31SPeter Ujfalusi enum cppi5_tr_resp_status_type {
88369bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_NONE,
88469bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR,
88569bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR,
88669bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR,
88769bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR,
88869bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_TRANSFER_EXCEPTION,
88969bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS__TEARDOWN_FLUSH,
89069bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_MAX
89169bafc31SPeter Ujfalusi };
89269bafc31SPeter Ujfalusi 
89369bafc31SPeter Ujfalusi /**
89469bafc31SPeter Ujfalusi  * enum cppi5_tr_resp_status_submission - TR Response Status field values which
89569bafc31SPeter Ujfalusi  *					  corresponds Submission Error
89669bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0:	ICNT0 was 0
89769bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL: Channel FIFO was full when TR
89869bafc31SPeter Ujfalusi  *						received
89969bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN:	Channel is not owned by the
90069bafc31SPeter Ujfalusi  *						submitter
90169bafc31SPeter Ujfalusi  */
90269bafc31SPeter Ujfalusi enum cppi5_tr_resp_status_submission {
90369bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0,
90469bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL,
90569bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN,
90669bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_MAX
90769bafc31SPeter Ujfalusi };
90869bafc31SPeter Ujfalusi 
90969bafc31SPeter Ujfalusi /**
91069bafc31SPeter Ujfalusi  * enum cppi5_tr_resp_status_unsupported - TR Response Status field values which
91169bafc31SPeter Ujfalusi  *					   corresponds Unsupported Error
91269bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE:	TR Type not supported
91369bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC:	STATIC not supported
91469bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL:		EOL not supported
91569bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC:	CONFIGURATION SPECIFIC
91669bafc31SPeter Ujfalusi  *							not supported
91769bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE:		AMODE not supported
91869bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE:	ELTYPE not supported
91969bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT:		DFMT not supported
92069bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR:		SECTR not supported
92169bafc31SPeter Ujfalusi  * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC: AMODE SPECIFIC field
92269bafc31SPeter Ujfalusi  *							not supported
92369bafc31SPeter Ujfalusi  */
92469bafc31SPeter Ujfalusi enum cppi5_tr_resp_status_unsupported {
92569bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE,
92669bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC,
92769bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL,
92869bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC,
92969bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE,
93069bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE,
93169bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT,
93269bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR,
93369bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC,
93469bafc31SPeter Ujfalusi 	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_MAX
93569bafc31SPeter Ujfalusi };
93669bafc31SPeter Ujfalusi 
93769bafc31SPeter Ujfalusi /**
93869bafc31SPeter Ujfalusi  * cppi5_trdesc_calc_size - Calculate TR Descriptor size
93969bafc31SPeter Ujfalusi  * @tr_count: number of TR records
94069bafc31SPeter Ujfalusi  * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
94169bafc31SPeter Ujfalusi  *
94269bafc31SPeter Ujfalusi  * Returns required TR Descriptor size
94369bafc31SPeter Ujfalusi  */
cppi5_trdesc_calc_size(u32 tr_count,u32 tr_size)94469bafc31SPeter Ujfalusi static inline size_t cppi5_trdesc_calc_size(u32 tr_count, u32 tr_size)
94569bafc31SPeter Ujfalusi {
94669bafc31SPeter Ujfalusi 	/*
94769bafc31SPeter Ujfalusi 	 * The Size of a TR descriptor is:
94869bafc31SPeter Ujfalusi 	 * 1 x tr_size : the first 16 bytes is used by the packet info block +
94969bafc31SPeter Ujfalusi 	 * tr_count x tr_size : Transfer Request Records +
95069bafc31SPeter Ujfalusi 	 * tr_count x sizeof(struct cppi5_tr_resp_t) : Transfer Response Records
95169bafc31SPeter Ujfalusi 	 */
95269bafc31SPeter Ujfalusi 	return tr_size * (tr_count + 1) +
95369bafc31SPeter Ujfalusi 		sizeof(struct cppi5_tr_resp_t) * tr_count;
95469bafc31SPeter Ujfalusi }
95569bafc31SPeter Ujfalusi 
95669bafc31SPeter Ujfalusi /**
95769bafc31SPeter Ujfalusi  * cppi5_trdesc_init - Init TR Descriptor
95869bafc31SPeter Ujfalusi  * @desc: TR Descriptor
95969bafc31SPeter Ujfalusi  * @tr_count: number of TR records
96069bafc31SPeter Ujfalusi  * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
96169bafc31SPeter Ujfalusi  * @reload_idx: Absolute index to jump to on the 2nd and following passes
96269bafc31SPeter Ujfalusi  *		through the TR packet.
96369bafc31SPeter Ujfalusi  * @reload_count: Number of times to jump from last entry to reload_idx. 0x1ff
96469bafc31SPeter Ujfalusi  *		  indicates infinite looping.
96569bafc31SPeter Ujfalusi  *
96669bafc31SPeter Ujfalusi  * Init TR Descriptor
96769bafc31SPeter Ujfalusi  */
cppi5_trdesc_init(struct cppi5_desc_hdr_t * desc_hdr,u32 tr_count,u32 tr_size,u32 reload_idx,u32 reload_count)96869bafc31SPeter Ujfalusi static inline void cppi5_trdesc_init(struct cppi5_desc_hdr_t *desc_hdr,
96969bafc31SPeter Ujfalusi 				     u32 tr_count, u32 tr_size, u32 reload_idx,
97069bafc31SPeter Ujfalusi 				     u32 reload_count)
97169bafc31SPeter Ujfalusi {
97269bafc31SPeter Ujfalusi 	desc_hdr->pkt_info0 = CPPI5_INFO0_DESC_TYPE_VAL_TR <<
97369bafc31SPeter Ujfalusi 			      CPPI5_INFO0_HDESC_TYPE_SHIFT;
97469bafc31SPeter Ujfalusi 	desc_hdr->pkt_info0 |=
97569bafc31SPeter Ujfalusi 			(reload_count << CPPI5_INFO0_TRDESC_RLDCNT_SHIFT) &
97669bafc31SPeter Ujfalusi 			CPPI5_INFO0_TRDESC_RLDCNT_MASK;
97769bafc31SPeter Ujfalusi 	desc_hdr->pkt_info0 |=
97869bafc31SPeter Ujfalusi 			(reload_idx << CPPI5_INFO0_TRDESC_RLDIDX_SHIFT) &
97969bafc31SPeter Ujfalusi 			CPPI5_INFO0_TRDESC_RLDIDX_MASK;
98069bafc31SPeter Ujfalusi 	desc_hdr->pkt_info0 |= (tr_count - 1) & CPPI5_INFO0_TRDESC_LASTIDX_MASK;
98169bafc31SPeter Ujfalusi 
98269bafc31SPeter Ujfalusi 	desc_hdr->pkt_info1 |= ((ffs(tr_size >> 4) - 1) <<
98369bafc31SPeter Ujfalusi 				CPPI5_INFO1_TRDESC_RECSIZE_SHIFT) &
98469bafc31SPeter Ujfalusi 				CPPI5_INFO1_TRDESC_RECSIZE_MASK;
98569bafc31SPeter Ujfalusi }
98669bafc31SPeter Ujfalusi 
98769bafc31SPeter Ujfalusi /**
98869bafc31SPeter Ujfalusi  * cppi5_tr_init - Init TR record
98969bafc31SPeter Ujfalusi  * @flags: Pointer to the TR's flags
99069bafc31SPeter Ujfalusi  * @type: TR type
99169bafc31SPeter Ujfalusi  * @static_tr: TR is static
99269bafc31SPeter Ujfalusi  * @wait: Wait for TR completion before allow the next TR to start
99369bafc31SPeter Ujfalusi  * @event_size: output event generation cfg
99469bafc31SPeter Ujfalusi  * @cmd_id: TR identifier (application specifics)
99569bafc31SPeter Ujfalusi  *
99669bafc31SPeter Ujfalusi  * Init TR record
99769bafc31SPeter Ujfalusi  */
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)99869bafc31SPeter Ujfalusi static inline void cppi5_tr_init(cppi5_tr_flags_t *flags,
99969bafc31SPeter Ujfalusi 				 enum cppi5_tr_types type, bool static_tr,
100069bafc31SPeter Ujfalusi 				 bool wait, enum cppi5_tr_event_size event_size,
100169bafc31SPeter Ujfalusi 				 u32 cmd_id)
100269bafc31SPeter Ujfalusi {
100369bafc31SPeter Ujfalusi 	*flags = type;
100469bafc31SPeter Ujfalusi 	*flags |= (event_size << CPPI5_TR_EVENT_SIZE_SHIFT) &
100569bafc31SPeter Ujfalusi 		  CPPI5_TR_EVENT_SIZE_MASK;
100669bafc31SPeter Ujfalusi 
100769bafc31SPeter Ujfalusi 	*flags |= (cmd_id << CPPI5_TR_CMD_ID_SHIFT) &
100869bafc31SPeter Ujfalusi 		  CPPI5_TR_CMD_ID_MASK;
100969bafc31SPeter Ujfalusi 
101069bafc31SPeter Ujfalusi 	if (static_tr && (type == CPPI5_TR_TYPE8 || type == CPPI5_TR_TYPE9))
101169bafc31SPeter Ujfalusi 		*flags |= CPPI5_TR_STATIC;
101269bafc31SPeter Ujfalusi 
101369bafc31SPeter Ujfalusi 	if (wait)
101469bafc31SPeter Ujfalusi 		*flags |= CPPI5_TR_WAIT;
101569bafc31SPeter Ujfalusi }
101669bafc31SPeter Ujfalusi 
101769bafc31SPeter Ujfalusi /**
101869bafc31SPeter Ujfalusi  * cppi5_tr_set_trigger - Configure trigger0/1 and trigger0/1_type
101969bafc31SPeter Ujfalusi  * @flags: Pointer to the TR's flags
102069bafc31SPeter Ujfalusi  * @trigger0: trigger0 selection
102169bafc31SPeter Ujfalusi  * @trigger0_type: type of data transfer that will be enabled by trigger0
102269bafc31SPeter Ujfalusi  * @trigger1: trigger1 selection
102369bafc31SPeter Ujfalusi  * @trigger1_type: type of data transfer that will be enabled by trigger1
102469bafc31SPeter Ujfalusi  *
102569bafc31SPeter Ujfalusi  * Configure the triggers for the TR
102669bafc31SPeter Ujfalusi  */
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)102769bafc31SPeter Ujfalusi static inline void cppi5_tr_set_trigger(cppi5_tr_flags_t *flags,
102869bafc31SPeter Ujfalusi 		enum cppi5_tr_trigger trigger0,
102969bafc31SPeter Ujfalusi 		enum cppi5_tr_trigger_type trigger0_type,
103069bafc31SPeter Ujfalusi 		enum cppi5_tr_trigger trigger1,
103169bafc31SPeter Ujfalusi 		enum cppi5_tr_trigger_type trigger1_type)
103269bafc31SPeter Ujfalusi {
103369bafc31SPeter Ujfalusi 	*flags &= ~(CPPI5_TR_TRIGGER0_MASK | CPPI5_TR_TRIGGER0_TYPE_MASK |
103469bafc31SPeter Ujfalusi 		    CPPI5_TR_TRIGGER1_MASK | CPPI5_TR_TRIGGER1_TYPE_MASK);
103569bafc31SPeter Ujfalusi 	*flags |= (trigger0 << CPPI5_TR_TRIGGER0_SHIFT) &
103669bafc31SPeter Ujfalusi 		  CPPI5_TR_TRIGGER0_MASK;
103769bafc31SPeter Ujfalusi 	*flags |= (trigger0_type << CPPI5_TR_TRIGGER0_TYPE_SHIFT) &
103869bafc31SPeter Ujfalusi 		  CPPI5_TR_TRIGGER0_TYPE_MASK;
103969bafc31SPeter Ujfalusi 
104069bafc31SPeter Ujfalusi 	*flags |= (trigger1 << CPPI5_TR_TRIGGER1_SHIFT) &
104169bafc31SPeter Ujfalusi 		  CPPI5_TR_TRIGGER1_MASK;
104269bafc31SPeter Ujfalusi 	*flags |= (trigger1_type << CPPI5_TR_TRIGGER1_TYPE_SHIFT) &
104369bafc31SPeter Ujfalusi 		  CPPI5_TR_TRIGGER1_TYPE_MASK;
104469bafc31SPeter Ujfalusi }
104569bafc31SPeter Ujfalusi 
104669bafc31SPeter Ujfalusi /**
104769bafc31SPeter Ujfalusi  * cppi5_tr_cflag_set - Update the Configuration specific flags
104869bafc31SPeter Ujfalusi  * @flags: Pointer to the TR's flags
104969bafc31SPeter Ujfalusi  * @csf: Configuration specific flags
105069bafc31SPeter Ujfalusi  *
105169bafc31SPeter Ujfalusi  * Set a bit in Configuration Specific Flags section of the TR flags.
105269bafc31SPeter Ujfalusi  */
cppi5_tr_csf_set(cppi5_tr_flags_t * flags,u32 csf)105369bafc31SPeter Ujfalusi static inline void cppi5_tr_csf_set(cppi5_tr_flags_t *flags, u32 csf)
105469bafc31SPeter Ujfalusi {
105569bafc31SPeter Ujfalusi 	*flags &= ~CPPI5_TR_CSF_FLAGS_MASK;
105669bafc31SPeter Ujfalusi 	*flags |= (csf << CPPI5_TR_CSF_FLAGS_SHIFT) &
105769bafc31SPeter Ujfalusi 		  CPPI5_TR_CSF_FLAGS_MASK;
105869bafc31SPeter Ujfalusi }
105969bafc31SPeter Ujfalusi 
106069bafc31SPeter Ujfalusi #endif /* __TI_CPPI5_H__ */
1061