From: Dan Nowlin <dan.nowlin@intel.com>
An optional flag field has been added to the signature segment
header. The flags field contains two flags, a valid flag, and
a last segment flag that indicates whether the segment is the
last segment that will be downloaded to firmware.
If the flag field's valid bit is NOT set, then as was done
before, assume that this is the last segment being downloaded.
However, if the flag field's valid bit IS set, then use the
last segment flag to determine if this segment is the last
segment to download.
Signed-off-by: Dan Nowlin <dan.nowlin@intel.com>
Signed-off-by: Soumyadeep Hore <soumyadeep.hore@intel.com>
---
drivers/net/ice/base/ice_ddp.c | 13 ++++++++++---
drivers/net/ice/base/ice_ddp.h | 5 ++++-
2 files changed, 14 insertions(+), 4 deletions(-)
@@ -499,12 +499,13 @@ ice_download_pkg_sig_seg(struct ice_hw *hw, struct ice_sign_seg *seg)
* @idx: segment index
* @start: starting buffer
* @count: buffer count
+ * @last_seg: last segment being downloaded
*
* Note: idx must reference a ICE segment
*/
static enum ice_ddp_state
ice_download_pkg_config_seg(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
- u32 idx, u32 start, u32 count)
+ u32 idx, u32 start, u32 count, bool last_seg)
{
struct ice_buf_table *bufs;
enum ice_ddp_state state;
@@ -522,7 +523,7 @@ ice_download_pkg_config_seg(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
return ICE_DDP_PKG_ERR;
state = ice_dwnld_cfg_bufs_no_lock(hw, bufs->buf_array, start, count,
- true);
+ last_seg);
return state;
}
@@ -541,9 +542,11 @@ ice_dwnld_sign_and_cfg_segs(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
{
enum ice_ddp_state state;
struct ice_sign_seg *seg;
+ bool last_seg = true;
u32 conf_idx;
u32 start;
u32 count;
+ u32 flags;
seg = (struct ice_sign_seg *)ice_get_pkg_seg_by_idx(pkg_hdr, idx);
if (!seg) {
@@ -554,6 +557,10 @@ ice_dwnld_sign_and_cfg_segs(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
conf_idx = LE32_TO_CPU(seg->signed_seg_idx);
start = LE32_TO_CPU(seg->signed_buf_start);
count = LE32_TO_CPU(seg->signed_buf_count);
+ flags = LE32_TO_CPU(seg->flags);
+
+ if (flags & ICE_SIGN_SEG_FLAGS_VALID)
+ last_seg = !!(flags & ICE_SIGN_SEG_FLAGS_LAST);
state = ice_download_pkg_sig_seg(hw, seg);
if (state)
@@ -568,7 +575,7 @@ ice_dwnld_sign_and_cfg_segs(struct ice_hw *hw, struct ice_pkg_hdr *pkg_hdr,
}
state = ice_download_pkg_config_seg(hw, pkg_hdr, conf_idx, start,
- count);
+ count, last_seg);
exit:
return state;
@@ -177,7 +177,10 @@ struct ice_sign_seg {
__le32 signed_seg_idx;
__le32 signed_buf_start;
__le32 signed_buf_count;
-#define ICE_SIGN_SEG_RESERVED_COUNT 44
+#define ICE_SIGN_SEG_FLAGS_VALID 0x80000000
+#define ICE_SIGN_SEG_FLAGS_LAST 0x00000001
+ __le32 flags;
+#define ICE_SIGN_SEG_RESERVED_COUNT 40
u8 reserved[ICE_SIGN_SEG_RESERVED_COUNT];
struct ice_buf_table buf_tbl;
};