/**************************************************************************** * * Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ #include #include #include #include #include "fwimage.h" int fwimage_check_fw_header_crc(char *fw, u32 hdr_length, u32 header_crc32) { u32 header_crc32_calculated; /* * The last 4-bytes are header CRC */ header_crc32_calculated = ether_crc(hdr_length - sizeof(u32), fw); if (header_crc32_calculated != header_crc32) { SCSC_TAG_ERR(FW_LOAD, "CRC32 doesn't match: header_crc32_calculated=%d header_crc32=%d\n", header_crc32_calculated, header_crc32); return -EINVAL; } SCSC_TAG_DEBUG(FW_LOAD, "CRC32 OK: header_crc32_calculated=%d header_crc32=%d\n", header_crc32_calculated, header_crc32); return 0; } int fwimage_check_fw_const_section_crc(char *fw, u32 const_crc32, u32 const_fw_length, u32 hdr_length) { u32 const_crc32_calculated; const_crc32_calculated = ether_crc(const_fw_length - hdr_length, fw + hdr_length); if (const_crc32_calculated != const_crc32) { SCSC_TAG_ERR(FW_LOAD, "CRC32 doesn't match: const_crc32_calculated=%d const_crc32=%d\n", const_crc32_calculated, const_crc32); return -EINVAL; } SCSC_TAG_DEBUG(FW_LOAD, "CRC32 OK: const_crc32_calculated=%d const_crc32=%d\n", const_crc32_calculated, const_crc32); return 0; } int fwimage_check_fw_crc(char *fw, u32 fw_image_length, u32 hdr_length, u32 fw_crc32) { u32 fw_crc32_calculated; fw_crc32_calculated = ether_crc(fw_image_length - hdr_length, fw + hdr_length); if (fw_crc32_calculated != fw_crc32) { SCSC_TAG_ERR(FW_LOAD, "CRC32 doesn't match: fw_crc32_calculated=%d fw_crc32=%d\n", fw_crc32_calculated, fw_crc32); return -EINVAL; } SCSC_TAG_DEBUG(FW_LOAD, "CRC32 OK: fw_crc32_calculated=%d fw_crc32=%d\n", fw_crc32_calculated, fw_crc32); return 0; }