xref: /dpdk/drivers/raw/gdtc/gdtc_rawdev.h (revision a73d74c2e30e7111b71b863aadf0c351a0f7ec8c)
130495f54SYong Zhang /* SPDX-License-Identifier: BSD-3-Clause
230495f54SYong Zhang  * Copyright 2024 ZTE Corporation
330495f54SYong Zhang  */
430495f54SYong Zhang 
530495f54SYong Zhang #ifndef GDTC_RAWDEV_H
630495f54SYong Zhang #define GDTC_RAWDEV_H
730495f54SYong Zhang 
830495f54SYong Zhang #include <stdint.h>
930495f54SYong Zhang #include <rte_log.h>
1030495f54SYong Zhang #include <rte_common.h>
1130495f54SYong Zhang #include <generic/rte_spinlock.h>
1230495f54SYong Zhang 
1330495f54SYong Zhang extern int zxdh_gdma_rawdev_logtype;
1430495f54SYong Zhang #define RTE_LOGTYPE_ZXDH_GDMA                   zxdh_gdma_rawdev_logtype
1530495f54SYong Zhang 
1630495f54SYong Zhang #define ZXDH_PMD_LOG(level, ...) \
1730495f54SYong Zhang 	RTE_LOG_LINE_PREFIX(level, ZXDH_GDMA, \
1830495f54SYong Zhang 		"%s() line %u: ", __func__ RTE_LOG_COMMA __LINE__, __VA_ARGS__)
1930495f54SYong Zhang 
2030495f54SYong Zhang #define ZXDH_GDMA_VENDORID                      0x1cf2
2130495f54SYong Zhang #define ZXDH_GDMA_DEVICEID                      0x8044
2230495f54SYong Zhang 
2330495f54SYong Zhang #define ZXDH_GDMA_TOTAL_CHAN_NUM                58
2430495f54SYong Zhang #define ZXDH_GDMA_QUEUE_SIZE                    16384
2530495f54SYong Zhang #define ZXDH_GDMA_RING_SIZE                     32768
2630495f54SYong Zhang 
27*a73d74c2SYong Zhang /* States if the source addresses is physical. */
28*a73d74c2SYong Zhang #define ZXDH_GDMA_JOB_SRC_PHY                   (1UL)
29*a73d74c2SYong Zhang 
30*a73d74c2SYong Zhang /* States if the destination addresses is physical. */
31*a73d74c2SYong Zhang #define ZXDH_GDMA_JOB_DEST_PHY                  (1UL << 1)
32*a73d74c2SYong Zhang 
33*a73d74c2SYong Zhang /* ZF->HOST */
34*a73d74c2SYong Zhang #define ZXDH_GDMA_JOB_DIR_TX                    (1UL << 2)
35*a73d74c2SYong Zhang 
36*a73d74c2SYong Zhang /* HOST->ZF */
37*a73d74c2SYong Zhang #define ZXDH_GDMA_JOB_DIR_RX                    (1UL << 3)
38*a73d74c2SYong Zhang 
39*a73d74c2SYong Zhang #define ZXDH_GDMA_JOB_DIR_MASK                  (ZXDH_GDMA_JOB_DIR_TX | ZXDH_GDMA_JOB_DIR_RX)
40*a73d74c2SYong Zhang 
4130495f54SYong Zhang enum zxdh_gdma_device_state {
4230495f54SYong Zhang 	ZXDH_GDMA_DEV_RUNNING,
4330495f54SYong Zhang 	ZXDH_GDMA_DEV_STOPPED
4430495f54SYong Zhang };
4530495f54SYong Zhang 
4630495f54SYong Zhang struct zxdh_gdma_buff_desc {
4730495f54SYong Zhang 	uint32_t SrcAddr_L;
4830495f54SYong Zhang 	uint32_t DstAddr_L;
4930495f54SYong Zhang 	uint32_t Xpara;
5030495f54SYong Zhang 	uint32_t ZY_para;
5130495f54SYong Zhang 	uint32_t ZY_SrcStep;
5230495f54SYong Zhang 	uint32_t ZY_DstStep;
5330495f54SYong Zhang 	uint32_t ExtAddr;
5430495f54SYong Zhang 	uint32_t LLI_Addr_L;
5530495f54SYong Zhang 	uint32_t LLI_Addr_H;
5630495f54SYong Zhang 	uint32_t ChCont;
5730495f54SYong Zhang 	uint32_t LLI_User;
5830495f54SYong Zhang 	uint32_t ErrAddr;
5930495f54SYong Zhang 	uint32_t Control;
6030495f54SYong Zhang 	uint32_t SrcAddr_H;
6130495f54SYong Zhang 	uint32_t DstAddr_H;
6230495f54SYong Zhang 	uint32_t Reserved;
6330495f54SYong Zhang };
6430495f54SYong Zhang 
6530495f54SYong Zhang struct zxdh_gdma_job {
6630495f54SYong Zhang 	uint64_t src;
6730495f54SYong Zhang 	uint64_t dest;
6830495f54SYong Zhang 	uint32_t len;
6930495f54SYong Zhang 	uint32_t flags;
7030495f54SYong Zhang 	uint64_t cnxt;
7130495f54SYong Zhang 	uint16_t status;
7230495f54SYong Zhang 	uint16_t vq_id;
7330495f54SYong Zhang 	void *usr_elem;
7430495f54SYong Zhang 	uint8_t ep_id;
7530495f54SYong Zhang 	uint8_t pf_id;
7630495f54SYong Zhang 	uint16_t vf_id;
7730495f54SYong Zhang };
7830495f54SYong Zhang 
7930495f54SYong Zhang struct zxdh_gdma_queue {
8030495f54SYong Zhang 	uint8_t   enable;
8130495f54SYong Zhang 	uint8_t   is_txq;
8230495f54SYong Zhang 	uint16_t  vq_id;
8330495f54SYong Zhang 	uint16_t  queue_size;
8430495f54SYong Zhang 	/* 0:GDMA needs to be configured through the APB interface */
8530495f54SYong Zhang 	uint16_t  flag;
8630495f54SYong Zhang 	uint32_t  user;
8730495f54SYong Zhang 	uint16_t  tc_cnt;
8830495f54SYong Zhang 	rte_spinlock_t enqueue_lock;
8930495f54SYong Zhang 	struct {
9030495f54SYong Zhang 		uint16_t avail_idx;
9130495f54SYong Zhang 		uint16_t last_avail_idx;
9230495f54SYong Zhang 		rte_iova_t ring_mem;
9330495f54SYong Zhang 		const struct rte_memzone *ring_mz;
9430495f54SYong Zhang 		struct zxdh_gdma_buff_desc *desc;
9530495f54SYong Zhang 	} ring;
9630495f54SYong Zhang 	struct {
9730495f54SYong Zhang 		uint16_t  free_cnt;
9830495f54SYong Zhang 		uint16_t  deq_cnt;
9930495f54SYong Zhang 		uint16_t  pend_cnt;
10030495f54SYong Zhang 		uint16_t  enq_idx;
10130495f54SYong Zhang 		uint16_t  deq_idx;
10230495f54SYong Zhang 		uint16_t  used_idx;
10330495f54SYong Zhang 		struct zxdh_gdma_job **job;
10430495f54SYong Zhang 	} sw_ring;
10530495f54SYong Zhang };
10630495f54SYong Zhang 
10730495f54SYong Zhang struct zxdh_gdma_rawdev {
10830495f54SYong Zhang 	struct rte_device *device;
10930495f54SYong Zhang 	struct rte_rawdev *rawdev;
11030495f54SYong Zhang 	uintptr_t base_addr;
11130495f54SYong Zhang 	uint8_t queue_num; /* total queue num */
11230495f54SYong Zhang 	uint8_t used_num;  /* used  queue num */
11330495f54SYong Zhang 	enum zxdh_gdma_device_state device_state;
11430495f54SYong Zhang 	struct zxdh_gdma_queue vqs[ZXDH_GDMA_TOTAL_CHAN_NUM];
11530495f54SYong Zhang };
11630495f54SYong Zhang 
117*a73d74c2SYong Zhang struct zxdh_gdma_enqdeq {
118*a73d74c2SYong Zhang 	uint16_t vq_id;
119*a73d74c2SYong Zhang 	struct zxdh_gdma_job **job;
120*a73d74c2SYong Zhang };
121*a73d74c2SYong Zhang 
122648001aaSYong Zhang struct zxdh_gdma_config {
123648001aaSYong Zhang 	uint16_t max_hw_queues_per_core;
124648001aaSYong Zhang 	uint16_t max_vqs;
125648001aaSYong Zhang 	int queue_pool_cnt;
126648001aaSYong Zhang };
127648001aaSYong Zhang 
128d373c66eSYong Zhang struct zxdh_gdma_rbp {
129d373c66eSYong Zhang 	uint32_t use_ultrashort:1;
130d373c66eSYong Zhang 	uint32_t enable:1;
131d373c66eSYong Zhang 	uint32_t dportid:3;
132d373c66eSYong Zhang 	uint32_t dpfid:3;
133d373c66eSYong Zhang 	uint32_t dvfid:8; /* using route by port for destination */
134d373c66eSYong Zhang 	uint32_t drbp:1;
135d373c66eSYong Zhang 	uint32_t sportid:3;
136d373c66eSYong Zhang 	uint32_t spfid:3;
137d373c66eSYong Zhang 	uint32_t svfid:8;
138d373c66eSYong Zhang 	uint32_t srbp:1;
139d373c66eSYong Zhang };
140d373c66eSYong Zhang 
141d373c66eSYong Zhang struct zxdh_gdma_queue_config {
142d373c66eSYong Zhang 	uint32_t lcore_id;
143d373c66eSYong Zhang 	uint32_t flags;
144d373c66eSYong Zhang 	struct zxdh_gdma_rbp *rbp;
145d373c66eSYong Zhang };
146d373c66eSYong Zhang 
147648001aaSYong Zhang struct zxdh_gdma_attr {
148648001aaSYong Zhang 	uint16_t num_hw_queues;
149648001aaSYong Zhang };
150648001aaSYong Zhang 
15130495f54SYong Zhang #endif /* GDTC_RAWDEV_H */
152