cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ice_nvm.c (36487B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2018, Intel Corporation. */
      3
      4#include <linux/vmalloc.h>
      5
      6#include "ice_common.h"
      7
      8/**
      9 * ice_aq_read_nvm
     10 * @hw: pointer to the HW struct
     11 * @module_typeid: module pointer location in words from the NVM beginning
     12 * @offset: byte offset from the module beginning
     13 * @length: length of the section to be read (in bytes from the offset)
     14 * @data: command buffer (size [bytes] = length)
     15 * @last_command: tells if this is the last command in a series
     16 * @read_shadow_ram: tell if this is a shadow RAM read
     17 * @cd: pointer to command details structure or NULL
     18 *
     19 * Read the NVM using the admin queue commands (0x0701)
     20 */
     21static int
     22ice_aq_read_nvm(struct ice_hw *hw, u16 module_typeid, u32 offset, u16 length,
     23		void *data, bool last_command, bool read_shadow_ram,
     24		struct ice_sq_cd *cd)
     25{
     26	struct ice_aq_desc desc;
     27	struct ice_aqc_nvm *cmd;
     28
     29	cmd = &desc.params.nvm;
     30
     31	if (offset > ICE_AQC_NVM_MAX_OFFSET)
     32		return -EINVAL;
     33
     34	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_read);
     35
     36	if (!read_shadow_ram && module_typeid == ICE_AQC_NVM_START_POINT)
     37		cmd->cmd_flags |= ICE_AQC_NVM_FLASH_ONLY;
     38
     39	/* If this is the last command in a series, set the proper flag. */
     40	if (last_command)
     41		cmd->cmd_flags |= ICE_AQC_NVM_LAST_CMD;
     42	cmd->module_typeid = cpu_to_le16(module_typeid);
     43	cmd->offset_low = cpu_to_le16(offset & 0xFFFF);
     44	cmd->offset_high = (offset >> 16) & 0xFF;
     45	cmd->length = cpu_to_le16(length);
     46
     47	return ice_aq_send_cmd(hw, &desc, data, length, cd);
     48}
     49
     50/**
     51 * ice_read_flat_nvm - Read portion of NVM by flat offset
     52 * @hw: pointer to the HW struct
     53 * @offset: offset from beginning of NVM
     54 * @length: (in) number of bytes to read; (out) number of bytes actually read
     55 * @data: buffer to return data in (sized to fit the specified length)
     56 * @read_shadow_ram: if true, read from shadow RAM instead of NVM
     57 *
     58 * Reads a portion of the NVM, as a flat memory space. This function correctly
     59 * breaks read requests across Shadow RAM sectors and ensures that no single
     60 * read request exceeds the maximum 4KB read for a single AdminQ command.
     61 *
     62 * Returns a status code on failure. Note that the data pointer may be
     63 * partially updated if some reads succeed before a failure.
     64 */
     65int
     66ice_read_flat_nvm(struct ice_hw *hw, u32 offset, u32 *length, u8 *data,
     67		  bool read_shadow_ram)
     68{
     69	u32 inlen = *length;
     70	u32 bytes_read = 0;
     71	bool last_cmd;
     72	int status;
     73
     74	*length = 0;
     75
     76	/* Verify the length of the read if this is for the Shadow RAM */
     77	if (read_shadow_ram && ((offset + inlen) > (hw->flash.sr_words * 2u))) {
     78		ice_debug(hw, ICE_DBG_NVM, "NVM error: requested offset is beyond Shadow RAM limit\n");
     79		return -EINVAL;
     80	}
     81
     82	do {
     83		u32 read_size, sector_offset;
     84
     85		/* ice_aq_read_nvm cannot read more than 4KB at a time.
     86		 * Additionally, a read from the Shadow RAM may not cross over
     87		 * a sector boundary. Conveniently, the sector size is also
     88		 * 4KB.
     89		 */
     90		sector_offset = offset % ICE_AQ_MAX_BUF_LEN;
     91		read_size = min_t(u32, ICE_AQ_MAX_BUF_LEN - sector_offset,
     92				  inlen - bytes_read);
     93
     94		last_cmd = !(bytes_read + read_size < inlen);
     95
     96		status = ice_aq_read_nvm(hw, ICE_AQC_NVM_START_POINT,
     97					 offset, read_size,
     98					 data + bytes_read, last_cmd,
     99					 read_shadow_ram, NULL);
    100		if (status)
    101			break;
    102
    103		bytes_read += read_size;
    104		offset += read_size;
    105	} while (!last_cmd);
    106
    107	*length = bytes_read;
    108	return status;
    109}
    110
    111/**
    112 * ice_aq_update_nvm
    113 * @hw: pointer to the HW struct
    114 * @module_typeid: module pointer location in words from the NVM beginning
    115 * @offset: byte offset from the module beginning
    116 * @length: length of the section to be written (in bytes from the offset)
    117 * @data: command buffer (size [bytes] = length)
    118 * @last_command: tells if this is the last command in a series
    119 * @command_flags: command parameters
    120 * @cd: pointer to command details structure or NULL
    121 *
    122 * Update the NVM using the admin queue commands (0x0703)
    123 */
    124int
    125ice_aq_update_nvm(struct ice_hw *hw, u16 module_typeid, u32 offset,
    126		  u16 length, void *data, bool last_command, u8 command_flags,
    127		  struct ice_sq_cd *cd)
    128{
    129	struct ice_aq_desc desc;
    130	struct ice_aqc_nvm *cmd;
    131
    132	cmd = &desc.params.nvm;
    133
    134	/* In offset the highest byte must be zeroed. */
    135	if (offset & 0xFF000000)
    136		return -EINVAL;
    137
    138	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_write);
    139
    140	cmd->cmd_flags |= command_flags;
    141
    142	/* If this is the last command in a series, set the proper flag. */
    143	if (last_command)
    144		cmd->cmd_flags |= ICE_AQC_NVM_LAST_CMD;
    145	cmd->module_typeid = cpu_to_le16(module_typeid);
    146	cmd->offset_low = cpu_to_le16(offset & 0xFFFF);
    147	cmd->offset_high = (offset >> 16) & 0xFF;
    148	cmd->length = cpu_to_le16(length);
    149
    150	desc.flags |= cpu_to_le16(ICE_AQ_FLAG_RD);
    151
    152	return ice_aq_send_cmd(hw, &desc, data, length, cd);
    153}
    154
    155/**
    156 * ice_aq_erase_nvm
    157 * @hw: pointer to the HW struct
    158 * @module_typeid: module pointer location in words from the NVM beginning
    159 * @cd: pointer to command details structure or NULL
    160 *
    161 * Erase the NVM sector using the admin queue commands (0x0702)
    162 */
    163int ice_aq_erase_nvm(struct ice_hw *hw, u16 module_typeid, struct ice_sq_cd *cd)
    164{
    165	struct ice_aq_desc desc;
    166	struct ice_aqc_nvm *cmd;
    167
    168	cmd = &desc.params.nvm;
    169
    170	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_erase);
    171
    172	cmd->module_typeid = cpu_to_le16(module_typeid);
    173	cmd->length = cpu_to_le16(ICE_AQC_NVM_ERASE_LEN);
    174	cmd->offset_low = 0;
    175	cmd->offset_high = 0;
    176
    177	return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
    178}
    179
    180/**
    181 * ice_read_sr_word_aq - Reads Shadow RAM via AQ
    182 * @hw: pointer to the HW structure
    183 * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
    184 * @data: word read from the Shadow RAM
    185 *
    186 * Reads one 16 bit word from the Shadow RAM using ice_read_flat_nvm.
    187 */
    188static int ice_read_sr_word_aq(struct ice_hw *hw, u16 offset, u16 *data)
    189{
    190	u32 bytes = sizeof(u16);
    191	__le16 data_local;
    192	int status;
    193
    194	/* Note that ice_read_flat_nvm takes into account the 4Kb AdminQ and
    195	 * Shadow RAM sector restrictions necessary when reading from the NVM.
    196	 */
    197	status = ice_read_flat_nvm(hw, offset * sizeof(u16), &bytes,
    198				   (__force u8 *)&data_local, true);
    199	if (status)
    200		return status;
    201
    202	*data = le16_to_cpu(data_local);
    203	return 0;
    204}
    205
    206/**
    207 * ice_acquire_nvm - Generic request for acquiring the NVM ownership
    208 * @hw: pointer to the HW structure
    209 * @access: NVM access type (read or write)
    210 *
    211 * This function will request NVM ownership.
    212 */
    213int ice_acquire_nvm(struct ice_hw *hw, enum ice_aq_res_access_type access)
    214{
    215	if (hw->flash.blank_nvm_mode)
    216		return 0;
    217
    218	return ice_acquire_res(hw, ICE_NVM_RES_ID, access, ICE_NVM_TIMEOUT);
    219}
    220
    221/**
    222 * ice_release_nvm - Generic request for releasing the NVM ownership
    223 * @hw: pointer to the HW structure
    224 *
    225 * This function will release NVM ownership.
    226 */
    227void ice_release_nvm(struct ice_hw *hw)
    228{
    229	if (hw->flash.blank_nvm_mode)
    230		return;
    231
    232	ice_release_res(hw, ICE_NVM_RES_ID);
    233}
    234
    235/**
    236 * ice_get_flash_bank_offset - Get offset into requested flash bank
    237 * @hw: pointer to the HW structure
    238 * @bank: whether to read from the active or inactive flash bank
    239 * @module: the module to read from
    240 *
    241 * Based on the module, lookup the module offset from the beginning of the
    242 * flash.
    243 *
    244 * Returns the flash offset. Note that a value of zero is invalid and must be
    245 * treated as an error.
    246 */
    247static u32 ice_get_flash_bank_offset(struct ice_hw *hw, enum ice_bank_select bank, u16 module)
    248{
    249	struct ice_bank_info *banks = &hw->flash.banks;
    250	enum ice_flash_bank active_bank;
    251	bool second_bank_active;
    252	u32 offset, size;
    253
    254	switch (module) {
    255	case ICE_SR_1ST_NVM_BANK_PTR:
    256		offset = banks->nvm_ptr;
    257		size = banks->nvm_size;
    258		active_bank = banks->nvm_bank;
    259		break;
    260	case ICE_SR_1ST_OROM_BANK_PTR:
    261		offset = banks->orom_ptr;
    262		size = banks->orom_size;
    263		active_bank = banks->orom_bank;
    264		break;
    265	case ICE_SR_NETLIST_BANK_PTR:
    266		offset = banks->netlist_ptr;
    267		size = banks->netlist_size;
    268		active_bank = banks->netlist_bank;
    269		break;
    270	default:
    271		ice_debug(hw, ICE_DBG_NVM, "Unexpected value for flash module: 0x%04x\n", module);
    272		return 0;
    273	}
    274
    275	switch (active_bank) {
    276	case ICE_1ST_FLASH_BANK:
    277		second_bank_active = false;
    278		break;
    279	case ICE_2ND_FLASH_BANK:
    280		second_bank_active = true;
    281		break;
    282	default:
    283		ice_debug(hw, ICE_DBG_NVM, "Unexpected value for active flash bank: %u\n",
    284			  active_bank);
    285		return 0;
    286	}
    287
    288	/* The second flash bank is stored immediately following the first
    289	 * bank. Based on whether the 1st or 2nd bank is active, and whether
    290	 * we want the active or inactive bank, calculate the desired offset.
    291	 */
    292	switch (bank) {
    293	case ICE_ACTIVE_FLASH_BANK:
    294		return offset + (second_bank_active ? size : 0);
    295	case ICE_INACTIVE_FLASH_BANK:
    296		return offset + (second_bank_active ? 0 : size);
    297	}
    298
    299	ice_debug(hw, ICE_DBG_NVM, "Unexpected value for flash bank selection: %u\n", bank);
    300	return 0;
    301}
    302
    303/**
    304 * ice_read_flash_module - Read a word from one of the main NVM modules
    305 * @hw: pointer to the HW structure
    306 * @bank: which bank of the module to read
    307 * @module: the module to read
    308 * @offset: the offset into the module in bytes
    309 * @data: storage for the word read from the flash
    310 * @length: bytes of data to read
    311 *
    312 * Read data from the specified flash module. The bank parameter indicates
    313 * whether or not to read from the active bank or the inactive bank of that
    314 * module.
    315 *
    316 * The word will be read using flat NVM access, and relies on the
    317 * hw->flash.banks data being setup by ice_determine_active_flash_banks()
    318 * during initialization.
    319 */
    320static int
    321ice_read_flash_module(struct ice_hw *hw, enum ice_bank_select bank, u16 module,
    322		      u32 offset, u8 *data, u32 length)
    323{
    324	int status;
    325	u32 start;
    326
    327	start = ice_get_flash_bank_offset(hw, bank, module);
    328	if (!start) {
    329		ice_debug(hw, ICE_DBG_NVM, "Unable to calculate flash bank offset for module 0x%04x\n",
    330			  module);
    331		return -EINVAL;
    332	}
    333
    334	status = ice_acquire_nvm(hw, ICE_RES_READ);
    335	if (status)
    336		return status;
    337
    338	status = ice_read_flat_nvm(hw, start + offset, &length, data, false);
    339
    340	ice_release_nvm(hw);
    341
    342	return status;
    343}
    344
    345/**
    346 * ice_read_nvm_module - Read from the active main NVM module
    347 * @hw: pointer to the HW structure
    348 * @bank: whether to read from active or inactive NVM module
    349 * @offset: offset into the NVM module to read, in words
    350 * @data: storage for returned word value
    351 *
    352 * Read the specified word from the active NVM module. This includes the CSS
    353 * header at the start of the NVM module.
    354 */
    355static int
    356ice_read_nvm_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
    357{
    358	__le16 data_local;
    359	int status;
    360
    361	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_NVM_BANK_PTR, offset * sizeof(u16),
    362				       (__force u8 *)&data_local, sizeof(u16));
    363	if (!status)
    364		*data = le16_to_cpu(data_local);
    365
    366	return status;
    367}
    368
    369/**
    370 * ice_read_nvm_sr_copy - Read a word from the Shadow RAM copy in the NVM bank
    371 * @hw: pointer to the HW structure
    372 * @bank: whether to read from the active or inactive NVM module
    373 * @offset: offset into the Shadow RAM copy to read, in words
    374 * @data: storage for returned word value
    375 *
    376 * Read the specified word from the copy of the Shadow RAM found in the
    377 * specified NVM module.
    378 */
    379static int
    380ice_read_nvm_sr_copy(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
    381{
    382	return ice_read_nvm_module(hw, bank, ICE_NVM_SR_COPY_WORD_OFFSET + offset, data);
    383}
    384
    385/**
    386 * ice_read_netlist_module - Read data from the netlist module area
    387 * @hw: pointer to the HW structure
    388 * @bank: whether to read from the active or inactive module
    389 * @offset: offset into the netlist to read from
    390 * @data: storage for returned word value
    391 *
    392 * Read a word from the specified netlist bank.
    393 */
    394static int
    395ice_read_netlist_module(struct ice_hw *hw, enum ice_bank_select bank, u32 offset, u16 *data)
    396{
    397	__le16 data_local;
    398	int status;
    399
    400	status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR, offset * sizeof(u16),
    401				       (__force u8 *)&data_local, sizeof(u16));
    402	if (!status)
    403		*data = le16_to_cpu(data_local);
    404
    405	return status;
    406}
    407
    408/**
    409 * ice_read_sr_word - Reads Shadow RAM word and acquire NVM if necessary
    410 * @hw: pointer to the HW structure
    411 * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF)
    412 * @data: word read from the Shadow RAM
    413 *
    414 * Reads one 16 bit word from the Shadow RAM using the ice_read_sr_word_aq.
    415 */
    416int ice_read_sr_word(struct ice_hw *hw, u16 offset, u16 *data)
    417{
    418	int status;
    419
    420	status = ice_acquire_nvm(hw, ICE_RES_READ);
    421	if (!status) {
    422		status = ice_read_sr_word_aq(hw, offset, data);
    423		ice_release_nvm(hw);
    424	}
    425
    426	return status;
    427}
    428
    429/**
    430 * ice_get_pfa_module_tlv - Reads sub module TLV from NVM PFA
    431 * @hw: pointer to hardware structure
    432 * @module_tlv: pointer to module TLV to return
    433 * @module_tlv_len: pointer to module TLV length to return
    434 * @module_type: module type requested
    435 *
    436 * Finds the requested sub module TLV type from the Preserved Field
    437 * Area (PFA) and returns the TLV pointer and length. The caller can
    438 * use these to read the variable length TLV value.
    439 */
    440int
    441ice_get_pfa_module_tlv(struct ice_hw *hw, u16 *module_tlv, u16 *module_tlv_len,
    442		       u16 module_type)
    443{
    444	u16 pfa_len, pfa_ptr;
    445	u16 next_tlv;
    446	int status;
    447
    448	status = ice_read_sr_word(hw, ICE_SR_PFA_PTR, &pfa_ptr);
    449	if (status) {
    450		ice_debug(hw, ICE_DBG_INIT, "Preserved Field Array pointer.\n");
    451		return status;
    452	}
    453	status = ice_read_sr_word(hw, pfa_ptr, &pfa_len);
    454	if (status) {
    455		ice_debug(hw, ICE_DBG_INIT, "Failed to read PFA length.\n");
    456		return status;
    457	}
    458	/* Starting with first TLV after PFA length, iterate through the list
    459	 * of TLVs to find the requested one.
    460	 */
    461	next_tlv = pfa_ptr + 1;
    462	while (next_tlv < pfa_ptr + pfa_len) {
    463		u16 tlv_sub_module_type;
    464		u16 tlv_len;
    465
    466		/* Read TLV type */
    467		status = ice_read_sr_word(hw, next_tlv, &tlv_sub_module_type);
    468		if (status) {
    469			ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV type.\n");
    470			break;
    471		}
    472		/* Read TLV length */
    473		status = ice_read_sr_word(hw, next_tlv + 1, &tlv_len);
    474		if (status) {
    475			ice_debug(hw, ICE_DBG_INIT, "Failed to read TLV length.\n");
    476			break;
    477		}
    478		if (tlv_sub_module_type == module_type) {
    479			if (tlv_len) {
    480				*module_tlv = next_tlv;
    481				*module_tlv_len = tlv_len;
    482				return 0;
    483			}
    484			return -EINVAL;
    485		}
    486		/* Check next TLV, i.e. current TLV pointer + length + 2 words
    487		 * (for current TLV's type and length)
    488		 */
    489		next_tlv = next_tlv + tlv_len + 2;
    490	}
    491	/* Module does not exist */
    492	return -ENOENT;
    493}
    494
    495/**
    496 * ice_read_pba_string - Reads part number string from NVM
    497 * @hw: pointer to hardware structure
    498 * @pba_num: stores the part number string from the NVM
    499 * @pba_num_size: part number string buffer length
    500 *
    501 * Reads the part number string from the NVM.
    502 */
    503int ice_read_pba_string(struct ice_hw *hw, u8 *pba_num, u32 pba_num_size)
    504{
    505	u16 pba_tlv, pba_tlv_len;
    506	u16 pba_word, pba_size;
    507	int status;
    508	u16 i;
    509
    510	status = ice_get_pfa_module_tlv(hw, &pba_tlv, &pba_tlv_len,
    511					ICE_SR_PBA_BLOCK_PTR);
    512	if (status) {
    513		ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Block TLV.\n");
    514		return status;
    515	}
    516
    517	/* pba_size is the next word */
    518	status = ice_read_sr_word(hw, (pba_tlv + 2), &pba_size);
    519	if (status) {
    520		ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Section size.\n");
    521		return status;
    522	}
    523
    524	if (pba_tlv_len < pba_size) {
    525		ice_debug(hw, ICE_DBG_INIT, "Invalid PBA Block TLV size.\n");
    526		return -EINVAL;
    527	}
    528
    529	/* Subtract one to get PBA word count (PBA Size word is included in
    530	 * total size)
    531	 */
    532	pba_size--;
    533	if (pba_num_size < (((u32)pba_size * 2) + 1)) {
    534		ice_debug(hw, ICE_DBG_INIT, "Buffer too small for PBA data.\n");
    535		return -EINVAL;
    536	}
    537
    538	for (i = 0; i < pba_size; i++) {
    539		status = ice_read_sr_word(hw, (pba_tlv + 2 + 1) + i, &pba_word);
    540		if (status) {
    541			ice_debug(hw, ICE_DBG_INIT, "Failed to read PBA Block word %d.\n", i);
    542			return status;
    543		}
    544
    545		pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
    546		pba_num[(i * 2) + 1] = pba_word & 0xFF;
    547	}
    548	pba_num[(pba_size * 2)] = '\0';
    549
    550	return status;
    551}
    552
    553/**
    554 * ice_get_nvm_ver_info - Read NVM version information
    555 * @hw: pointer to the HW struct
    556 * @bank: whether to read from the active or inactive flash bank
    557 * @nvm: pointer to NVM info structure
    558 *
    559 * Read the NVM EETRACK ID and map version of the main NVM image bank, filling
    560 * in the NVM info structure.
    561 */
    562static int
    563ice_get_nvm_ver_info(struct ice_hw *hw, enum ice_bank_select bank, struct ice_nvm_info *nvm)
    564{
    565	u16 eetrack_lo, eetrack_hi, ver;
    566	int status;
    567
    568	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_DEV_STARTER_VER, &ver);
    569	if (status) {
    570		ice_debug(hw, ICE_DBG_NVM, "Failed to read DEV starter version.\n");
    571		return status;
    572	}
    573
    574	nvm->major = (ver & ICE_NVM_VER_HI_MASK) >> ICE_NVM_VER_HI_SHIFT;
    575	nvm->minor = (ver & ICE_NVM_VER_LO_MASK) >> ICE_NVM_VER_LO_SHIFT;
    576
    577	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_LO, &eetrack_lo);
    578	if (status) {
    579		ice_debug(hw, ICE_DBG_NVM, "Failed to read EETRACK lo.\n");
    580		return status;
    581	}
    582	status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_HI, &eetrack_hi);
    583	if (status) {
    584		ice_debug(hw, ICE_DBG_NVM, "Failed to read EETRACK hi.\n");
    585		return status;
    586	}
    587
    588	nvm->eetrack = (eetrack_hi << 16) | eetrack_lo;
    589
    590	return 0;
    591}
    592
    593/**
    594 * ice_get_inactive_nvm_ver - Read Option ROM version from the inactive bank
    595 * @hw: pointer to the HW structure
    596 * @nvm: storage for Option ROM version information
    597 *
    598 * Reads the NVM EETRACK ID, Map version, and security revision of the
    599 * inactive NVM bank. Used to access version data for a pending update that
    600 * has not yet been activated.
    601 */
    602int ice_get_inactive_nvm_ver(struct ice_hw *hw, struct ice_nvm_info *nvm)
    603{
    604	return ice_get_nvm_ver_info(hw, ICE_INACTIVE_FLASH_BANK, nvm);
    605}
    606
    607/**
    608 * ice_get_orom_civd_data - Get the combo version information from Option ROM
    609 * @hw: pointer to the HW struct
    610 * @bank: whether to read from the active or inactive flash module
    611 * @civd: storage for the Option ROM CIVD data.
    612 *
    613 * Searches through the Option ROM flash contents to locate the CIVD data for
    614 * the image.
    615 */
    616static int
    617ice_get_orom_civd_data(struct ice_hw *hw, enum ice_bank_select bank,
    618		       struct ice_orom_civd_info *civd)
    619{
    620	u8 *orom_data;
    621	int status;
    622	u32 offset;
    623
    624	/* The CIVD section is located in the Option ROM aligned to 512 bytes.
    625	 * The first 4 bytes must contain the ASCII characters "$CIV".
    626	 * A simple modulo 256 sum of all of the bytes of the structure must
    627	 * equal 0.
    628	 *
    629	 * The exact location is unknown and varies between images but is
    630	 * usually somewhere in the middle of the bank. We need to scan the
    631	 * Option ROM bank to locate it.
    632	 *
    633	 * It's significantly faster to read the entire Option ROM up front
    634	 * using the maximum page size, than to read each possible location
    635	 * with a separate firmware command.
    636	 */
    637	orom_data = vzalloc(hw->flash.banks.orom_size);
    638	if (!orom_data)
    639		return -ENOMEM;
    640
    641	status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR, 0,
    642				       orom_data, hw->flash.banks.orom_size);
    643	if (status) {
    644		vfree(orom_data);
    645		ice_debug(hw, ICE_DBG_NVM, "Unable to read Option ROM data\n");
    646		return status;
    647	}
    648
    649	/* Scan the memory buffer to locate the CIVD data section */
    650	for (offset = 0; (offset + 512) <= hw->flash.banks.orom_size; offset += 512) {
    651		struct ice_orom_civd_info *tmp;
    652		u8 sum = 0, i;
    653
    654		tmp = (struct ice_orom_civd_info *)&orom_data[offset];
    655
    656		/* Skip forward until we find a matching signature */
    657		if (memcmp("$CIV", tmp->signature, sizeof(tmp->signature)) != 0)
    658			continue;
    659
    660		ice_debug(hw, ICE_DBG_NVM, "Found CIVD section at offset %u\n",
    661			  offset);
    662
    663		/* Verify that the simple checksum is zero */
    664		for (i = 0; i < sizeof(*tmp); i++)
    665			/* cppcheck-suppress objectIndex */
    666			sum += ((u8 *)tmp)[i];
    667
    668		if (sum) {
    669			ice_debug(hw, ICE_DBG_NVM, "Found CIVD data with invalid checksum of %u\n",
    670				  sum);
    671			goto err_invalid_checksum;
    672		}
    673
    674		*civd = *tmp;
    675		vfree(orom_data);
    676		return 0;
    677	}
    678
    679	ice_debug(hw, ICE_DBG_NVM, "Unable to locate CIVD data within the Option ROM\n");
    680
    681err_invalid_checksum:
    682	vfree(orom_data);
    683	return -EIO;
    684}
    685
    686/**
    687 * ice_get_orom_ver_info - Read Option ROM version information
    688 * @hw: pointer to the HW struct
    689 * @bank: whether to read from the active or inactive flash module
    690 * @orom: pointer to Option ROM info structure
    691 *
    692 * Read Option ROM version and security revision from the Option ROM flash
    693 * section.
    694 */
    695static int
    696ice_get_orom_ver_info(struct ice_hw *hw, enum ice_bank_select bank, struct ice_orom_info *orom)
    697{
    698	struct ice_orom_civd_info civd;
    699	u32 combo_ver;
    700	int status;
    701
    702	status = ice_get_orom_civd_data(hw, bank, &civd);
    703	if (status) {
    704		ice_debug(hw, ICE_DBG_NVM, "Failed to locate valid Option ROM CIVD data\n");
    705		return status;
    706	}
    707
    708	combo_ver = le32_to_cpu(civd.combo_ver);
    709
    710	orom->major = (u8)((combo_ver & ICE_OROM_VER_MASK) >> ICE_OROM_VER_SHIFT);
    711	orom->patch = (u8)(combo_ver & ICE_OROM_VER_PATCH_MASK);
    712	orom->build = (u16)((combo_ver & ICE_OROM_VER_BUILD_MASK) >> ICE_OROM_VER_BUILD_SHIFT);
    713
    714	return 0;
    715}
    716
    717/**
    718 * ice_get_inactive_orom_ver - Read Option ROM version from the inactive bank
    719 * @hw: pointer to the HW structure
    720 * @orom: storage for Option ROM version information
    721 *
    722 * Reads the Option ROM version and security revision data for the inactive
    723 * section of flash. Used to access version data for a pending update that has
    724 * not yet been activated.
    725 */
    726int ice_get_inactive_orom_ver(struct ice_hw *hw, struct ice_orom_info *orom)
    727{
    728	return ice_get_orom_ver_info(hw, ICE_INACTIVE_FLASH_BANK, orom);
    729}
    730
    731/**
    732 * ice_get_netlist_info
    733 * @hw: pointer to the HW struct
    734 * @bank: whether to read from the active or inactive flash bank
    735 * @netlist: pointer to netlist version info structure
    736 *
    737 * Get the netlist version information from the requested bank. Reads the Link
    738 * Topology section to find the Netlist ID block and extract the relevant
    739 * information into the netlist version structure.
    740 */
    741static int
    742ice_get_netlist_info(struct ice_hw *hw, enum ice_bank_select bank,
    743		     struct ice_netlist_info *netlist)
    744{
    745	u16 module_id, length, node_count, i;
    746	u16 *id_blk;
    747	int status;
    748
    749	status = ice_read_netlist_module(hw, bank, ICE_NETLIST_TYPE_OFFSET, &module_id);
    750	if (status)
    751		return status;
    752
    753	if (module_id != ICE_NETLIST_LINK_TOPO_MOD_ID) {
    754		ice_debug(hw, ICE_DBG_NVM, "Expected netlist module_id ID of 0x%04x, but got 0x%04x\n",
    755			  ICE_NETLIST_LINK_TOPO_MOD_ID, module_id);
    756		return -EIO;
    757	}
    758
    759	status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_MODULE_LEN, &length);
    760	if (status)
    761		return status;
    762
    763	/* sanity check that we have at least enough words to store the netlist ID block */
    764	if (length < ICE_NETLIST_ID_BLK_SIZE) {
    765		ice_debug(hw, ICE_DBG_NVM, "Netlist Link Topology module too small. Expected at least %u words, but got %u words.\n",
    766			  ICE_NETLIST_ID_BLK_SIZE, length);
    767		return -EIO;
    768	}
    769
    770	status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_NODE_COUNT, &node_count);
    771	if (status)
    772		return status;
    773	node_count &= ICE_LINK_TOPO_NODE_COUNT_M;
    774
    775	id_blk = kcalloc(ICE_NETLIST_ID_BLK_SIZE, sizeof(*id_blk), GFP_KERNEL);
    776	if (!id_blk)
    777		return -ENOMEM;
    778
    779	/* Read out the entire Netlist ID Block at once. */
    780	status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR,
    781				       ICE_NETLIST_ID_BLK_OFFSET(node_count) * sizeof(u16),
    782				       (u8 *)id_blk, ICE_NETLIST_ID_BLK_SIZE * sizeof(u16));
    783	if (status)
    784		goto exit_error;
    785
    786	for (i = 0; i < ICE_NETLIST_ID_BLK_SIZE; i++)
    787		id_blk[i] = le16_to_cpu(((__force __le16 *)id_blk)[i]);
    788
    789	netlist->major = id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_HIGH] << 16 |
    790			 id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_LOW];
    791	netlist->minor = id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_HIGH] << 16 |
    792			 id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_LOW];
    793	netlist->type = id_blk[ICE_NETLIST_ID_BLK_TYPE_HIGH] << 16 |
    794			id_blk[ICE_NETLIST_ID_BLK_TYPE_LOW];
    795	netlist->rev = id_blk[ICE_NETLIST_ID_BLK_REV_HIGH] << 16 |
    796		       id_blk[ICE_NETLIST_ID_BLK_REV_LOW];
    797	netlist->cust_ver = id_blk[ICE_NETLIST_ID_BLK_CUST_VER];
    798	/* Read the left most 4 bytes of SHA */
    799	netlist->hash = id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(15)] << 16 |
    800			id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(14)];
    801
    802exit_error:
    803	kfree(id_blk);
    804
    805	return status;
    806}
    807
    808/**
    809 * ice_get_inactive_netlist_ver
    810 * @hw: pointer to the HW struct
    811 * @netlist: pointer to netlist version info structure
    812 *
    813 * Read the netlist version data from the inactive netlist bank. Used to
    814 * extract version data of a pending flash update in order to display the
    815 * version data.
    816 */
    817int ice_get_inactive_netlist_ver(struct ice_hw *hw, struct ice_netlist_info *netlist)
    818{
    819	return ice_get_netlist_info(hw, ICE_INACTIVE_FLASH_BANK, netlist);
    820}
    821
    822/**
    823 * ice_discover_flash_size - Discover the available flash size.
    824 * @hw: pointer to the HW struct
    825 *
    826 * The device flash could be up to 16MB in size. However, it is possible that
    827 * the actual size is smaller. Use bisection to determine the accessible size
    828 * of flash memory.
    829 */
    830static int ice_discover_flash_size(struct ice_hw *hw)
    831{
    832	u32 min_size = 0, max_size = ICE_AQC_NVM_MAX_OFFSET + 1;
    833	int status;
    834
    835	status = ice_acquire_nvm(hw, ICE_RES_READ);
    836	if (status)
    837		return status;
    838
    839	while ((max_size - min_size) > 1) {
    840		u32 offset = (max_size + min_size) / 2;
    841		u32 len = 1;
    842		u8 data;
    843
    844		status = ice_read_flat_nvm(hw, offset, &len, &data, false);
    845		if (status == -EIO &&
    846		    hw->adminq.sq_last_status == ICE_AQ_RC_EINVAL) {
    847			ice_debug(hw, ICE_DBG_NVM, "%s: New upper bound of %u bytes\n",
    848				  __func__, offset);
    849			status = 0;
    850			max_size = offset;
    851		} else if (!status) {
    852			ice_debug(hw, ICE_DBG_NVM, "%s: New lower bound of %u bytes\n",
    853				  __func__, offset);
    854			min_size = offset;
    855		} else {
    856			/* an unexpected error occurred */
    857			goto err_read_flat_nvm;
    858		}
    859	}
    860
    861	ice_debug(hw, ICE_DBG_NVM, "Predicted flash size is %u bytes\n", max_size);
    862
    863	hw->flash.flash_size = max_size;
    864
    865err_read_flat_nvm:
    866	ice_release_nvm(hw);
    867
    868	return status;
    869}
    870
    871/**
    872 * ice_read_sr_pointer - Read the value of a Shadow RAM pointer word
    873 * @hw: pointer to the HW structure
    874 * @offset: the word offset of the Shadow RAM word to read
    875 * @pointer: pointer value read from Shadow RAM
    876 *
    877 * Read the given Shadow RAM word, and convert it to a pointer value specified
    878 * in bytes. This function assumes the specified offset is a valid pointer
    879 * word.
    880 *
    881 * Each pointer word specifies whether it is stored in word size or 4KB
    882 * sector size by using the highest bit. The reported pointer value will be in
    883 * bytes, intended for flat NVM reads.
    884 */
    885static int ice_read_sr_pointer(struct ice_hw *hw, u16 offset, u32 *pointer)
    886{
    887	int status;
    888	u16 value;
    889
    890	status = ice_read_sr_word(hw, offset, &value);
    891	if (status)
    892		return status;
    893
    894	/* Determine if the pointer is in 4KB or word units */
    895	if (value & ICE_SR_NVM_PTR_4KB_UNITS)
    896		*pointer = (value & ~ICE_SR_NVM_PTR_4KB_UNITS) * 4 * 1024;
    897	else
    898		*pointer = value * 2;
    899
    900	return 0;
    901}
    902
    903/**
    904 * ice_read_sr_area_size - Read an area size from a Shadow RAM word
    905 * @hw: pointer to the HW structure
    906 * @offset: the word offset of the Shadow RAM to read
    907 * @size: size value read from the Shadow RAM
    908 *
    909 * Read the given Shadow RAM word, and convert it to an area size value
    910 * specified in bytes. This function assumes the specified offset is a valid
    911 * area size word.
    912 *
    913 * Each area size word is specified in 4KB sector units. This function reports
    914 * the size in bytes, intended for flat NVM reads.
    915 */
    916static int ice_read_sr_area_size(struct ice_hw *hw, u16 offset, u32 *size)
    917{
    918	int status;
    919	u16 value;
    920
    921	status = ice_read_sr_word(hw, offset, &value);
    922	if (status)
    923		return status;
    924
    925	/* Area sizes are always specified in 4KB units */
    926	*size = value * 4 * 1024;
    927
    928	return 0;
    929}
    930
    931/**
    932 * ice_determine_active_flash_banks - Discover active bank for each module
    933 * @hw: pointer to the HW struct
    934 *
    935 * Read the Shadow RAM control word and determine which banks are active for
    936 * the NVM, OROM, and Netlist modules. Also read and calculate the associated
    937 * pointer and size. These values are then cached into the ice_flash_info
    938 * structure for later use in order to calculate the correct offset to read
    939 * from the active module.
    940 */
    941static int ice_determine_active_flash_banks(struct ice_hw *hw)
    942{
    943	struct ice_bank_info *banks = &hw->flash.banks;
    944	u16 ctrl_word;
    945	int status;
    946
    947	status = ice_read_sr_word(hw, ICE_SR_NVM_CTRL_WORD, &ctrl_word);
    948	if (status) {
    949		ice_debug(hw, ICE_DBG_NVM, "Failed to read the Shadow RAM control word\n");
    950		return status;
    951	}
    952
    953	/* Check that the control word indicates validity */
    954	if ((ctrl_word & ICE_SR_CTRL_WORD_1_M) >> ICE_SR_CTRL_WORD_1_S != ICE_SR_CTRL_WORD_VALID) {
    955		ice_debug(hw, ICE_DBG_NVM, "Shadow RAM control word is invalid\n");
    956		return -EIO;
    957	}
    958
    959	if (!(ctrl_word & ICE_SR_CTRL_WORD_NVM_BANK))
    960		banks->nvm_bank = ICE_1ST_FLASH_BANK;
    961	else
    962		banks->nvm_bank = ICE_2ND_FLASH_BANK;
    963
    964	if (!(ctrl_word & ICE_SR_CTRL_WORD_OROM_BANK))
    965		banks->orom_bank = ICE_1ST_FLASH_BANK;
    966	else
    967		banks->orom_bank = ICE_2ND_FLASH_BANK;
    968
    969	if (!(ctrl_word & ICE_SR_CTRL_WORD_NETLIST_BANK))
    970		banks->netlist_bank = ICE_1ST_FLASH_BANK;
    971	else
    972		banks->netlist_bank = ICE_2ND_FLASH_BANK;
    973
    974	status = ice_read_sr_pointer(hw, ICE_SR_1ST_NVM_BANK_PTR, &banks->nvm_ptr);
    975	if (status) {
    976		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM bank pointer\n");
    977		return status;
    978	}
    979
    980	status = ice_read_sr_area_size(hw, ICE_SR_NVM_BANK_SIZE, &banks->nvm_size);
    981	if (status) {
    982		ice_debug(hw, ICE_DBG_NVM, "Failed to read NVM bank area size\n");
    983		return status;
    984	}
    985
    986	status = ice_read_sr_pointer(hw, ICE_SR_1ST_OROM_BANK_PTR, &banks->orom_ptr);
    987	if (status) {
    988		ice_debug(hw, ICE_DBG_NVM, "Failed to read OROM bank pointer\n");
    989		return status;
    990	}
    991
    992	status = ice_read_sr_area_size(hw, ICE_SR_OROM_BANK_SIZE, &banks->orom_size);
    993	if (status) {
    994		ice_debug(hw, ICE_DBG_NVM, "Failed to read OROM bank area size\n");
    995		return status;
    996	}
    997
    998	status = ice_read_sr_pointer(hw, ICE_SR_NETLIST_BANK_PTR, &banks->netlist_ptr);
    999	if (status) {
   1000		ice_debug(hw, ICE_DBG_NVM, "Failed to read Netlist bank pointer\n");
   1001		return status;
   1002	}
   1003
   1004	status = ice_read_sr_area_size(hw, ICE_SR_NETLIST_BANK_SIZE, &banks->netlist_size);
   1005	if (status) {
   1006		ice_debug(hw, ICE_DBG_NVM, "Failed to read Netlist bank area size\n");
   1007		return status;
   1008	}
   1009
   1010	return 0;
   1011}
   1012
   1013/**
   1014 * ice_init_nvm - initializes NVM setting
   1015 * @hw: pointer to the HW struct
   1016 *
   1017 * This function reads and populates NVM settings such as Shadow RAM size,
   1018 * max_timeout, and blank_nvm_mode
   1019 */
   1020int ice_init_nvm(struct ice_hw *hw)
   1021{
   1022	struct ice_flash_info *flash = &hw->flash;
   1023	u32 fla, gens_stat;
   1024	u8 sr_size;
   1025	int status;
   1026
   1027	/* The SR size is stored regardless of the NVM programming mode
   1028	 * as the blank mode may be used in the factory line.
   1029	 */
   1030	gens_stat = rd32(hw, GLNVM_GENS);
   1031	sr_size = (gens_stat & GLNVM_GENS_SR_SIZE_M) >> GLNVM_GENS_SR_SIZE_S;
   1032
   1033	/* Switching to words (sr_size contains power of 2) */
   1034	flash->sr_words = BIT(sr_size) * ICE_SR_WORDS_IN_1KB;
   1035
   1036	/* Check if we are in the normal or blank NVM programming mode */
   1037	fla = rd32(hw, GLNVM_FLA);
   1038	if (fla & GLNVM_FLA_LOCKED_M) { /* Normal programming mode */
   1039		flash->blank_nvm_mode = false;
   1040	} else {
   1041		/* Blank programming mode */
   1042		flash->blank_nvm_mode = true;
   1043		ice_debug(hw, ICE_DBG_NVM, "NVM init error: unsupported blank mode.\n");
   1044		return -EIO;
   1045	}
   1046
   1047	status = ice_discover_flash_size(hw);
   1048	if (status) {
   1049		ice_debug(hw, ICE_DBG_NVM, "NVM init error: failed to discover flash size.\n");
   1050		return status;
   1051	}
   1052
   1053	status = ice_determine_active_flash_banks(hw);
   1054	if (status) {
   1055		ice_debug(hw, ICE_DBG_NVM, "Failed to determine active flash banks.\n");
   1056		return status;
   1057	}
   1058
   1059	status = ice_get_nvm_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->nvm);
   1060	if (status) {
   1061		ice_debug(hw, ICE_DBG_INIT, "Failed to read NVM info.\n");
   1062		return status;
   1063	}
   1064
   1065	status = ice_get_orom_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->orom);
   1066	if (status)
   1067		ice_debug(hw, ICE_DBG_INIT, "Failed to read Option ROM info.\n");
   1068
   1069	/* read the netlist version information */
   1070	status = ice_get_netlist_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->netlist);
   1071	if (status)
   1072		ice_debug(hw, ICE_DBG_INIT, "Failed to read netlist info.\n");
   1073
   1074	return 0;
   1075}
   1076
   1077/**
   1078 * ice_nvm_validate_checksum
   1079 * @hw: pointer to the HW struct
   1080 *
   1081 * Verify NVM PFA checksum validity (0x0706)
   1082 */
   1083int ice_nvm_validate_checksum(struct ice_hw *hw)
   1084{
   1085	struct ice_aqc_nvm_checksum *cmd;
   1086	struct ice_aq_desc desc;
   1087	int status;
   1088
   1089	status = ice_acquire_nvm(hw, ICE_RES_READ);
   1090	if (status)
   1091		return status;
   1092
   1093	cmd = &desc.params.nvm_checksum;
   1094
   1095	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_checksum);
   1096	cmd->flags = ICE_AQC_NVM_CHECKSUM_VERIFY;
   1097
   1098	status = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
   1099	ice_release_nvm(hw);
   1100
   1101	if (!status)
   1102		if (le16_to_cpu(cmd->checksum) != ICE_AQC_NVM_CHECKSUM_CORRECT)
   1103			status = -EIO;
   1104
   1105	return status;
   1106}
   1107
   1108/**
   1109 * ice_nvm_write_activate
   1110 * @hw: pointer to the HW struct
   1111 * @cmd_flags: flags for write activate command
   1112 * @response_flags: response indicators from firmware
   1113 *
   1114 * Update the control word with the required banks' validity bits
   1115 * and dumps the Shadow RAM to flash (0x0707)
   1116 *
   1117 * cmd_flags controls which banks to activate, and the preservation level to
   1118 * use when activating the NVM bank.
   1119 *
   1120 * On successful return of the firmware command, the response_flags variable
   1121 * is updated with the flags reported by firmware indicating certain status,
   1122 * such as whether EMP reset is enabled.
   1123 */
   1124int ice_nvm_write_activate(struct ice_hw *hw, u8 cmd_flags, u8 *response_flags)
   1125{
   1126	struct ice_aqc_nvm *cmd;
   1127	struct ice_aq_desc desc;
   1128	int err;
   1129
   1130	cmd = &desc.params.nvm;
   1131	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_write_activate);
   1132
   1133	cmd->cmd_flags = cmd_flags;
   1134
   1135	err = ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
   1136	if (!err && response_flags)
   1137		*response_flags = cmd->cmd_flags;
   1138
   1139	return err;
   1140}
   1141
   1142/**
   1143 * ice_aq_nvm_update_empr
   1144 * @hw: pointer to the HW struct
   1145 *
   1146 * Update empr (0x0709). This command allows SW to
   1147 * request an EMPR to activate new FW.
   1148 */
   1149int ice_aq_nvm_update_empr(struct ice_hw *hw)
   1150{
   1151	struct ice_aq_desc desc;
   1152
   1153	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_update_empr);
   1154
   1155	return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
   1156}
   1157
   1158/* ice_nvm_set_pkg_data
   1159 * @hw: pointer to the HW struct
   1160 * @del_pkg_data_flag: If is set then the current pkg_data store by FW
   1161 *		       is deleted.
   1162 *		       If bit is set to 1, then buffer should be size 0.
   1163 * @data: pointer to buffer
   1164 * @length: length of the buffer
   1165 * @cd: pointer to command details structure or NULL
   1166 *
   1167 * Set package data (0x070A). This command is equivalent to the reception
   1168 * of a PLDM FW Update GetPackageData cmd. This command should be sent
   1169 * as part of the NVM update as the first cmd in the flow.
   1170 */
   1171
   1172int
   1173ice_nvm_set_pkg_data(struct ice_hw *hw, bool del_pkg_data_flag, u8 *data,
   1174		     u16 length, struct ice_sq_cd *cd)
   1175{
   1176	struct ice_aqc_nvm_pkg_data *cmd;
   1177	struct ice_aq_desc desc;
   1178
   1179	if (length != 0 && !data)
   1180		return -EINVAL;
   1181
   1182	cmd = &desc.params.pkg_data;
   1183
   1184	ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_pkg_data);
   1185	desc.flags |= cpu_to_le16(ICE_AQ_FLAG_RD);
   1186
   1187	if (del_pkg_data_flag)
   1188		cmd->cmd_flags |= ICE_AQC_NVM_PKG_DELETE;
   1189
   1190	return ice_aq_send_cmd(hw, &desc, data, length, cd);
   1191}
   1192
   1193/* ice_nvm_pass_component_tbl
   1194 * @hw: pointer to the HW struct
   1195 * @data: pointer to buffer
   1196 * @length: length of the buffer
   1197 * @transfer_flag: parameter for determining stage of the update
   1198 * @comp_response: a pointer to the response from the 0x070B AQC.
   1199 * @comp_response_code: a pointer to the response code from the 0x070B AQC.
   1200 * @cd: pointer to command details structure or NULL
   1201 *
   1202 * Pass component table (0x070B). This command is equivalent to the reception
   1203 * of a PLDM FW Update PassComponentTable cmd. This command should be sent once
   1204 * per component. It can be only sent after Set Package Data cmd and before
   1205 * actual update. FW will assume these commands are going to be sent until
   1206 * the TransferFlag is set to End or StartAndEnd.
   1207 */
   1208
   1209int
   1210ice_nvm_pass_component_tbl(struct ice_hw *hw, u8 *data, u16 length,
   1211			   u8 transfer_flag, u8 *comp_response,
   1212			   u8 *comp_response_code, struct ice_sq_cd *cd)
   1213{
   1214	struct ice_aqc_nvm_pass_comp_tbl *cmd;
   1215	struct ice_aq_desc desc;
   1216	int status;
   1217
   1218	if (!data || !comp_response || !comp_response_code)
   1219		return -EINVAL;
   1220
   1221	cmd = &desc.params.pass_comp_tbl;
   1222
   1223	ice_fill_dflt_direct_cmd_desc(&desc,
   1224				      ice_aqc_opc_nvm_pass_component_tbl);
   1225	desc.flags |= cpu_to_le16(ICE_AQ_FLAG_RD);
   1226
   1227	cmd->transfer_flag = transfer_flag;
   1228	status = ice_aq_send_cmd(hw, &desc, data, length, cd);
   1229
   1230	if (!status) {
   1231		*comp_response = cmd->component_response;
   1232		*comp_response_code = cmd->component_response_code;
   1233	}
   1234	return status;
   1235}