i40e/base: fix hardware port number for pass-thru
authorHelin Zhang <helin.zhang@intel.com>
Thu, 30 Apr 2015 15:03:30 +0000 (23:03 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Sun, 17 May 2015 21:18:23 +0000 (23:18 +0200)
Getting the pf_id from the function number was a good place to
start, but when the PF was setup in pass-thru mode, the PCI
bus/device/function was virtualized and the number in the VM is
different from the number in the bare metal. This caused HW
configuration issues when the wrong pf_id was used to set up the
HMC and other structures. The PF_FUNC_RID register has the real
bus/device/function information as configured by the BIOS, so use
that for a better number.

Test report: http://www.dpdk.org/ml/archives/dev/2015-May/017384.html

Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Jijiang Liu <jijiang.liu@intel.com>
Tested-by: Min Cao <min.cao@intel.com>
lib/librte_pmd_i40e/i40e/i40e_common.c

index 1ca3040..81e0a6b 100644 (file)
@@ -568,7 +568,7 @@ struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
 {
        enum i40e_status_code status = I40E_SUCCESS;
-       u32 reg;
+       u32 port, ari, func_rid;
 
        DEBUGFUNC("i40e_init_shared_code");
 
@@ -583,18 +583,17 @@ enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
 
        hw->phy.get_link_info = true;
 
-       /* Determine port number */
-       reg = rd32(hw, I40E_PFGEN_PORTNUM);
-       reg = ((reg & I40E_PFGEN_PORTNUM_PORT_NUM_MASK) >>
-              I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT);
-       hw->port = (u8)reg;
-
-       /* Determine the PF number based on the PCI fn */
-       reg = rd32(hw, I40E_GLPCI_CAPSUP);
-       if (reg & I40E_GLPCI_CAPSUP_ARI_EN_MASK)
-               hw->pf_id = (u8)((hw->bus.device << 3) | hw->bus.func);
+       /* Determine port number and PF number*/
+       port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
+                                          >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
+       hw->port = (u8)port;
+       ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
+                                                I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
+       func_rid = rd32(hw, I40E_PF_FUNC_RID);
+       if (ari)
+               hw->pf_id = (u8)(func_rid & 0xff);
        else
-               hw->pf_id = (u8)hw->bus.func;
+               hw->pf_id = (u8)(func_rid & 0x7);
 
        status = i40e_init_nvm(hw);
        return status;