Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Jan 2016 06:26:37 +0000 (UTC)
From:      Andrew Rybchenko <arybchik@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r294078 - head/sys/dev/sfxge/common
Message-ID:  <201601150626.u0F6QbSV014293@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: arybchik
Date: Fri Jan 15 06:26:37 2016
New Revision: 294078
URL: https://svnweb.freebsd.org/changeset/base/294078

Log:
  sfxge: medford stores a single global copy of VPD
  
  Not per PF copies as on Huntington.
  
  Submitted by:   Mark Spender <mspender at solarflare.com>
  Reviewed by:    gnn
  Sponsored by:   Solarflare Communications, Inc.
  MFC after:      2 days
  Differential Revision: https://reviews.freebsd.org/D4935

Modified:
  head/sys/dev/sfxge/common/efx.h
  head/sys/dev/sfxge/common/hunt_vpd.c
  head/sys/dev/sfxge/common/medford_nic.c

Modified: head/sys/dev/sfxge/common/efx.h
==============================================================================
--- head/sys/dev/sfxge/common/efx.h	Fri Jan 15 06:25:26 2016	(r294077)
+++ head/sys/dev/sfxge/common/efx.h	Fri Jan 15 06:26:37 2016	(r294078)
@@ -1162,6 +1162,8 @@ typedef struct efx_nic_cfg_s {
 	/* External port identifier */
 	uint8_t			enc_external_port;
 	uint32_t		enc_mcdi_max_payload_length;
+	/* VPD may be per-PF or global */
+	boolean_t		enc_vpd_is_global;
 } efx_nic_cfg_t;
 
 #define	EFX_PCI_FUNCTION_IS_PF(_encp)	((_encp)->enc_vf == 0xffff)

Modified: head/sys/dev/sfxge/common/hunt_vpd.c
==============================================================================
--- head/sys/dev/sfxge/common/hunt_vpd.c	Fri Jan 15 06:25:26 2016	(r294077)
+++ head/sys/dev/sfxge/common/hunt_vpd.c	Fri Jan 15 06:26:37 2016	(r294078)
@@ -48,13 +48,20 @@ ef10_vpd_init(
 	caddr_t svpd;
 	size_t svpd_size;
 	uint32_t pci_pf;
+	uint32_t tag;
 	efx_rc_t rc;
 
 	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
 	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
 		    enp->en_family == EFX_FAMILY_MEDFORD);
 
-	pci_pf = enp->en_nic_cfg.enc_pf;
+	if (enp->en_nic_cfg.enc_vpd_is_global) {
+		tag = TLV_TAG_GLOBAL_STATIC_VPD;
+	} else {
+		pci_pf = enp->en_nic_cfg.enc_pf;
+		tag = TLV_TAG_PF_STATIC_VPD(pci_pf);
+	}
+
 	/*
 	 * The VPD interface exposes VPD resources from the combined static and
 	 * dynamic VPD storage. As the static VPD configuration should *never*
@@ -64,8 +71,7 @@ ef10_vpd_init(
 	svpd_size = 0;
 	rc = ef10_nvram_partn_read_tlv(enp,
 	    NVRAM_PARTITION_TYPE_STATIC_CONFIG,
-	    TLV_TAG_PF_STATIC_VPD(pci_pf),
-	    &svpd, &svpd_size);
+	    tag, &svpd, &svpd_size);
 	if (rc != 0) {
 		if (rc == EACCES) {
 			/* Unpriviledged functions cannot access VPD */
@@ -132,17 +138,22 @@ ef10_vpd_read(
 	caddr_t dvpd;
 	size_t dvpd_size;
 	uint32_t pci_pf;
+	uint32_t tag;
 	efx_rc_t rc;
 
 	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
 		    enp->en_family == EFX_FAMILY_MEDFORD);
 
-	pci_pf = enp->en_nic_cfg.enc_pf;
+	if (enp->en_nic_cfg.enc_vpd_is_global) {
+		tag = TLV_TAG_GLOBAL_DYNAMIC_VPD;
+	} else {
+		pci_pf = enp->en_nic_cfg.enc_pf;
+		tag = TLV_TAG_PF_DYNAMIC_VPD(pci_pf);
+	}
 
 	if ((rc = ef10_nvram_partn_read_tlv(enp,
 		    NVRAM_PARTITION_TYPE_DYNAMIC_CONFIG,
-		    TLV_TAG_PF_DYNAMIC_VPD(pci_pf),
-		    &dvpd, &dvpd_size)) != 0)
+		    tag, &dvpd, &dvpd_size)) != 0)
 		goto fail1;
 
 	if (dvpd_size > size) {
@@ -396,12 +407,18 @@ ef10_vpd_write(
 {
 	size_t vpd_length;
 	uint32_t pci_pf;
+	uint32_t tag;
 	efx_rc_t rc;
 
 	EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
 		    enp->en_family == EFX_FAMILY_MEDFORD);
 
-	pci_pf = enp->en_nic_cfg.enc_pf;
+	if (enp->en_nic_cfg.enc_vpd_is_global) {
+		tag = TLV_TAG_GLOBAL_DYNAMIC_VPD;
+	} else {
+		pci_pf = enp->en_nic_cfg.enc_pf;
+		tag = TLV_TAG_PF_DYNAMIC_VPD(pci_pf);
+	}
 
 	/* Determine total length of new dynamic VPD */
 	if ((rc = efx_vpd_hunk_length(data, size, &vpd_length)) != 0)
@@ -410,8 +427,7 @@ ef10_vpd_write(
 	/* Store new dynamic VPD in all segments in DYNAMIC_CONFIG partition */
 	if ((rc = ef10_nvram_partn_write_segment_tlv(enp,
 		    NVRAM_PARTITION_TYPE_DYNAMIC_CONFIG,
-		    TLV_TAG_PF_DYNAMIC_VPD(pci_pf),
-		    data, vpd_length, B_TRUE)) != 0) {
+		    tag, data, vpd_length, B_TRUE)) != 0) {
 		goto fail2;
 	}
 

Modified: head/sys/dev/sfxge/common/medford_nic.c
==============================================================================
--- head/sys/dev/sfxge/common/medford_nic.c	Fri Jan 15 06:25:26 2016	(r294077)
+++ head/sys/dev/sfxge/common/medford_nic.c	Fri Jan 15 06:26:37 2016	(r294078)
@@ -212,6 +212,12 @@ medford_board_cfg(
 	 */
 	encp->enc_tx_tso_tcp_header_offset_limit = EF10_TCP_HEADER_OFFSET_LIMIT;
 
+	/*
+	 * Medford stores a single global copy of VPD, not per-PF as on
+	 * Huntington.
+	 */
+	encp->enc_vpd_is_global = B_TRUE;
+
 	return (0);
 
 fail11:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201601150626.u0F6QbSV014293>