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