mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00

Added support for HW computed CRC using Arm ACLE intrinsics. These are built-in intrinsics available for ARMv8.1-A, and onwards. These intrinsics are enabled via '-march=armv8-a+crc' compile switch for ARMv8-A (supports CRC instructions optionally). HW CRC support is enabled unconditionally in BL2 for all Arm platforms. HW CRC calculation is verified offline to ensure a similar result as its respective ZLib utility function. HW CRC calculation support will be used in the upcoming firmware update patches. Change-Id: Ia2ae801f62d2003e89a9c3e6d77469b5312614b3 Signed-off-by: Manish V Badarkhe <Manish.Badarkhe@arm.com>
44 lines
1,009 B
C
44 lines
1,009 B
C
/*
|
|
* Copyright (c) 2021, Arm Limited. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
#include <assert.h>
|
|
|
|
#include <arm_acle.h>
|
|
#include <common/debug.h>
|
|
|
|
/* hw_crc32 - compute CRC using Arm intrinsic function
|
|
*
|
|
* This function is useful for the platforms with the CPU ARMv8.0
|
|
* (with CRC instructions supported), and onwards.
|
|
* Platforms with CPU ARMv8.0 should make sure to add a compile switch
|
|
* '-march=armv8-a+crc" for successful compilation of this file.
|
|
*
|
|
* @crc: previous accumulated CRC
|
|
* @buf: buffer base address
|
|
* @size: the size of the buffer
|
|
*
|
|
* Return calculated CRC value
|
|
*/
|
|
uint32_t hw_crc32(uint32_t crc, const unsigned char *buf, size_t size)
|
|
{
|
|
assert(buf != NULL);
|
|
|
|
uint32_t calc_crc = ~crc;
|
|
const unsigned char *local_buf = buf;
|
|
size_t local_size = size;
|
|
|
|
/*
|
|
* calculate CRC over byte data
|
|
*/
|
|
while (local_size != 0UL) {
|
|
calc_crc = __crc32b(calc_crc, *local_buf);
|
|
local_buf++;
|
|
local_size--;
|
|
}
|
|
|
|
return ~calc_crc;
|
|
}
|