X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fbase%2Fef10_image.c;h=9204da13b163f73b9375bdeb87846e8fd0a9d56f;hb=6cf2f95d4dfbae8c8b4ea31ec899e750dcbc62bb;hp=0d889876278b0904da219dbf6d0d8e045d9d398e;hpb=b1c25748ddf5dcec834eed4d1e97068ebe5e2409;p=dpdk.git diff --git a/drivers/net/sfc/base/ef10_image.c b/drivers/net/sfc/base/ef10_image.c index 0d88987627..9204da13b1 100644 --- a/drivers/net/sfc/base/ef10_image.c +++ b/drivers/net/sfc/base/ef10_image.c @@ -1,12 +1,14 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright (c) 2017-2018 Solarflare Communications Inc. - * All rights reserved. + * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2017-2019 Solarflare Communications Inc. */ #include "efx.h" #include "efx_impl.h" +#include "ef10_firmware_ids.h" + #if EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 #if EFSYS_OPT_IMAGE_LAYOUT @@ -429,54 +431,59 @@ fail1: static __checkReturn efx_rc_t efx_check_unsigned_image( - __in void *bufferp, - __in uint32_t buffer_size) + __in void *bufferp, + __in uint32_t buffer_size, + __out efx_image_header_t **headerpp, + __out efx_image_trailer_t **trailerpp) { - efx_image_header_t *header; - efx_image_trailer_t *trailer; + efx_image_header_t *headerp; + efx_image_trailer_t *trailerp; uint32_t crc; efx_rc_t rc; - EFX_STATIC_ASSERT(sizeof (*header) == EFX_IMAGE_HEADER_SIZE); - EFX_STATIC_ASSERT(sizeof (*trailer) == EFX_IMAGE_TRAILER_SIZE); + EFX_STATIC_ASSERT(sizeof (*headerp) == EFX_IMAGE_HEADER_SIZE); + EFX_STATIC_ASSERT(sizeof (*trailerp) == EFX_IMAGE_TRAILER_SIZE); /* Must have at least enough space for required image header fields */ if (buffer_size < (EFX_FIELD_OFFSET(efx_image_header_t, eih_size) + - sizeof (header->eih_size))) { + sizeof (headerp->eih_size))) { rc = ENOSPC; goto fail1; } - header = (efx_image_header_t *)bufferp; + headerp = (efx_image_header_t *)bufferp; - if (header->eih_magic != EFX_IMAGE_HEADER_MAGIC) { - rc = EINVAL; + /* Buffer must have space for image header, code and image trailer. */ + if (buffer_size < (headerp->eih_size + headerp->eih_code_size + + EFX_IMAGE_TRAILER_SIZE)) { + rc = ENOSPC; goto fail2; } + trailerp = (efx_image_trailer_t *)((uint8_t *)headerp + + headerp->eih_size + headerp->eih_code_size); + + *headerpp = headerp; + *trailerpp = trailerp; + + if (headerp->eih_magic != EFX_IMAGE_HEADER_MAGIC) { + rc = EINVAL; + goto fail3; + } + /* * Check image header version is same or higher than lowest required * version. */ - if (header->eih_version < EFX_IMAGE_HEADER_VERSION) { + if (headerp->eih_version < EFX_IMAGE_HEADER_VERSION) { rc = EINVAL; - goto fail3; - } - - /* Buffer must have space for image header, code and image trailer. */ - if (buffer_size < (header->eih_size + header->eih_code_size + - EFX_IMAGE_TRAILER_SIZE)) { - rc = ENOSPC; goto fail4; } /* Check CRC from image buffer matches computed CRC. */ - trailer = (efx_image_trailer_t *)((uint8_t *)header + - header->eih_size + header->eih_code_size); + crc = efx_crc32_calculate(0, (uint8_t *)headerp, + (headerp->eih_size + headerp->eih_code_size)); - crc = efx_crc32_calculate(0, (uint8_t *)header, - (header->eih_size + header->eih_code_size)); - - if (trailer->eit_crc != crc) { + if (trailerp->eit_crc != crc) { rc = EINVAL; goto fail5; } @@ -507,9 +514,10 @@ efx_check_reflash_image( uint32_t image_offset; uint32_t image_size; void *imagep; + efx_image_header_t *headerp; + efx_image_trailer_t *trailerp; efx_rc_t rc; - EFSYS_ASSERT(infop != NULL); if (infop == NULL) { rc = EINVAL; @@ -531,7 +539,7 @@ efx_check_reflash_image( if (rc == 0) { /* * Buffer holds signed image format. Check that the encapsulated - * content is in unsigned image format. + * content contains an unsigned image format header. */ format = EFX_IMAGE_FORMAT_SIGNED; } else { @@ -546,11 +554,21 @@ efx_check_reflash_image( } imagep = (uint8_t *)bufferp + image_offset; - /* Check unsigned image layout (image header, code, image trailer) */ - rc = efx_check_unsigned_image(imagep, image_size); + /* Check image layout (image header, code, image trailer) */ + rc = efx_check_unsigned_image(imagep, image_size, &headerp, &trailerp); if (rc != 0) goto fail4; + /* + * Signed images are packages consumed directly by the firmware, + * with the exception of MC firmware, where the image must be + * rearranged for booting purposes. + */ + if (format == EFX_IMAGE_FORMAT_SIGNED) { + if (headerp->eih_type != FIRMWARE_TYPE_MCFW) + format = EFX_IMAGE_FORMAT_SIGNED_PACKAGE; + } + /* Return image details */ infop->eii_format = format; infop->eii_imagep = bufferp; @@ -577,7 +595,8 @@ fail1: __checkReturn efx_rc_t efx_build_signed_image_write_buffer( - __out uint8_t *bufferp, + __out_bcount(buffer_size) + uint8_t *bufferp, __in uint32_t buffer_size, __in efx_image_info_t *infop, __out efx_image_header_t **headerpp)