2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

ixgbe: read the OROM version information

Add functions reading the OROM version info and use them
as a part of the setting NVM info procedure.

Reviewed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Tested-by: Bharath R <bharath.r@intel.com>
Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozowicz@intel.com>
Co-developed-by: Piotr Kwapulinski <piotr.kwapulinski@intel.com>
Signed-off-by: Piotr Kwapulinski <piotr.kwapulinski@intel.com>
Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
Slawomir Mrozowicz 2025-04-10 14:59:59 +02:00 committed by Tony Nguyen
parent 5f214150c7
commit 70db0788a2
2 changed files with 184 additions and 0 deletions

View File

@ -2585,6 +2585,35 @@ static int ixgbe_read_nvm_module(struct ixgbe_hw *hw,
return err;
}
/**
* ixgbe_read_orom_module - Read from the active Option ROM module
* @hw: pointer to the HW structure
* @bank: whether to read from active or inactive OROM module
* @offset: offset into the OROM module to read, in words
* @data: storage for returned word value
*
* Read the specified word from the active Option ROM module of the flash.
* Note that unlike the NVM module, the CSS data is stored at the end of the
* module instead of at the beginning.
*
* Return: the exit code of the operation.
*/
static int ixgbe_read_orom_module(struct ixgbe_hw *hw,
enum ixgbe_bank_select bank,
u32 offset, u16 *data)
{
__le16 data_local;
int err;
err = ixgbe_read_flash_module(hw, bank, IXGBE_E610_SR_1ST_OROM_BANK_PTR,
offset * sizeof(data_local),
(u8 *)&data_local, sizeof(data_local));
if (!err)
*data = le16_to_cpu(data_local);
return err;
}
/**
* ixgbe_get_nvm_css_hdr_len - Read the CSS header length
* @hw: pointer to the HW struct
@ -2681,6 +2710,141 @@ static int ixgbe_get_nvm_srev(struct ixgbe_hw *hw,
return 0;
}
/**
* ixgbe_get_orom_civd_data - Get the combo version information from Option ROM
* @hw: pointer to the HW struct
* @bank: whether to read from the active or inactive flash module
* @civd: storage for the Option ROM CIVD data.
*
* Searches through the Option ROM flash contents to locate the CIVD data for
* the image.
*
* Return: the exit code of the operation.
*/
static int
ixgbe_get_orom_civd_data(struct ixgbe_hw *hw, enum ixgbe_bank_select bank,
struct ixgbe_orom_civd_info *civd)
{
struct ixgbe_orom_civd_info tmp;
u32 offset;
int err;
/* The CIVD section is located in the Option ROM aligned to 512 bytes.
* The first 4 bytes must contain the ASCII characters "$CIV".
* A simple modulo 256 sum of all of the bytes of the structure must
* equal 0.
*/
for (offset = 0; (offset + SZ_512) <= hw->flash.banks.orom_size;
offset += SZ_512) {
u8 sum = 0;
u32 i;
err = ixgbe_read_flash_module(hw, bank,
IXGBE_E610_SR_1ST_OROM_BANK_PTR,
offset,
(u8 *)&tmp, sizeof(tmp));
if (err)
return err;
/* Skip forward until we find a matching signature */
if (memcmp(IXGBE_OROM_CIV_SIGNATURE, tmp.signature,
sizeof(tmp.signature)))
continue;
/* Verify that the simple checksum is zero */
for (i = 0; i < sizeof(tmp); i++)
sum += ((u8 *)&tmp)[i];
if (sum)
return -EDOM;
*civd = tmp;
return 0;
}
return -ENODATA;
}
/**
* ixgbe_get_orom_srev - Read the security revision from the OROM CSS header
* @hw: pointer to the HW struct
* @bank: whether to read from active or inactive flash module
* @srev: storage for security revision
*
* Read the security revision out of the CSS header of the active OROM module
* bank.
*
* Return: the exit code of the operation.
*/
static int ixgbe_get_orom_srev(struct ixgbe_hw *hw,
enum ixgbe_bank_select bank,
u32 *srev)
{
u32 orom_size_word = hw->flash.banks.orom_size / 2;
u32 css_start, hdr_len;
u16 srev_l, srev_h;
int err;
err = ixgbe_get_nvm_css_hdr_len(hw, bank, &hdr_len);
if (err)
return err;
if (orom_size_word < hdr_len)
return -EINVAL;
/* Calculate how far into the Option ROM the CSS header starts. Note
* that ixgbe_read_orom_module takes a word offset.
*/
css_start = orom_size_word - hdr_len;
err = ixgbe_read_orom_module(hw, bank,
css_start + IXGBE_NVM_CSS_SREV_L,
&srev_l);
if (err)
return err;
err = ixgbe_read_orom_module(hw, bank,
css_start + IXGBE_NVM_CSS_SREV_H,
&srev_h);
if (err)
return err;
*srev = srev_h << 16 | srev_l;
return 0;
}
/**
* ixgbe_get_orom_ver_info - Read Option ROM version information
* @hw: pointer to the HW struct
* @bank: whether to read from the active or inactive flash module
* @orom: pointer to Option ROM info structure
*
* Read Option ROM version and security revision from the Option ROM flash
* section.
*
* Return: the exit code of the operation.
*/
static int ixgbe_get_orom_ver_info(struct ixgbe_hw *hw,
enum ixgbe_bank_select bank,
struct ixgbe_orom_info *orom)
{
struct ixgbe_orom_civd_info civd;
u32 combo_ver;
int err;
err = ixgbe_get_orom_civd_data(hw, bank, &civd);
if (err)
return err;
combo_ver = le32_to_cpu(civd.combo_ver);
orom->major = (u8)FIELD_GET(IXGBE_OROM_VER_MASK, combo_ver);
orom->patch = (u8)FIELD_GET(IXGBE_OROM_VER_PATCH_MASK, combo_ver);
orom->build = (u16)FIELD_GET(IXGBE_OROM_VER_BUILD_MASK, combo_ver);
return ixgbe_get_orom_srev(hw, bank, &orom->srev);
}
/**
* ixgbe_get_nvm_ver_info - Read NVM version information
* @hw: pointer to the HW struct
@ -2768,6 +2932,11 @@ int ixgbe_get_flash_data(struct ixgbe_hw *hw)
err = ixgbe_get_nvm_ver_info(hw, IXGBE_ACTIVE_FLASH_BANK,
&flash->nvm);
if (err)
return err;
err = ixgbe_get_orom_ver_info(hw, IXGBE_ACTIVE_FLASH_BANK,
&flash->orom);
return err;
}

View File

@ -26,6 +26,11 @@
#define IXGBE_E610_SR_NETLIST_BANK_PTR 0x46
#define IXGBE_E610_SR_NETLIST_BANK_SIZE 0x47
/* The OROM version topology */
#define IXGBE_OROM_VER_PATCH_MASK GENMASK_ULL(7, 0)
#define IXGBE_OROM_VER_BUILD_MASK GENMASK_ULL(23, 8)
#define IXGBE_OROM_VER_MASK GENMASK_ULL(31, 24)
/* CSS Header words */
#define IXGBE_NVM_CSS_HDR_LEN_L 0x02
#define IXGBE_NVM_CSS_HDR_LEN_H 0x03
@ -1017,6 +1022,16 @@ struct ixgbe_hw_caps {
#define IXGBE_EXT_TOPO_DEV_IMG_PROG_EN BIT(1)
} __packed;
#define IXGBE_OROM_CIV_SIGNATURE "$CIV"
struct ixgbe_orom_civd_info {
u8 signature[4]; /* Must match ASCII '$CIV' characters */
u8 checksum; /* Simple modulo 256 sum of all structure bytes must equal 0 */
__le32 combo_ver; /* Combo Image Version number */
u8 combo_name_len; /* Length of the unicode combo image version string, max of 32 */
__le16 combo_name[32]; /* Unicode string representing the Combo Image version */
};
/* Function specific capabilities */
struct ixgbe_hw_func_caps {
u32 num_allocd_vfs; /* Number of allocated VFs */