/*
 * 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 <zephyr/sys/__assert.h>
#endif

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

#include <zephyr/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 */
