1 #ifndef _LM_VF_COMMON_H
2 #define _LM_VF_COMMON_H
3 
4 #include "lm_defs.h"
5 #define ELEM_OF_RES_ARRAY_SIZE_IN_BYTES     (sizeof(u32_t))
6 #define ELEM_OF_RES_ARRAY_SIZE_IN_BITS      (ELEM_OF_RES_ARRAY_SIZE_IN_BYTES*8)
7 
8 /* VF functions*/
9 
10 /* Description:
11 */
12 u8_t lm_vf_is_function_after_flr(struct _lm_device_t * pdev);
13 
14 lm_status_t lm_vf_setup_alloc_resc(struct _lm_device_t *pdev, u8_t b_is_alloc);
15 
16 lm_status_t lm_vf_allocate_resc_in_pf(struct _lm_device_t *pdev);
17 
18 lm_status_t
19 lm_vf_init_dev_info(struct _lm_device_t *pdev);
20 
21 lm_status_t
22 lm_vf_chip_init(struct _lm_device_t *pdev);
23 
24 lm_status_t
25 lm_vf_chip_reset(struct _lm_device_t *pdev, lm_reason_t reason);
26 
27 lm_status_t
28 lm_vf_recycle_resc_in_pf(struct _lm_device_t *pdev);
29 
30 lm_status_t
31 lm_vf_get_intr_blk_info(struct _lm_device_t *pdev);
32 
33 lm_status_t
34 lm_vf_get_bar_offset(struct _lm_device_t *pdev, u8_t bar_num, lm_address_t * bar_addr);
35 
36 lm_status_t
37 lm_vf_get_vf_id(struct _lm_device_t * pdev);
38 
39 lm_status_t
40 lm_vf_en(struct _lm_device_t * pf_dev, u16_t vf_num);
41 
42 lm_status_t
43 lm_vf_dis(struct _lm_device_t * pf_dev);
44 
45 lm_status_t
46 lm_vf_prep(struct _lm_device_t * pf_dev, struct _lm_device_t * vf_dev);
47 
48 
49 lm_status_t
50 lm_vf_get_pcicfg_info(struct _lm_device_t * pdev);
51 
52 lm_status_t
53 lm_vf_enable_vf(struct _lm_device_t *pdev);
54 
55 lm_status_t
56 lm_vf_enable_igu_int(struct _lm_device_t * pdev);
57 
58 lm_status_t
59 lm_vf_disable_igu_int(struct _lm_device_t * pdev);
60 
61 void lm_pf_fl_vf_reset_set_inprogress(struct _lm_device_t * pdev, u8_t abs_vf_id);
62 void lm_pf_fl_vf_reset_clear_inprogress(struct _lm_device_t *pdev, u8_t abs_vf_id);
63 u8_t lm_pf_fl_vf_reset_is_inprogress(struct _lm_device_t *pdev, u8_t abs_vf_id);
64 
65 /*=================================CHANNEL_VF===========================================*/
66 #define LM_FW_VF_SB_ID(_vf_info, _sb_id) ((_vf_info)->vf_chains[(_sb_id)].fw_ndsb)
67 #define LM_SW_VF_SB_ID(_vf_info, _sb_id) ((_vf_info)->vf_chains[(_sb_id)].sw_ndsb)
68 
69 #define LM_FW_VF_QZONE_ID(_vf_info, _q_zone_id) ((_vf_info)->vf_chains[(_q_zone_id)].fw_qzone_id)
70 #define LM_FW_VF_DHC_QZONE_ID(_vf_info, _q_zone_id)  ((_vf_info)->vf_chains[(_q_zone_id)].fw_qzone_id)
71 
72 #define LM_VF_IGU_SB_ID(_vf_info, _igu_sb_id) ((_vf_info)->vf_chains[(_igu_sb_id)].igu_sb_id)
73 
74 #define LM_FW_VF_STATS_CNT_ID(_vf_info) ((_vf_info)->base_fw_stats_id)
75 
76 #define LM_FW_VF_CLI_ID(_vf_info, _q_id)  ((_vf_info)->vf_chains[(_q_id)].fw_client_id)
77 #define LM_SW_VF_CLI_ID(_vf_info, _q_id)  ((_vf_info)->vf_chains[(_q_id)].sw_client_id)
78 
79 #define LM_VF_Q_ID_TO_PF_CID(_pdev,_vf_info, _q_id) ((((1 << LM_VF_MAX_RVFID_SIZE) | (_vf_info)->abs_vf_id) <<  LM_VF_CID_WND_SIZE(_pdev)) | (_q_id))
80 
81 typedef struct _lm_pf_vf_response_t
82 {
83     u32_t           state;
84 #define PF_VF_RESPONSE_FLAG_OFFSET     16
85     u16_t           recent_opcode;
86     u16_t           req_resp_state;
87 #define VF_PF_UNKNOWN_STATE                     0
88 #define VF_PF_WAIT_FOR_START_REQUEST            1
89 #define VF_PF_WAIT_FOR_NEXT_CHUNK_OF_REQUEST    2
90 #define VF_PF_REQUEST_IN_PROCESSING             3
91 #define VF_PF_RESPONSE_READY                    4
92 
93     u32_t           request_size;
94     u32_t           request_offset;
95     void *          request_virt_addr;
96     lm_address_t    request_phys_addr;
97     u32_t           response_size;
98     u32_t           response_offset;
99     void *          response_virt_addr;
100     lm_address_t    response_phys_addr;
101     lm_address_t    vf_pf_message_addr;
102 }
103     lm_pf_vf_response_t;
104 
105 typedef struct _lm_vf_location_t
106 {
107     u16_t   pci_segment_num;
108     u8_t    pci_bus_num;
109     u8_t    pci_device_num;
110     u8_t    pci_function_num;
111     u8_t    pad[3];
112 }
113     lm_vf_location_t;
114 
115 typedef struct _lm_vf_stats_t
116 {
117     struct per_queue_stats *pf_fw_stats_virt_data;
118     lm_address_t	        pf_fw_stats_phys_data;
119     lm_address_t	        vf_fw_stats_phys_data;
120     void   *mirror_stats_fw;
121 
122     u32_t                   vf_stats_state;
123 #define VF_STATS_NONE               0
124 #define VF_STATS_REQ_SUBMITTED      1
125 #define VF_STATS_REQ_IN_PROCESSING  2
126 #define VF_STATS_REQ_READY          3
127 
128     u8_t                    vf_stats_flag;
129 #define VF_STATS_COLLECT_FW_STATS_FOR_PF   0x01
130 #define VF_STATS_COLLECT_FW_STATS_FOR_VF   0x02
131 
132     u8_t                    stop_collect_stats;
133     u8_t                    do_not_collect_pf_stats;
134     u8_t                    pad;
135     u32_t                   vf_stats_cnt;
136     u32_t                   vf_exracted_stats_cnt;
137 }
138     lm_vf_stats_t;
139 
140 
141 typedef struct _lm_vf_slowpath_data_t
142 {
143     struct eth_rss_update_ramrod_data * rss_rdata;
144     lm_address_t rss_rdata_phys;
145 }
146 lm_vf_slowpath_data_t ;
147 
148 typedef struct _lm_vf_slowpath_info_t {
149     lm_vf_slowpath_data_t slowpath_data;
150 
151     #define LM_VF_SLOWPATH(vf_info, var)		(vf_info->vf_slowpath_info.slowpath_data.var)
152     #define LM_VF_SLOWPATH_PHYS(vf_info, var) (vf_info->vf_slowpath_info.slowpath_data.var##_phys)
153 
154     struct ecore_rss_config_obj rss_conf_obj;
155     volatile u32_t  sp_rss_state;
156     struct ecore_config_rss_params rss_params;
157 } lm_vf_slowpath_info_t;
158 
159 
160 typedef struct _lm_vf_chain_info_t
161 {
162     u8_t    sw_client_id;
163     u8_t    fw_client_id;
164     u8_t    fw_qzone_id;
165     u8_t    sw_ndsb;
166     u8_t    fw_ndsb;
167     u8_t    igu_sb_id;
168     u16_t   mtu;
169     u64     sge_addr;
170     struct tpa_update_ramrod_data*
171             tpa_ramrod_data_virt;
172     lm_address_t
173             tpa_ramrod_data_phys;
174 }
175     lm_vf_chain_info_t;
176 
177 typedef struct _lm_vf_tpa_info_t
178 {
179     volatile u32_t  ramrod_recv_cnt;    // Number of ramrods received.Decrement by using Interlockeddecrement.
180     u8_t            ipvx_enabled_required;
181     u8_t            ipvx_enabled_current;
182 }
183     lm_vf_tpa_info_t ;
184 
185 typedef struct _lm_vf_info_t
186 {
187     u8_t    relative_vf_id;
188     u8_t    abs_vf_id;
189     u8_t    vport_state;
190 #define VF_VPORT_STATE_DELETED              0
191 #define VF_VPORT_STATE_CREATED              1
192 #define VF_VPORT_STATE_RESET                2
193 #define VF_VPORT_STATE_REJECTED             3
194 
195     u8_t    vf_si_state;
196 #define PF_SI_WAIT_FOR_ACQUIRING_REQUEST    0
197 #define PF_SI_ACQUIRED                      1
198 #define PF_SI_VF_INITIALIZED                2
199 
200     u8_t    base_fw_stats_id;
201     u8_t    vport_instance;
202     u8_t    num_rxqs;
203     u8_t    num_txqs;
204 
205     u8_t    num_vport_chains_requested;     /* Requested via Hyper-V manager, VMNetworkAdapter setting*/
206     u8_t    num_vf_chains_requested;        /* Requested via VF/PF channel, VF acquiring */
207     u8_t    num_igu_sb_available;
208     u8_t    num_allocated_chains;
209 
210     u8_t    num_sbs;
211 
212     u8_t    num_mac_filters;
213     u8_t    num_vlan_filters;
214     u8_t    num_mc_filters;
215 
216     u8_t    is_mac_set;
217     u8_t    was_flred;
218     u8_t    was_malicious;
219 
220     u8_t    is_promiscuous_mode_restricted;
221 
222     u16_t    current_interrupr_moderation;
223 #define VPORT_INT_MOD_UNDEFINED     0
224 #define VPORT_INT_MOD_ADAPTIVE      1
225 #define VPORT_INT_MOD_OFF           2
226 #define VPORT_INT_MOD_LOW           100
227 #define VPORT_INT_MOD_MEDIUM        200
228 #define VPORT_INT_MOD_HIGH          300
229 
230     u8_t    malicious_cnt;
231     u8_t    fp_hsi_ver;
232 
233     u32_t   vf_si_num_of_active_q;
234     u32_t   base_cam_offset;
235 
236     lm_vf_chain_info_t      vf_chains[16];
237     lm_vf_location_t        vf_location;
238     lm_pf_vf_response_t     pf_vf_response;
239     lm_vf_stats_t           vf_stats;
240     lm_vf_slowpath_info_t   vf_slowpath_info;
241     lm_vf_tpa_info_t        vf_tpa_info;
242     void *  um_ctx;
243 }
244     lm_vf_info_t;
245 
246 typedef struct _lm_vfs_set_t
247 {
248     lm_vf_info_t  * vfs_array;
249     u16_t           number_of_enabled_vfs;
250     u8_t            vf_sb_cnt;
251     u8_t            pad;
252 
253     void *          req_resp_virt_addr;
254     lm_address_t    req_resp_phys_addr;
255     u32_t           req_resp_size;
256 
257     void *          pf_fw_stats_set_virt_data;
258     lm_address_t	pf_fw_stats_set_phys_data;
259     u32_t			pf_fw_stats_set_data_sz;
260 
261     u8_t *          mirror_stats_fw_set;
262 
263     void *          rss_update_virt_addr;
264     lm_address_t    rss_update_phys_addr;
265     u32_t           rss_update_size;
266 }
267     lm_vfs_set_t;
268 
269 u16_t lm_vf_pf_get_sb_running_index(struct _lm_device_t *pdev, u8_t sb_id, u8_t sm_idx);
270 u16_t lm_vf_pf_get_sb_index(struct _lm_device_t *pdev, u8_t sb_id, u8_t idx);
271 u16_t lm_vf_get_doorbell_size(struct _lm_device_t *pdev);
272 
273 #define RX_Q_VALIDATE   0x01
274 #define TX_Q_VALIDATE   0x02
275 
276 typedef enum {
277     Q_FILTER_MAC,
278     Q_FILTER_VLAN,
279     Q_FILTER_MC,
280     Q_FILTER_RX_MASK
281 } q_filter_type;
282 
283 typedef enum {
284     PFVF_BB_CHANNEL_IS_NOT_ACTIVE,
285     PFVF_BB_CHANNEL_CRC_ERR,
286     PFVF_BB_NO_UPDATE,
287     PFVF_BB_VALID_MAC,
288 } pfvf_bb_event_type;
289 
290 
291 u8_t lm_vf_is_lamac_restricted(struct _lm_device_t *pdev);
292 lm_status_t lm_pf_process_standard_request(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
293 lm_status_t lm_pf_notify_standard_request_ready(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t * set_done);
294 
295 lm_status_t lm_vf_pf_acquire_msg(struct _lm_device_t * pdev);
296 lm_status_t lm_vf_pf_init_vf(struct _lm_device_t * pdev);
297 lm_status_t lm_vf_pf_setup_q(struct _lm_device_t * pdev, u8 vf_qid, u8_t validation_flag);
298 lm_status_t lm_vf_pf_tear_q_down(struct _lm_device_t * pdev, u8 vf_qid);
299 lm_status_t lm_vf_pf_set_q_filters(struct _lm_device_t * pdev, u8 vf_qid, void * cookie,
300                                    q_filter_type filter_type, u8_t * pbuf, u32_t buf_len,
301                                    u16_t vlan_tag, u8_t set_mac);
302 lm_status_t lm_vf_pf_set_q_filters_list(struct _lm_device_t * pdev, u8 vf_qid, void * cookie,
303                                         q_filter_type filter_type, d_list_t * pbuf,
304                                         u16_t vlan_tag, u8_t set_mac);
305 lm_status_t lm_vf_pf_close_vf(struct _lm_device_t * pdev);
306 lm_status_t lm_vf_pf_release_vf(struct _lm_device_t * pdev);
307 lm_status_t lm_vf_pf_update_rss(struct _lm_device_t *pdev, void * cookie, u32_t rss_flags, u8_t rss_result_mask, u8_t * ind_table, u32_t * rss_key);
308 lm_status_t lm_vf_pf_update_rsc(struct _lm_device_t *pdev);
309 
310 lm_status_t lm_vf_pf_wait_no_messages_pending(struct _lm_device_t * pdev);
311 
312 lm_status_t lm_vf_queue_init(struct _lm_device_t *pdev, u8_t cid);
313 lm_status_t lm_vf_queue_close(struct _lm_device_t *pdev, u8_t cid);
314 pfvf_bb_event_type lm_vf_check_hw_back_channel(struct _lm_device_t * pdev);
315 
316 void lm_pf_init_vf_client(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t q_id);
317 void lm_pf_init_vf_slow_path(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
318 
319 lm_status_t lm_pf_init_vf_client_init_data(struct _lm_device_t *pf_dev, lm_vf_info_t *vf_info, u8_t q_id,
320                                            struct sw_vf_pf_rxq_params * rxq_params,
321                                            struct sw_vf_pf_txq_params * txq_params);
322 lm_status_t lm_pf_init_vf_non_def_sb(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t sb_idx, u64 sb_addr);
323 lm_status_t lm_pf_enable_vf_igu_int(struct _lm_device_t * pdev, u8_t abs_vf_id);
324 
325 lm_status_t lm_pf_disable_vf_igu_int(struct _lm_device_t * pdev,  u8_t abs_vf_id);
326 
327 lm_status_t lm_pf_enable_vf(struct _lm_device_t *pdev,   u8_t abs_vf_id);
328 lm_status_t lm_pf_vf_wait_for_stats_ready(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
329 //struct _lm_vf_pf_message_t * lm_vf_pf_channel_get_message_to_send(struct _lm_device_t * pdev, u8  opcode);
330 //lm_status_t lm_vf_pf_channel_send(struct _lm_device_t * pdev, struct _lm_vf_pf_message_t * mess);
331 //lm_status_t lm_vf_pf_channel_wait_response(struct _lm_device_t * pdev, struct _lm_vf_pf_message_t * mess);
332 
333 /*
334 static __inline void * lm_vf_pf_channel_get_message(struct _lm_device_t * pdev)
335 {
336     return pdev->vars.vf_pf_mess.message_virt_addr;
337 }
338 */
339 
340 u8_t lm_vf_get_free_resource(u32_t * resource, u8_t min_num, u8_t max_num, u8_t num);
341 void lm_vf_acquire_resource(u32_t * presource, u8_t base_value, u8_t num);
342 u8_t lm_vf_get_resource_value(u32_t * presource, u8_t base_value);
343 void lm_vf_release_resource(u32_t * presource, u8_t base_value, u8_t num);
344 lm_status_t lm_wait_vf_config_rss_done(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
345 
346 
347 lm_status_t lm_pf_create_vf(struct _lm_device_t *pdev, u16_t rel_vf_id, void* ctx);
348 lm_status_t lm_pf_remove_vf(struct _lm_device_t *pdev, u16_t rel_vf_id);
349 lm_status_t lm_pf_cleanup_vf_after_flr(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
350 lm_status_t lm_pf_finally_release_vf(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
351 lm_status_t lm_pf_tpa_send_vf_ramrod(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u32_t q_idx, u8_t update_ipv4, u8_t update_ipv6);
352 
353 u8_t lm_is_vf_rsc_supported(struct _lm_device_t *pdev);
354 
355 void lm_pf_init_vf_filters(struct _lm_device_t *pdev, lm_vf_info_t *vf_info);
356 void lm_pf_allow_vf_promiscuous_mode(lm_vf_info_t *vf_info, u8_t is_allowed);
357 void lm_pf_int_vf_igu_sb_cleanup(struct _lm_device_t *pdev, lm_vf_info_t *vf_info, u8_t vf_chain_id);
358 #endif
359 /* */
360