/*
 * Copyright (c) 2016 Cadence Design Systems, Inc.
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef XTENSA_CONFIG_H
#define XTENSA_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

#include <xtensa/hal.h>
#include <xtensa/config/core.h>
#include <xtensa/config/system.h>	/* required for XSHAL_CLIB */

#include "xtensa_context.h"

/*
 * STACK REQUIREMENTS
 *
 * This section defines the minimum stack size, and the extra space required to
 * be allocated for saving coprocessor state and/or C library state information
 * (if thread safety is enabled for the C library). The sizes are in bytes.
 *
 * Stack sizes for individual threads should be derived from these minima based
 * on the maximum call depth of the task and the maximum level of interrupt
 * nesting.  A minimum stack size is defined by XT_STACK_MIN_SIZE. This minimum
 * is based on the requirement for a task that calls nothing else but can be
 * interrupted.  This assumes that interrupt handlers do not call more than a
 * few levels deep.  If this is not true, i.e. one or more interrupt handlers
 * make deep calls then the minimum must be increased.
 *
 * If the Xtensa processor configuration includes coprocessors, then space is
 * allocated to save the coprocessor state on the stack.
 *
 * If thread safety is enabled for the C runtime library,
 * (XT_USE_THREAD_SAFE_CLIB is defined) then space is allocated to save the C
 * library context in the TCB.
 *
 * Allocating insufficient stack space is a common source of hard-to-find
 * errors.  During development, it is best to enable the FreeRTOS stack
 * checking features.
 *
 * Usage:
 *
 * XT_USE_THREAD_SAFE_CLIB -- Define this to a nonzero value to enable
 * thread-safe use of the C library. This will require extra stack space to be
 * allocated for threads that use the C library reentrant functions. See below
 * for more information.
 *
 * NOTE: The Xtensa toolchain supports multiple C libraries and not all of them
 * support thread safety. Check your core configuration to see which C library
 * was chosen for your system.
 *
 * XT_STACK_MIN_SIZE       -- The minimum stack size for any task. It is
 * recommended that you do not use a stack smaller than this for any task. In
 * case you want to use stacks smaller than this size, you must verify that the
 * smaller size(s) will work under all operating conditions.
 *
 * XT_STACK_EXTRA          -- The amount of extra stack space to allocate for a
 * task that does not make C library reentrant calls. Add this to the amount of
 * stack space required by the task itself.
 *
 * XT_STACK_EXTRA_CLIB     -- The amount of space to allocate for C library
 * state.
 */

/* Extra space required for interrupt/exception hooks. */
#ifdef XT_INTEXC_HOOKS
  #ifdef __XTENSA_CALL0_ABI__
    #define STK_INTEXC_EXTRA        0x200
  #else
    #define STK_INTEXC_EXTRA        0x180
  #endif
#else
  #define STK_INTEXC_EXTRA          0
#endif

/* Check C library thread safety support and compute size of C library save
 * area.
 */
#if XT_USE_THREAD_SAFE_CLIB > 0u
  #if XSHAL_CLIB == XTHAL_CLIB_XCLIB
    #define XT_HAVE_THREAD_SAFE_CLIB	0
    #error "Thread-safe operation is not yet supported for the XCLIB C library."
  #elif XSHAL_CLIB == XTHAL_CLIB_NEWLIB
    #define XT_HAVE_THREAD_SAFE_CLIB	1
    #if !defined __ASSEMBLER__
      #include <sys/reent.h>
      #define XT_CLIB_CONTEXT_AREA_SIZE ((sizeof(struct _reent) + 15) + (-16))
      #define XT_CLIB_GLOBAL_PTR        _impure_ptr
    #endif
  #else
    #define XT_HAVE_THREAD_SAFE_CLIB	0
    #error "The selected C runtime library is not thread safe."
  #endif
#else
  #define XT_CLIB_CONTEXT_AREA_SIZE	0
#endif

/* Extra size -- interrupt frame plus coprocessor save area plus hook space.
 *
 * NOTE: Make sure XT_INTEXC_HOOKS is undefined unless you really need the
 * hooks.
 */
#ifdef __XTENSA_CALL0_ABI__
  #define XT_XTRA_SIZE  (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x10 + XT_CP_SIZE)
#else
  #define XT_XTRA_SIZE  (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x20 + XT_CP_SIZE)
#endif

/*
 * Space allocated for user code -- function calls and local variables.
 *
 * NOTE: This number can be adjusted to suit your needs. You must verify that
 * the amount of space you reserve is adequate for the worst-case conditions in
 * your application.  NOTE: The windowed ABI requires more stack, since space
 * has to be reserved for spilling register windows.
 */
#ifdef __XTENSA_CALL0_ABI__
  #define XT_USER_SIZE            0x200
#else
  #define XT_USER_SIZE            0x400
#endif

/* Minimum recommended stack size. */
#define XT_STACK_MIN_SIZE \
	((XT_XTRA_SIZE + XT_USER_SIZE) / sizeof(unsigned char))

/* OS overhead with and without C library thread context. */
#define XT_STACK_EXTRA              (XT_XTRA_SIZE)
#define XT_STACK_EXTRA_CLIB         (XT_XTRA_SIZE + XT_CLIB_CONTEXT_AREA_SIZE)


#ifdef __cplusplus
}
#endif

#endif /* XTENSA_CONFIG_H */

