7be78d0279
The tool comes from https://github.com/jsoref Signed-off-by: Josh Soref <jsoref@gmail.com> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
157 lines
3.3 KiB
C
157 lines
3.3 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright 2018-2019 NXP
|
|
*/
|
|
|
|
#ifndef _PFE_HIF_H_
|
|
#define _PFE_HIF_H_
|
|
|
|
#define HIF_CLIENT_QUEUES_MAX 16
|
|
#define HIF_RX_PKT_MIN_SIZE RTE_CACHE_LINE_SIZE
|
|
/*
|
|
* HIF_TX_DESC_NT value should be always greater than 4,
|
|
* Otherwise HIF_TX_POLL_MARK will become zero.
|
|
*/
|
|
#define HIF_RX_DESC_NT 64
|
|
#define HIF_TX_DESC_NT 2048
|
|
|
|
#define HIF_FIRST_BUFFER BIT(0)
|
|
#define HIF_LAST_BUFFER BIT(1)
|
|
#define HIF_DONT_DMA_MAP BIT(2)
|
|
#define HIF_DATA_VALID BIT(3)
|
|
#define HIF_TSO BIT(4)
|
|
|
|
enum {
|
|
PFE_CL_GEM0 = 0,
|
|
PFE_CL_GEM1,
|
|
HIF_CLIENTS_MAX
|
|
};
|
|
|
|
/*structure to store client queue info */
|
|
struct hif_rx_queue {
|
|
struct rx_queue_desc *base;
|
|
u32 size;
|
|
u32 write_idx;
|
|
};
|
|
|
|
struct hif_tx_queue {
|
|
struct tx_queue_desc *base;
|
|
u32 size;
|
|
u32 ack_idx;
|
|
};
|
|
|
|
/*Structure to store the client info */
|
|
struct hif_client {
|
|
unsigned int rx_qn;
|
|
struct hif_rx_queue rx_q[HIF_CLIENT_QUEUES_MAX];
|
|
unsigned int tx_qn;
|
|
struct hif_tx_queue tx_q[HIF_CLIENT_QUEUES_MAX];
|
|
};
|
|
|
|
/*HIF hardware buffer descriptor */
|
|
struct hif_desc {
|
|
u32 ctrl;
|
|
u32 status;
|
|
u32 data;
|
|
u32 next;
|
|
};
|
|
|
|
struct __hif_desc {
|
|
u32 ctrl;
|
|
u32 status;
|
|
u32 data;
|
|
};
|
|
|
|
struct hif_desc_sw {
|
|
dma_addr_t data;
|
|
u16 len;
|
|
u8 client_id;
|
|
u8 q_no;
|
|
u16 flags;
|
|
};
|
|
|
|
struct hif_hdr {
|
|
u8 client_id;
|
|
u8 q_num;
|
|
u16 client_ctrl;
|
|
u16 client_ctrl1;
|
|
};
|
|
|
|
struct __hif_hdr {
|
|
union {
|
|
struct hif_hdr hdr;
|
|
u32 word[2];
|
|
};
|
|
};
|
|
|
|
struct hif_ipsec_hdr {
|
|
u16 sa_handle[2];
|
|
} __packed;
|
|
|
|
struct pfe_parse {
|
|
unsigned int packet_type;
|
|
uint16_t hash;
|
|
uint16_t parse_incomplete;
|
|
unsigned long long ol_flags;
|
|
};
|
|
|
|
/* HIF_CTRL_TX... defines */
|
|
#define HIF_CTRL_TX_CHECKSUM BIT(2)
|
|
|
|
/* HIF_CTRL_RX... defines */
|
|
#define HIF_CTRL_RX_OFFSET_OFST (24)
|
|
#define HIF_CTRL_RX_CHECKSUMMED BIT(2)
|
|
#define HIF_CTRL_RX_CONTINUED BIT(1)
|
|
|
|
struct pfe_hif {
|
|
/* To store registered clients in hif layer */
|
|
struct hif_client client[HIF_CLIENTS_MAX];
|
|
struct hif_shm *shm;
|
|
|
|
void *descr_baseaddr_v;
|
|
unsigned long descr_baseaddr_p;
|
|
|
|
struct hif_desc *rx_base;
|
|
u32 rx_ring_size;
|
|
u32 rxtoclean_index;
|
|
void *rx_buf_addr[HIF_RX_DESC_NT];
|
|
void *rx_buf_vaddr[HIF_RX_DESC_NT];
|
|
int rx_buf_len[HIF_RX_DESC_NT];
|
|
unsigned int qno;
|
|
unsigned int client_id;
|
|
unsigned int client_ctrl;
|
|
unsigned int started;
|
|
unsigned int setuped;
|
|
|
|
struct hif_desc *tx_base;
|
|
u32 tx_ring_size;
|
|
u32 txtosend;
|
|
u32 txtoclean;
|
|
u32 txavail;
|
|
u32 txtoflush;
|
|
struct hif_desc_sw tx_sw_queue[HIF_TX_DESC_NT];
|
|
int32_t epoll_fd; /**< File descriptor created for interrupt polling */
|
|
|
|
/* tx_lock synchronizes hif packet tx as well as pfe_hif structure access */
|
|
rte_spinlock_t tx_lock;
|
|
/* lock synchronizes hif rx queue processing */
|
|
rte_spinlock_t lock;
|
|
struct rte_device *dev;
|
|
};
|
|
|
|
void hif_xmit_pkt(struct pfe_hif *hif, unsigned int client_id, unsigned int
|
|
q_no, void *data, u32 len, unsigned int flags);
|
|
void hif_process_client_req(struct pfe_hif *hif, int req, int data1, int
|
|
data2);
|
|
int pfe_hif_init(struct pfe *pfe);
|
|
void pfe_hif_exit(struct pfe *pfe);
|
|
void pfe_hif_rx_idle(struct pfe_hif *hif);
|
|
int pfe_hif_rx_process(struct pfe *pfe, int budget);
|
|
int pfe_hif_init_buffers(struct pfe_hif *hif);
|
|
void pfe_tx_do_cleanup(struct pfe *pfe);
|
|
|
|
#define __memcpy8(dst, src) memcpy(dst, src, 8)
|
|
#define __memcpy12(dst, src) memcpy(dst, src, 12)
|
|
#define __memcpy(dst, src, len) memcpy(dst, src, len)
|
|
|
|
#endif /* _PFE_HIF_H_ */
|