/*
 * Copyright (c) 2017, Arm Limited. All rights reserved.
 * Copyright (c) 2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 * Origin of this file is the LittleFS lfs_util.h file adjusted for Zephyr
 * specific needs.
 */

#ifndef ZEPHYR_LFS_CONFIG_H
#define ZEPHYR_LFS_CONFIG_H

/* System includes */
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <inttypes.h>

#ifndef LFS_NO_MALLOC
#include <stdlib.h>
#endif
#ifndef LFS_NO_ASSERT
#include <sys/__assert.h>
#endif

#if !defined(LFS_NO_DEBUG) || \
	    !defined(LFS_NO_WARN) || \
	    !defined(LFS_NO_ERROR) || \
	    defined(LFS_YES_TRACE)

#include <logging/log.h>

#ifdef LFS_LOG_REGISTER
LOG_MODULE_REGISTER(littlefs, CONFIG_FS_LOG_LEVEL);
#endif

#include <stdio.h>
#endif

#ifdef __cplusplus
extern "C"
{
#endif

/* Logging functions when using LittleFS with Zephyr. */
#ifndef LFS_TRACE
#ifdef LFS_YES_TRACE
#define LFS_TRACE(fmt, ...) LOG_DBG("%s:%d:trace: " fmt, __FILE__, __LINE__, __VA_ARGS__)
#else
#define LFS_TRACE(...)
#endif
#endif

#ifndef LFS_DEBUG
#define LFS_DEBUG(fmt, ...) LOG_DBG("%s:%d: " fmt, __FILE__, __LINE__, __VA_ARGS__)
#endif

#ifndef LFS_WARN
#define LFS_WARN(fmt, ...) LOG_WRN("%s:%d: " fmt, __FILE__, __LINE__, __VA_ARGS__)
#endif

#ifndef LFS_ERROR
#define LFS_ERROR(fmt, ...) LOG_ERR("%s:%d: " fmt, __FILE__, __LINE__, __VA_ARGS__)
#endif

/* Runtime assertions */
#ifndef LFS_ASSERT
#define LFS_ASSERT(test) __ASSERT_NO_MSG(test)
#endif


/* Builtin functions, these may be replaced by more efficient */
/* toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more */
/* expensive basic C implementation for debugging purposes */

/* Min/max functions for unsigned 32-bit numbers */
static inline uint32_t lfs_max(uint32_t a, uint32_t b)
{
	return (a > b) ? a : b;
}

static inline uint32_t lfs_min(uint32_t a, uint32_t b)
{
	return (a < b) ? a : b;
}

/* Align to nearest multiple of a size */
static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment)
{
	return a - (a % alignment);
}

static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment)
{
	return lfs_aligndown(a + alignment-1, alignment);
}

/* Find the smallest power of 2 greater than or equal to a */
static inline uint32_t lfs_npw2(uint32_t a)
{
#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM))
	return 32 - __builtin_clz(a-1);
#else
	uint32_t r = 0;
	uint32_t s;

	a -= 1;
	s = (a > 0xffff) << 4; a >>= s; r |= s;
	s = (a > 0xff) << 3; a >>= s; r |= s;
	s = (a > 0xf) << 2; a >>= s; r |= s;
	s = (a > 0x3) << 1; a >>= s; r |= s;
	return (r | (a >> 1)) + 1;
#endif
}

/* Count the number of trailing binary zeros in a */
/* lfs_ctz(0) may be undefined */
static inline uint32_t lfs_ctz(uint32_t a)
{
#if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__)
	return __builtin_ctz(a);
#else
	return lfs_npw2((a & -a) + 1) - 1;
#endif
}

/* Count the number of binary ones in a */
static inline uint32_t lfs_popc(uint32_t a)
{
#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM))
	return __builtin_popcount(a);
#else
	a = a - ((a >> 1) & 0x55555555);
	a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
	return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24;
#endif
}

/* Find the sequence comparison of a and b, this is the distance */
/* between a and b ignoring overflow */
static inline int lfs_scmp(uint32_t a, uint32_t b)
{
	return (int)(unsigned int)(a - b);
}

/* Convert between 32-bit little-endian and native order */
static inline uint32_t lfs_fromle32(uint32_t a)
{
#if !defined(LFS_NO_INTRINSICS) && (                                    \
	(defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) &&         \
	BYTE_ORDER == ORDER_LITTLE_ENDIAN) ||                           \
	(defined(__BYTE_ORDER) && defined(__ORDER_LITTLE_ENDIAN) &&     \
	__BYTE_ORDER   == __ORDER_LITTLE_ENDIAN) ||                     \
	(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
	__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
	return a;
#elif !defined(LFS_NO_INTRINSICS) && (                               \
	(defined(BYTE_ORDER) && defined(ORDER_BIG_ENDIAN) &&         \
	BYTE_ORDER == ORDER_BIG_ENDIAN) ||                           \
	(defined(__BYTE_ORDER) && defined(__ORDER_BIG_ENDIAN) &&     \
	__BYTE_ORDER == __ORDER_BIG_ENDIAN) ||                       \
	(defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
	__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
	return __builtin_bswap32(a);
#else
	return (((uint8_t *)&a)[0] <<  0) |
	       (((uint8_t *)&a)[1] <<  8) |
	       (((uint8_t *)&a)[2] << 16) |
	       (((uint8_t *)&a)[3] << 24);
#endif
}

static inline uint32_t lfs_tole32(uint32_t a)
{
	return lfs_fromle32(a);
}

/* Convert between 32-bit big-endian and native order */
static inline uint32_t lfs_frombe32(uint32_t a)
{
#if !defined(LFS_NO_INTRINSICS) && ( \
	(defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) &&         \
	BYTE_ORDER == ORDER_LITTLE_ENDIAN) ||                           \
	(defined(__BYTE_ORDER) && defined(__ORDER_LITTLE_ENDIAN) &&     \
	__BYTE_ORDER == __ORDER_LITTLE_ENDIAN) ||                       \
	(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \
	__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
	return __builtin_bswap32(a);
#elif !defined(LFS_NO_INTRINSICS) && (                               \
	(defined(BYTE_ORDER) && defined(ORDER_BIG_ENDIAN) &&         \
	BYTE_ORDER == ORDER_BIG_ENDIAN) ||                           \
	(defined(__BYTE_ORDER) && defined(__ORDER_BIG_ENDIAN) &&     \
	__BYTE_ORDER == __ORDER_BIG_ENDIAN) ||                       \
	(defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \
	__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
	return a;
#else
	return (((uint8_t *)&a)[0] << 24) |
	       (((uint8_t *)&a)[1] << 16) |
	       (((uint8_t *)&a)[2] <<  8) |
	       (((uint8_t *)&a)[3] <<  0);
#endif
}

static inline uint32_t lfs_tobe32(uint32_t a)
{
	return lfs_frombe32(a);
}

/* Calculate CRC-32 with polynomial = 0x04c11db7 */
uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size);

/* Allocate memory, only used if buffers are not provided to littlefs */
/* Note, memory must be 64-bit aligned */
static inline void *lfs_malloc(size_t size)
{
#ifndef LFS_NO_MALLOC
	return malloc(size);
#else
	(void)size;
	return NULL;
#endif
}

/* Deallocate memory, only used if buffers are not provided to littlefs */
static inline void lfs_free(void *p)
{
#ifndef LFS_NO_MALLOC
	free(p);
#else
	(void)p;
#endif
}


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* ZEPHYR_LFS_CONFIG_H */
