Commit 70db0788 authored by Slawomir Mrozowicz's avatar Slawomir Mrozowicz Committed by Tony Nguyen
Browse files

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: default avatarMateusz Polchlopek <mateusz.polchlopek@intel.com>
Reviewed-by: default avatarPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Tested-by: default avatarBharath R <bharath.r@intel.com>
Signed-off-by: default avatarSlawomir Mrozowicz <slawomirx.mrozowicz@intel.com>
Co-developed-by: default avatarPiotr Kwapulinski <piotr.kwapulinski@intel.com>
Signed-off-by: default avatarPiotr Kwapulinski <piotr.kwapulinski@intel.com>
Signed-off-by: default avatarJedrzej Jagielski <jedrzej.jagielski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 5f214150
Loading
Loading
Loading
Loading
+169 −0
Original line number Diff line number Diff line
@@ -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;
}

+15 −0
Original line number Diff line number Diff line
@@ -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 */