162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * CPPI5 descriptors interface
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __TI_CPPI5_H__
962306a36Sopenharmony_ci#define __TI_CPPI5_H__
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/bitops.h>
1262306a36Sopenharmony_ci#include <linux/printk.h>
1362306a36Sopenharmony_ci#include <linux/bug.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/**
1662306a36Sopenharmony_ci * struct cppi5_desc_hdr_t - Descriptor header, present in all types of
1762306a36Sopenharmony_ci *			     descriptors
1862306a36Sopenharmony_ci * @pkt_info0:		Packet info word 0 (n/a in Buffer desc)
1962306a36Sopenharmony_ci * @pkt_info0:		Packet info word 1 (n/a in Buffer desc)
2062306a36Sopenharmony_ci * @pkt_info0:		Packet info word 2 (n/a in Buffer desc)
2162306a36Sopenharmony_ci * @src_dst_tag:	Packet info word 3 (n/a in Buffer desc)
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_cistruct cppi5_desc_hdr_t {
2462306a36Sopenharmony_ci	u32 pkt_info0;
2562306a36Sopenharmony_ci	u32 pkt_info1;
2662306a36Sopenharmony_ci	u32 pkt_info2;
2762306a36Sopenharmony_ci	u32 src_dst_tag;
2862306a36Sopenharmony_ci} __packed;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/**
3162306a36Sopenharmony_ci * struct cppi5_host_desc_t - Host-mode packet and buffer descriptor definition
3262306a36Sopenharmony_ci * @hdr:		Descriptor header
3362306a36Sopenharmony_ci * @next_desc:		word 4/5: Linking word
3462306a36Sopenharmony_ci * @buf_ptr:		word 6/7: Buffer pointer
3562306a36Sopenharmony_ci * @buf_info1:		word 8: Buffer valid data length
3662306a36Sopenharmony_ci * @org_buf_len:	word 9: Original buffer length
3762306a36Sopenharmony_ci * @org_buf_ptr:	word 10/11: Original buffer pointer
3862306a36Sopenharmony_ci * @epib[0]:		Extended Packet Info Data (optional, 4 words), and/or
3962306a36Sopenharmony_ci *			Protocol Specific Data (optional, 0-128 bytes in
4062306a36Sopenharmony_ci *			multiples of 4), and/or
4162306a36Sopenharmony_ci *			Other Software Data (0-N bytes, optional)
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_cistruct cppi5_host_desc_t {
4462306a36Sopenharmony_ci	struct cppi5_desc_hdr_t hdr;
4562306a36Sopenharmony_ci	u64 next_desc;
4662306a36Sopenharmony_ci	u64 buf_ptr;
4762306a36Sopenharmony_ci	u32 buf_info1;
4862306a36Sopenharmony_ci	u32 org_buf_len;
4962306a36Sopenharmony_ci	u64 org_buf_ptr;
5062306a36Sopenharmony_ci	u32 epib[];
5162306a36Sopenharmony_ci} __packed;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define CPPI5_DESC_MIN_ALIGN			(16U)
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_EPIB_SIZE		(16U)
5662306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE	(128U)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_TYPE_SHIFT		(30U)
5962306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_TYPE_MASK		GENMASK(31, 30)
6062306a36Sopenharmony_ci#define   CPPI5_INFO0_DESC_TYPE_VAL_HOST	(1U)
6162306a36Sopenharmony_ci#define   CPPI5_INFO0_DESC_TYPE_VAL_MONO	(2U)
6262306a36Sopenharmony_ci#define   CPPI5_INFO0_DESC_TYPE_VAL_TR		(3U)
6362306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_EPIB_PRESENT		BIT(29)
6462306a36Sopenharmony_ci/*
6562306a36Sopenharmony_ci * Protocol Specific Words location:
6662306a36Sopenharmony_ci * 0 - located in the descriptor,
6762306a36Sopenharmony_ci * 1 = located in the SOP Buffer immediately prior to the data.
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_PSINFO_LOCATION	BIT(28)
7062306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT	(22U)
7162306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK	GENMASK(27, 22)
7262306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_PKTLEN_SHIFT		(0)
7362306a36Sopenharmony_ci#define CPPI5_INFO0_HDESC_PKTLEN_MASK		GENMASK(21, 0)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_PKTERROR_SHIFT		(28U)
7662306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_PKTERROR_MASK		GENMASK(31, 28)
7762306a36Sopenharmony_ci#define CPPI5_INFO1_HDESC_PSFLGS_SHIFT		(24U)
7862306a36Sopenharmony_ci#define CPPI5_INFO1_HDESC_PSFLGS_MASK		GENMASK(27, 24)
7962306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_PKTID_SHIFT		(14U)
8062306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_PKTID_MASK		GENMASK(23, 14)
8162306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_FLOWID_SHIFT		(0)
8262306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_FLOWID_MASK		GENMASK(13, 0)
8362306a36Sopenharmony_ci#define CPPI5_INFO1_DESC_FLOWID_DEFAULT		CPPI5_INFO1_DESC_FLOWID_MASK
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#define CPPI5_INFO2_HDESC_PKTTYPE_SHIFT		(27U)
8662306a36Sopenharmony_ci#define CPPI5_INFO2_HDESC_PKTTYPE_MASK		GENMASK(31, 27)
8762306a36Sopenharmony_ci/* Return Policy: 0 - Entire packet 1 - Each buffer */
8862306a36Sopenharmony_ci#define CPPI5_INFO2_HDESC_RETPOLICY		BIT(18)
8962306a36Sopenharmony_ci/*
9062306a36Sopenharmony_ci * Early Return:
9162306a36Sopenharmony_ci * 0 = desc pointers should be returned after all reads have been completed
9262306a36Sopenharmony_ci * 1 = desc pointers should be returned immediately upon fetching
9362306a36Sopenharmony_ci * the descriptor and beginning to transfer data.
9462306a36Sopenharmony_ci */
9562306a36Sopenharmony_ci#define CPPI5_INFO2_HDESC_EARLYRET		BIT(17)
9662306a36Sopenharmony_ci/*
9762306a36Sopenharmony_ci * Return Push Policy:
9862306a36Sopenharmony_ci * 0 = Descriptor must be returned to tail of queue
9962306a36Sopenharmony_ci * 1 = Descriptor must be returned to head of queue
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_ci#define CPPI5_INFO2_DESC_RETPUSHPOLICY		BIT(16)
10262306a36Sopenharmony_ci#define CPPI5_INFO2_DESC_RETP_MASK		GENMASK(18, 16)
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define CPPI5_INFO2_DESC_RETQ_SHIFT		(0)
10562306a36Sopenharmony_ci#define CPPI5_INFO2_DESC_RETQ_MASK		GENMASK(15, 0)
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#define CPPI5_INFO3_DESC_SRCTAG_SHIFT		(16U)
10862306a36Sopenharmony_ci#define CPPI5_INFO3_DESC_SRCTAG_MASK		GENMASK(31, 16)
10962306a36Sopenharmony_ci#define CPPI5_INFO3_DESC_DSTTAG_SHIFT		(0)
11062306a36Sopenharmony_ci#define CPPI5_INFO3_DESC_DSTTAG_MASK		GENMASK(15, 0)
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci#define CPPI5_BUFINFO1_HDESC_DATA_LEN_SHIFT	(0)
11362306a36Sopenharmony_ci#define CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK	GENMASK(27, 0)
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#define CPPI5_OBUFINFO0_HDESC_BUF_LEN_SHIFT	(0)
11662306a36Sopenharmony_ci#define CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK	GENMASK(27, 0)
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/**
11962306a36Sopenharmony_ci * struct cppi5_desc_epib_t - Host Packet Descriptor Extended Packet Info Block
12062306a36Sopenharmony_ci * @timestamp:		word 0: application specific timestamp
12162306a36Sopenharmony_ci * @sw_info0:		word 1: Software Info 0
12262306a36Sopenharmony_ci * @sw_info1:		word 1: Software Info 1
12362306a36Sopenharmony_ci * @sw_info2:		word 1: Software Info 2
12462306a36Sopenharmony_ci */
12562306a36Sopenharmony_cistruct cppi5_desc_epib_t {
12662306a36Sopenharmony_ci	u32 timestamp;	/* w0: application specific timestamp */
12762306a36Sopenharmony_ci	u32 sw_info0;	/* w1: Software Info 0 */
12862306a36Sopenharmony_ci	u32 sw_info1;	/* w2: Software Info 1 */
12962306a36Sopenharmony_ci	u32 sw_info2;	/* w3: Software Info 2 */
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/**
13362306a36Sopenharmony_ci * struct cppi5_monolithic_desc_t - Monolithic-mode packet descriptor
13462306a36Sopenharmony_ci * @hdr:		Descriptor header
13562306a36Sopenharmony_ci * @epib[0]:		Extended Packet Info Data (optional, 4 words), and/or
13662306a36Sopenharmony_ci *			Protocol Specific Data (optional, 0-128 bytes in
13762306a36Sopenharmony_ci *			multiples of 4), and/or
13862306a36Sopenharmony_ci *			Other Software Data (0-N bytes, optional)
13962306a36Sopenharmony_ci */
14062306a36Sopenharmony_cistruct cppi5_monolithic_desc_t {
14162306a36Sopenharmony_ci	struct cppi5_desc_hdr_t hdr;
14262306a36Sopenharmony_ci	u32 epib[];
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci#define CPPI5_INFO2_MDESC_DATA_OFFSET_SHIFT	(18U)
14662306a36Sopenharmony_ci#define CPPI5_INFO2_MDESC_DATA_OFFSET_MASK	GENMASK(26, 18)
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/*
14962306a36Sopenharmony_ci * Reload Count:
15062306a36Sopenharmony_ci * 0 = Finish the packet and place the descriptor back on the return queue
15162306a36Sopenharmony_ci * 1-0x1ff = Vector to the Reload Index and resume processing
15262306a36Sopenharmony_ci * 0x1ff indicates perpetual loop, infinite reload until the channel is stopped
15362306a36Sopenharmony_ci */
15462306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDCNT_SHIFT		(20U)
15562306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDCNT_MASK		GENMASK(28, 20)
15662306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDCNT_MAX		(0x1ff)
15762306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDCNT_INFINITE	CPPI5_INFO0_TRDESC_RLDCNT_MAX
15862306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDIDX_SHIFT		(14U)
15962306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDIDX_MASK		GENMASK(19, 14)
16062306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_RLDIDX_MAX		(0x3f)
16162306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_LASTIDX_SHIFT	(0)
16262306a36Sopenharmony_ci#define CPPI5_INFO0_TRDESC_LASTIDX_MASK		GENMASK(13, 0)
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci#define CPPI5_INFO1_TRDESC_RECSIZE_SHIFT	(24U)
16562306a36Sopenharmony_ci#define CPPI5_INFO1_TRDESC_RECSIZE_MASK		GENMASK(26, 24)
16662306a36Sopenharmony_ci#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_16B	(0)
16762306a36Sopenharmony_ci#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_32B	(1U)
16862306a36Sopenharmony_ci#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_64B	(2U)
16962306a36Sopenharmony_ci#define   CPPI5_INFO1_TRDESC_RECSIZE_VAL_128B	(3U)
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_cistatic inline void cppi5_desc_dump(void *desc, u32 size)
17262306a36Sopenharmony_ci{
17362306a36Sopenharmony_ci	print_hex_dump(KERN_ERR, "dump udmap_desc: ", DUMP_PREFIX_NONE,
17462306a36Sopenharmony_ci		       32, 4, desc, size, false);
17562306a36Sopenharmony_ci}
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci#define CPPI5_TDCM_MARKER			(0x1)
17862306a36Sopenharmony_ci/**
17962306a36Sopenharmony_ci * cppi5_desc_is_tdcm - check if the paddr indicates Teardown Complete Message
18062306a36Sopenharmony_ci * @paddr: Physical address of the packet popped from the ring
18162306a36Sopenharmony_ci *
18262306a36Sopenharmony_ci * Returns true if the address indicates TDCM
18362306a36Sopenharmony_ci */
18462306a36Sopenharmony_cistatic inline bool cppi5_desc_is_tdcm(dma_addr_t paddr)
18562306a36Sopenharmony_ci{
18662306a36Sopenharmony_ci	return (paddr & CPPI5_TDCM_MARKER) ? true : false;
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci/**
19062306a36Sopenharmony_ci * cppi5_desc_get_type - get descriptor type
19162306a36Sopenharmony_ci * @desc_hdr: packet descriptor/TR header
19262306a36Sopenharmony_ci *
19362306a36Sopenharmony_ci * Returns descriptor type:
19462306a36Sopenharmony_ci * CPPI5_INFO0_DESC_TYPE_VAL_HOST
19562306a36Sopenharmony_ci * CPPI5_INFO0_DESC_TYPE_VAL_MONO
19662306a36Sopenharmony_ci * CPPI5_INFO0_DESC_TYPE_VAL_TR
19762306a36Sopenharmony_ci */
19862306a36Sopenharmony_cistatic inline u32 cppi5_desc_get_type(struct cppi5_desc_hdr_t *desc_hdr)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	return (desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_TYPE_MASK) >>
20162306a36Sopenharmony_ci		CPPI5_INFO0_HDESC_TYPE_SHIFT;
20262306a36Sopenharmony_ci}
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci/**
20562306a36Sopenharmony_ci * cppi5_desc_get_errflags - get Error Flags from Desc
20662306a36Sopenharmony_ci * @desc_hdr: packet/TR descriptor header
20762306a36Sopenharmony_ci *
20862306a36Sopenharmony_ci * Returns Error Flags from Packet/TR Descriptor
20962306a36Sopenharmony_ci */
21062306a36Sopenharmony_cistatic inline u32 cppi5_desc_get_errflags(struct cppi5_desc_hdr_t *desc_hdr)
21162306a36Sopenharmony_ci{
21262306a36Sopenharmony_ci	return (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTERROR_MASK) >>
21362306a36Sopenharmony_ci		CPPI5_INFO1_DESC_PKTERROR_SHIFT;
21462306a36Sopenharmony_ci}
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/**
21762306a36Sopenharmony_ci * cppi5_desc_get_pktids - get Packet and Flow ids from Desc
21862306a36Sopenharmony_ci * @desc_hdr: packet/TR descriptor header
21962306a36Sopenharmony_ci * @pkt_id: Packet ID
22062306a36Sopenharmony_ci * @flow_id: Flow ID
22162306a36Sopenharmony_ci *
22262306a36Sopenharmony_ci * Returns Packet and Flow ids from packet/TR descriptor
22362306a36Sopenharmony_ci */
22462306a36Sopenharmony_cistatic inline void cppi5_desc_get_pktids(struct cppi5_desc_hdr_t *desc_hdr,
22562306a36Sopenharmony_ci					 u32 *pkt_id, u32 *flow_id)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	*pkt_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_PKTID_MASK) >>
22862306a36Sopenharmony_ci		   CPPI5_INFO1_DESC_PKTID_SHIFT;
22962306a36Sopenharmony_ci	*flow_id = (desc_hdr->pkt_info1 & CPPI5_INFO1_DESC_FLOWID_MASK) >>
23062306a36Sopenharmony_ci		    CPPI5_INFO1_DESC_FLOWID_SHIFT;
23162306a36Sopenharmony_ci}
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci/**
23462306a36Sopenharmony_ci * cppi5_desc_set_pktids - set Packet and Flow ids in Desc
23562306a36Sopenharmony_ci * @desc_hdr: packet/TR descriptor header
23662306a36Sopenharmony_ci * @pkt_id: Packet ID
23762306a36Sopenharmony_ci * @flow_id: Flow ID
23862306a36Sopenharmony_ci */
23962306a36Sopenharmony_cistatic inline void cppi5_desc_set_pktids(struct cppi5_desc_hdr_t *desc_hdr,
24062306a36Sopenharmony_ci					 u32 pkt_id, u32 flow_id)
24162306a36Sopenharmony_ci{
24262306a36Sopenharmony_ci	desc_hdr->pkt_info1 &= ~(CPPI5_INFO1_DESC_PKTID_MASK |
24362306a36Sopenharmony_ci				 CPPI5_INFO1_DESC_FLOWID_MASK);
24462306a36Sopenharmony_ci	desc_hdr->pkt_info1 |= (pkt_id << CPPI5_INFO1_DESC_PKTID_SHIFT) &
24562306a36Sopenharmony_ci				CPPI5_INFO1_DESC_PKTID_MASK;
24662306a36Sopenharmony_ci	desc_hdr->pkt_info1 |= (flow_id << CPPI5_INFO1_DESC_FLOWID_SHIFT) &
24762306a36Sopenharmony_ci				CPPI5_INFO1_DESC_FLOWID_MASK;
24862306a36Sopenharmony_ci}
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci/**
25162306a36Sopenharmony_ci * cppi5_desc_set_retpolicy - set Packet Return Policy in Desc
25262306a36Sopenharmony_ci * @desc_hdr: packet/TR descriptor header
25362306a36Sopenharmony_ci * @flags: fags, supported values
25462306a36Sopenharmony_ci *  CPPI5_INFO2_HDESC_RETPOLICY
25562306a36Sopenharmony_ci *  CPPI5_INFO2_HDESC_EARLYRET
25662306a36Sopenharmony_ci *  CPPI5_INFO2_DESC_RETPUSHPOLICY
25762306a36Sopenharmony_ci * @return_ring_id: Packet Return Queue/Ring id, value 0xFFFF reserved
25862306a36Sopenharmony_ci */
25962306a36Sopenharmony_cistatic inline void cppi5_desc_set_retpolicy(struct cppi5_desc_hdr_t *desc_hdr,
26062306a36Sopenharmony_ci					    u32 flags, u32 return_ring_id)
26162306a36Sopenharmony_ci{
26262306a36Sopenharmony_ci	desc_hdr->pkt_info2 &= ~(CPPI5_INFO2_DESC_RETP_MASK |
26362306a36Sopenharmony_ci				 CPPI5_INFO2_DESC_RETQ_MASK);
26462306a36Sopenharmony_ci	desc_hdr->pkt_info2 |= flags & CPPI5_INFO2_DESC_RETP_MASK;
26562306a36Sopenharmony_ci	desc_hdr->pkt_info2 |= return_ring_id & CPPI5_INFO2_DESC_RETQ_MASK;
26662306a36Sopenharmony_ci}
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci/**
26962306a36Sopenharmony_ci * cppi5_desc_get_tags_ids - get Packet Src/Dst Tags from Desc
27062306a36Sopenharmony_ci * @desc_hdr: packet/TR descriptor header
27162306a36Sopenharmony_ci * @src_tag_id: Source Tag
27262306a36Sopenharmony_ci * @dst_tag_id: Dest Tag
27362306a36Sopenharmony_ci *
27462306a36Sopenharmony_ci * Returns Packet Src/Dst Tags from packet/TR descriptor
27562306a36Sopenharmony_ci */
27662306a36Sopenharmony_cistatic inline void cppi5_desc_get_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
27762306a36Sopenharmony_ci					   u32 *src_tag_id, u32 *dst_tag_id)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	if (src_tag_id)
28062306a36Sopenharmony_ci		*src_tag_id = (desc_hdr->src_dst_tag &
28162306a36Sopenharmony_ci			      CPPI5_INFO3_DESC_SRCTAG_MASK) >>
28262306a36Sopenharmony_ci			      CPPI5_INFO3_DESC_SRCTAG_SHIFT;
28362306a36Sopenharmony_ci	if (dst_tag_id)
28462306a36Sopenharmony_ci		*dst_tag_id = desc_hdr->src_dst_tag &
28562306a36Sopenharmony_ci			      CPPI5_INFO3_DESC_DSTTAG_MASK;
28662306a36Sopenharmony_ci}
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci/**
28962306a36Sopenharmony_ci * cppi5_desc_set_tags_ids - set Packet Src/Dst Tags in HDesc
29062306a36Sopenharmony_ci * @desc_hdr: packet/TR descriptor header
29162306a36Sopenharmony_ci * @src_tag_id: Source Tag
29262306a36Sopenharmony_ci * @dst_tag_id: Dest Tag
29362306a36Sopenharmony_ci *
29462306a36Sopenharmony_ci * Returns Packet Src/Dst Tags from packet/TR descriptor
29562306a36Sopenharmony_ci */
29662306a36Sopenharmony_cistatic inline void cppi5_desc_set_tags_ids(struct cppi5_desc_hdr_t *desc_hdr,
29762306a36Sopenharmony_ci					   u32 src_tag_id, u32 dst_tag_id)
29862306a36Sopenharmony_ci{
29962306a36Sopenharmony_ci	desc_hdr->src_dst_tag = (src_tag_id << CPPI5_INFO3_DESC_SRCTAG_SHIFT) &
30062306a36Sopenharmony_ci				CPPI5_INFO3_DESC_SRCTAG_MASK;
30162306a36Sopenharmony_ci	desc_hdr->src_dst_tag |= dst_tag_id & CPPI5_INFO3_DESC_DSTTAG_MASK;
30262306a36Sopenharmony_ci}
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci/**
30562306a36Sopenharmony_ci * cppi5_hdesc_calc_size - Calculate Host Packet Descriptor size
30662306a36Sopenharmony_ci * @epib: is EPIB present
30762306a36Sopenharmony_ci * @psdata_size: PSDATA size
30862306a36Sopenharmony_ci * @sw_data_size: SWDATA size
30962306a36Sopenharmony_ci *
31062306a36Sopenharmony_ci * Returns required Host Packet Descriptor size
31162306a36Sopenharmony_ci * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
31262306a36Sopenharmony_ci */
31362306a36Sopenharmony_cistatic inline u32 cppi5_hdesc_calc_size(bool epib, u32 psdata_size,
31462306a36Sopenharmony_ci					u32 sw_data_size)
31562306a36Sopenharmony_ci{
31662306a36Sopenharmony_ci	u32 desc_size;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	if (psdata_size > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE)
31962306a36Sopenharmony_ci		return 0;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	desc_size = sizeof(struct cppi5_host_desc_t) + psdata_size +
32262306a36Sopenharmony_ci		    sw_data_size;
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	if (epib)
32562306a36Sopenharmony_ci		desc_size += CPPI5_INFO0_HDESC_EPIB_SIZE;
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	return ALIGN(desc_size, CPPI5_DESC_MIN_ALIGN);
32862306a36Sopenharmony_ci}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci/**
33162306a36Sopenharmony_ci * cppi5_hdesc_init - Init Host Packet Descriptor size
33262306a36Sopenharmony_ci * @desc: Host packet descriptor
33362306a36Sopenharmony_ci * @flags: supported values
33462306a36Sopenharmony_ci *	CPPI5_INFO0_HDESC_EPIB_PRESENT
33562306a36Sopenharmony_ci *	CPPI5_INFO0_HDESC_PSINFO_LOCATION
33662306a36Sopenharmony_ci * @psdata_size: PSDATA size
33762306a36Sopenharmony_ci *
33862306a36Sopenharmony_ci * Returns required Host Packet Descriptor size
33962306a36Sopenharmony_ci * 0 - if PSDATA > CPPI5_INFO0_HDESC_PSDATA_MAX_SIZE
34062306a36Sopenharmony_ci */
34162306a36Sopenharmony_cistatic inline void cppi5_hdesc_init(struct cppi5_host_desc_t *desc, u32 flags,
34262306a36Sopenharmony_ci				    u32 psdata_size)
34362306a36Sopenharmony_ci{
34462306a36Sopenharmony_ci	desc->hdr.pkt_info0 = (CPPI5_INFO0_DESC_TYPE_VAL_HOST <<
34562306a36Sopenharmony_ci			       CPPI5_INFO0_HDESC_TYPE_SHIFT) | (flags);
34662306a36Sopenharmony_ci	desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
34762306a36Sopenharmony_ci				CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
34862306a36Sopenharmony_ci				CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
34962306a36Sopenharmony_ci	desc->next_desc = 0;
35062306a36Sopenharmony_ci}
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci/**
35362306a36Sopenharmony_ci * cppi5_hdesc_update_flags - Replace descriptor flags
35462306a36Sopenharmony_ci * @desc: Host packet descriptor
35562306a36Sopenharmony_ci * @flags: supported values
35662306a36Sopenharmony_ci *	CPPI5_INFO0_HDESC_EPIB_PRESENT
35762306a36Sopenharmony_ci *	CPPI5_INFO0_HDESC_PSINFO_LOCATION
35862306a36Sopenharmony_ci */
35962306a36Sopenharmony_cistatic inline void cppi5_hdesc_update_flags(struct cppi5_host_desc_t *desc,
36062306a36Sopenharmony_ci					    u32 flags)
36162306a36Sopenharmony_ci{
36262306a36Sopenharmony_ci	desc->hdr.pkt_info0 &= ~(CPPI5_INFO0_HDESC_EPIB_PRESENT |
36362306a36Sopenharmony_ci				 CPPI5_INFO0_HDESC_PSINFO_LOCATION);
36462306a36Sopenharmony_ci	desc->hdr.pkt_info0 |= flags;
36562306a36Sopenharmony_ci}
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci/**
36862306a36Sopenharmony_ci * cppi5_hdesc_update_psdata_size - Replace PSdata size
36962306a36Sopenharmony_ci * @desc: Host packet descriptor
37062306a36Sopenharmony_ci * @psdata_size: PSDATA size
37162306a36Sopenharmony_ci */
37262306a36Sopenharmony_cistatic inline void
37362306a36Sopenharmony_cicppi5_hdesc_update_psdata_size(struct cppi5_host_desc_t *desc, u32 psdata_size)
37462306a36Sopenharmony_ci{
37562306a36Sopenharmony_ci	desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
37662306a36Sopenharmony_ci	desc->hdr.pkt_info0 |= ((psdata_size >> 2) <<
37762306a36Sopenharmony_ci				CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT) &
37862306a36Sopenharmony_ci				CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK;
37962306a36Sopenharmony_ci}
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci/**
38262306a36Sopenharmony_ci * cppi5_hdesc_get_psdata_size - get PSdata size in bytes
38362306a36Sopenharmony_ci * @desc: Host packet descriptor
38462306a36Sopenharmony_ci */
38562306a36Sopenharmony_cistatic inline u32 cppi5_hdesc_get_psdata_size(struct cppi5_host_desc_t *desc)
38662306a36Sopenharmony_ci{
38762306a36Sopenharmony_ci	u32 psdata_size = 0;
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci	if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
39062306a36Sopenharmony_ci		psdata_size = (desc->hdr.pkt_info0 &
39162306a36Sopenharmony_ci			       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
39262306a36Sopenharmony_ci			       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	return (psdata_size << 2);
39562306a36Sopenharmony_ci}
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci/**
39862306a36Sopenharmony_ci * cppi5_hdesc_get_pktlen - get Packet Length from HDesc
39962306a36Sopenharmony_ci * @desc: Host packet descriptor
40062306a36Sopenharmony_ci *
40162306a36Sopenharmony_ci * Returns Packet Length from Host Packet Descriptor
40262306a36Sopenharmony_ci */
40362306a36Sopenharmony_cistatic inline u32 cppi5_hdesc_get_pktlen(struct cppi5_host_desc_t *desc)
40462306a36Sopenharmony_ci{
40562306a36Sopenharmony_ci	return (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PKTLEN_MASK);
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci/**
40962306a36Sopenharmony_ci * cppi5_hdesc_set_pktlen - set Packet Length in HDesc
41062306a36Sopenharmony_ci * @desc: Host packet descriptor
41162306a36Sopenharmony_ci */
41262306a36Sopenharmony_cistatic inline void cppi5_hdesc_set_pktlen(struct cppi5_host_desc_t *desc,
41362306a36Sopenharmony_ci					  u32 pkt_len)
41462306a36Sopenharmony_ci{
41562306a36Sopenharmony_ci	desc->hdr.pkt_info0 &= ~CPPI5_INFO0_HDESC_PKTLEN_MASK;
41662306a36Sopenharmony_ci	desc->hdr.pkt_info0 |= (pkt_len & CPPI5_INFO0_HDESC_PKTLEN_MASK);
41762306a36Sopenharmony_ci}
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci/**
42062306a36Sopenharmony_ci * cppi5_hdesc_get_psflags - get Protocol Specific Flags from HDesc
42162306a36Sopenharmony_ci * @desc: Host packet descriptor
42262306a36Sopenharmony_ci *
42362306a36Sopenharmony_ci * Returns Protocol Specific Flags from Host Packet Descriptor
42462306a36Sopenharmony_ci */
42562306a36Sopenharmony_cistatic inline u32 cppi5_hdesc_get_psflags(struct cppi5_host_desc_t *desc)
42662306a36Sopenharmony_ci{
42762306a36Sopenharmony_ci	return (desc->hdr.pkt_info1 & CPPI5_INFO1_HDESC_PSFLGS_MASK) >>
42862306a36Sopenharmony_ci		CPPI5_INFO1_HDESC_PSFLGS_SHIFT;
42962306a36Sopenharmony_ci}
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci/**
43262306a36Sopenharmony_ci * cppi5_hdesc_set_psflags - set Protocol Specific Flags in HDesc
43362306a36Sopenharmony_ci * @desc: Host packet descriptor
43462306a36Sopenharmony_ci */
43562306a36Sopenharmony_cistatic inline void cppi5_hdesc_set_psflags(struct cppi5_host_desc_t *desc,
43662306a36Sopenharmony_ci					   u32 ps_flags)
43762306a36Sopenharmony_ci{
43862306a36Sopenharmony_ci	desc->hdr.pkt_info1 &= ~CPPI5_INFO1_HDESC_PSFLGS_MASK;
43962306a36Sopenharmony_ci	desc->hdr.pkt_info1 |= (ps_flags <<
44062306a36Sopenharmony_ci				CPPI5_INFO1_HDESC_PSFLGS_SHIFT) &
44162306a36Sopenharmony_ci				CPPI5_INFO1_HDESC_PSFLGS_MASK;
44262306a36Sopenharmony_ci}
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci/**
44562306a36Sopenharmony_ci * cppi5_hdesc_get_errflags - get Packet Type from HDesc
44662306a36Sopenharmony_ci * @desc: Host packet descriptor
44762306a36Sopenharmony_ci */
44862306a36Sopenharmony_cistatic inline u32 cppi5_hdesc_get_pkttype(struct cppi5_host_desc_t *desc)
44962306a36Sopenharmony_ci{
45062306a36Sopenharmony_ci	return (desc->hdr.pkt_info2 & CPPI5_INFO2_HDESC_PKTTYPE_MASK) >>
45162306a36Sopenharmony_ci		CPPI5_INFO2_HDESC_PKTTYPE_SHIFT;
45262306a36Sopenharmony_ci}
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci/**
45562306a36Sopenharmony_ci * cppi5_hdesc_get_errflags - set Packet Type in HDesc
45662306a36Sopenharmony_ci * @desc: Host packet descriptor
45762306a36Sopenharmony_ci * @pkt_type: Packet Type
45862306a36Sopenharmony_ci */
45962306a36Sopenharmony_cistatic inline void cppi5_hdesc_set_pkttype(struct cppi5_host_desc_t *desc,
46062306a36Sopenharmony_ci					   u32 pkt_type)
46162306a36Sopenharmony_ci{
46262306a36Sopenharmony_ci	desc->hdr.pkt_info2 &= ~CPPI5_INFO2_HDESC_PKTTYPE_MASK;
46362306a36Sopenharmony_ci	desc->hdr.pkt_info2 |=
46462306a36Sopenharmony_ci			(pkt_type << CPPI5_INFO2_HDESC_PKTTYPE_SHIFT) &
46562306a36Sopenharmony_ci			 CPPI5_INFO2_HDESC_PKTTYPE_MASK;
46662306a36Sopenharmony_ci}
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci/**
46962306a36Sopenharmony_ci * cppi5_hdesc_attach_buf - attach buffer to HDesc
47062306a36Sopenharmony_ci * @desc: Host packet descriptor
47162306a36Sopenharmony_ci * @buf: Buffer physical address
47262306a36Sopenharmony_ci * @buf_data_len: Buffer length
47362306a36Sopenharmony_ci * @obuf: Original Buffer physical address
47462306a36Sopenharmony_ci * @obuf_len: Original Buffer length
47562306a36Sopenharmony_ci *
47662306a36Sopenharmony_ci * Attaches buffer to Host Packet Descriptor
47762306a36Sopenharmony_ci */
47862306a36Sopenharmony_cistatic inline void cppi5_hdesc_attach_buf(struct cppi5_host_desc_t *desc,
47962306a36Sopenharmony_ci					  dma_addr_t buf, u32 buf_data_len,
48062306a36Sopenharmony_ci					  dma_addr_t obuf, u32 obuf_len)
48162306a36Sopenharmony_ci{
48262306a36Sopenharmony_ci	desc->buf_ptr = buf;
48362306a36Sopenharmony_ci	desc->buf_info1 = buf_data_len & CPPI5_BUFINFO1_HDESC_DATA_LEN_MASK;
48462306a36Sopenharmony_ci	desc->org_buf_ptr = obuf;
48562306a36Sopenharmony_ci	desc->org_buf_len = obuf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
48662306a36Sopenharmony_ci}
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_cistatic inline void cppi5_hdesc_get_obuf(struct cppi5_host_desc_t *desc,
48962306a36Sopenharmony_ci					dma_addr_t *obuf, u32 *obuf_len)
49062306a36Sopenharmony_ci{
49162306a36Sopenharmony_ci	*obuf = desc->org_buf_ptr;
49262306a36Sopenharmony_ci	*obuf_len = desc->org_buf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_MASK;
49362306a36Sopenharmony_ci}
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_cistatic inline void cppi5_hdesc_reset_to_original(struct cppi5_host_desc_t *desc)
49662306a36Sopenharmony_ci{
49762306a36Sopenharmony_ci	desc->buf_ptr = desc->org_buf_ptr;
49862306a36Sopenharmony_ci	desc->buf_info1 = desc->org_buf_len;
49962306a36Sopenharmony_ci}
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci/**
50262306a36Sopenharmony_ci * cppi5_hdesc_link_hbdesc - link Host Buffer Descriptor to HDesc
50362306a36Sopenharmony_ci * @desc: Host Packet Descriptor
50462306a36Sopenharmony_ci * @buf_desc: Host Buffer Descriptor physical address
50562306a36Sopenharmony_ci *
50662306a36Sopenharmony_ci * add and link Host Buffer Descriptor to HDesc
50762306a36Sopenharmony_ci */
50862306a36Sopenharmony_cistatic inline void cppi5_hdesc_link_hbdesc(struct cppi5_host_desc_t *desc,
50962306a36Sopenharmony_ci					   dma_addr_t hbuf_desc)
51062306a36Sopenharmony_ci{
51162306a36Sopenharmony_ci	desc->next_desc = hbuf_desc;
51262306a36Sopenharmony_ci}
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_cistatic inline dma_addr_t
51562306a36Sopenharmony_cicppi5_hdesc_get_next_hbdesc(struct cppi5_host_desc_t *desc)
51662306a36Sopenharmony_ci{
51762306a36Sopenharmony_ci	return (dma_addr_t)desc->next_desc;
51862306a36Sopenharmony_ci}
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_cistatic inline void cppi5_hdesc_reset_hbdesc(struct cppi5_host_desc_t *desc)
52162306a36Sopenharmony_ci{
52262306a36Sopenharmony_ci	desc->hdr = (struct cppi5_desc_hdr_t) { 0 };
52362306a36Sopenharmony_ci	desc->next_desc = 0;
52462306a36Sopenharmony_ci}
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci/**
52762306a36Sopenharmony_ci * cppi5_hdesc_epib_present -  check if EPIB present
52862306a36Sopenharmony_ci * @desc_hdr: packet descriptor/TR header
52962306a36Sopenharmony_ci *
53062306a36Sopenharmony_ci * Returns true if EPIB present in the packet
53162306a36Sopenharmony_ci */
53262306a36Sopenharmony_cistatic inline bool cppi5_hdesc_epib_present(struct cppi5_desc_hdr_t *desc_hdr)
53362306a36Sopenharmony_ci{
53462306a36Sopenharmony_ci	return !!(desc_hdr->pkt_info0 & CPPI5_INFO0_HDESC_EPIB_PRESENT);
53562306a36Sopenharmony_ci}
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_ci/**
53862306a36Sopenharmony_ci * cppi5_hdesc_get_psdata -  Get pointer on PSDATA
53962306a36Sopenharmony_ci * @desc: Host packet descriptor
54062306a36Sopenharmony_ci *
54162306a36Sopenharmony_ci * Returns pointer on PSDATA in HDesc.
54262306a36Sopenharmony_ci * NULL - if ps_data placed at the start of data buffer.
54362306a36Sopenharmony_ci */
54462306a36Sopenharmony_cistatic inline void *cppi5_hdesc_get_psdata(struct cppi5_host_desc_t *desc)
54562306a36Sopenharmony_ci{
54662306a36Sopenharmony_ci	u32 psdata_size;
54762306a36Sopenharmony_ci	void *psdata;
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_ci	if (desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION)
55062306a36Sopenharmony_ci		return NULL;
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci	psdata_size = (desc->hdr.pkt_info0 &
55362306a36Sopenharmony_ci		       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
55462306a36Sopenharmony_ci		       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci	if (!psdata_size)
55762306a36Sopenharmony_ci		return NULL;
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci	psdata = &desc->epib;
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci	if (cppi5_hdesc_epib_present(&desc->hdr))
56262306a36Sopenharmony_ci		psdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ci	return psdata;
56562306a36Sopenharmony_ci}
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci/**
56862306a36Sopenharmony_ci * cppi5_hdesc_get_swdata -  Get pointer on swdata
56962306a36Sopenharmony_ci * @desc: Host packet descriptor
57062306a36Sopenharmony_ci *
57162306a36Sopenharmony_ci * Returns pointer on SWDATA in HDesc.
57262306a36Sopenharmony_ci * NOTE. It's caller responsibility to be sure hdesc actually has swdata.
57362306a36Sopenharmony_ci */
57462306a36Sopenharmony_cistatic inline void *cppi5_hdesc_get_swdata(struct cppi5_host_desc_t *desc)
57562306a36Sopenharmony_ci{
57662306a36Sopenharmony_ci	u32 psdata_size = 0;
57762306a36Sopenharmony_ci	void *swdata;
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	if (!(desc->hdr.pkt_info0 & CPPI5_INFO0_HDESC_PSINFO_LOCATION))
58062306a36Sopenharmony_ci		psdata_size = (desc->hdr.pkt_info0 &
58162306a36Sopenharmony_ci			       CPPI5_INFO0_HDESC_PSINFO_SIZE_MASK) >>
58262306a36Sopenharmony_ci			       CPPI5_INFO0_HDESC_PSINFO_SIZE_SHIFT;
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci	swdata = &desc->epib;
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci	if (cppi5_hdesc_epib_present(&desc->hdr))
58762306a36Sopenharmony_ci		swdata += CPPI5_INFO0_HDESC_EPIB_SIZE;
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci	swdata += (psdata_size << 2);
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci	return swdata;
59262306a36Sopenharmony_ci}
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci/* ================================== TR ================================== */
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci#define CPPI5_TR_TYPE_SHIFT			(0U)
59762306a36Sopenharmony_ci#define CPPI5_TR_TYPE_MASK			GENMASK(3, 0)
59862306a36Sopenharmony_ci#define CPPI5_TR_STATIC				BIT(4)
59962306a36Sopenharmony_ci#define CPPI5_TR_WAIT				BIT(5)
60062306a36Sopenharmony_ci#define CPPI5_TR_EVENT_SIZE_SHIFT		(6U)
60162306a36Sopenharmony_ci#define CPPI5_TR_EVENT_SIZE_MASK		GENMASK(7, 6)
60262306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER0_SHIFT			(8U)
60362306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER0_MASK			GENMASK(9, 8)
60462306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER0_TYPE_SHIFT		(10U)
60562306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER0_TYPE_MASK		GENMASK(11, 10)
60662306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER1_SHIFT			(12U)
60762306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER1_MASK			GENMASK(13, 12)
60862306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER1_TYPE_SHIFT		(14U)
60962306a36Sopenharmony_ci#define CPPI5_TR_TRIGGER1_TYPE_MASK		GENMASK(15, 14)
61062306a36Sopenharmony_ci#define CPPI5_TR_CMD_ID_SHIFT			(16U)
61162306a36Sopenharmony_ci#define CPPI5_TR_CMD_ID_MASK			GENMASK(23, 16)
61262306a36Sopenharmony_ci#define CPPI5_TR_CSF_FLAGS_SHIFT		(24U)
61362306a36Sopenharmony_ci#define CPPI5_TR_CSF_FLAGS_MASK			GENMASK(31, 24)
61462306a36Sopenharmony_ci#define   CPPI5_TR_CSF_SA_INDIRECT		BIT(0)
61562306a36Sopenharmony_ci#define   CPPI5_TR_CSF_DA_INDIRECT		BIT(1)
61662306a36Sopenharmony_ci#define   CPPI5_TR_CSF_SUPR_EVT			BIT(2)
61762306a36Sopenharmony_ci#define   CPPI5_TR_CSF_EOL_ADV_SHIFT		(4U)
61862306a36Sopenharmony_ci#define   CPPI5_TR_CSF_EOL_ADV_MASK		GENMASK(6, 4)
61962306a36Sopenharmony_ci#define   CPPI5_TR_CSF_EOL_ICNT0		BIT(4)
62062306a36Sopenharmony_ci#define   CPPI5_TR_CSF_EOP			BIT(7)
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci/**
62362306a36Sopenharmony_ci * enum cppi5_tr_types - TR types
62462306a36Sopenharmony_ci * @CPPI5_TR_TYPE0:	One dimensional data move
62562306a36Sopenharmony_ci * @CPPI5_TR_TYPE1:	Two dimensional data move
62662306a36Sopenharmony_ci * @CPPI5_TR_TYPE2:	Three dimensional data move
62762306a36Sopenharmony_ci * @CPPI5_TR_TYPE3:	Four dimensional data move
62862306a36Sopenharmony_ci * @CPPI5_TR_TYPE4:	Four dimensional data move with data formatting
62962306a36Sopenharmony_ci * @CPPI5_TR_TYPE5:	Four dimensional Cache Warm
63062306a36Sopenharmony_ci * @CPPI5_TR_TYPE8:	Four Dimensional Block Move
63162306a36Sopenharmony_ci * @CPPI5_TR_TYPE9:	Four Dimensional Block Move with Repacking
63262306a36Sopenharmony_ci * @CPPI5_TR_TYPE10:	Two Dimensional Block Move
63362306a36Sopenharmony_ci * @CPPI5_TR_TYPE11:	Two Dimensional Block Move with Repacking
63462306a36Sopenharmony_ci * @CPPI5_TR_TYPE15:	Four Dimensional Block Move with Repacking and
63562306a36Sopenharmony_ci *			Indirection
63662306a36Sopenharmony_ci */
63762306a36Sopenharmony_cienum cppi5_tr_types {
63862306a36Sopenharmony_ci	CPPI5_TR_TYPE0 = 0,
63962306a36Sopenharmony_ci	CPPI5_TR_TYPE1,
64062306a36Sopenharmony_ci	CPPI5_TR_TYPE2,
64162306a36Sopenharmony_ci	CPPI5_TR_TYPE3,
64262306a36Sopenharmony_ci	CPPI5_TR_TYPE4,
64362306a36Sopenharmony_ci	CPPI5_TR_TYPE5,
64462306a36Sopenharmony_ci	/* type6-7: Reserved */
64562306a36Sopenharmony_ci	CPPI5_TR_TYPE8 = 8,
64662306a36Sopenharmony_ci	CPPI5_TR_TYPE9,
64762306a36Sopenharmony_ci	CPPI5_TR_TYPE10,
64862306a36Sopenharmony_ci	CPPI5_TR_TYPE11,
64962306a36Sopenharmony_ci	/* type12-14: Reserved */
65062306a36Sopenharmony_ci	CPPI5_TR_TYPE15 = 15,
65162306a36Sopenharmony_ci	CPPI5_TR_TYPE_MAX
65262306a36Sopenharmony_ci};
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci/**
65562306a36Sopenharmony_ci * enum cppi5_tr_event_size - TR Flags EVENT_SIZE field specifies when an event
65662306a36Sopenharmony_ci *			      is generated for each TR.
65762306a36Sopenharmony_ci * @CPPI5_TR_EVENT_SIZE_COMPLETION:	When TR is complete and all status for
65862306a36Sopenharmony_ci * 					the TR has been received
65962306a36Sopenharmony_ci * @CPPI5_TR_EVENT_SIZE_ICNT1_DEC:	Type 0: when the last data transaction
66062306a36Sopenharmony_ci *					is sent for the TR
66162306a36Sopenharmony_ci *					Type 1-11: when ICNT1 is decremented
66262306a36Sopenharmony_ci * @CPPI5_TR_EVENT_SIZE_ICNT2_DEC:	Type 0-1,10-11: when the last data
66362306a36Sopenharmony_ci *					transaction is sent for the TR
66462306a36Sopenharmony_ci *					All other types: when ICNT2 is
66562306a36Sopenharmony_ci *					decremented
66662306a36Sopenharmony_ci * @CPPI5_TR_EVENT_SIZE_ICNT3_DEC:	Type 0-2,10-11: when the last data
66762306a36Sopenharmony_ci *					transaction is sent for the TR
66862306a36Sopenharmony_ci *					All other types: when ICNT3 is
66962306a36Sopenharmony_ci *					decremented
67062306a36Sopenharmony_ci */
67162306a36Sopenharmony_cienum cppi5_tr_event_size {
67262306a36Sopenharmony_ci	CPPI5_TR_EVENT_SIZE_COMPLETION,
67362306a36Sopenharmony_ci	CPPI5_TR_EVENT_SIZE_ICNT1_DEC,
67462306a36Sopenharmony_ci	CPPI5_TR_EVENT_SIZE_ICNT2_DEC,
67562306a36Sopenharmony_ci	CPPI5_TR_EVENT_SIZE_ICNT3_DEC,
67662306a36Sopenharmony_ci	CPPI5_TR_EVENT_SIZE_MAX
67762306a36Sopenharmony_ci};
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci/**
68062306a36Sopenharmony_ci * enum cppi5_tr_trigger - TR Flags TRIGGERx field specifies the type of trigger
68162306a36Sopenharmony_ci *			   used to enable the TR to transfer data as specified
68262306a36Sopenharmony_ci *			   by TRIGGERx_TYPE field.
68362306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_NONE:		No trigger
68462306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_GLOBAL0:		Global trigger 0
68562306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_GLOBAL1:		Global trigger 1
68662306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_LOCAL_EVENT:	Local Event
68762306a36Sopenharmony_ci */
68862306a36Sopenharmony_cienum cppi5_tr_trigger {
68962306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_NONE,
69062306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_GLOBAL0,
69162306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_GLOBAL1,
69262306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_LOCAL_EVENT,
69362306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_MAX
69462306a36Sopenharmony_ci};
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_ci/**
69762306a36Sopenharmony_ci * enum cppi5_tr_trigger_type - TR Flags TRIGGERx_TYPE field specifies the type
69862306a36Sopenharmony_ci *				of data transfer that will be enabled by
69962306a36Sopenharmony_ci *				receiving a trigger as specified by TRIGGERx.
70062306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC:	The second inner most loop (ICNT1) will
70162306a36Sopenharmony_ci *					be decremented by 1
70262306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC:	The third inner most loop (ICNT2) will
70362306a36Sopenharmony_ci *					be decremented by 1
70462306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC:	The outer most loop (ICNT3) will be
70562306a36Sopenharmony_ci *					decremented by 1
70662306a36Sopenharmony_ci * @CPPI5_TR_TRIGGER_TYPE_ALL:		The entire TR will be allowed to
70762306a36Sopenharmony_ci *					complete
70862306a36Sopenharmony_ci */
70962306a36Sopenharmony_cienum cppi5_tr_trigger_type {
71062306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_TYPE_ICNT1_DEC,
71162306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_TYPE_ICNT2_DEC,
71262306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_TYPE_ICNT3_DEC,
71362306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_TYPE_ALL,
71462306a36Sopenharmony_ci	CPPI5_TR_TRIGGER_TYPE_MAX
71562306a36Sopenharmony_ci};
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_citypedef u32 cppi5_tr_flags_t;
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_ci/**
72062306a36Sopenharmony_ci * struct cppi5_tr_type0_t - Type 0 (One dimensional data move) TR (16 byte)
72162306a36Sopenharmony_ci * @flags:		TR flags (type, triggers, event, configuration)
72262306a36Sopenharmony_ci * @icnt0:		Total loop iteration count for level 0 (innermost)
72362306a36Sopenharmony_ci * @_reserved:		Not used
72462306a36Sopenharmony_ci * @addr:		Starting address for the source data or destination data
72562306a36Sopenharmony_ci */
72662306a36Sopenharmony_cistruct cppi5_tr_type0_t {
72762306a36Sopenharmony_ci	cppi5_tr_flags_t flags;
72862306a36Sopenharmony_ci	u16 icnt0;
72962306a36Sopenharmony_ci	u16 _reserved;
73062306a36Sopenharmony_ci	u64 addr;
73162306a36Sopenharmony_ci} __aligned(16) __packed;
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci/**
73462306a36Sopenharmony_ci * struct cppi5_tr_type1_t - Type 1 (Two dimensional data move) TR (32 byte)
73562306a36Sopenharmony_ci * @flags:		TR flags (type, triggers, event, configuration)
73662306a36Sopenharmony_ci * @icnt0:		Total loop iteration count for level 0 (innermost)
73762306a36Sopenharmony_ci * @icnt1:		Total loop iteration count for level 1
73862306a36Sopenharmony_ci * @addr:		Starting address for the source data or destination data
73962306a36Sopenharmony_ci * @dim1:		Signed dimension for loop level 1
74062306a36Sopenharmony_ci */
74162306a36Sopenharmony_cistruct cppi5_tr_type1_t {
74262306a36Sopenharmony_ci	cppi5_tr_flags_t flags;
74362306a36Sopenharmony_ci	u16 icnt0;
74462306a36Sopenharmony_ci	u16 icnt1;
74562306a36Sopenharmony_ci	u64 addr;
74662306a36Sopenharmony_ci	s32 dim1;
74762306a36Sopenharmony_ci} __aligned(32) __packed;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci/**
75062306a36Sopenharmony_ci * struct cppi5_tr_type2_t - Type 2 (Three dimensional data move) TR (32 byte)
75162306a36Sopenharmony_ci * @flags:		TR flags (type, triggers, event, configuration)
75262306a36Sopenharmony_ci * @icnt0:		Total loop iteration count for level 0 (innermost)
75362306a36Sopenharmony_ci * @icnt1:		Total loop iteration count for level 1
75462306a36Sopenharmony_ci * @addr:		Starting address for the source data or destination data
75562306a36Sopenharmony_ci * @dim1:		Signed dimension for loop level 1
75662306a36Sopenharmony_ci * @icnt2:		Total loop iteration count for level 2
75762306a36Sopenharmony_ci * @_reserved:		Not used
75862306a36Sopenharmony_ci * @dim2:		Signed dimension for loop level 2
75962306a36Sopenharmony_ci */
76062306a36Sopenharmony_cistruct cppi5_tr_type2_t {
76162306a36Sopenharmony_ci	cppi5_tr_flags_t flags;
76262306a36Sopenharmony_ci	u16 icnt0;
76362306a36Sopenharmony_ci	u16 icnt1;
76462306a36Sopenharmony_ci	u64 addr;
76562306a36Sopenharmony_ci	s32 dim1;
76662306a36Sopenharmony_ci	u16 icnt2;
76762306a36Sopenharmony_ci	u16 _reserved;
76862306a36Sopenharmony_ci	s32 dim2;
76962306a36Sopenharmony_ci} __aligned(32) __packed;
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci/**
77262306a36Sopenharmony_ci * struct cppi5_tr_type3_t - Type 3 (Four dimensional data move) TR (32 byte)
77362306a36Sopenharmony_ci * @flags:		TR flags (type, triggers, event, configuration)
77462306a36Sopenharmony_ci * @icnt0:		Total loop iteration count for level 0 (innermost)
77562306a36Sopenharmony_ci * @icnt1:		Total loop iteration count for level 1
77662306a36Sopenharmony_ci * @addr:		Starting address for the source data or destination data
77762306a36Sopenharmony_ci * @dim1:		Signed dimension for loop level 1
77862306a36Sopenharmony_ci * @icnt2:		Total loop iteration count for level 2
77962306a36Sopenharmony_ci * @icnt3:		Total loop iteration count for level 3 (outermost)
78062306a36Sopenharmony_ci * @dim2:		Signed dimension for loop level 2
78162306a36Sopenharmony_ci * @dim3:		Signed dimension for loop level 3
78262306a36Sopenharmony_ci */
78362306a36Sopenharmony_cistruct cppi5_tr_type3_t {
78462306a36Sopenharmony_ci	cppi5_tr_flags_t flags;
78562306a36Sopenharmony_ci	u16 icnt0;
78662306a36Sopenharmony_ci	u16 icnt1;
78762306a36Sopenharmony_ci	u64 addr;
78862306a36Sopenharmony_ci	s32 dim1;
78962306a36Sopenharmony_ci	u16 icnt2;
79062306a36Sopenharmony_ci	u16 icnt3;
79162306a36Sopenharmony_ci	s32 dim2;
79262306a36Sopenharmony_ci	s32 dim3;
79362306a36Sopenharmony_ci} __aligned(32) __packed;
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci/**
79662306a36Sopenharmony_ci * struct cppi5_tr_type15_t - Type 15 (Four Dimensional Block Copy with
79762306a36Sopenharmony_ci *			      Repacking and Indirection Support) TR (64 byte)
79862306a36Sopenharmony_ci * @flags:		TR flags (type, triggers, event, configuration)
79962306a36Sopenharmony_ci * @icnt0:		Total loop iteration count for level 0 (innermost) for
80062306a36Sopenharmony_ci *			source
80162306a36Sopenharmony_ci * @icnt1:		Total loop iteration count for level 1 for source
80262306a36Sopenharmony_ci * @addr:		Starting address for the source data
80362306a36Sopenharmony_ci * @dim1:		Signed dimension for loop level 1 for source
80462306a36Sopenharmony_ci * @icnt2:		Total loop iteration count for level 2 for source
80562306a36Sopenharmony_ci * @icnt3:		Total loop iteration count for level 3 (outermost) for
80662306a36Sopenharmony_ci *			source
80762306a36Sopenharmony_ci * @dim2:		Signed dimension for loop level 2 for source
80862306a36Sopenharmony_ci * @dim3:		Signed dimension for loop level 3 for source
80962306a36Sopenharmony_ci * @_reserved:		Not used
81062306a36Sopenharmony_ci * @ddim1:		Signed dimension for loop level 1 for destination
81162306a36Sopenharmony_ci * @daddr:		Starting address for the destination data
81262306a36Sopenharmony_ci * @ddim2:		Signed dimension for loop level 2 for destination
81362306a36Sopenharmony_ci * @ddim3:		Signed dimension for loop level 3 for destination
81462306a36Sopenharmony_ci * @dicnt0:		Total loop iteration count for level 0 (innermost) for
81562306a36Sopenharmony_ci *			destination
81662306a36Sopenharmony_ci * @dicnt1:		Total loop iteration count for level 1 for destination
81762306a36Sopenharmony_ci * @dicnt2:		Total loop iteration count for level 2 for destination
81862306a36Sopenharmony_ci * @sicnt3:		Total loop iteration count for level 3 (outermost) for
81962306a36Sopenharmony_ci *			destination
82062306a36Sopenharmony_ci */
82162306a36Sopenharmony_cistruct cppi5_tr_type15_t {
82262306a36Sopenharmony_ci	cppi5_tr_flags_t flags;
82362306a36Sopenharmony_ci	u16 icnt0;
82462306a36Sopenharmony_ci	u16 icnt1;
82562306a36Sopenharmony_ci	u64 addr;
82662306a36Sopenharmony_ci	s32 dim1;
82762306a36Sopenharmony_ci	u16 icnt2;
82862306a36Sopenharmony_ci	u16 icnt3;
82962306a36Sopenharmony_ci	s32 dim2;
83062306a36Sopenharmony_ci	s32 dim3;
83162306a36Sopenharmony_ci	u32 _reserved;
83262306a36Sopenharmony_ci	s32 ddim1;
83362306a36Sopenharmony_ci	u64 daddr;
83462306a36Sopenharmony_ci	s32 ddim2;
83562306a36Sopenharmony_ci	s32 ddim3;
83662306a36Sopenharmony_ci	u16 dicnt0;
83762306a36Sopenharmony_ci	u16 dicnt1;
83862306a36Sopenharmony_ci	u16 dicnt2;
83962306a36Sopenharmony_ci	u16 dicnt3;
84062306a36Sopenharmony_ci} __aligned(64) __packed;
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci/**
84362306a36Sopenharmony_ci * struct cppi5_tr_resp_t - TR response record
84462306a36Sopenharmony_ci * @status:		Status type and info
84562306a36Sopenharmony_ci * @_reserved:		Not used
84662306a36Sopenharmony_ci * @cmd_id:		Command ID for the TR for TR identification
84762306a36Sopenharmony_ci * @flags:		Configuration Specific Flags
84862306a36Sopenharmony_ci */
84962306a36Sopenharmony_cistruct cppi5_tr_resp_t {
85062306a36Sopenharmony_ci	u8 status;
85162306a36Sopenharmony_ci	u8 _reserved;
85262306a36Sopenharmony_ci	u8 cmd_id;
85362306a36Sopenharmony_ci	u8 flags;
85462306a36Sopenharmony_ci} __packed;
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_STATUS_TYPE_SHIFT	(0U)
85762306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_STATUS_TYPE_MASK	GENMASK(3, 0)
85862306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_STATUS_INFO_SHIFT	(4U)
85962306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_STATUS_INFO_MASK	GENMASK(7, 4)
86062306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_CMDID_SHIFT		(16U)
86162306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_CMDID_MASK		GENMASK(23, 16)
86262306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_CFG_SPECIFIC_SHIFT	(24U)
86362306a36Sopenharmony_ci#define CPPI5_TR_RESPONSE_CFG_SPECIFIC_MASK	GENMASK(31, 24)
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci/**
86662306a36Sopenharmony_ci * enum cppi5_tr_resp_status_type - TR Response Status Type field is used to
86762306a36Sopenharmony_ci *				    determine what type of status is being
86862306a36Sopenharmony_ci *				    returned.
86962306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_NONE:		No error, completion: completed
87062306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR:	Transfer Error, completion: none
87162306a36Sopenharmony_ci *						or partially completed
87262306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR:	Aborted Error, completion: none
87362306a36Sopenharmony_ci *						or partially completed
87462306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR:	Submission Error, completion:
87562306a36Sopenharmony_ci *						none
87662306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR:	Unsupported Error, completion:
87762306a36Sopenharmony_ci *						none
87862306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_TRANSFER_EXCEPTION: Transfer Exception, completion:
87962306a36Sopenharmony_ci *						partially completed
88062306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS__TEARDOWN_FLUSH:	Teardown Flush, completion: none
88162306a36Sopenharmony_ci */
88262306a36Sopenharmony_cienum cppi5_tr_resp_status_type {
88362306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_NONE,
88462306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_TRANSFER_ERR,
88562306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_ABORTED_ERR,
88662306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ERR,
88762306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ERR,
88862306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_TRANSFER_EXCEPTION,
88962306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS__TEARDOWN_FLUSH,
89062306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_MAX
89162306a36Sopenharmony_ci};
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci/**
89462306a36Sopenharmony_ci * enum cppi5_tr_resp_status_submission - TR Response Status field values which
89562306a36Sopenharmony_ci *					  corresponds Submission Error
89662306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0:	ICNT0 was 0
89762306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL: Channel FIFO was full when TR
89862306a36Sopenharmony_ci *						received
89962306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN:	Channel is not owned by the
90062306a36Sopenharmony_ci *						submitter
90162306a36Sopenharmony_ci */
90262306a36Sopenharmony_cienum cppi5_tr_resp_status_submission {
90362306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_ICNT0,
90462306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_FIFO_FULL,
90562306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_OWN,
90662306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_SUBMISSION_MAX
90762306a36Sopenharmony_ci};
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci/**
91062306a36Sopenharmony_ci * enum cppi5_tr_resp_status_unsupported - TR Response Status field values which
91162306a36Sopenharmony_ci *					   corresponds Unsupported Error
91262306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE:	TR Type not supported
91362306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC:	STATIC not supported
91462306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL:		EOL not supported
91562306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC:	CONFIGURATION SPECIFIC
91662306a36Sopenharmony_ci *							not supported
91762306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE:		AMODE not supported
91862306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE:	ELTYPE not supported
91962306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT:		DFMT not supported
92062306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR:		SECTR not supported
92162306a36Sopenharmony_ci * @CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC: AMODE SPECIFIC field
92262306a36Sopenharmony_ci *							not supported
92362306a36Sopenharmony_ci */
92462306a36Sopenharmony_cienum cppi5_tr_resp_status_unsupported {
92562306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_TR_TYPE,
92662306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_STATIC,
92762306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_EOL,
92862306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_CFG_SPECIFIC,
92962306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE,
93062306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_ELTYPE,
93162306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_DFMT,
93262306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_SECTR,
93362306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_AMODE_SPECIFIC,
93462306a36Sopenharmony_ci	CPPI5_TR_RESPONSE_STATUS_UNSUPPORTED_MAX
93562306a36Sopenharmony_ci};
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_ci/**
93862306a36Sopenharmony_ci * cppi5_trdesc_calc_size - Calculate TR Descriptor size
93962306a36Sopenharmony_ci * @tr_count: number of TR records
94062306a36Sopenharmony_ci * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
94162306a36Sopenharmony_ci *
94262306a36Sopenharmony_ci * Returns required TR Descriptor size
94362306a36Sopenharmony_ci */
94462306a36Sopenharmony_cistatic inline size_t cppi5_trdesc_calc_size(u32 tr_count, u32 tr_size)
94562306a36Sopenharmony_ci{
94662306a36Sopenharmony_ci	/*
94762306a36Sopenharmony_ci	 * The Size of a TR descriptor is:
94862306a36Sopenharmony_ci	 * 1 x tr_size : the first 16 bytes is used by the packet info block +
94962306a36Sopenharmony_ci	 * tr_count x tr_size : Transfer Request Records +
95062306a36Sopenharmony_ci	 * tr_count x sizeof(struct cppi5_tr_resp_t) : Transfer Response Records
95162306a36Sopenharmony_ci	 */
95262306a36Sopenharmony_ci	return tr_size * (tr_count + 1) +
95362306a36Sopenharmony_ci		sizeof(struct cppi5_tr_resp_t) * tr_count;
95462306a36Sopenharmony_ci}
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci/**
95762306a36Sopenharmony_ci * cppi5_trdesc_init - Init TR Descriptor
95862306a36Sopenharmony_ci * @desc: TR Descriptor
95962306a36Sopenharmony_ci * @tr_count: number of TR records
96062306a36Sopenharmony_ci * @tr_size: Nominal size of TR record (max) [16, 32, 64, 128]
96162306a36Sopenharmony_ci * @reload_idx: Absolute index to jump to on the 2nd and following passes
96262306a36Sopenharmony_ci *		through the TR packet.
96362306a36Sopenharmony_ci * @reload_count: Number of times to jump from last entry to reload_idx. 0x1ff
96462306a36Sopenharmony_ci *		  indicates infinite looping.
96562306a36Sopenharmony_ci *
96662306a36Sopenharmony_ci * Init TR Descriptor
96762306a36Sopenharmony_ci */
96862306a36Sopenharmony_cistatic inline void cppi5_trdesc_init(struct cppi5_desc_hdr_t *desc_hdr,
96962306a36Sopenharmony_ci				     u32 tr_count, u32 tr_size, u32 reload_idx,
97062306a36Sopenharmony_ci				     u32 reload_count)
97162306a36Sopenharmony_ci{
97262306a36Sopenharmony_ci	desc_hdr->pkt_info0 = CPPI5_INFO0_DESC_TYPE_VAL_TR <<
97362306a36Sopenharmony_ci			      CPPI5_INFO0_HDESC_TYPE_SHIFT;
97462306a36Sopenharmony_ci	desc_hdr->pkt_info0 |=
97562306a36Sopenharmony_ci			(reload_count << CPPI5_INFO0_TRDESC_RLDCNT_SHIFT) &
97662306a36Sopenharmony_ci			CPPI5_INFO0_TRDESC_RLDCNT_MASK;
97762306a36Sopenharmony_ci	desc_hdr->pkt_info0 |=
97862306a36Sopenharmony_ci			(reload_idx << CPPI5_INFO0_TRDESC_RLDIDX_SHIFT) &
97962306a36Sopenharmony_ci			CPPI5_INFO0_TRDESC_RLDIDX_MASK;
98062306a36Sopenharmony_ci	desc_hdr->pkt_info0 |= (tr_count - 1) & CPPI5_INFO0_TRDESC_LASTIDX_MASK;
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci	desc_hdr->pkt_info1 |= ((ffs(tr_size >> 4) - 1) <<
98362306a36Sopenharmony_ci				CPPI5_INFO1_TRDESC_RECSIZE_SHIFT) &
98462306a36Sopenharmony_ci				CPPI5_INFO1_TRDESC_RECSIZE_MASK;
98562306a36Sopenharmony_ci}
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci/**
98862306a36Sopenharmony_ci * cppi5_tr_init - Init TR record
98962306a36Sopenharmony_ci * @flags: Pointer to the TR's flags
99062306a36Sopenharmony_ci * @type: TR type
99162306a36Sopenharmony_ci * @static_tr: TR is static
99262306a36Sopenharmony_ci * @wait: Wait for TR completion before allow the next TR to start
99362306a36Sopenharmony_ci * @event_size: output event generation cfg
99462306a36Sopenharmony_ci * @cmd_id: TR identifier (application specifics)
99562306a36Sopenharmony_ci *
99662306a36Sopenharmony_ci * Init TR record
99762306a36Sopenharmony_ci */
99862306a36Sopenharmony_cistatic inline void cppi5_tr_init(cppi5_tr_flags_t *flags,
99962306a36Sopenharmony_ci				 enum cppi5_tr_types type, bool static_tr,
100062306a36Sopenharmony_ci				 bool wait, enum cppi5_tr_event_size event_size,
100162306a36Sopenharmony_ci				 u32 cmd_id)
100262306a36Sopenharmony_ci{
100362306a36Sopenharmony_ci	*flags = type;
100462306a36Sopenharmony_ci	*flags |= (event_size << CPPI5_TR_EVENT_SIZE_SHIFT) &
100562306a36Sopenharmony_ci		  CPPI5_TR_EVENT_SIZE_MASK;
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci	*flags |= (cmd_id << CPPI5_TR_CMD_ID_SHIFT) &
100862306a36Sopenharmony_ci		  CPPI5_TR_CMD_ID_MASK;
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci	if (static_tr && (type == CPPI5_TR_TYPE8 || type == CPPI5_TR_TYPE9))
101162306a36Sopenharmony_ci		*flags |= CPPI5_TR_STATIC;
101262306a36Sopenharmony_ci
101362306a36Sopenharmony_ci	if (wait)
101462306a36Sopenharmony_ci		*flags |= CPPI5_TR_WAIT;
101562306a36Sopenharmony_ci}
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ci/**
101862306a36Sopenharmony_ci * cppi5_tr_set_trigger - Configure trigger0/1 and trigger0/1_type
101962306a36Sopenharmony_ci * @flags: Pointer to the TR's flags
102062306a36Sopenharmony_ci * @trigger0: trigger0 selection
102162306a36Sopenharmony_ci * @trigger0_type: type of data transfer that will be enabled by trigger0
102262306a36Sopenharmony_ci * @trigger1: trigger1 selection
102362306a36Sopenharmony_ci * @trigger1_type: type of data transfer that will be enabled by trigger1
102462306a36Sopenharmony_ci *
102562306a36Sopenharmony_ci * Configure the triggers for the TR
102662306a36Sopenharmony_ci */
102762306a36Sopenharmony_cistatic inline void cppi5_tr_set_trigger(cppi5_tr_flags_t *flags,
102862306a36Sopenharmony_ci		enum cppi5_tr_trigger trigger0,
102962306a36Sopenharmony_ci		enum cppi5_tr_trigger_type trigger0_type,
103062306a36Sopenharmony_ci		enum cppi5_tr_trigger trigger1,
103162306a36Sopenharmony_ci		enum cppi5_tr_trigger_type trigger1_type)
103262306a36Sopenharmony_ci{
103362306a36Sopenharmony_ci	*flags &= ~(CPPI5_TR_TRIGGER0_MASK | CPPI5_TR_TRIGGER0_TYPE_MASK |
103462306a36Sopenharmony_ci		    CPPI5_TR_TRIGGER1_MASK | CPPI5_TR_TRIGGER1_TYPE_MASK);
103562306a36Sopenharmony_ci	*flags |= (trigger0 << CPPI5_TR_TRIGGER0_SHIFT) &
103662306a36Sopenharmony_ci		  CPPI5_TR_TRIGGER0_MASK;
103762306a36Sopenharmony_ci	*flags |= (trigger0_type << CPPI5_TR_TRIGGER0_TYPE_SHIFT) &
103862306a36Sopenharmony_ci		  CPPI5_TR_TRIGGER0_TYPE_MASK;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	*flags |= (trigger1 << CPPI5_TR_TRIGGER1_SHIFT) &
104162306a36Sopenharmony_ci		  CPPI5_TR_TRIGGER1_MASK;
104262306a36Sopenharmony_ci	*flags |= (trigger1_type << CPPI5_TR_TRIGGER1_TYPE_SHIFT) &
104362306a36Sopenharmony_ci		  CPPI5_TR_TRIGGER1_TYPE_MASK;
104462306a36Sopenharmony_ci}
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_ci/**
104762306a36Sopenharmony_ci * cppi5_tr_cflag_set - Update the Configuration specific flags
104862306a36Sopenharmony_ci * @flags: Pointer to the TR's flags
104962306a36Sopenharmony_ci * @csf: Configuration specific flags
105062306a36Sopenharmony_ci *
105162306a36Sopenharmony_ci * Set a bit in Configuration Specific Flags section of the TR flags.
105262306a36Sopenharmony_ci */
105362306a36Sopenharmony_cistatic inline void cppi5_tr_csf_set(cppi5_tr_flags_t *flags, u32 csf)
105462306a36Sopenharmony_ci{
105562306a36Sopenharmony_ci	*flags &= ~CPPI5_TR_CSF_FLAGS_MASK;
105662306a36Sopenharmony_ci	*flags |= (csf << CPPI5_TR_CSF_FLAGS_SHIFT) &
105762306a36Sopenharmony_ci		  CPPI5_TR_CSF_FLAGS_MASK;
105862306a36Sopenharmony_ci}
105962306a36Sopenharmony_ci
106062306a36Sopenharmony_ci#endif /* __TI_CPPI5_H__ */
1061