1
2
3
4
5#ifndef _PFE_HIF_H_
6#define _PFE_HIF_H_
7
8#define HIF_CLIENT_QUEUES_MAX 16
9#define HIF_RX_PKT_MIN_SIZE RTE_CACHE_LINE_SIZE
10
11
12
13
14#define HIF_RX_DESC_NT 64
15#define HIF_TX_DESC_NT 2048
16
17#define HIF_FIRST_BUFFER BIT(0)
18#define HIF_LAST_BUFFER BIT(1)
19#define HIF_DONT_DMA_MAP BIT(2)
20#define HIF_DATA_VALID BIT(3)
21#define HIF_TSO BIT(4)
22
23enum {
24 PFE_CL_GEM0 = 0,
25 PFE_CL_GEM1,
26 HIF_CLIENTS_MAX
27};
28
29
30struct hif_rx_queue {
31 struct rx_queue_desc *base;
32 u32 size;
33 u32 write_idx;
34};
35
36struct hif_tx_queue {
37 struct tx_queue_desc *base;
38 u32 size;
39 u32 ack_idx;
40};
41
42
43struct hif_client {
44 unsigned int rx_qn;
45 struct hif_rx_queue rx_q[HIF_CLIENT_QUEUES_MAX];
46 unsigned int tx_qn;
47 struct hif_tx_queue tx_q[HIF_CLIENT_QUEUES_MAX];
48};
49
50
51struct hif_desc {
52 u32 ctrl;
53 u32 status;
54 u32 data;
55 u32 next;
56};
57
58struct __hif_desc {
59 u32 ctrl;
60 u32 status;
61 u32 data;
62};
63
64struct hif_desc_sw {
65 dma_addr_t data;
66 u16 len;
67 u8 client_id;
68 u8 q_no;
69 u16 flags;
70};
71
72struct hif_hdr {
73 u8 client_id;
74 u8 q_num;
75 u16 client_ctrl;
76 u16 client_ctrl1;
77};
78
79struct __hif_hdr {
80 union {
81 struct hif_hdr hdr;
82 u32 word[2];
83 };
84};
85
86struct hif_ipsec_hdr {
87 u16 sa_handle[2];
88} __packed;
89
90struct pfe_parse {
91 unsigned int packet_type;
92 uint16_t hash;
93 uint16_t parse_incomplete;
94 unsigned long long ol_flags;
95};
96
97
98#define HIF_CTRL_TX_CHECKSUM BIT(2)
99
100
101#define HIF_CTRL_RX_OFFSET_OFST (24)
102#define HIF_CTRL_RX_CHECKSUMMED BIT(2)
103#define HIF_CTRL_RX_CONTINUED BIT(1)
104
105struct pfe_hif {
106
107 struct hif_client client[HIF_CLIENTS_MAX];
108 struct hif_shm *shm;
109
110 void *descr_baseaddr_v;
111 unsigned long descr_baseaddr_p;
112
113 struct hif_desc *rx_base;
114 u32 rx_ring_size;
115 u32 rxtoclean_index;
116 void *rx_buf_addr[HIF_RX_DESC_NT];
117 void *rx_buf_vaddr[HIF_RX_DESC_NT];
118 int rx_buf_len[HIF_RX_DESC_NT];
119 unsigned int qno;
120 unsigned int client_id;
121 unsigned int client_ctrl;
122 unsigned int started;
123 unsigned int setuped;
124
125 struct hif_desc *tx_base;
126 u32 tx_ring_size;
127 u32 txtosend;
128 u32 txtoclean;
129 u32 txavail;
130 u32 txtoflush;
131 struct hif_desc_sw tx_sw_queue[HIF_TX_DESC_NT];
132 int32_t epoll_fd;
133
134
135 rte_spinlock_t tx_lock;
136
137 rte_spinlock_t lock;
138 struct rte_device *dev;
139};
140
141void hif_xmit_pkt(struct pfe_hif *hif, unsigned int client_id, unsigned int
142 q_no, void *data, u32 len, unsigned int flags);
143void hif_process_client_req(struct pfe_hif *hif, int req, int data1, int
144 data2);
145int pfe_hif_init(struct pfe *pfe);
146void pfe_hif_exit(struct pfe *pfe);
147void pfe_hif_rx_idle(struct pfe_hif *hif);
148int pfe_hif_rx_process(struct pfe *pfe, int budget);
149int pfe_hif_init_buffers(struct pfe_hif *hif);
150void pfe_tx_do_cleanup(struct pfe *pfe);
151
152#define __memcpy8(dst, src) memcpy(dst, src, 8)
153#define __memcpy12(dst, src) memcpy(dst, src, 12)
154#define __memcpy(dst, src, len) memcpy(dst, src, len)
155
156#endif
157