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