net/thunderx: disable L3 alignment padding
[dpdk.git] / drivers / net / thunderx / base / nicvf_hw.h
1 /*
2  *   BSD LICENSE
3  *
4  *   Copyright (C) Cavium networks Ltd. 2016.
5  *
6  *   Redistribution and use in source and binary forms, with or without
7  *   modification, are permitted provided that the following conditions
8  *   are met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  *       notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above copyright
13  *       notice, this list of conditions and the following disclaimer in
14  *       the documentation and/or other materials provided with the
15  *       distribution.
16  *     * Neither the name of Cavium networks nor the names of its
17  *       contributors may be used to endorse or promote products derived
18  *       from this software without specific prior written permission.
19  *
20  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #ifndef _THUNDERX_NICVF_HW_H
34 #define _THUNDERX_NICVF_HW_H
35
36 #include <stdint.h>
37
38 #include "nicvf_hw_defs.h"
39
40 #define PCI_VENDOR_ID_CAVIUM                            0x177D
41 #define PCI_DEVICE_ID_THUNDERX_CN88XX_PASS1_NICVF       0x0011
42 #define PCI_DEVICE_ID_THUNDERX_NICVF                    0xA034
43 #define PCI_SUB_DEVICE_ID_CN88XX_PASS1_NICVF            0xA11E
44 #define PCI_SUB_DEVICE_ID_CN88XX_PASS2_NICVF            0xA134
45 #define PCI_SUB_DEVICE_ID_CN81XX_NICVF                  0xA234
46
47 #define NICVF_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
48
49 #define NICVF_GET_RX_STATS(reg) \
50         nicvf_reg_read(nic, NIC_VNIC_RX_STAT_0_13 | (reg << 3))
51 #define NICVF_GET_TX_STATS(reg) \
52         nicvf_reg_read(nic, NIC_VNIC_TX_STAT_0_4 | (reg << 3))
53
54 #define NICVF_CAP_TUNNEL_PARSING        (1ULL << 0)
55 /* Additional word in Rx descriptor to hold optional tunneling extension info */
56 #define NICVF_CAP_CQE_RX2               (1ULL << 1)
57 /* The device capable of setting NIC_CQE_RX_S[APAD] == 0 */
58 #define NICVF_CAP_DISABLE_APAD          (1ULL << 2)
59
60 enum nicvf_tns_mode {
61         NIC_TNS_BYPASS_MODE,
62         NIC_TNS_MODE,
63 };
64
65 enum nicvf_err_e {
66         NICVF_OK,
67         NICVF_ERR_SET_QS = -8191,/* -8191 */
68         NICVF_ERR_RESET_QS,      /* -8190 */
69         NICVF_ERR_REG_POLL,      /* -8189 */
70         NICVF_ERR_RBDR_RESET,    /* -8188 */
71         NICVF_ERR_RBDR_DISABLE,  /* -8187 */
72         NICVF_ERR_RBDR_PREFETCH, /* -8186 */
73         NICVF_ERR_RBDR_RESET1,   /* -8185 */
74         NICVF_ERR_RBDR_RESET2,   /* -8184 */
75         NICVF_ERR_RQ_CLAIM,      /* -8183 */
76         NICVF_ERR_RQ_PF_CFG,     /* -8182 */
77         NICVF_ERR_RQ_BP_CFG,     /* -8181 */
78         NICVF_ERR_RQ_DROP_CFG,   /* -8180 */
79         NICVF_ERR_CQ_DISABLE,    /* -8179 */
80         NICVF_ERR_CQ_RESET,      /* -8178 */
81         NICVF_ERR_SQ_DISABLE,    /* -8177 */
82         NICVF_ERR_SQ_RESET,      /* -8176 */
83         NICVF_ERR_SQ_PF_CFG,     /* -8175 */
84         NICVF_ERR_LOOPBACK_CFG,  /* -8174 */
85         NICVF_ERR_BASE_INIT,     /* -8173 */
86         NICVF_ERR_RSS_TBL_UPDATE,/* -8172 */
87         NICVF_ERR_RSS_GET_SZ,    /* -8171 */
88 };
89
90 typedef nicvf_phys_addr_t (*rbdr_pool_get_handler)(void *dev, void *opaque);
91
92 struct nicvf_hw_rx_qstats {
93         uint64_t q_rx_bytes;
94         uint64_t q_rx_packets;
95 };
96
97 struct nicvf_hw_tx_qstats {
98         uint64_t q_tx_bytes;
99         uint64_t q_tx_packets;
100 };
101
102 struct nicvf_hw_stats {
103         uint64_t rx_bytes;
104         uint64_t rx_ucast_frames;
105         uint64_t rx_bcast_frames;
106         uint64_t rx_mcast_frames;
107         uint64_t rx_fcs_errors;
108         uint64_t rx_l2_errors;
109         uint64_t rx_drop_red;
110         uint64_t rx_drop_red_bytes;
111         uint64_t rx_drop_overrun;
112         uint64_t rx_drop_overrun_bytes;
113         uint64_t rx_drop_bcast;
114         uint64_t rx_drop_mcast;
115         uint64_t rx_drop_l3_bcast;
116         uint64_t rx_drop_l3_mcast;
117
118         uint64_t tx_bytes_ok;
119         uint64_t tx_ucast_frames_ok;
120         uint64_t tx_bcast_frames_ok;
121         uint64_t tx_mcast_frames_ok;
122         uint64_t tx_drops;
123 };
124
125 struct nicvf_rss_reta_info {
126         uint8_t hash_bits;
127         uint16_t rss_size;
128         uint8_t ind_tbl[NIC_MAX_RSS_IDR_TBL_SIZE];
129 };
130
131 /* Common structs used in DPDK and base layer are defined in DPDK layer */
132 #include "../nicvf_struct.h"
133
134 NICVF_STATIC_ASSERT(sizeof(struct nicvf_rbdr) <= 128);
135 NICVF_STATIC_ASSERT(sizeof(struct nicvf_txq) <= 128);
136 NICVF_STATIC_ASSERT(sizeof(struct nicvf_rxq) <= 128);
137
138 static inline void
139 nicvf_reg_write(struct nicvf *nic, uint32_t offset, uint64_t val)
140 {
141         nicvf_addr_write(nic->reg_base + offset, val);
142 }
143
144 static inline uint64_t
145 nicvf_reg_read(struct nicvf *nic, uint32_t offset)
146 {
147         return nicvf_addr_read(nic->reg_base + offset);
148 }
149
150 static inline uintptr_t
151 nicvf_qset_base(struct nicvf *nic, uint32_t qidx)
152 {
153         return nic->reg_base + (qidx << NIC_Q_NUM_SHIFT);
154 }
155
156 static inline void
157 nicvf_queue_reg_write(struct nicvf *nic, uint32_t offset, uint32_t qidx,
158                       uint64_t val)
159 {
160         nicvf_addr_write(nicvf_qset_base(nic, qidx) + offset, val);
161 }
162
163 static inline uint64_t
164 nicvf_queue_reg_read(struct nicvf *nic, uint32_t offset, uint32_t qidx)
165 {
166         return  nicvf_addr_read(nicvf_qset_base(nic, qidx) + offset);
167 }
168
169 static inline void
170 nicvf_disable_all_interrupts(struct nicvf *nic)
171 {
172         nicvf_reg_write(nic, NIC_VF_ENA_W1C, NICVF_INTR_ALL_MASK);
173         nicvf_reg_write(nic, NIC_VF_INT, NICVF_INTR_ALL_MASK);
174 }
175
176 static inline uint32_t
177 nicvf_hw_version(struct nicvf *nic)
178 {
179         return nic->subsystem_device_id;
180 }
181
182 static inline uint64_t
183 nicvf_hw_cap(struct nicvf *nic)
184 {
185         return nic->hwcap;
186 }
187
188 int nicvf_base_init(struct nicvf *nic);
189
190 int nicvf_reg_get_count(void);
191 int nicvf_reg_poll_interrupts(struct nicvf *nic);
192 int nicvf_reg_dump(struct nicvf *nic, uint64_t *data);
193
194 int nicvf_qset_config(struct nicvf *nic);
195 int nicvf_qset_reclaim(struct nicvf *nic);
196
197 int nicvf_qset_rbdr_config(struct nicvf *nic, uint16_t qidx);
198 int nicvf_qset_rbdr_reclaim(struct nicvf *nic, uint16_t qidx);
199 int nicvf_qset_rbdr_precharge(void *dev, struct nicvf *nic,
200                               uint16_t ridx, rbdr_pool_get_handler handler,
201                               uint32_t max_buffs);
202 int nicvf_qset_rbdr_active(struct nicvf *nic, uint16_t qidx);
203
204 int nicvf_qset_rq_config(struct nicvf *nic, uint16_t qidx,
205                          struct nicvf_rxq *rxq);
206 int nicvf_qset_rq_reclaim(struct nicvf *nic, uint16_t qidx);
207
208 int nicvf_qset_cq_config(struct nicvf *nic, uint16_t qidx,
209                          struct nicvf_rxq *rxq);
210 int nicvf_qset_cq_reclaim(struct nicvf *nic, uint16_t qidx);
211
212 int nicvf_qset_sq_config(struct nicvf *nic, uint16_t qidx,
213                          struct nicvf_txq *txq);
214 int nicvf_qset_sq_reclaim(struct nicvf *nic, uint16_t qidx);
215
216 uint32_t nicvf_qsize_rbdr_roundup(uint32_t val);
217 uint32_t nicvf_qsize_cq_roundup(uint32_t val);
218 uint32_t nicvf_qsize_sq_roundup(uint32_t val);
219
220 void nicvf_vlan_hw_strip(struct nicvf *nic, bool enable);
221
222 void nicvf_apad_config(struct nicvf *nic, bool enable);
223
224 int nicvf_rss_config(struct nicvf *nic, uint32_t  qcnt, uint64_t cfg);
225 int nicvf_rss_term(struct nicvf *nic);
226
227 int nicvf_rss_reta_update(struct nicvf *nic, uint8_t *tbl, uint32_t max_count);
228 int nicvf_rss_reta_query(struct nicvf *nic, uint8_t *tbl, uint32_t max_count);
229
230 void nicvf_rss_set_key(struct nicvf *nic, uint8_t *key);
231 void nicvf_rss_get_key(struct nicvf *nic, uint8_t *key);
232
233 void nicvf_rss_set_cfg(struct nicvf *nic, uint64_t val);
234 uint64_t nicvf_rss_get_cfg(struct nicvf *nic);
235
236 int nicvf_loopback_config(struct nicvf *nic, bool enable);
237
238 void nicvf_hw_get_stats(struct nicvf *nic, struct nicvf_hw_stats *stats);
239 void nicvf_hw_get_rx_qstats(struct nicvf *nic,
240                             struct nicvf_hw_rx_qstats *qstats, uint16_t qidx);
241 void nicvf_hw_get_tx_qstats(struct nicvf *nic,
242                             struct nicvf_hw_tx_qstats *qstats, uint16_t qidx);
243
244 #endif /* _THUNDERX_NICVF_HW_H */