xref: /aosp_15_r20/external/arm-trusted-firmware/common/tf_crc32.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2021, Arm Limited. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #include <stdarg.h>
8*54fd6939SJiyong Park #include <assert.h>
9*54fd6939SJiyong Park 
10*54fd6939SJiyong Park #include <arm_acle.h>
11*54fd6939SJiyong Park #include <common/debug.h>
12*54fd6939SJiyong Park #include <common/tf_crc32.h>
13*54fd6939SJiyong Park 
14*54fd6939SJiyong Park /* compute CRC using Arm intrinsic function
15*54fd6939SJiyong Park  *
16*54fd6939SJiyong Park  * This function is useful for the platforms with the CPU ARMv8.0
17*54fd6939SJiyong Park  * (with CRC instructions supported), and onwards.
18*54fd6939SJiyong Park  * Platforms with CPU ARMv8.0 should make sure to add a compile switch
19*54fd6939SJiyong Park  * '-march=armv8-a+crc" for successful compilation of this file.
20*54fd6939SJiyong Park  *
21*54fd6939SJiyong Park  * @crc: previous accumulated CRC
22*54fd6939SJiyong Park  * @buf: buffer base address
23*54fd6939SJiyong Park  * @size: the size of the buffer
24*54fd6939SJiyong Park  *
25*54fd6939SJiyong Park  * Return calculated CRC value
26*54fd6939SJiyong Park  */
tf_crc32(uint32_t crc,const unsigned char * buf,size_t size)27*54fd6939SJiyong Park uint32_t tf_crc32(uint32_t crc, const unsigned char *buf, size_t size)
28*54fd6939SJiyong Park {
29*54fd6939SJiyong Park 	assert(buf != NULL);
30*54fd6939SJiyong Park 
31*54fd6939SJiyong Park 	uint32_t calc_crc = ~crc;
32*54fd6939SJiyong Park 	const unsigned char *local_buf = buf;
33*54fd6939SJiyong Park 	size_t local_size = size;
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park 	/*
36*54fd6939SJiyong Park 	 * calculate CRC over byte data
37*54fd6939SJiyong Park 	 */
38*54fd6939SJiyong Park 	while (local_size != 0UL) {
39*54fd6939SJiyong Park 		calc_crc = __crc32b(calc_crc, *local_buf);
40*54fd6939SJiyong Park 		local_buf++;
41*54fd6939SJiyong Park 		local_size--;
42*54fd6939SJiyong Park 	}
43*54fd6939SJiyong Park 
44*54fd6939SJiyong Park 	return ~calc_crc;
45*54fd6939SJiyong Park }
46