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:
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to