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 Badarkheuint32_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