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