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
This commit is contained in:
parent
8cbcec3cf7
commit
672bab966c
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user