1*d14abf15SRobert Mustacchi #ifdef VF_INVOLVED
2*d14abf15SRobert Mustacchi 
3*d14abf15SRobert Mustacchi #include "lm5710.h"
4*d14abf15SRobert Mustacchi #include "command.h"
5*d14abf15SRobert Mustacchi #include "igu_def.h"
6*d14abf15SRobert Mustacchi 
7*d14abf15SRobert Mustacchi 
lm_vf_is_function_after_flr(struct _lm_device_t * pdev)8*d14abf15SRobert Mustacchi u8_t lm_vf_is_function_after_flr(struct _lm_device_t * pdev)
9*d14abf15SRobert Mustacchi {
10*d14abf15SRobert Mustacchi     u8_t res = 0;
11*d14abf15SRobert Mustacchi     res = (PFDEV(pdev)->vars.connections[VF_TO_PF_CID(pdev,LM_SW_LEADING_RSS_CID(pdev))].con_state != LM_CON_STATE_CLOSE);
12*d14abf15SRobert Mustacchi     if (res) {
13*d14abf15SRobert Mustacchi         DbgMessage2(pdev, FATAL, "VF[%d(%d)] was FLRed\n", ABS_VFID(pdev), REL_VFID(pdev));
14*d14abf15SRobert Mustacchi     }
15*d14abf15SRobert Mustacchi     return res;
16*d14abf15SRobert Mustacchi }
17*d14abf15SRobert Mustacchi 
18*d14abf15SRobert Mustacchi 
lm_vf_get_free_sbs(struct _lm_device_t * pf_dev,u8_t num_rss)19*d14abf15SRobert Mustacchi static u8_t lm_vf_get_free_sbs(struct _lm_device_t * pf_dev, u8_t num_rss)
20*d14abf15SRobert Mustacchi {
21*d14abf15SRobert Mustacchi     u8_t free_sb = 0xff;
22*d14abf15SRobert Mustacchi     u8_t max_num = pf_dev->params.base_fw_ndsb + MAX_RSS_CHAINS / pf_dev->params.vnics_per_port;
23*d14abf15SRobert Mustacchi     free_sb = lm_vf_get_free_resource(pf_dev->pf_resources.free_sbs, pf_dev->params.base_fw_ndsb, max_num, num_rss);
24*d14abf15SRobert Mustacchi     if (free_sb != 0xff) {
25*d14abf15SRobert Mustacchi         DbgMessage3(pf_dev,FATAL,"lm_vf_get_free_sbs(%d-%d): %d\n",pf_dev->params.base_fw_ndsb, max_num, free_sb);
26*d14abf15SRobert Mustacchi     } else {
27*d14abf15SRobert Mustacchi         DbgMessage2(pf_dev,FATAL,"lm_vf_get_free_sbs(%d-%d): No more free SBs\n",pf_dev->params.base_fw_ndsb, max_num);
28*d14abf15SRobert Mustacchi     }
29*d14abf15SRobert Mustacchi     return free_sb;
30*d14abf15SRobert Mustacchi }
31*d14abf15SRobert Mustacchi 
lm_vf_get_free_clients(struct _lm_device_t * pf_dev,u8_t num_rss)32*d14abf15SRobert Mustacchi static u8_t lm_vf_get_free_clients(struct _lm_device_t * pf_dev, u8_t num_rss)
33*d14abf15SRobert Mustacchi {
34*d14abf15SRobert Mustacchi     u8_t free_cli = 0xff;
35*d14abf15SRobert Mustacchi     u8_t max_num = pf_dev->params.base_fw_client_id + MAX_RSS_CHAINS / pf_dev->params.vnics_per_port;
36*d14abf15SRobert Mustacchi     free_cli = lm_vf_get_free_resource(pf_dev->pf_resources.free_clients, pf_dev->params.base_fw_client_id, max_num, num_rss);
37*d14abf15SRobert Mustacchi     if (free_cli != 0xff) {
38*d14abf15SRobert Mustacchi         DbgMessage3(pf_dev,FATAL,"lm_vf_get_free_clients(%d-%d): %d\n",pf_dev->params.base_fw_client_id, max_num, free_cli);
39*d14abf15SRobert Mustacchi     } else {
40*d14abf15SRobert Mustacchi         DbgMessage2(pf_dev,FATAL,"lm_vf_get_free_clients(%d-%d): No more free clients\n",pf_dev->params.base_fw_client_id, max_num);
41*d14abf15SRobert Mustacchi     }
42*d14abf15SRobert Mustacchi     return free_cli;
43*d14abf15SRobert Mustacchi }
44*d14abf15SRobert Mustacchi 
lm_vf_get_free_stats(struct _lm_device_t * pf_dev)45*d14abf15SRobert Mustacchi static u8_t lm_vf_get_free_stats(struct _lm_device_t * pf_dev)
46*d14abf15SRobert Mustacchi {
47*d14abf15SRobert Mustacchi     u8_t free_st_id = 0xff;
48*d14abf15SRobert Mustacchi     u8_t min_num = pf_dev->params.vnics_per_port + VNIC_ID(pf_dev) * ((MAX_NUM_OF_STATS - pf_dev->params.vnics_per_port) / pf_dev->params.vnics_per_port);
49*d14abf15SRobert Mustacchi     u8_t max_num = min_num + (MAX_NUM_OF_STATS - pf_dev->params.vnics_per_port) / pf_dev->params.vnics_per_port;
50*d14abf15SRobert Mustacchi     free_st_id = lm_vf_get_free_resource(pf_dev->pf_resources.free_stats, min_num, max_num, 1);
51*d14abf15SRobert Mustacchi     if (free_st_id != 0xff) {
52*d14abf15SRobert Mustacchi         DbgMessage1(pf_dev,FATAL,"lm_vf_get_free_stats: %d\n",free_st_id);
53*d14abf15SRobert Mustacchi     } else {
54*d14abf15SRobert Mustacchi         DbgMessage3(pf_dev,FATAL,"lm_vf_get_free_stats: No more free stats counters(%d,%d)\n",min_num,max_num);
55*d14abf15SRobert Mustacchi         DbgMessage1(pf_dev,FATAL,"lm_vf_get_free_stats: vnic_per_port is %d)\n",pf_dev->params.vnics_per_port);
56*d14abf15SRobert Mustacchi     }
57*d14abf15SRobert Mustacchi     return free_st_id;
58*d14abf15SRobert Mustacchi }
59*d14abf15SRobert Mustacchi 
lm_vf_get_free_cam_offset(struct _lm_device_t * pf_dev)60*d14abf15SRobert Mustacchi static u8_t lm_vf_get_free_cam_offset(struct _lm_device_t * pf_dev)
61*d14abf15SRobert Mustacchi {
62*d14abf15SRobert Mustacchi     u8_t free_cam_offset = 0xff;
63*d14abf15SRobert Mustacchi     u8_t max_num;
64*d14abf15SRobert Mustacchi     max_num = LM_CAM_SIZE(pf_dev);
65*d14abf15SRobert Mustacchi     free_cam_offset = lm_vf_get_free_resource(pf_dev->pf_resources.free_cam_offsets, 0, max_num, 1);
66*d14abf15SRobert Mustacchi     if (free_cam_offset != 0xff) {
67*d14abf15SRobert Mustacchi         DbgMessage1(pf_dev,FATAL,"lm_vf_get_free_cam_offset: %d\n",free_cam_offset);
68*d14abf15SRobert Mustacchi     } else {
69*d14abf15SRobert Mustacchi         DbgMessage(pf_dev,FATAL,"lm_vf_get_free_cam_offset: No more free cam offsets\n");
70*d14abf15SRobert Mustacchi     }
71*d14abf15SRobert Mustacchi     return  free_cam_offset;
72*d14abf15SRobert Mustacchi }
73*d14abf15SRobert Mustacchi 
lm_vf_prep(struct _lm_device_t * pf_dev,struct _lm_device_t * vf_dev)74*d14abf15SRobert Mustacchi lm_status_t lm_vf_prep(struct _lm_device_t * pf_dev, struct _lm_device_t * vf_dev)
75*d14abf15SRobert Mustacchi {
76*d14abf15SRobert Mustacchi     vf_dev->pf_dev = pf_dev;
77*d14abf15SRobert Mustacchi     /* TODO: anything else to prepare for VF? */
78*d14abf15SRobert Mustacchi 
79*d14abf15SRobert Mustacchi     lm_set_virt_mode(vf_dev, DEVICE_TYPE_VF, VT_BASIC_VF);
80*d14abf15SRobert Mustacchi 
81*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
82*d14abf15SRobert Mustacchi }
83*d14abf15SRobert Mustacchi 
lm_vf_get_bar_offset(struct _lm_device_t * pdev,u8_t bar_num,lm_address_t * bar_addr)84*d14abf15SRobert Mustacchi lm_status_t lm_vf_get_bar_offset(struct _lm_device_t *pdev, u8_t bar_num, lm_address_t * bar_addr)
85*d14abf15SRobert Mustacchi {
86*d14abf15SRobert Mustacchi     bar_addr->as_u64 = PFDEV(pdev)->hw_info.sriov_info.vf_bars[bar_num].as_u64 +
87*d14abf15SRobert Mustacchi         REL_VFID(pdev)*pdev->hw_info.bar_size[bar_num];
88*d14abf15SRobert Mustacchi     DbgMessage3(pdev, FATAL, "VF[%d(%d)]-bar[%d]:\n", ABS_VFID(pdev),REL_VFID(pdev),bar_num);
89*d14abf15SRobert Mustacchi     DbgMessage2(pdev, FATAL, "A: 0x%x, S: 0x%x\n", bar_addr->as_u32.low, pdev->hw_info.bar_size[bar_num]);
90*d14abf15SRobert Mustacchi 
91*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
92*d14abf15SRobert Mustacchi }
93*d14abf15SRobert Mustacchi 
lm_vf_get_vf_id(struct _lm_device_t * pdev)94*d14abf15SRobert Mustacchi lm_status_t lm_vf_get_vf_id(struct _lm_device_t * pdev)
95*d14abf15SRobert Mustacchi {
96*d14abf15SRobert Mustacchi     u32_t val;
97*d14abf15SRobert Mustacchi 
98*d14abf15SRobert Mustacchi     mm_read_pci(pdev, PCICFG_ME_REGISTER, &val);
99*d14abf15SRobert Mustacchi 
100*d14abf15SRobert Mustacchi     DbgMessage1(pdev, FATAL, "vf ME-REG value: 0x%x\n", val);
101*d14abf15SRobert Mustacchi 
102*d14abf15SRobert Mustacchi     if (!(val & ME_REG_VF_VALID)) {
103*d14abf15SRobert Mustacchi         DbgBreakIf(!(val & ME_REG_VF_VALID));
104*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
105*d14abf15SRobert Mustacchi     }
106*d14abf15SRobert Mustacchi     pdev->params.vf_num_in_path = (val & ME_REG_VF_NUM_MASK) >> ME_REG_VF_NUM_SHIFT;
107*d14abf15SRobert Mustacchi 
108*d14abf15SRobert Mustacchi     if (pdev->params.vf_num_in_path < PFDEV(pdev)->hw_info.sriov_info.first_vf_in_pf) {
109*d14abf15SRobert Mustacchi         DbgBreakIf(pdev->params.vf_num_in_path < PFDEV(pdev)->hw_info.sriov_info.first_vf_in_pf);
110*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
111*d14abf15SRobert Mustacchi     }
112*d14abf15SRobert Mustacchi     pdev->params.vf_num_in_pf = pdev->params.vf_num_in_path - PFDEV(pdev)->hw_info.sriov_info.first_vf_in_pf;
113*d14abf15SRobert Mustacchi 
114*d14abf15SRobert Mustacchi     DbgMessage2(pdev, FATAL, "vf_num_in_path=%d vf_num_in_pf=%d\n", pdev->params.vf_num_in_path, pdev->params.vf_num_in_pf);
115*d14abf15SRobert Mustacchi 
116*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
117*d14abf15SRobert Mustacchi }
118*d14abf15SRobert Mustacchi 
lm_vf_get_intr_blk_info(struct _lm_device_t * pdev)119*d14abf15SRobert Mustacchi lm_status_t lm_vf_get_intr_blk_info(struct _lm_device_t *pdev)
120*d14abf15SRobert Mustacchi {
121*d14abf15SRobert Mustacchi     // TODO
122*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
123*d14abf15SRobert Mustacchi }
124*d14abf15SRobert Mustacchi 
lm_vf_en(struct _lm_device_t * pf_dev,u16_t vf_num)125*d14abf15SRobert Mustacchi lm_status_t lm_vf_en(struct _lm_device_t * pf_dev, u16_t vf_num)
126*d14abf15SRobert Mustacchi {
127*d14abf15SRobert Mustacchi     u8_t rss_id;
128*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
129*d14abf15SRobert Mustacchi     /* TODO: what HW needs to be initialized at this stage */
130*d14abf15SRobert Mustacchi 	/* TODO: VF Database for FLR needs? */
131*d14abf15SRobert Mustacchi #ifndef _VBD_CMD_
132*d14abf15SRobert Mustacchi     lm_status = mm_vf_en(pf_dev, vf_num);
133*d14abf15SRobert Mustacchi #endif
134*d14abf15SRobert Mustacchi     if (lm_status == LM_STATUS_SUCCESS) {
135*d14abf15SRobert Mustacchi         pf_dev->pf_resources.free_cam_offsets[0] |= 0x3;
136*d14abf15SRobert Mustacchi 
137*d14abf15SRobert Mustacchi         LM_FOREACH_RSS_IDX(pf_dev, rss_id) {
138*d14abf15SRobert Mustacchi             lm_vf_acquire_resource(pf_dev->pf_resources.free_sbs, LM_FW_SB_ID(pf_dev, RSS_ID_TO_SB_ID(rss_id)), 1);
139*d14abf15SRobert Mustacchi             DbgMessage2(pf_dev, FATAL, "SB%d is allocated for PF[%d] itself\n", LM_FW_SB_ID(pf_dev, RSS_ID_TO_SB_ID(rss_id)), FUNC_ID(pf_dev));
140*d14abf15SRobert Mustacchi             lm_vf_acquire_resource(pf_dev->pf_resources.free_clients, LM_FW_CLI_ID(pf_dev, RSS_ID_TO_CID(rss_id)), 1);
141*d14abf15SRobert Mustacchi             DbgMessage2(pf_dev, FATAL, "Client%d is allocated for PF[%d] itself\n", LM_FW_CLI_ID(pf_dev, RSS_ID_TO_CID(rss_id)), FUNC_ID(pf_dev));
142*d14abf15SRobert Mustacchi         }
143*d14abf15SRobert Mustacchi 
144*d14abf15SRobert Mustacchi         lm_vf_acquire_resource(pf_dev->pf_resources.free_stats, LM_STATS_CNT_ID(pf_dev), 1);
145*d14abf15SRobert Mustacchi         DbgMessage2(pf_dev, FATAL, "Stats%d is allocated for PF[%d] itself\n", LM_STATS_CNT_ID(pf_dev), FUNC_ID(pf_dev));
146*d14abf15SRobert Mustacchi     }
147*d14abf15SRobert Mustacchi     pf_dev->vars.num_vfs_enabled = vf_num;
148*d14abf15SRobert Mustacchi     return lm_status;
149*d14abf15SRobert Mustacchi }
150*d14abf15SRobert Mustacchi 
lm_vf_dis(struct _lm_device_t * pf_dev)151*d14abf15SRobert Mustacchi lm_status_t lm_vf_dis(struct _lm_device_t * pf_dev)
152*d14abf15SRobert Mustacchi {
153*d14abf15SRobert Mustacchi 	/* TODO: Clean VF Database for FLR needs? */
154*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
155*d14abf15SRobert Mustacchi     u32_t base_vfid, vfid;
156*d14abf15SRobert Mustacchi     u16_t pretend_val;
157*d14abf15SRobert Mustacchi     u16_t ind_cids, start_cid, end_cid;
158*d14abf15SRobert Mustacchi 
159*d14abf15SRobert Mustacchi     DbgMessage(pf_dev, FATAL, "vf disable\n");
160*d14abf15SRobert Mustacchi     start_cid = (((1 << LM_VF_MAX_RVFID_SIZE) | 0) <<  LM_VF_CID_WND_SIZE); //1st possible abs VF_ID
161*d14abf15SRobert Mustacchi     end_cid = (((1 << LM_VF_MAX_RVFID_SIZE) | 63) <<  LM_VF_CID_WND_SIZE); //last possible abs VF_ID
162*d14abf15SRobert Mustacchi     DbgMessage2(pf_dev, FATAL, "vf disable: clear VFs connections from %d till %d\n",start_cid, end_cid);
163*d14abf15SRobert Mustacchi     for (ind_cids = start_cid; ind_cids <= end_cid; ind_cids++) {
164*d14abf15SRobert Mustacchi         pf_dev->vars.connections[ind_cids].con_state = LM_CON_STATE_CLOSE;
165*d14abf15SRobert Mustacchi     }
166*d14abf15SRobert Mustacchi #ifndef _VBD_CMD_
167*d14abf15SRobert Mustacchi     mm_vf_dis(pf_dev);
168*d14abf15SRobert Mustacchi #endif
169*d14abf15SRobert Mustacchi 
170*d14abf15SRobert Mustacchi     if (lm_is_function_after_flr(pf_dev)) {
171*d14abf15SRobert Mustacchi         DbgMessage(pf_dev, FATAL, "vf disable called on a flred function - not much we can do here... \n");
172*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
173*d14abf15SRobert Mustacchi     }
174*d14abf15SRobert Mustacchi     /* if MCP does not exist for each vf in pf, need to pretend to it and disable igu vf_msix and internal vfid enable bit */
175*d14abf15SRobert Mustacchi     if (GET_FLAGS( pf_dev->params.test_mode, TEST_MODE_NO_MCP)){
176*d14abf15SRobert Mustacchi         DbgMessage(pf_dev, FATAL, "bootcode is down fix sriov disable.\n");
177*d14abf15SRobert Mustacchi         base_vfid = pf_dev->hw_info.sriov_info.first_vf_in_pf;
178*d14abf15SRobert Mustacchi         for (vfid = base_vfid; vfid < base_vfid + pf_dev->vars.num_vfs_enabled; vfid++ ) {
179*d14abf15SRobert Mustacchi             pretend_val = ABS_FUNC_ID(pf_dev) | (1<<3) | (vfid << 4);
180*d14abf15SRobert Mustacchi             lm_pretend_func(pf_dev, pretend_val);
181*d14abf15SRobert Mustacchi 
182*d14abf15SRobert Mustacchi             REG_WR(pf_dev, IGU_REG_PCI_VF_MSIX_EN, 0);
183*d14abf15SRobert Mustacchi             REG_WR(pf_dev, IGU_REG_PCI_VF_MSIX_FUNC_MASK, 0);
184*d14abf15SRobert Mustacchi             REG_WR(pf_dev, PGLUE_B_REG_INTERNAL_VFID_ENABLE, 0);
185*d14abf15SRobert Mustacchi 
186*d14abf15SRobert Mustacchi             lm_pretend_func(pf_dev, ABS_FUNC_ID(pf_dev) );
187*d14abf15SRobert Mustacchi         }
188*d14abf15SRobert Mustacchi 
189*d14abf15SRobert Mustacchi         /* This is a clear-on-write register, therefore we actually write 1 to the bit we want to reset */
190*d14abf15SRobert Mustacchi         REG_WR(pf_dev, 0x24d8, 1<<29);
191*d14abf15SRobert Mustacchi 
192*d14abf15SRobert Mustacchi         REG_WR(pf_dev, PGLUE_B_REG_SR_IOV_DISABLED_REQUEST_CLR ,(1<<ABS_FUNC_ID(pf_dev)));
193*d14abf15SRobert Mustacchi         //REG_WR(pf_dev, PGLUE_B_REG_DISABLE_FLR_SRIOV_DISABLED, PGLUE_B_DISABLE_FLR_SRIOV_DISABLED_REG_DISABLE_SRIOV_DISABLED_REQUEST);*/
194*d14abf15SRobert Mustacchi     }
195*d14abf15SRobert Mustacchi     return lm_status;
196*d14abf15SRobert Mustacchi }
197*d14abf15SRobert Mustacchi 
198*d14abf15SRobert Mustacchi lm_status_t lm_alloc_client_info(struct _lm_device_t *pdev);
199*d14abf15SRobert Mustacchi lm_status_t lm_setup_client_info(struct _lm_device_t *pdev);
200*d14abf15SRobert Mustacchi 
201*d14abf15SRobert Mustacchi /* Description:
202*d14abf15SRobert Mustacchi *    This routine contain code for VF alloc/setup distinguish by flag
203*d14abf15SRobert Mustacchi */
lm_vf_setup_alloc_resc(struct _lm_device_t * pdev,u8_t b_is_alloc)204*d14abf15SRobert Mustacchi lm_status_t lm_vf_setup_alloc_resc(struct _lm_device_t *pdev, u8_t b_is_alloc )
205*d14abf15SRobert Mustacchi {
206*d14abf15SRobert Mustacchi     lm_variables_t* vars       = NULL ;
207*d14abf15SRobert Mustacchi     u32_t           mem_size   = 0 ;
208*d14abf15SRobert Mustacchi     u32_t           alloc_size = 0 ;
209*d14abf15SRobert Mustacchi     u8_t            mm_cli_idx = 0 ;
210*d14abf15SRobert Mustacchi     u8_t            sb_id      = 0 ;
211*d14abf15SRobert Mustacchi     lm_address_t    sb_phy_address;
212*d14abf15SRobert Mustacchi     lm_status_t     lm_status  = LM_STATUS_FAILURE;
213*d14abf15SRobert Mustacchi 
214*d14abf15SRobert Mustacchi     if CHK_NULL( pdev )
215*d14abf15SRobert Mustacchi     {
216*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER ;
217*d14abf15SRobert Mustacchi     }
218*d14abf15SRobert Mustacchi 
219*d14abf15SRobert Mustacchi     DbgMessage1(pdev, FATAL , "### VF lm_common_setup_alloc_resc b_is_alloc=%s\n", b_is_alloc ? "TRUE" : "FALSE" );
220*d14abf15SRobert Mustacchi 
221*d14abf15SRobert Mustacchi     vars       = &(pdev->vars) ;
222*d14abf15SRobert Mustacchi 
223*d14abf15SRobert Mustacchi     //       Status blocks allocation. We allocate mem both for the default and non-default status blocks
224*d14abf15SRobert Mustacchi     //       there is 1 def sb and 16 non-def sb per port.
225*d14abf15SRobert Mustacchi     //       non-default sb: index 0-15, default sb: index 16.
226*d14abf15SRobert Mustacchi     mem_size = E2_STATUS_BLOCK_BUFFER_SIZE;
227*d14abf15SRobert Mustacchi 
228*d14abf15SRobert Mustacchi     mm_cli_idx = LM_RESOURCE_COMMON;//!!DP mm_cli_idx_to_um_idx(LM_CLI_IDX_MAX);
229*d14abf15SRobert Mustacchi 
230*d14abf15SRobert Mustacchi     LM_FOREACH_SB_ID(pdev, sb_id)
231*d14abf15SRobert Mustacchi     {
232*d14abf15SRobert Mustacchi         if( b_is_alloc )
233*d14abf15SRobert Mustacchi         {
234*d14abf15SRobert Mustacchi             pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e2_sb = mm_alloc_phys_mem(pdev, mem_size, &sb_phy_address, 0, mm_cli_idx);
235*d14abf15SRobert Mustacchi             pdev->vars.status_blocks_arr[sb_id].hc_status_block_data.e2_sb_data.common.host_sb_addr.lo = sb_phy_address.as_u32.low;
236*d14abf15SRobert Mustacchi             pdev->vars.status_blocks_arr[sb_id].hc_status_block_data.e2_sb_data.common.host_sb_addr.hi = sb_phy_address.as_u32.high;
237*d14abf15SRobert Mustacchi         }
238*d14abf15SRobert Mustacchi         if CHK_NULL(pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e1x_sb)
239*d14abf15SRobert Mustacchi         {
240*d14abf15SRobert Mustacchi             DbgBreakIf(DBG_BREAK_ON(MEMORY_ALLOCATION_FAILURE));
241*d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE ;
242*d14abf15SRobert Mustacchi         }
243*d14abf15SRobert Mustacchi         mm_mem_zero((void *)(pdev->vars.status_blocks_arr[sb_id].host_hc_status_block.e2_sb), mem_size);
244*d14abf15SRobert Mustacchi     }
245*d14abf15SRobert Mustacchi 
246*d14abf15SRobert Mustacchi     /* SlowPath Info */
247*d14abf15SRobert Mustacchi     lm_status = lm_alloc_setup_slowpath_resc(pdev, b_is_alloc);
248*d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
249*d14abf15SRobert Mustacchi     {
250*d14abf15SRobert Mustacchi         DbgMessage1(pdev, FATAL, "lm_alloc_client_info failed lm-status = %d\n", lm_status);
251*d14abf15SRobert Mustacchi         return lm_status;
252*d14abf15SRobert Mustacchi     }
253*d14abf15SRobert Mustacchi 
254*d14abf15SRobert Mustacchi 
255*d14abf15SRobert Mustacchi     if (b_is_alloc)
256*d14abf15SRobert Mustacchi     {
257*d14abf15SRobert Mustacchi         lm_status = lm_alloc_client_info(pdev);
258*d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
259*d14abf15SRobert Mustacchi         {
260*d14abf15SRobert Mustacchi             DbgMessage1(pdev, FATAL, "lm_alloc_client_info failed lm-status = %d\n", lm_status);
261*d14abf15SRobert Mustacchi             return lm_status;
262*d14abf15SRobert Mustacchi         }
263*d14abf15SRobert Mustacchi     }
264*d14abf15SRobert Mustacchi 
265*d14abf15SRobert Mustacchi     lm_status = lm_setup_client_info(pdev);
266*d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
267*d14abf15SRobert Mustacchi     {
268*d14abf15SRobert Mustacchi         DbgMessage1(pdev, FATAL, "lm_setup_client_info failed lm-status = %d\n", lm_status);
269*d14abf15SRobert Mustacchi         return lm_status;
270*d14abf15SRobert Mustacchi     }
271*d14abf15SRobert Mustacchi 
272*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
273*d14abf15SRobert Mustacchi }
274*d14abf15SRobert Mustacchi 
275*d14abf15SRobert Mustacchi 
lm_vf_init_dev_info(struct _lm_device_t * pdev)276*d14abf15SRobert Mustacchi lm_status_t lm_vf_init_dev_info(struct _lm_device_t *pdev)
277*d14abf15SRobert Mustacchi {
278*d14abf15SRobert Mustacchi     u8_t    index;
279*d14abf15SRobert Mustacchi     lm_status_t lm_status;
280*d14abf15SRobert Mustacchi     lm_status = lm_vf_allocate_resc_in_pf(pdev);
281*d14abf15SRobert Mustacchi     if (lm_status == LM_STATUS_SUCCESS) {
282*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_hw.b_collect_enabled = FALSE;
283*d14abf15SRobert Mustacchi         pdev->vars.stats.stats_collect.stats_fw.b_collect_enabled = FALSE;
284*d14abf15SRobert Mustacchi         DbgBreakIf(LM_SB_CNT(pdev) != 1);
285*d14abf15SRobert Mustacchi 
286*d14abf15SRobert Mustacchi         for (index = 0; index < LM_SB_CNT(pdev); index++) { //RSS? but not SBs
287*d14abf15SRobert Mustacchi             PFDEV(pdev)->context_info->array[VF_TO_PF_CID(pdev,index)].cid_resc.mapped_cid_bar_addr =
288*d14abf15SRobert Mustacchi                 (volatile void *)((u8_t*)pdev->vars.mapped_bar_addr[BAR_0] + index*LM_DQ_CID_SIZE + VF_BAR0_DB_OFFSET);
289*d14abf15SRobert Mustacchi         }
290*d14abf15SRobert Mustacchi     }
291*d14abf15SRobert Mustacchi     return lm_status;
292*d14abf15SRobert Mustacchi }
293*d14abf15SRobert Mustacchi 
294*d14abf15SRobert Mustacchi 
295*d14abf15SRobert Mustacchi //static vf_info_t tmp_vf_info;
296*d14abf15SRobert Mustacchi 
lm_vf_allocate_resc_in_pf(struct _lm_device_t * pdev)297*d14abf15SRobert Mustacchi lm_status_t lm_vf_allocate_resc_in_pf(struct _lm_device_t *pdev)
298*d14abf15SRobert Mustacchi {
299*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
300*d14abf15SRobert Mustacchi 
301*d14abf15SRobert Mustacchi     DbgMessage(pdev, FATAL, "lm_vf_allocate_resc_in_pf\n");
302*d14abf15SRobert Mustacchi 
303*d14abf15SRobert Mustacchi     DbgMessage2(pdev,FATAL,"lm_vf_allocate_resc_in_pf: VF %d requests resources from PF %d\n",ABS_VFID(pdev),FUNC_ID(pdev));
304*d14abf15SRobert Mustacchi     MM_ACQUIRE_PF_LOCK(PFDEV(pdev));
305*d14abf15SRobert Mustacchi 
306*d14abf15SRobert Mustacchi     pdev->params.base_fw_client_id = lm_vf_get_free_clients(PFDEV(pdev),pdev->params.sb_cnt);
307*d14abf15SRobert Mustacchi     pdev->params.base_fw_ndsb = lm_vf_get_free_sbs(PFDEV(pdev),pdev->params.sb_cnt);
308*d14abf15SRobert Mustacchi     pdev->params.base_cam_offset = lm_vf_get_free_cam_offset(PFDEV(pdev));
309*d14abf15SRobert Mustacchi     pdev->params.base_fw_stats_id = lm_vf_get_free_stats(PFDEV(pdev));
310*d14abf15SRobert Mustacchi 
311*d14abf15SRobert Mustacchi     if ((pdev->params.base_fw_client_id == 0xff)
312*d14abf15SRobert Mustacchi             || (pdev->params.base_fw_ndsb == 0xff)
313*d14abf15SRobert Mustacchi             || (pdev->params.base_cam_offset == 0xff)) {
314*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_RESOURCE;
315*d14abf15SRobert Mustacchi     } else {
316*d14abf15SRobert Mustacchi         lm_vf_acquire_resource(PFDEV(pdev)->pf_resources.free_sbs, pdev->params.base_fw_ndsb, pdev->params.sb_cnt);
317*d14abf15SRobert Mustacchi         lm_vf_acquire_resource(PFDEV(pdev)->pf_resources.free_clients, pdev->params.base_fw_client_id, pdev->params.sb_cnt);
318*d14abf15SRobert Mustacchi         lm_vf_acquire_resource(PFDEV(pdev)->pf_resources.free_cam_offsets, pdev->params.base_cam_offset, 1);
319*d14abf15SRobert Mustacchi         if (pdev->params.base_fw_stats_id != 0xff) {
320*d14abf15SRobert Mustacchi             lm_vf_acquire_resource(PFDEV(pdev)->pf_resources.free_stats, pdev->params.base_fw_stats_id, 1);
321*d14abf15SRobert Mustacchi         }
322*d14abf15SRobert Mustacchi         /* For now, qzone_id == sb_id, but this is not a requirement */
323*d14abf15SRobert Mustacchi         pdev->params.base_fw_qzone_id = pdev->params.base_fw_ndsb;
324*d14abf15SRobert Mustacchi     }
325*d14abf15SRobert Mustacchi 
326*d14abf15SRobert Mustacchi     MM_RELEASE_PF_LOCK(PFDEV(pdev));
327*d14abf15SRobert Mustacchi 
328*d14abf15SRobert Mustacchi     DbgMessage4(pdev, FATAL, "vf_resc: fw_client=%d fw_ndsb=%d fw cam=%d fw stats=%d\n",
329*d14abf15SRobert Mustacchi                pdev->params.base_fw_client_id, pdev->params.base_fw_ndsb, pdev->params.base_cam_offset, pdev->params.base_fw_stats_id);
330*d14abf15SRobert Mustacchi 
331*d14abf15SRobert Mustacchi     return lm_status;
332*d14abf15SRobert Mustacchi }
333*d14abf15SRobert Mustacchi 
334*d14abf15SRobert Mustacchi lm_status_t
lm_vf_chip_init(struct _lm_device_t * pdev)335*d14abf15SRobert Mustacchi lm_vf_chip_init(struct _lm_device_t *pdev)
336*d14abf15SRobert Mustacchi {
337*d14abf15SRobert Mustacchi     lm_status_t     lm_status = LM_STATUS_SUCCESS;
338*d14abf15SRobert Mustacchi     u32_t           function_fw_id;
339*d14abf15SRobert Mustacchi     u8_t            port = PORT_ID(pdev);
340*d14abf15SRobert Mustacchi     u8_t  i;
341*d14abf15SRobert Mustacchi 
342*d14abf15SRobert Mustacchi     DbgMessage(pdev, FATAL, "lm_vf_chip_init: start\n");
343*d14abf15SRobert Mustacchi     mm_memset(pdev->vars.c_hc_ack, 0, sizeof(pdev->vars.c_hc_ack));
344*d14abf15SRobert Mustacchi     mm_memset(pdev->vars.u_hc_ack, 0, sizeof(pdev->vars.u_hc_ack));
345*d14abf15SRobert Mustacchi     lm_init_non_def_status_block(pdev, LM_SW_LEADING_SB_ID, port);
346*d14abf15SRobert Mustacchi 
347*d14abf15SRobert Mustacchi     // Init SPQ
348*d14abf15SRobert Mustacchi     /*  Driver should zero the slow path queue data before enabling the function in XSTORM.
349*d14abf15SRobert Mustacchi         Until now firmware was doing this but it cannot scale for VFs, so this zeroing was removed from firmware.
350*d14abf15SRobert Mustacchi         The driver should write zeros to XSTORM_SPQ_DATA_OFFSET(function).
351*d14abf15SRobert Mustacchi         The size of this structure is given in XSTORM_SPQ_DATA_SIZE.
352*d14abf15SRobert Mustacchi         For VFs, the XSTORM_VF_SPQ_DATA_OFFSET(vfid) should be used. To do it via GRC is preferrable */
353*d14abf15SRobert Mustacchi     DbgBreakIf((XSTORM_SPQ_DATA_SIZE % 4) != 0);
354*d14abf15SRobert Mustacchi     for (i = 0; i < XSTORM_SPQ_DATA_SIZE/sizeof(u32_t); i++) {
355*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev),XSEM_REG_FAST_MEMORY + XSTORM_VF_SPQ_DATA_OFFSET(ABS_VFID(pdev)) + i*sizeof(u32_t),0);
356*d14abf15SRobert Mustacchi     }
357*d14abf15SRobert Mustacchi 
358*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev),XSEM_REG_FAST_MEMORY + (XSTORM_VF_SPQ_PAGE_BASE_OFFSET(ABS_VFID(pdev))),pdev->sq_info.sq_chain.bd_chain_phy.as_u32.low);
359*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev),XSEM_REG_FAST_MEMORY + (XSTORM_VF_SPQ_PAGE_BASE_OFFSET(ABS_VFID(pdev)) + 4),pdev->sq_info.sq_chain.bd_chain_phy.as_u32.high);
360*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev),XSEM_REG_FAST_MEMORY + (XSTORM_VF_SPQ_PROD_OFFSET(ABS_VFID(pdev))),pdev->sq_info.sq_chain.prod_idx);
361*d14abf15SRobert Mustacchi 
362*d14abf15SRobert Mustacchi     lm_status = lm_set_rx_mask(pdev, LM_CLI_IDX_NDIS, LM_RX_MASK_ACCEPT_NONE, NULL);
363*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
364*d14abf15SRobert Mustacchi     {
365*d14abf15SRobert Mustacchi         DbgMessage1(pdev,FATAL,"lm_set_rx_mask(LM_RX_MASK_ACCEPT_NONE) returns %d\n",lm_status);
366*d14abf15SRobert Mustacchi         return lm_status;
367*d14abf15SRobert Mustacchi     }
368*d14abf15SRobert Mustacchi /*
369*d14abf15SRobert Mustacchi Enable the function in STORMs
370*d14abf15SRobert Mustacchi */
371*d14abf15SRobert Mustacchi     function_fw_id = FW_VFID(pdev);
372*d14abf15SRobert Mustacchi 
373*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), XSTORM_VF_TO_PF_OFFSET(function_fw_id), FUNC_ID(pdev), BAR_XSTRORM_INTMEM);
374*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), CSTORM_VF_TO_PF_OFFSET(function_fw_id), FUNC_ID(pdev), BAR_CSTRORM_INTMEM);
375*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), TSTORM_VF_TO_PF_OFFSET(function_fw_id), FUNC_ID(pdev), BAR_TSTRORM_INTMEM);
376*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), USTORM_VF_TO_PF_OFFSET(function_fw_id), FUNC_ID(pdev), BAR_USTRORM_INTMEM);
377*d14abf15SRobert Mustacchi 
378*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), XSTORM_FUNC_EN_OFFSET(function_fw_id), 1, BAR_XSTRORM_INTMEM);
379*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), CSTORM_FUNC_EN_OFFSET(function_fw_id), 1, BAR_CSTRORM_INTMEM);
380*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), TSTORM_FUNC_EN_OFFSET(function_fw_id), 1, BAR_TSTRORM_INTMEM);
381*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), USTORM_FUNC_EN_OFFSET(function_fw_id), 1, BAR_USTRORM_INTMEM);
382*d14abf15SRobert Mustacchi 
383*d14abf15SRobert Mustacchi 
384*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
385*d14abf15SRobert Mustacchi }
386*d14abf15SRobert Mustacchi 
387*d14abf15SRobert Mustacchi lm_status_t
lm_vf_chip_reset(struct _lm_device_t * pdev,lm_reason_t reason)388*d14abf15SRobert Mustacchi lm_vf_chip_reset(struct _lm_device_t *pdev, lm_reason_t reason)
389*d14abf15SRobert Mustacchi {
390*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
391*d14abf15SRobert Mustacchi     u32_t       function_fw_id;
392*d14abf15SRobert Mustacchi     u8_t        port = PORT_ID(pdev);
393*d14abf15SRobert Mustacchi 
394*d14abf15SRobert Mustacchi     if (lm_reset_is_inprogress(pdev)) {
395*d14abf15SRobert Mustacchi         DbgMessage1(pdev,FATAL,"lm_vf_chip_reset: VF(%d) under reset\n",ABS_VFID(pdev));
396*d14abf15SRobert Mustacchi         if (!lm_vf_fl_reset_is_inprogress(pdev)) {
397*d14abf15SRobert Mustacchi             lm_status = lm_vf_recycle_resc_in_pf(pdev);
398*d14abf15SRobert Mustacchi             PFDEV(pdev)->vars.connections[VF_TO_PF_CID(pdev,LM_SW_LEADING_RSS_CID(pdev))].con_state = LM_CON_STATE_CLOSE;
399*d14abf15SRobert Mustacchi             DbgMessage1(pdev,FATAL,"lm_vf_chip_reset: recycle resources (including connection) for VF(%d)\n",ABS_VFID(pdev));
400*d14abf15SRobert Mustacchi         }
401*d14abf15SRobert Mustacchi         return lm_status;
402*d14abf15SRobert Mustacchi     }
403*d14abf15SRobert Mustacchi 
404*d14abf15SRobert Mustacchi /*
405*d14abf15SRobert Mustacchi Disable the function in STORMs
406*d14abf15SRobert Mustacchi */
407*d14abf15SRobert Mustacchi     function_fw_id = FW_VFID(pdev);
408*d14abf15SRobert Mustacchi 
409*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), XSTORM_FUNC_EN_OFFSET(function_fw_id), 0, BAR_XSTRORM_INTMEM);
410*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), CSTORM_FUNC_EN_OFFSET(function_fw_id), 0, BAR_CSTRORM_INTMEM);
411*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), TSTORM_FUNC_EN_OFFSET(function_fw_id), 0, BAR_TSTRORM_INTMEM);
412*d14abf15SRobert Mustacchi     LM_INTMEM_WRITE8(PFDEV(pdev), USTORM_FUNC_EN_OFFSET(function_fw_id), 0, BAR_USTRORM_INTMEM);
413*d14abf15SRobert Mustacchi 
414*d14abf15SRobert Mustacchi     lm_clear_non_def_status_block(pdev,  LM_FW_SB_ID(pdev, LM_SW_LEADING_SB_ID));
415*d14abf15SRobert Mustacchi 
416*d14abf15SRobert Mustacchi     lm_status = lm_vf_recycle_resc_in_pf(pdev);
417*d14abf15SRobert Mustacchi     return lm_status;
418*d14abf15SRobert Mustacchi }
419*d14abf15SRobert Mustacchi 
420*d14abf15SRobert Mustacchi lm_status_t
lm_vf_recycle_resc_in_pf(struct _lm_device_t * pdev)421*d14abf15SRobert Mustacchi lm_vf_recycle_resc_in_pf(struct _lm_device_t *pdev)
422*d14abf15SRobert Mustacchi {
423*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
424*d14abf15SRobert Mustacchi 
425*d14abf15SRobert Mustacchi     MM_ACQUIRE_PF_LOCK(PFDEV(pdev));
426*d14abf15SRobert Mustacchi 
427*d14abf15SRobert Mustacchi     lm_vf_release_resource(PFDEV(pdev)->pf_resources.free_sbs, pdev->params.base_fw_ndsb, pdev->params.sb_cnt);
428*d14abf15SRobert Mustacchi     lm_vf_release_resource(PFDEV(pdev)->pf_resources.free_clients, pdev->params.base_fw_client_id, pdev->params.sb_cnt);
429*d14abf15SRobert Mustacchi     lm_vf_release_resource(PFDEV(pdev)->pf_resources.free_cam_offsets, pdev->params.base_cam_offset, 1);
430*d14abf15SRobert Mustacchi     if (pdev->params.base_fw_stats_id != 0xff) {
431*d14abf15SRobert Mustacchi         lm_vf_release_resource(PFDEV(pdev)->pf_resources.free_stats, pdev->params.base_fw_stats_id, 1);
432*d14abf15SRobert Mustacchi     }
433*d14abf15SRobert Mustacchi 
434*d14abf15SRobert Mustacchi     MM_RELEASE_PF_LOCK(PFDEV(pdev));
435*d14abf15SRobert Mustacchi 
436*d14abf15SRobert Mustacchi     return lm_status;
437*d14abf15SRobert Mustacchi }
438*d14abf15SRobert Mustacchi 
439*d14abf15SRobert Mustacchi lm_status_t
lm_vf_enable_vf(struct _lm_device_t * pdev)440*d14abf15SRobert Mustacchi lm_vf_enable_vf(struct _lm_device_t *pdev)
441*d14abf15SRobert Mustacchi {
442*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
443*d14abf15SRobert Mustacchi     u16_t pretend_val;
444*d14abf15SRobert Mustacchi     u32_t prod_idx;
445*d14abf15SRobert Mustacchi     u8_t igu_sb_id;
446*d14abf15SRobert Mustacchi     u32_t was_err_num;
447*d14abf15SRobert Mustacchi     u32_t was_err_value;
448*d14abf15SRobert Mustacchi     u32_t was_err_reg;
449*d14abf15SRobert Mustacchi 
450*d14abf15SRobert Mustacchi     /* Enable the VF in PXP - this will enable read/write from VF bar.
451*d14abf15SRobert Mustacchi      * Need to use Pretend in order to do this. Note: once we do pretend
452*d14abf15SRobert Mustacchi      * all accesses to SPLIT-68 will be done as if-vf...
453*d14abf15SRobert Mustacchi      * Bits. Bits [13:10] - Reserved.  Bits [9:4] - VFID. Bits [3] - VF valid. Bits [2:0] - PFID.
454*d14abf15SRobert Mustacchi      */
455*d14abf15SRobert Mustacchi 
456*d14abf15SRobert Mustacchi     pretend_val = ABS_FUNC_ID(pdev) | (1<<3) | (ABS_VFID(pdev) << 4);
457*d14abf15SRobert Mustacchi     lm_status = lm_pretend_func(PFDEV(pdev), pretend_val);
458*d14abf15SRobert Mustacchi     if (lm_status == LM_STATUS_SUCCESS) {
459*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev), PBF_REG_DISABLE_VF,0);
460*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev), PGLUE_B_REG_INTERNAL_VFID_ENABLE, 1);
461*d14abf15SRobert Mustacchi         lm_pretend_func(PFDEV(pdev), ABS_FUNC_ID(pdev) );
462*d14abf15SRobert Mustacchi         DbgMessage1(pdev, FATAL, "vf[%d] is enabled\n", ABS_VFID(pdev));
463*d14abf15SRobert Mustacchi 
464*d14abf15SRobert Mustacchi         was_err_num = 2 * PATH_ID(pdev) + ABS_VFID(pdev) / 32;
465*d14abf15SRobert Mustacchi         switch (was_err_num) {
466*d14abf15SRobert Mustacchi         case 0:
467*d14abf15SRobert Mustacchi             was_err_reg = PGLUE_B_REG_WAS_ERROR_VF_31_0_CLR;
468*d14abf15SRobert Mustacchi             break;
469*d14abf15SRobert Mustacchi         case 1:
470*d14abf15SRobert Mustacchi             was_err_reg = PGLUE_B_REG_WAS_ERROR_VF_63_32_CLR;
471*d14abf15SRobert Mustacchi             break;
472*d14abf15SRobert Mustacchi         case 2:
473*d14abf15SRobert Mustacchi             was_err_reg = PGLUE_B_REG_WAS_ERROR_VF_95_64_CLR;
474*d14abf15SRobert Mustacchi             break;
475*d14abf15SRobert Mustacchi         case 3:
476*d14abf15SRobert Mustacchi             was_err_reg = PGLUE_B_REG_WAS_ERROR_VF_127_96_CLR;
477*d14abf15SRobert Mustacchi             break;
478*d14abf15SRobert Mustacchi         default:
479*d14abf15SRobert Mustacchi             was_err_reg = 0;
480*d14abf15SRobert Mustacchi             DbgMessage2(pdev,FATAL,"Wrong Path[%d], VF[%d]\n",PATH_ID(pdev),ABS_VFID(pdev));
481*d14abf15SRobert Mustacchi             DbgBreak();
482*d14abf15SRobert Mustacchi         }
483*d14abf15SRobert Mustacchi 
484*d14abf15SRobert Mustacchi         was_err_value = 1 << (ABS_VFID(pdev) % 32);
485*d14abf15SRobert Mustacchi         if (was_err_reg) {
486*d14abf15SRobert Mustacchi             REG_WR(PFDEV(pdev), was_err_reg, was_err_value); /* PglueB - Clear the was_error indication of the relevant function*/
487*d14abf15SRobert Mustacchi         }
488*d14abf15SRobert Mustacchi 
489*d14abf15SRobert Mustacchi         /* IGU Initializations */
490*d14abf15SRobert Mustacchi         for (igu_sb_id = 0; igu_sb_id < LM_IGU_SB_CNT(pdev); igu_sb_id++) {
491*d14abf15SRobert Mustacchi             prod_idx = (IGU_BASE_NDSB(pdev) + igu_sb_id);
492*d14abf15SRobert Mustacchi             REG_WR(PFDEV(pdev), IGU_REG_PROD_CONS_MEMORY + prod_idx*4, 0);
493*d14abf15SRobert Mustacchi             DbgMessage1(pdev, FATAL, "IGU[%d] is inialized\n", prod_idx);
494*d14abf15SRobert Mustacchi         }
495*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev),TSEM_REG_VFPF_ERR_NUM, ABS_VFID(pdev));
496*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev),USEM_REG_VFPF_ERR_NUM, ABS_VFID(pdev));
497*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev),CSEM_REG_VFPF_ERR_NUM, ABS_VFID(pdev));
498*d14abf15SRobert Mustacchi         REG_WR(PFDEV(pdev),XSEM_REG_VFPF_ERR_NUM, ABS_VFID(pdev));
499*d14abf15SRobert Mustacchi     } else {
500*d14abf15SRobert Mustacchi         DbgMessage2(pdev, FATAL, "lm_pretend_func(%x) returns %d\n",pretend_val,lm_status);
501*d14abf15SRobert Mustacchi         DbgMessage1(pdev, FATAL, "vf[%d] is not enabled\n", ABS_VFID(pdev));
502*d14abf15SRobert Mustacchi     }
503*d14abf15SRobert Mustacchi 
504*d14abf15SRobert Mustacchi     return lm_status;
505*d14abf15SRobert Mustacchi }
506*d14abf15SRobert Mustacchi 
507*d14abf15SRobert Mustacchi lm_status_t
lm_vf_enable_igu_int(struct _lm_device_t * pdev)508*d14abf15SRobert Mustacchi lm_vf_enable_igu_int(struct _lm_device_t * pdev)
509*d14abf15SRobert Mustacchi {
510*d14abf15SRobert Mustacchi     u32_t val;
511*d14abf15SRobert Mustacchi     u16_t pretend_val;
512*d14abf15SRobert Mustacchi     u8_t num_segs;
513*d14abf15SRobert Mustacchi     u8_t prod_idx;
514*d14abf15SRobert Mustacchi     u8_t sb_id;
515*d14abf15SRobert Mustacchi     u8_t i;
516*d14abf15SRobert Mustacchi     lm_status_t status;
517*d14abf15SRobert Mustacchi 
518*d14abf15SRobert Mustacchi     /* Need to use pretend for VF */
519*d14abf15SRobert Mustacchi     pretend_val = ABS_FUNC_ID(pdev) | (1<<3) | (ABS_VFID(pdev) << 4);
520*d14abf15SRobert Mustacchi     lm_pretend_func(PFDEV(pdev), pretend_val);
521*d14abf15SRobert Mustacchi 
522*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev), IGU_REG_SB_INT_BEFORE_MASK_LSB, 0);
523*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev), IGU_REG_SB_INT_BEFORE_MASK_MSB, 0);
524*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev), IGU_REG_SB_MASK_LSB, 0);
525*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev), IGU_REG_SB_MASK_MSB, 0);
526*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev), IGU_REG_PBA_STATUS_LSB, 0);
527*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev), IGU_REG_PBA_STATUS_MSB, 0);
528*d14abf15SRobert Mustacchi 
529*d14abf15SRobert Mustacchi 
530*d14abf15SRobert Mustacchi     val=REG_RD(PFDEV(pdev), IGU_REG_VF_CONFIGURATION);
531*d14abf15SRobert Mustacchi 
532*d14abf15SRobert Mustacchi     SET_FLAGS(val, IGU_VF_CONF_FUNC_EN);
533*d14abf15SRobert Mustacchi     SET_FLAGS(val, IGU_VF_CONF_MSI_MSIX_EN);
534*d14abf15SRobert Mustacchi 
535*d14abf15SRobert Mustacchi     if (pdev->params.interrupt_mode == LM_INT_MODE_SIMD) {
536*d14abf15SRobert Mustacchi         SET_FLAGS(val,IGU_VF_CONF_SINGLE_ISR_EN);
537*d14abf15SRobert Mustacchi     }
538*d14abf15SRobert Mustacchi 
539*d14abf15SRobert Mustacchi     /* set Parent PF */
540*d14abf15SRobert Mustacchi     val |= ((FUNC_ID(pdev) << IGU_VF_CONF_PARENT_SHIFT) & IGU_VF_CONF_PARENT_MASK);
541*d14abf15SRobert Mustacchi 
542*d14abf15SRobert Mustacchi 	REG_WR(PFDEV(pdev),  IGU_REG_VF_CONFIGURATION, val);
543*d14abf15SRobert Mustacchi 
544*d14abf15SRobert Mustacchi     status = lm_pretend_func(PFDEV(pdev), ABS_FUNC_ID(pdev));
545*d14abf15SRobert Mustacchi 
546*d14abf15SRobert Mustacchi     num_segs = (INTR_BLK_MODE(pdev) == INTR_BLK_MODE_BC)? IGU_BC_NDSB_NUM_SEGS : IGU_NORM_NDSB_NUM_SEGS;
547*d14abf15SRobert Mustacchi     for (sb_id = 0; sb_id < LM_IGU_SB_CNT(pdev); sb_id++) {
548*d14abf15SRobert Mustacchi         prod_idx = (IGU_BASE_NDSB(pdev) + sb_id)*num_segs; /* bc-assumption consecutive pfs, norm-no assumption */
549*d14abf15SRobert Mustacchi         for (i = 0; i < num_segs;i++) {
550*d14abf15SRobert Mustacchi             REG_WR(PFDEV(pdev), IGU_REG_PROD_CONS_MEMORY + (prod_idx + i)*4, 0);
551*d14abf15SRobert Mustacchi         }
552*d14abf15SRobert Mustacchi         /* Give Consumer updates with value '0' */
553*d14abf15SRobert Mustacchi         lm_int_ack_sb_enable(pdev, sb_id);
554*d14abf15SRobert Mustacchi     }
555*d14abf15SRobert Mustacchi 
556*d14abf15SRobert Mustacchi     return status;
557*d14abf15SRobert Mustacchi 
558*d14abf15SRobert Mustacchi }
559*d14abf15SRobert Mustacchi 
560*d14abf15SRobert Mustacchi lm_status_t
lm_vf_disable_igu_int(struct _lm_device_t * pdev)561*d14abf15SRobert Mustacchi lm_vf_disable_igu_int(struct _lm_device_t * pdev)
562*d14abf15SRobert Mustacchi {
563*d14abf15SRobert Mustacchi     u32_t val;
564*d14abf15SRobert Mustacchi     u16_t pretend_val;
565*d14abf15SRobert Mustacchi 
566*d14abf15SRobert Mustacchi     /* Need to use pretend for VF */
567*d14abf15SRobert Mustacchi     if (lm_fl_reset_is_inprogress(PFDEV(pdev))) {
568*d14abf15SRobert Mustacchi         DbgMessage2(pdev, FATAL, "PF[%d] of VF[%d] is under FLR\n", FUNC_ID(pdev), ABS_VFID(pdev));
569*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
570*d14abf15SRobert Mustacchi     }
571*d14abf15SRobert Mustacchi     pretend_val = ABS_FUNC_ID(pdev) | (1<<3) | (ABS_VFID(pdev) << 4);
572*d14abf15SRobert Mustacchi     lm_pretend_func(PFDEV(pdev), pretend_val);
573*d14abf15SRobert Mustacchi 
574*d14abf15SRobert Mustacchi     val = REG_RD(PFDEV(pdev), IGU_REG_VF_CONFIGURATION);
575*d14abf15SRobert Mustacchi 
576*d14abf15SRobert Mustacchi     /* disable both bits, for INTA, MSI and MSI-X. */
577*d14abf15SRobert Mustacchi     RESET_FLAGS(val, (IGU_VF_CONF_MSI_MSIX_EN | IGU_VF_CONF_SINGLE_ISR_EN | IGU_VF_CONF_FUNC_EN | IGU_VF_CONF_PARENT_MASK));
578*d14abf15SRobert Mustacchi 
579*d14abf15SRobert Mustacchi     REG_WR(PFDEV(pdev),  IGU_REG_VF_CONFIGURATION, val);
580*d14abf15SRobert Mustacchi 
581*d14abf15SRobert Mustacchi     return (lm_pretend_func(PFDEV(pdev), ABS_FUNC_ID(pdev)));
582*d14abf15SRobert Mustacchi }
583*d14abf15SRobert Mustacchi 
lm_vf_fl_reset_set_inprogress(struct _lm_device_t * pdev)584*d14abf15SRobert Mustacchi void lm_vf_fl_reset_set_inprogress(struct _lm_device_t * pdev)
585*d14abf15SRobert Mustacchi {
586*d14abf15SRobert Mustacchi     MM_ACQUIRE_PF_LOCK(PFDEV(pdev));
587*d14abf15SRobert Mustacchi     lm_vf_acquire_resource(PFDEV(pdev)->pf_resources.flred_vfs, REL_VFID(pdev), 1);
588*d14abf15SRobert Mustacchi     DbgMessage2(pdev, FATAL, "Set FLR flag for VF[%d(%d)]\n", ABS_VFID(pdev), REL_VFID(pdev));
589*d14abf15SRobert Mustacchi     MM_RELEASE_PF_LOCK(PFDEV(pdev));
590*d14abf15SRobert Mustacchi }
591*d14abf15SRobert Mustacchi 
lm_vf_fl_reset_clear_inprogress(struct _lm_device_t * pdev)592*d14abf15SRobert Mustacchi void lm_vf_fl_reset_clear_inprogress(struct _lm_device_t *pdev)
593*d14abf15SRobert Mustacchi {
594*d14abf15SRobert Mustacchi     MM_ACQUIRE_PF_LOCK(PFDEV(pdev));
595*d14abf15SRobert Mustacchi     lm_vf_release_resource(PFDEV(pdev)->pf_resources.flred_vfs, REL_VFID(pdev), 1);
596*d14abf15SRobert Mustacchi     DbgMessage2(pdev, FATAL, "Clear FLR flag for VF[%d(%d)]\n", ABS_VFID(pdev), REL_VFID(pdev));
597*d14abf15SRobert Mustacchi     MM_RELEASE_PF_LOCK(PFDEV(pdev));
598*d14abf15SRobert Mustacchi }
599*d14abf15SRobert Mustacchi 
lm_vf_fl_reset_is_inprogress(struct _lm_device_t * pdev)600*d14abf15SRobert Mustacchi u8_t lm_vf_fl_reset_is_inprogress(struct _lm_device_t *pdev)
601*d14abf15SRobert Mustacchi {
602*d14abf15SRobert Mustacchi     u8_t vf_flr_inprogess;
603*d14abf15SRobert Mustacchi     MM_ACQUIRE_PF_LOCK(PFDEV(pdev));
604*d14abf15SRobert Mustacchi     vf_flr_inprogess = lm_vf_get_resource_value(PFDEV(pdev)->pf_resources.flred_vfs, REL_VFID(pdev));
605*d14abf15SRobert Mustacchi     if (vf_flr_inprogess) {
606*d14abf15SRobert Mustacchi         DbgMessage2(pdev, FATAL, "VF[%d(%d)] is FLRed\n", ABS_VFID(pdev), REL_VFID(pdev));
607*d14abf15SRobert Mustacchi     }
608*d14abf15SRobert Mustacchi     MM_RELEASE_PF_LOCK(PFDEV(pdev));
609*d14abf15SRobert Mustacchi     return vf_flr_inprogess;
610*d14abf15SRobert Mustacchi }
611*d14abf15SRobert Mustacchi 
lm_vf_pf_get_sb_running_index(struct _lm_device_t * pdev,u8_t sb_id,u8_t sm_idx)612*d14abf15SRobert Mustacchi u16_t lm_vf_pf_get_sb_running_index(struct _lm_device_t *pdev, u8_t sb_id, u8_t sm_idx)
613*d14abf15SRobert Mustacchi {
614*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_pf_get_sb_running_index is not used in basic VF\n");
615*d14abf15SRobert Mustacchi     DbgBreak();
616*d14abf15SRobert Mustacchi     return 0;
617*d14abf15SRobert Mustacchi }
618*d14abf15SRobert Mustacchi 
lm_vf_pf_get_sb_index(struct _lm_device_t * pdev,u8_t sb_id,u8_t idx)619*d14abf15SRobert Mustacchi u16_t lm_vf_pf_get_sb_index(struct _lm_device_t *pdev, u8_t sb_id, u8_t idx)
620*d14abf15SRobert Mustacchi {
621*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_pf_get_sb_running_index is not used in basic VF\n");
622*d14abf15SRobert Mustacchi     DbgBreak();
623*d14abf15SRobert Mustacchi     return 0;
624*d14abf15SRobert Mustacchi }
625*d14abf15SRobert Mustacchi 
lm_vf_get_doorbell_size(struct _lm_device_t * pdev)626*d14abf15SRobert Mustacchi u16_t lm_vf_get_doorbell_size(struct _lm_device_t *pdev)
627*d14abf15SRobert Mustacchi {
628*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_get_doorbell_size is not used in basic VF\n");
629*d14abf15SRobert Mustacchi     DbgBreak();
630*d14abf15SRobert Mustacchi     return 0;
631*d14abf15SRobert Mustacchi }
632*d14abf15SRobert Mustacchi 
lm_vf_pf_set_q_filters(struct _lm_device_t * pdev,u8 vf_qid,u8_t to_indicate,q_filter_type filter_type,u8_t * pbuf,u32_t buf_len,u16_t vlan_tag,u8_t set_mac)633*d14abf15SRobert Mustacchi lm_status_t lm_vf_pf_set_q_filters(struct _lm_device_t * pdev, u8 vf_qid, u8_t to_indicate, q_filter_type filter_type, u8_t * pbuf, u32_t buf_len, u16_t vlan_tag, u8_t set_mac)
634*d14abf15SRobert Mustacchi {
635*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_pf_set_q_filters is not used in basic VF\n");
636*d14abf15SRobert Mustacchi     DbgBreak();
637*d14abf15SRobert Mustacchi     return LM_STATUS_FAILURE;
638*d14abf15SRobert Mustacchi }
639*d14abf15SRobert Mustacchi 
lm_vf_pf_set_q_filters_list(struct _lm_device_t * pdev,u8 vf_qid,u8_t to_indicate,q_filter_type filter_type,d_list_t * pbuf,u16_t vlan_tag,u8_t set_mac)640*d14abf15SRobert Mustacchi lm_status_t lm_vf_pf_set_q_filters_list(struct _lm_device_t * pdev, u8 vf_qid, u8_t to_indicate, q_filter_type filter_type, d_list_t * pbuf, u16_t vlan_tag, u8_t set_mac)
641*d14abf15SRobert Mustacchi {
642*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_pf_set_q_filters_list is not used in basic VF\n");
643*d14abf15SRobert Mustacchi     DbgBreak();
644*d14abf15SRobert Mustacchi     return LM_STATUS_FAILURE;
645*d14abf15SRobert Mustacchi }
646*d14abf15SRobert Mustacchi 
lm_vf_pf_tear_q_down(struct _lm_device_t * pdev,u8 vf_qid)647*d14abf15SRobert Mustacchi lm_status_t lm_vf_pf_tear_q_down(struct _lm_device_t * pdev, u8 vf_qid)
648*d14abf15SRobert Mustacchi {
649*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_pf_tear_q_down is not used in basic VF\n");
650*d14abf15SRobert Mustacchi     DbgBreak();
651*d14abf15SRobert Mustacchi     return LM_STATUS_FAILURE;
652*d14abf15SRobert Mustacchi }
653*d14abf15SRobert Mustacchi 
lm_vf_queue_init(struct _lm_device_t * pdev,u8_t cid)654*d14abf15SRobert Mustacchi lm_status_t lm_vf_queue_init(struct _lm_device_t *pdev, u8_t cid)
655*d14abf15SRobert Mustacchi {
656*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_queue_init is not used in basic VF\n");
657*d14abf15SRobert Mustacchi     DbgBreak();
658*d14abf15SRobert Mustacchi     return LM_STATUS_FAILURE;
659*d14abf15SRobert Mustacchi }
660*d14abf15SRobert Mustacchi 
lm_vf_queue_close(struct _lm_device_t * pdev,u8_t cid)661*d14abf15SRobert Mustacchi lm_status_t lm_vf_queue_close(struct _lm_device_t *pdev, u8_t cid)
662*d14abf15SRobert Mustacchi {
663*d14abf15SRobert Mustacchi     DbgMessage(NULL, FATAL, "lm_vf_queue_close is not used in basic VF\n");
664*d14abf15SRobert Mustacchi     DbgBreak();
665*d14abf15SRobert Mustacchi     return LM_STATUS_FAILURE;
666*d14abf15SRobert Mustacchi }
667*d14abf15SRobert Mustacchi 
668*d14abf15SRobert Mustacchi #endif
669*d14abf15SRobert Mustacchi 
670