xref: /freebsd/sys/contrib/alpine-hal/al_hal_udma_config.h (revision d002f039aeb370370cd2cba63ad55cc4cf16c932)
1*3fc36ee0SWojciech Macek /*******************************************************************************
249b49cdaSZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd.
349b49cdaSZbigniew Bodek 
449b49cdaSZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial
549b49cdaSZbigniew Bodek License Agreement.
649b49cdaSZbigniew Bodek 
749b49cdaSZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General
849b49cdaSZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be
949b49cdaSZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html
1049b49cdaSZbigniew Bodek 
1149b49cdaSZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or
1249b49cdaSZbigniew Bodek without modification, are permitted provided that the following conditions are
1349b49cdaSZbigniew Bodek met:
1449b49cdaSZbigniew Bodek 
1549b49cdaSZbigniew Bodek     *     Redistributions of source code must retain the above copyright notice,
1649b49cdaSZbigniew Bodek this list of conditions and the following disclaimer.
1749b49cdaSZbigniew Bodek 
1849b49cdaSZbigniew Bodek     *     Redistributions in binary form must reproduce the above copyright
1949b49cdaSZbigniew Bodek notice, this list of conditions and the following disclaimer in
2049b49cdaSZbigniew Bodek the documentation and/or other materials provided with the
2149b49cdaSZbigniew Bodek distribution.
2249b49cdaSZbigniew Bodek 
2349b49cdaSZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
2449b49cdaSZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2549b49cdaSZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2649b49cdaSZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
2749b49cdaSZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2849b49cdaSZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2949b49cdaSZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
3049b49cdaSZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3149b49cdaSZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3249b49cdaSZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3349b49cdaSZbigniew Bodek 
3449b49cdaSZbigniew Bodek *******************************************************************************/
3549b49cdaSZbigniew Bodek 
3649b49cdaSZbigniew Bodek /**
3749b49cdaSZbigniew Bodek  * @defgroup group_udma_config UDMA Config
3849b49cdaSZbigniew Bodek  * @ingroup group_udma_api
3949b49cdaSZbigniew Bodek  *  UDMA Config API
4049b49cdaSZbigniew Bodek  *  @{
4149b49cdaSZbigniew Bodek  * @file   al_hal_udma_config.h
4249b49cdaSZbigniew Bodek  *
4349b49cdaSZbigniew Bodek  * @brief C Header file for the Universal DMA HAL driver for configuration APIs
4449b49cdaSZbigniew Bodek  *
4549b49cdaSZbigniew Bodek  */
4649b49cdaSZbigniew Bodek 
4749b49cdaSZbigniew Bodek #ifndef __AL_HAL_UDMA_CONFIG_H__
4849b49cdaSZbigniew Bodek #define __AL_HAL_UDMA_CONFIG_H__
4949b49cdaSZbigniew Bodek 
5049b49cdaSZbigniew Bodek #include <al_hal_udma.h>
5149b49cdaSZbigniew Bodek 
5249b49cdaSZbigniew Bodek 
5349b49cdaSZbigniew Bodek /* *INDENT-OFF* */
5449b49cdaSZbigniew Bodek #ifdef __cplusplus
5549b49cdaSZbigniew Bodek extern "C" {
5649b49cdaSZbigniew Bodek #endif
5749b49cdaSZbigniew Bodek /* *INDENT-ON* */
5849b49cdaSZbigniew Bodek 
5949b49cdaSZbigniew Bodek /** Scheduling mode */
6049b49cdaSZbigniew Bodek enum al_udma_sch_mode {
6149b49cdaSZbigniew Bodek 	STRICT,			/* Strict */
6249b49cdaSZbigniew Bodek 	SRR,			/* Simple Sound Rubin */
6349b49cdaSZbigniew Bodek 	DWRR			/* Deficit Weighted Round Rubin */
6449b49cdaSZbigniew Bodek };
6549b49cdaSZbigniew Bodek 
6649b49cdaSZbigniew Bodek /** AXI configuration */
6749b49cdaSZbigniew Bodek struct al_udma_axi_conf {
6849b49cdaSZbigniew Bodek 	uint32_t axi_timeout;	/* Timeout for AXI transactions  */
6949b49cdaSZbigniew Bodek 	uint8_t arb_promotion;	/* arbitration promotion */
7049b49cdaSZbigniew Bodek 	al_bool swap_8_bytes;	/* enable 8 bytes swap instead of 4 bytes */
7149b49cdaSZbigniew Bodek 	al_bool swap_s2m_data;
7249b49cdaSZbigniew Bodek 	al_bool swap_s2m_desc;
7349b49cdaSZbigniew Bodek 	al_bool swap_m2s_data;
7449b49cdaSZbigniew Bodek 	al_bool swap_m2s_desc;
7549b49cdaSZbigniew Bodek };
7649b49cdaSZbigniew Bodek 
7749b49cdaSZbigniew Bodek /** UDMA AXI M2S configuration */
7849b49cdaSZbigniew Bodek struct al_udma_axi_submaster {
7949b49cdaSZbigniew Bodek 	uint8_t id; /* AXI ID */
8049b49cdaSZbigniew Bodek 	uint8_t cache_type;
8149b49cdaSZbigniew Bodek 	uint8_t burst;
8249b49cdaSZbigniew Bodek 	uint16_t used_ext;
8349b49cdaSZbigniew Bodek 	uint8_t bus_size;
8449b49cdaSZbigniew Bodek 	uint8_t qos;
8549b49cdaSZbigniew Bodek 	uint8_t prot;
8649b49cdaSZbigniew Bodek 	uint8_t max_beats;
8749b49cdaSZbigniew Bodek };
8849b49cdaSZbigniew Bodek 
8949b49cdaSZbigniew Bodek /** UDMA AXI M2S configuration */
9049b49cdaSZbigniew Bodek struct al_udma_m2s_axi_conf {
9149b49cdaSZbigniew Bodek 	struct al_udma_axi_submaster comp_write;
9249b49cdaSZbigniew Bodek 	struct al_udma_axi_submaster data_read;
9349b49cdaSZbigniew Bodek 	struct al_udma_axi_submaster desc_read;
9449b49cdaSZbigniew Bodek 	al_bool break_on_max_boundary; /* Data read break on max boundary */
9549b49cdaSZbigniew Bodek 	uint8_t min_axi_beats; /* Minimum burst for writing completion desc. */
9649b49cdaSZbigniew Bodek 	uint8_t ostand_max_data_read;
9749b49cdaSZbigniew Bodek 	uint8_t ostand_max_desc_read;
9849b49cdaSZbigniew Bodek 	uint8_t ostand_max_comp_req;
9949b49cdaSZbigniew Bodek 	uint8_t ostand_max_comp_write;
10049b49cdaSZbigniew Bodek };
10149b49cdaSZbigniew Bodek 
10249b49cdaSZbigniew Bodek /** UDMA AXI S2M configuration */
10349b49cdaSZbigniew Bodek struct al_udma_s2m_axi_conf {
10449b49cdaSZbigniew Bodek 	struct al_udma_axi_submaster data_write;
10549b49cdaSZbigniew Bodek 	struct al_udma_axi_submaster desc_read;
10649b49cdaSZbigniew Bodek 	struct al_udma_axi_submaster comp_write;
10749b49cdaSZbigniew Bodek 	al_bool break_on_max_boundary; /* Data read break on max boundary */
10849b49cdaSZbigniew Bodek 	uint8_t min_axi_beats; /* Minimum burst for writing completion desc. */
10949b49cdaSZbigniew Bodek 	uint8_t ostand_max_data_req;
11049b49cdaSZbigniew Bodek 	uint8_t ostand_max_data_write;
11149b49cdaSZbigniew Bodek 	uint8_t ostand_max_comp_req;
11249b49cdaSZbigniew Bodek 	uint8_t ostand_max_comp_write;
11349b49cdaSZbigniew Bodek 	uint8_t ostand_max_desc_read;
11449b49cdaSZbigniew Bodek 	uint8_t ack_fifo_depth;	/* size of the stream application ack fifo */
11549b49cdaSZbigniew Bodek };
11649b49cdaSZbigniew Bodek 
11749b49cdaSZbigniew Bodek /** M2S error logging */
11849b49cdaSZbigniew Bodek struct al_udma_err_log {
11949b49cdaSZbigniew Bodek 	uint32_t error_status;
12049b49cdaSZbigniew Bodek 	uint32_t header[4];
12149b49cdaSZbigniew Bodek };
12249b49cdaSZbigniew Bodek 
12349b49cdaSZbigniew Bodek /** M2S max packet size configuration */
12449b49cdaSZbigniew Bodek struct al_udma_m2s_pkt_len_conf {
12549b49cdaSZbigniew Bodek 	uint32_t max_pkt_size;
12649b49cdaSZbigniew Bodek 	al_bool encode_64k_as_zero;
12749b49cdaSZbigniew Bodek };
12849b49cdaSZbigniew Bodek 
12949b49cdaSZbigniew Bodek /** M2S Descriptor Prefetch configuration */
13049b49cdaSZbigniew Bodek struct al_udma_m2s_desc_pref_conf {
13149b49cdaSZbigniew Bodek 	uint8_t desc_fifo_depth;
13249b49cdaSZbigniew Bodek 	enum al_udma_sch_mode sch_mode;	/* Scheduling mode
13349b49cdaSZbigniew Bodek 					* (either strict or RR) */
13449b49cdaSZbigniew Bodek 
13549b49cdaSZbigniew Bodek 	uint8_t max_desc_per_packet;	/* max number of descriptors to
13649b49cdaSZbigniew Bodek 					 * prefetch */
13749b49cdaSZbigniew Bodek 	/* in one burst (5b) */
13849b49cdaSZbigniew Bodek 	uint8_t pref_thr;
13949b49cdaSZbigniew Bodek 	uint8_t min_burst_above_thr;	/* min burst size when fifo above
14049b49cdaSZbigniew Bodek 					* pref_thr (4b)
14149b49cdaSZbigniew Bodek 					*/
14249b49cdaSZbigniew Bodek 	uint8_t min_burst_below_thr;	/* min burst size when fifo below
14349b49cdaSZbigniew Bodek 					* pref_thr (4b)
14449b49cdaSZbigniew Bodek 					*/
14549b49cdaSZbigniew Bodek 	uint8_t max_pkt_limit;		/* maximum number of packets in the data
14649b49cdaSZbigniew Bodek 					* read FIFO, defined based on header
14749b49cdaSZbigniew Bodek 					* FIFO size
14849b49cdaSZbigniew Bodek 					*/
14949b49cdaSZbigniew Bodek 	uint16_t data_fifo_depth;	/* maximum number of data beats in the
15049b49cdaSZbigniew Bodek 					* data read FIFO,
15149b49cdaSZbigniew Bodek 					* defined based on header FIFO size
15249b49cdaSZbigniew Bodek 					*/
15349b49cdaSZbigniew Bodek };
15449b49cdaSZbigniew Bodek 
15549b49cdaSZbigniew Bodek /** S2M Descriptor Prefetch configuration */
15649b49cdaSZbigniew Bodek struct al_udma_s2m_desc_pref_conf {
15749b49cdaSZbigniew Bodek 	uint8_t desc_fifo_depth;
15849b49cdaSZbigniew Bodek 	enum al_udma_sch_mode sch_mode;	/* Scheduling mode *
15949b49cdaSZbigniew Bodek 					* (either strict or RR)
16049b49cdaSZbigniew Bodek 					*/
16149b49cdaSZbigniew Bodek 
16249b49cdaSZbigniew Bodek 	al_bool q_promotion;		/* enable promotion */
16349b49cdaSZbigniew Bodek 	al_bool force_promotion;	/* force promotion  */
16449b49cdaSZbigniew Bodek 	al_bool en_pref_prediction;	/* enable prefetch prediction */
16549b49cdaSZbigniew Bodek 	uint8_t promotion_th;		/* Threshold for queue promotion */
16649b49cdaSZbigniew Bodek 
16749b49cdaSZbigniew Bodek 	uint8_t pref_thr;
16849b49cdaSZbigniew Bodek 	uint8_t min_burst_above_thr;	/* min burst size when fifo above
16949b49cdaSZbigniew Bodek 	 	 	 	 	 * pref_thr (4b)
17049b49cdaSZbigniew Bodek 	 	 	 	 	 */
17149b49cdaSZbigniew Bodek 	uint8_t min_burst_below_thr;	/* min burst size when fifo below
17249b49cdaSZbigniew Bodek 	 	 	 	 	 * pref_thr (4b)
17349b49cdaSZbigniew Bodek 	 	 	 	 	 */
17449b49cdaSZbigniew Bodek 	uint8_t a_full_thr;		/* almost full threshold */
17549b49cdaSZbigniew Bodek };
17649b49cdaSZbigniew Bodek 
17749b49cdaSZbigniew Bodek /** S2M Data write configuration */
17849b49cdaSZbigniew Bodek struct al_udma_s2m_data_write_conf {
17949b49cdaSZbigniew Bodek 	uint16_t data_fifo_depth;	/* maximum number of data beats in the
18049b49cdaSZbigniew Bodek 					 * data write FIFO, defined based on
18149b49cdaSZbigniew Bodek 					 * header FIFO size
18249b49cdaSZbigniew Bodek 					 */
18349b49cdaSZbigniew Bodek 	uint8_t max_pkt_limit;		/* maximum number of packets in the
18449b49cdaSZbigniew Bodek 					* data write FIFO,defined based on
18549b49cdaSZbigniew Bodek 					* header FIFO size
18649b49cdaSZbigniew Bodek 					*/
18749b49cdaSZbigniew Bodek 	uint8_t fifo_margin;
18849b49cdaSZbigniew Bodek 	uint32_t desc_wait_timer;	/* waiting time for the host to write
18949b49cdaSZbigniew Bodek 					* new descriptor to the queue
19049b49cdaSZbigniew Bodek 					* (for the current packet in process)
19149b49cdaSZbigniew Bodek 					*/
19249b49cdaSZbigniew Bodek 	uint32_t flags;			/* bitwise of flags of s2m
19349b49cdaSZbigniew Bodek 					 * data_cfg_2 register
19449b49cdaSZbigniew Bodek 					 */
19549b49cdaSZbigniew Bodek };
19649b49cdaSZbigniew Bodek 
19749b49cdaSZbigniew Bodek /** S2M Completion configuration */
19849b49cdaSZbigniew Bodek struct al_udma_s2m_completion_conf {
19949b49cdaSZbigniew Bodek 	uint8_t desc_size;		/* Size of completion descriptor
20049b49cdaSZbigniew Bodek 					 * in words
20149b49cdaSZbigniew Bodek 					 */
20249b49cdaSZbigniew Bodek 	al_bool cnt_words;		/* Completion fifo in use counter:
20349b49cdaSZbigniew Bodek 	 	 	 	 	 * AL_TRUE words, AL_FALS descriptors
20449b49cdaSZbigniew Bodek 	 	 	 	 	 */
20549b49cdaSZbigniew Bodek 	al_bool q_promotion;		/* Enable promotion of the current
20649b49cdaSZbigniew Bodek 					 * unack in progress */
20749b49cdaSZbigniew Bodek 					/* in the completion write scheduler */
20849b49cdaSZbigniew Bodek 	al_bool force_rr;		/* force RR arbitration in the
20949b49cdaSZbigniew Bodek 					*  scheduler
21049b49cdaSZbigniew Bodek 					*/
21149b49cdaSZbigniew Bodek   //	uint8_t ack_fifo_depth;		/* size of the stream application ack fifo */
21249b49cdaSZbigniew Bodek 	uint8_t q_free_min;		/* minimum number of free completion
21349b49cdaSZbigniew Bodek 					 * entries
21449b49cdaSZbigniew Bodek 					 */
21549b49cdaSZbigniew Bodek 					/* to qualify for promotion */
21649b49cdaSZbigniew Bodek 
21749b49cdaSZbigniew Bodek 	uint16_t comp_fifo_depth;	/* Size of completion fifo in words */
21849b49cdaSZbigniew Bodek 	uint16_t unack_fifo_depth;	/* Size of unacked fifo in descs */
21949b49cdaSZbigniew Bodek 	uint32_t timeout;		/* Ack timout from stream interface */
22049b49cdaSZbigniew Bodek };
22149b49cdaSZbigniew Bodek 
22249b49cdaSZbigniew Bodek /** M2S UDMA DWRR configuration */
22349b49cdaSZbigniew Bodek struct al_udma_m2s_dwrr_conf {
22449b49cdaSZbigniew Bodek 	al_bool enable_dwrr;
22549b49cdaSZbigniew Bodek 	uint8_t inc_factor;
22649b49cdaSZbigniew Bodek 	uint8_t weight;
22749b49cdaSZbigniew Bodek 	al_bool pkt_mode;
22849b49cdaSZbigniew Bodek 	uint32_t deficit_init_val;
22949b49cdaSZbigniew Bodek };
23049b49cdaSZbigniew Bodek 
23149b49cdaSZbigniew Bodek /** M2S DMA Rate Limitation mode */
23249b49cdaSZbigniew Bodek struct al_udma_m2s_rlimit_mode {
23349b49cdaSZbigniew Bodek 	al_bool pkt_mode_en;
23449b49cdaSZbigniew Bodek 	uint16_t short_cycle_sz;
23549b49cdaSZbigniew Bodek 	uint32_t token_init_val;
23649b49cdaSZbigniew Bodek };
23749b49cdaSZbigniew Bodek 
23849b49cdaSZbigniew Bodek /** M2S Stream/Q Rate Limitation */
23949b49cdaSZbigniew Bodek struct al_udma_m2s_rlimit_cfg {
24049b49cdaSZbigniew Bodek 	uint32_t max_burst_sz;	/* maximum number of accumulated bytes in the
24149b49cdaSZbigniew Bodek 				 * token counter
24249b49cdaSZbigniew Bodek 				 */
24349b49cdaSZbigniew Bodek 	uint16_t long_cycle_sz;	/* number of short cycles between token fill */
24449b49cdaSZbigniew Bodek 	uint32_t long_cycle;	/* number of bits to add in each long cycle */
24549b49cdaSZbigniew Bodek 	uint32_t short_cycle;	/* number of bits to add in each cycle */
24649b49cdaSZbigniew Bodek 	uint32_t mask;		/* mask the different types of rate limiters */
24749b49cdaSZbigniew Bodek };
24849b49cdaSZbigniew Bodek 
24949b49cdaSZbigniew Bodek enum al_udma_m2s_rlimit_action {
25049b49cdaSZbigniew Bodek 	AL_UDMA_STRM_RLIMIT_ENABLE,
25149b49cdaSZbigniew Bodek 	AL_UDMA_STRM_RLIMIT_PAUSE,
25249b49cdaSZbigniew Bodek 	AL_UDMA_STRM_RLIMIT_RESET
25349b49cdaSZbigniew Bodek };
25449b49cdaSZbigniew Bodek 
25549b49cdaSZbigniew Bodek /** M2S UDMA Q scheduling configuration */
25649b49cdaSZbigniew Bodek struct al_udma_m2s_q_dwrr_conf {
25749b49cdaSZbigniew Bodek 	uint32_t max_deficit_cnt_sz;	/*maximum number of accumulated bytes
25849b49cdaSZbigniew Bodek 					* in the deficit counter
25949b49cdaSZbigniew Bodek 					*/
26049b49cdaSZbigniew Bodek 	al_bool strict;		/* bypass DWRR */
26149b49cdaSZbigniew Bodek 	uint8_t axi_qos;
26249b49cdaSZbigniew Bodek 	uint16_t q_qos;
26349b49cdaSZbigniew Bodek 	uint8_t weight;
26449b49cdaSZbigniew Bodek };
26549b49cdaSZbigniew Bodek 
26649b49cdaSZbigniew Bodek /** M2S UDMA / UDMA Q scheduling configuration */
26749b49cdaSZbigniew Bodek struct al_udma_m2s_sc {
26849b49cdaSZbigniew Bodek 	enum al_udma_sch_mode sch_mode;	/* Scheduling Mode */
26949b49cdaSZbigniew Bodek 	struct al_udma_m2s_dwrr_conf dwrr;	/* DWRR configuration */
27049b49cdaSZbigniew Bodek };
27149b49cdaSZbigniew Bodek 
27249b49cdaSZbigniew Bodek /** UDMA / UDMA Q rate limitation configuration */
27349b49cdaSZbigniew Bodek struct al_udma_m2s_rlimit {
27449b49cdaSZbigniew Bodek 	struct al_udma_m2s_rlimit_mode rlimit_mode;
27549b49cdaSZbigniew Bodek 						/* rate limitation enablers */
27649b49cdaSZbigniew Bodek #if 0
27749b49cdaSZbigniew Bodek 	struct al_udma_tkn_bkt_conf token_bkt;        /* Token Bucket configuration */
27849b49cdaSZbigniew Bodek #endif
27949b49cdaSZbigniew Bodek };
28049b49cdaSZbigniew Bodek 
28149b49cdaSZbigniew Bodek /** UDMA Data read configuration */
28249b49cdaSZbigniew Bodek struct al_udma_m2s_data_rd_conf {
28349b49cdaSZbigniew Bodek 	uint8_t max_rd_d_beats;		/* max burst size for reading data
28449b49cdaSZbigniew Bodek 					 * (in AXI beats-128b) (5b)
28549b49cdaSZbigniew Bodek 					 */
28649b49cdaSZbigniew Bodek 	uint8_t max_rd_d_out_req;	/* max number of outstanding data
28749b49cdaSZbigniew Bodek 					 * read requests (6b)
28849b49cdaSZbigniew Bodek 					 */
28949b49cdaSZbigniew Bodek 	uint16_t max_rd_d_out_beats;	/* max num. of data read beats (10b) */
29049b49cdaSZbigniew Bodek };
29149b49cdaSZbigniew Bodek 
29249b49cdaSZbigniew Bodek /** M2S UDMA completion and application timeouts */
29349b49cdaSZbigniew Bodek struct al_udma_m2s_comp_timeouts {
29449b49cdaSZbigniew Bodek 	enum al_udma_sch_mode sch_mode;	/* Scheduling mode
29549b49cdaSZbigniew Bodek 					 * (either strict or RR)
29649b49cdaSZbigniew Bodek 					 */
29749b49cdaSZbigniew Bodek 	al_bool enable_q_promotion;
29849b49cdaSZbigniew Bodek 	uint8_t unack_fifo_depth;	/* unacked desc fifo size */
29949b49cdaSZbigniew Bodek 	uint8_t comp_fifo_depth;	/* desc fifo size */
30049b49cdaSZbigniew Bodek 	uint32_t coal_timeout;	/* (24b) */
30149b49cdaSZbigniew Bodek 	uint32_t app_timeout;	/* (24b) */
30249b49cdaSZbigniew Bodek };
30349b49cdaSZbigniew Bodek 
30449b49cdaSZbigniew Bodek /** S2M UDMA per queue completion configuration */
30549b49cdaSZbigniew Bodek struct al_udma_s2m_q_comp_conf {
30649b49cdaSZbigniew Bodek 	al_bool dis_comp_coal;		/* disable completion coalescing */
30749b49cdaSZbigniew Bodek 	al_bool en_comp_ring_update;	/* enable writing completion descs */
30849b49cdaSZbigniew Bodek 	uint32_t comp_timer;		/* completion coalescing timer */
30949b49cdaSZbigniew Bodek 	al_bool en_hdr_split;		/* enable header split */
31049b49cdaSZbigniew Bodek 	al_bool force_hdr_split;	/* force header split */
31149b49cdaSZbigniew Bodek 	uint16_t hdr_split_size;	/* size used for the header split */
31249b49cdaSZbigniew Bodek 	uint8_t q_qos;			/* queue QoS */
31349b49cdaSZbigniew Bodek };
31449b49cdaSZbigniew Bodek 
315*3fc36ee0SWojciech Macek /** UDMA per queue Target-ID control configuration */
316*3fc36ee0SWojciech Macek struct al_udma_gen_tgtid_q_conf {
317*3fc36ee0SWojciech Macek 	/* Enable usage of the Target-ID per queue according to 'tgtid' */
31849b49cdaSZbigniew Bodek 	al_bool queue_en;
31949b49cdaSZbigniew Bodek 
320*3fc36ee0SWojciech Macek 	/* Enable usage of the Target-ID from the descriptor buffer address 63:48 */
32149b49cdaSZbigniew Bodek 	al_bool desc_en;
32249b49cdaSZbigniew Bodek 
323*3fc36ee0SWojciech Macek 	/* Target-ID to be applied when 'queue_en' is asserted */
324*3fc36ee0SWojciech Macek 	uint16_t tgtid;
32549b49cdaSZbigniew Bodek 
326*3fc36ee0SWojciech Macek 	/* TGTADDR to be applied to msbs when 'desc_en' is asserted.
32749b49cdaSZbigniew Bodek 	 * Relevant for revisions >= AL_UDMA_REV_ID_REV2 */
328*3fc36ee0SWojciech Macek 	uint16_t tgtaddr;
32949b49cdaSZbigniew Bodek };
33049b49cdaSZbigniew Bodek 
331*3fc36ee0SWojciech Macek /** UDMA Target-ID control configuration */
332*3fc36ee0SWojciech Macek struct al_udma_gen_tgtid_conf {
33349b49cdaSZbigniew Bodek 	/* TX queue configuration */
334*3fc36ee0SWojciech Macek 	struct al_udma_gen_tgtid_q_conf tx_q_conf[DMA_MAX_Q];
33549b49cdaSZbigniew Bodek 
33649b49cdaSZbigniew Bodek 	/* RX queue configuration */
337*3fc36ee0SWojciech Macek 	struct al_udma_gen_tgtid_q_conf rx_q_conf[DMA_MAX_Q];
33849b49cdaSZbigniew Bodek };
33949b49cdaSZbigniew Bodek 
340*3fc36ee0SWojciech Macek /** UDMA Target-ID MSIX control configuration */
341*3fc36ee0SWojciech Macek struct al_udma_gen_tgtid_msix_conf {
342*3fc36ee0SWojciech Macek 	/* Enable write to all TGTID_n registers in the MSI-X Controller */
34349b49cdaSZbigniew Bodek 	al_bool access_en;
34449b49cdaSZbigniew Bodek 
345*3fc36ee0SWojciech Macek 	/* use TGTID_n [7:0] from MSI-X Controller for MSI-X message */
34649b49cdaSZbigniew Bodek 	al_bool sel;
34749b49cdaSZbigniew Bodek };
34849b49cdaSZbigniew Bodek 
34949b49cdaSZbigniew Bodek /* Report Error - to be used for abort */
35049b49cdaSZbigniew Bodek void al_udma_err_report(struct al_udma *udma);
35149b49cdaSZbigniew Bodek 
35249b49cdaSZbigniew Bodek /* Statistics - TBD */
35349b49cdaSZbigniew Bodek void al_udma_stats_get(struct al_udma *udma);
35449b49cdaSZbigniew Bodek 
35549b49cdaSZbigniew Bodek /* Misc configurations */
35649b49cdaSZbigniew Bodek /* Configure AXI configuration */
35749b49cdaSZbigniew Bodek int al_udma_axi_set(struct udma_gen_axi *axi_regs,
35849b49cdaSZbigniew Bodek 		    struct al_udma_axi_conf *axi);
35949b49cdaSZbigniew Bodek 
36049b49cdaSZbigniew Bodek /* Configure UDMA AXI M2S configuration */
36149b49cdaSZbigniew Bodek int al_udma_m2s_axi_set(struct al_udma *udma,
36249b49cdaSZbigniew Bodek 			struct al_udma_m2s_axi_conf *axi_m2s);
36349b49cdaSZbigniew Bodek 
36449b49cdaSZbigniew Bodek /* Configure UDMA AXI S2M configuration */
36549b49cdaSZbigniew Bodek int al_udma_s2m_axi_set(struct al_udma *udma,
36649b49cdaSZbigniew Bodek 			struct al_udma_s2m_axi_conf *axi_s2m);
36749b49cdaSZbigniew Bodek 
36849b49cdaSZbigniew Bodek /* Configure M2S packet len */
36949b49cdaSZbigniew Bodek int al_udma_m2s_packet_size_cfg_set(struct al_udma *udma,
37049b49cdaSZbigniew Bodek 				    struct al_udma_m2s_pkt_len_conf *conf);
37149b49cdaSZbigniew Bodek 
37249b49cdaSZbigniew Bodek /* Configure M2S UDMA descriptor prefetch */
37349b49cdaSZbigniew Bodek int al_udma_m2s_pref_set(struct al_udma *udma,
37449b49cdaSZbigniew Bodek 			 struct al_udma_m2s_desc_pref_conf *conf);
37549b49cdaSZbigniew Bodek int al_udma_m2s_pref_get(struct al_udma *udma,
37649b49cdaSZbigniew Bodek 			 struct al_udma_m2s_desc_pref_conf *conf);
37749b49cdaSZbigniew Bodek 
37849b49cdaSZbigniew Bodek /* set m2s packet's max descriptors (including meta descriptors) */
37949b49cdaSZbigniew Bodek #define AL_UDMA_M2S_MAX_ALLOWED_DESCS_PER_PACKET	31
38049b49cdaSZbigniew Bodek int al_udma_m2s_max_descs_set(struct al_udma *udma, uint8_t max_descs);
38149b49cdaSZbigniew Bodek 
38249b49cdaSZbigniew Bodek /* set s2m packets' max descriptors */
38349b49cdaSZbigniew Bodek #define AL_UDMA_S2M_MAX_ALLOWED_DESCS_PER_PACKET	31
38449b49cdaSZbigniew Bodek int al_udma_s2m_max_descs_set(struct al_udma *udma, uint8_t max_descs);
38549b49cdaSZbigniew Bodek 
38649b49cdaSZbigniew Bodek 
38749b49cdaSZbigniew Bodek /* Configure S2M UDMA descriptor prefetch */
38849b49cdaSZbigniew Bodek int al_udma_s2m_pref_set(struct al_udma *udma,
38949b49cdaSZbigniew Bodek 			 struct al_udma_s2m_desc_pref_conf *conf);
39049b49cdaSZbigniew Bodek int al_udma_m2s_pref_get(struct al_udma *udma,
39149b49cdaSZbigniew Bodek 			 struct al_udma_m2s_desc_pref_conf *conf);
39249b49cdaSZbigniew Bodek 
39349b49cdaSZbigniew Bodek /* Configure S2M UDMA data write */
39449b49cdaSZbigniew Bodek int al_udma_s2m_data_write_set(struct al_udma *udma,
39549b49cdaSZbigniew Bodek 			       struct al_udma_s2m_data_write_conf *conf);
39649b49cdaSZbigniew Bodek 
39749b49cdaSZbigniew Bodek /* Configure the s2m full line write feature */
39849b49cdaSZbigniew Bodek int al_udma_s2m_full_line_write_set(struct al_udma *umda, al_bool enable);
39949b49cdaSZbigniew Bodek 
40049b49cdaSZbigniew Bodek /* Configure S2M UDMA completion */
40149b49cdaSZbigniew Bodek int al_udma_s2m_completion_set(struct al_udma *udma,
40249b49cdaSZbigniew Bodek 			       struct al_udma_s2m_completion_conf *conf);
40349b49cdaSZbigniew Bodek 
40449b49cdaSZbigniew Bodek /* Configure the M2S UDMA scheduling mode */
40549b49cdaSZbigniew Bodek int al_udma_m2s_sc_set(struct al_udma *udma,
40649b49cdaSZbigniew Bodek 		       struct al_udma_m2s_dwrr_conf *sched);
40749b49cdaSZbigniew Bodek 
40849b49cdaSZbigniew Bodek /* Configure the M2S UDMA rate limitation */
40949b49cdaSZbigniew Bodek int al_udma_m2s_rlimit_set(struct al_udma *udma,
41049b49cdaSZbigniew Bodek 			   struct al_udma_m2s_rlimit_mode *mode);
41149b49cdaSZbigniew Bodek int al_udma_m2s_rlimit_reset(struct al_udma *udma);
41249b49cdaSZbigniew Bodek 
41349b49cdaSZbigniew Bodek /* Configure the M2S Stream rate limitation */
41449b49cdaSZbigniew Bodek int al_udma_m2s_strm_rlimit_set(struct al_udma *udma,
41549b49cdaSZbigniew Bodek 				struct al_udma_m2s_rlimit_cfg *conf);
41649b49cdaSZbigniew Bodek int al_udma_m2s_strm_rlimit_act(struct al_udma *udma,
41749b49cdaSZbigniew Bodek 				enum al_udma_m2s_rlimit_action act);
41849b49cdaSZbigniew Bodek 
41949b49cdaSZbigniew Bodek /* Configure the M2S UDMA Q rate limitation */
42049b49cdaSZbigniew Bodek int al_udma_m2s_q_rlimit_set(struct al_udma_q *udma_q,
42149b49cdaSZbigniew Bodek 			     struct al_udma_m2s_rlimit_cfg *conf);
42249b49cdaSZbigniew Bodek int al_udma_m2s_q_rlimit_act(struct al_udma_q *udma_q,
42349b49cdaSZbigniew Bodek 			     enum al_udma_m2s_rlimit_action act);
42449b49cdaSZbigniew Bodek 
42549b49cdaSZbigniew Bodek /* Configure the M2S UDMA Q scheduling mode */
42649b49cdaSZbigniew Bodek int al_udma_m2s_q_sc_set(struct al_udma_q *udma_q,
42749b49cdaSZbigniew Bodek 			 struct al_udma_m2s_q_dwrr_conf *conf);
42849b49cdaSZbigniew Bodek int al_udma_m2s_q_sc_pause(struct al_udma_q *udma_q, al_bool set);
42949b49cdaSZbigniew Bodek int al_udma_m2s_q_sc_reset(struct al_udma_q *udma_q);
43049b49cdaSZbigniew Bodek 
43149b49cdaSZbigniew Bodek /* M2S UDMA completion and application timeouts */
43249b49cdaSZbigniew Bodek int al_udma_m2s_comp_timeouts_set(struct al_udma *udma,
43349b49cdaSZbigniew Bodek 				  struct al_udma_m2s_comp_timeouts *conf);
43449b49cdaSZbigniew Bodek int al_udma_m2s_comp_timeouts_get(struct al_udma *udma,
43549b49cdaSZbigniew Bodek 				  struct al_udma_m2s_comp_timeouts *conf);
43649b49cdaSZbigniew Bodek 
43749b49cdaSZbigniew Bodek /* UDMA get revision */
al_udma_get_revision(struct unit_regs __iomem * unit_regs)43849b49cdaSZbigniew Bodek static INLINE unsigned int al_udma_get_revision(struct unit_regs __iomem *unit_regs)
43949b49cdaSZbigniew Bodek {
44049b49cdaSZbigniew Bodek 	return (al_reg_read32(&unit_regs->gen.dma_misc.revision)
44149b49cdaSZbigniew Bodek 			& UDMA_GEN_DMA_MISC_REVISION_PROGRAMMING_ID_MASK) >>
44249b49cdaSZbigniew Bodek 			UDMA_GEN_DMA_MISC_REVISION_PROGRAMMING_ID_SHIFT;
44349b49cdaSZbigniew Bodek }
44449b49cdaSZbigniew Bodek 
44549b49cdaSZbigniew Bodek /**
44649b49cdaSZbigniew Bodek  * S2M UDMA Configure the expected behavior of Rx/S2M UDMA when there are no Rx Descriptors.
44749b49cdaSZbigniew Bodek  *
44849b49cdaSZbigniew Bodek  * @param udma
44949b49cdaSZbigniew Bodek  * @param drop_packet when set to true, the UDMA will drop packet.
45049b49cdaSZbigniew Bodek  * @param gen_interrupt when set to true, the UDMA will generate
45149b49cdaSZbigniew Bodek  *        no_desc_hint interrupt when a packet received and the UDMA
45249b49cdaSZbigniew Bodek  *	  doesn't find enough free descriptors for it.
45349b49cdaSZbigniew Bodek  * @param wait_for_desc_timeout timeout in SB cycles to wait for new
45449b49cdaSZbigniew Bodek  *	  descriptors before dropping the packets.
45549b49cdaSZbigniew Bodek  *	  Notes:
45649b49cdaSZbigniew Bodek  *		- The hint interrupt is raised immediately without waiting
45749b49cdaSZbigniew Bodek  *		for new descs.
45849b49cdaSZbigniew Bodek  *		- value 0 means wait for ever.
45949b49cdaSZbigniew Bodek  *
46049b49cdaSZbigniew Bodek  * Notes:
46149b49cdaSZbigniew Bodek  * - When get_interrupt is set, the API won't program the iofic to unmask this
46249b49cdaSZbigniew Bodek  * interrupt, in this case the callee should take care for doing that unmask
46349b49cdaSZbigniew Bodek  * using the al_udma_iofic_config() API.
46449b49cdaSZbigniew Bodek  *
46549b49cdaSZbigniew Bodek  * - The hardware's default configuration is: no drop packet, generate hint
46649b49cdaSZbigniew Bodek  * interrupt.
46749b49cdaSZbigniew Bodek  * - This API must be called once and before enabling the UDMA
46849b49cdaSZbigniew Bodek  *
46949b49cdaSZbigniew Bodek  * @return 0 if no error found.
47049b49cdaSZbigniew Bodek  */
47149b49cdaSZbigniew Bodek int al_udma_s2m_no_desc_cfg_set(struct al_udma *udma, al_bool drop_packet, al_bool gen_interrupt, uint32_t wait_for_desc_timeout);
47249b49cdaSZbigniew Bodek 
47349b49cdaSZbigniew Bodek /**
47449b49cdaSZbigniew Bodek  * S2M UDMA configure a queue's completion update
47549b49cdaSZbigniew Bodek  *
47649b49cdaSZbigniew Bodek  * @param q_udma
47749b49cdaSZbigniew Bodek  * @param enable set to true to enable completion update
47849b49cdaSZbigniew Bodek  *
47949b49cdaSZbigniew Bodek  * completion update better be disabled for tx queues as those descriptors
48049b49cdaSZbigniew Bodek  * doesn't carry useful information, thus disabling it saves DMA accesses.
48149b49cdaSZbigniew Bodek  *
48249b49cdaSZbigniew Bodek  * @return 0 if no error found.
48349b49cdaSZbigniew Bodek  */
48449b49cdaSZbigniew Bodek int al_udma_s2m_q_compl_updade_config(struct al_udma_q *udma_q, al_bool enable);
48549b49cdaSZbigniew Bodek 
48649b49cdaSZbigniew Bodek /**
48749b49cdaSZbigniew Bodek  * S2M UDMA configure a queue's completion descriptors coalescing
48849b49cdaSZbigniew Bodek  *
48949b49cdaSZbigniew Bodek  * @param q_udma
49049b49cdaSZbigniew Bodek  * @param enable set to true to enable completion coalescing
49149b49cdaSZbigniew Bodek  * @param coal_timeout in South Bridge cycles.
49249b49cdaSZbigniew Bodek  *
49349b49cdaSZbigniew Bodek  * @return 0 if no error found.
49449b49cdaSZbigniew Bodek  */
49549b49cdaSZbigniew Bodek int al_udma_s2m_q_compl_coal_config(struct al_udma_q *udma_q, al_bool enable, uint32_t coal_timeout);
49649b49cdaSZbigniew Bodek 
49749b49cdaSZbigniew Bodek /**
49849b49cdaSZbigniew Bodek  * S2M UDMA configure completion descriptors write burst parameters
49949b49cdaSZbigniew Bodek  *
50049b49cdaSZbigniew Bodek  * @param udma
50149b49cdaSZbigniew Bodek  * @param burst_size completion descriptors write burst size in bytes.
50249b49cdaSZbigniew Bodek  *
50349b49cdaSZbigniew Bodek  * @return 0 if no error found.
50449b49cdaSZbigniew Bodek  */int al_udma_s2m_compl_desc_burst_config(struct al_udma *udma, uint16_t
50549b49cdaSZbigniew Bodek 		 burst_size);
50649b49cdaSZbigniew Bodek 
50749b49cdaSZbigniew Bodek /**
50849b49cdaSZbigniew Bodek  * S2M UDMA configure a queue's completion header split
50949b49cdaSZbigniew Bodek  *
51049b49cdaSZbigniew Bodek  * @param q_udma
51149b49cdaSZbigniew Bodek  * @param enable set to true to enable completion header split
51249b49cdaSZbigniew Bodek  * @param force_hdr_split the header split length will be taken from the queue configuration
51349b49cdaSZbigniew Bodek  * @param hdr_len header split length.
51449b49cdaSZbigniew Bodek  *
51549b49cdaSZbigniew Bodek  * @return 0 if no error found.
51649b49cdaSZbigniew Bodek  */
51749b49cdaSZbigniew Bodek int al_udma_s2m_q_compl_hdr_split_config(struct al_udma_q *udma_q,
51849b49cdaSZbigniew Bodek 					 al_bool enable,
51949b49cdaSZbigniew Bodek 					 al_bool force_hdr_split,
52049b49cdaSZbigniew Bodek 					 uint32_t hdr_len);
52149b49cdaSZbigniew Bodek 
52249b49cdaSZbigniew Bodek /* S2M UDMA per queue completion configuration */
52349b49cdaSZbigniew Bodek int al_udma_s2m_q_comp_set(struct al_udma_q *udma_q,
52449b49cdaSZbigniew Bodek 			   struct al_udma_s2m_q_comp_conf *conf);
52549b49cdaSZbigniew Bodek 
526*3fc36ee0SWojciech Macek /** UDMA Target-ID control configuration per queue */
527*3fc36ee0SWojciech Macek void al_udma_gen_tgtid_conf_queue_set(
528*3fc36ee0SWojciech Macek 	struct unit_regs		*unit_regs,
529*3fc36ee0SWojciech Macek 	struct al_udma_gen_tgtid_conf	*conf,
530*3fc36ee0SWojciech Macek 	uint32_t qid);
531*3fc36ee0SWojciech Macek 
532*3fc36ee0SWojciech Macek /** UDMA Target-ID control configuration */
533*3fc36ee0SWojciech Macek void al_udma_gen_tgtid_conf_set(
53449b49cdaSZbigniew Bodek 	struct unit_regs __iomem	*unit_regs,
535*3fc36ee0SWojciech Macek 	struct al_udma_gen_tgtid_conf	*conf);
53649b49cdaSZbigniew Bodek 
537*3fc36ee0SWojciech Macek /** UDMA Target-ID MSIX control configuration */
538*3fc36ee0SWojciech Macek void al_udma_gen_tgtid_msix_conf_set(
53949b49cdaSZbigniew Bodek 	struct unit_regs __iomem		*unit_regs,
540*3fc36ee0SWojciech Macek 	struct al_udma_gen_tgtid_msix_conf	*conf);
54149b49cdaSZbigniew Bodek 
54249b49cdaSZbigniew Bodek /* *INDENT-OFF* */
54349b49cdaSZbigniew Bodek #ifdef __cplusplus
54449b49cdaSZbigniew Bodek }
54549b49cdaSZbigniew Bodek #endif
54649b49cdaSZbigniew Bodek /* *INDENT-ON* */
54749b49cdaSZbigniew Bodek /** @} end of UDMA config group */
54849b49cdaSZbigniew Bodek #endif /* __AL_HAL_UDMA_CONFIG_H__ */
549