[dpdk-dev,v2,24/33] i40e/base: get pf_id from HW rather than PCI function

Message ID 1430406219-23901-25-git-send-email-helin.zhang@intel.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Zhang, Helin April 30, 2015, 3:03 p.m. UTC
  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.

Signed-off-by: Helin Zhang <helin.zhang@intel.com>
---
 lib/librte_pmd_i40e/i40e/i40e_common.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)
  

Comments

Jingjing Wu May 8, 2015, 3:20 a.m. UTC | #1
Acked-by: Jingjing Wu <jingjing.wu@intel.com>


> -----Original Message-----
> From: Zhang, Helin
> Sent: Thursday, April 30, 2015 11:04 PM
> To: dev@dpdk.org
> Cc: Cao, Min; Xu, Qian Q; Wu, Jingjing; Liu, Jijiang; Kenguva, Monica; Patel,
> Rashmin N; Murray, Steven J; Nelson, Shannon; Zhang, Helin
> Subject: [PATCH v2 24/33] i40e/base: get pf_id from HW rather than PCI
> function
> 
> 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.
> 
> Signed-off-by: Helin Zhang <helin.zhang@intel.com>
> ---
>  lib/librte_pmd_i40e/i40e/i40e_common.c | 23 +++++++++++------------
>  1 file changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/lib/librte_pmd_i40e/i40e/i40e_common.c
> b/lib/librte_pmd_i40e/i40e/i40e_common.c
> index 705b9dd..03980b9 100644
> --- a/lib/librte_pmd_i40e/i40e/i40e_common.c
> +++ b/lib/librte_pmd_i40e/i40e/i40e_common.c
> @@ -592,7 +592,7 @@ enum i40e_status_code i40e_validate_mac_addr(u8
> *mac_addr)  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");
> 
> @@ -607,18 +607,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;
> --
> 1.8.1.4
  

Patch

diff --git a/lib/librte_pmd_i40e/i40e/i40e_common.c b/lib/librte_pmd_i40e/i40e/i40e_common.c
index 705b9dd..03980b9 100644
--- a/lib/librte_pmd_i40e/i40e/i40e_common.c
+++ b/lib/librte_pmd_i40e/i40e/i40e_common.c
@@ -592,7 +592,7 @@  enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
 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");
 
@@ -607,18 +607,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;