mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 22:35:42 +00:00
Merge "feat(hw_crc): add support for HW computed CRC" into integration
This commit is contained in:
commit
09e153a9a8
4 changed files with 70 additions and 0 deletions
44
common/hw_crc32.c
Normal file
44
common/hw_crc32.c
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
16
include/common/hw_crc32.h
Normal file
16
include/common/hw_crc32.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Arm Limited. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HW_CRC32_H
|
||||||
|
#define HW_CRC32_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* compute CRC using Arm intrinsic function */
|
||||||
|
uint32_t hw_crc32(uint32_t crc, const unsigned char *buf, size_t size);
|
||||||
|
|
||||||
|
#endif /* HW_CRC32_H */
|
|
@ -14,8 +14,10 @@
|
||||||
#define ARM_ACLE_H
|
#define ARM_ACLE_H
|
||||||
|
|
||||||
#if !defined(__aarch64__) || defined(__clang__)
|
#if !defined(__aarch64__) || defined(__clang__)
|
||||||
|
# define __crc32b __builtin_arm_crc32b
|
||||||
# define __crc32w __builtin_arm_crc32w
|
# define __crc32w __builtin_arm_crc32w
|
||||||
#else
|
#else
|
||||||
|
# define __crc32b __builtin_aarch64_crc32b
|
||||||
# define __crc32w __builtin_aarch64_crc32w
|
# define __crc32w __builtin_aarch64_crc32w
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -178,6 +178,13 @@ ifeq (${ARM_GPT_SUPPORT}, 1)
|
||||||
drivers/partition/partition.c
|
drivers/partition/partition.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Enable CRC instructions via extension for ARMv8-A CPUs.
|
||||||
|
# For ARMv8.1-A, and onwards CRC instructions are default enabled.
|
||||||
|
# Enable HW computed CRC support unconditionally in BL2 component.
|
||||||
|
ifeq (${ARM_ARCH_MINOR},0)
|
||||||
|
BL2_CPPFLAGS += -march=armv8-a+crc
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq (${ARCH}, aarch64)
|
ifeq (${ARCH}, aarch64)
|
||||||
PLAT_INCLUDES += -Iinclude/plat/arm/common/aarch64
|
PLAT_INCLUDES += -Iinclude/plat/arm/common/aarch64
|
||||||
endif
|
endif
|
||||||
|
@ -223,6 +230,7 @@ BL2_SOURCES += drivers/delay_timer/delay_timer.c \
|
||||||
drivers/io/io_storage.c \
|
drivers/io/io_storage.c \
|
||||||
plat/arm/common/arm_bl2_setup.c \
|
plat/arm/common/arm_bl2_setup.c \
|
||||||
plat/arm/common/arm_err.c \
|
plat/arm/common/arm_err.c \
|
||||||
|
common/hw_crc32.c \
|
||||||
${ARM_IO_SOURCES}
|
${ARM_IO_SOURCES}
|
||||||
|
|
||||||
# Firmware Configuration Framework sources
|
# Firmware Configuration Framework sources
|
||||||
|
|
Loading…
Add table
Reference in a new issue