// Copyright (c) 2020, XMOS Ltd, All rights reserved

#ifndef PORTMACRO_H
#define PORTMACRO_H

#ifndef __ASSEMBLER__

/* Inclusion of xc1.h will result in clock being defined as a type.
 * By default, FreeRTOS will require standard time.h, where clock is a function.
 */
#ifndef USE_XCORE_CLOCK_TYPE
#define _clock_defined
#endif

#include <xs1.h>
#include "rtos_support.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Type definitions. */
#define portSTACK_TYPE	uint32_t
typedef portSTACK_TYPE StackType_t;
typedef double portDOUBLE;
typedef int32_t BaseType_t;
typedef uint32_t UBaseType_t;

#if( configUSE_16_BIT_TICKS == 1 )
	typedef uint16_t TickType_t;
	#define portMAX_DELAY ( TickType_t ) 0xffff
#else
	typedef uint32_t TickType_t;
	#define portMAX_DELAY ( TickType_t ) 0xffffffffUL

	/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do
	not need to be guarded with a critical section. */
	#define portTICK_TYPE_IS_ATOMIC 1
#endif
/*-----------------------------------------------------------*/

#endif /* __ASSEMBLER__ */

/* Architecture specifics. These can be used by assembly files as well. */
#define portSTACK_GROWTH			  ( -1 )
#define portTICK_PERIOD_MS			  ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
#define portBYTE_ALIGNMENT			  8
#define portCRITICAL_NESTING_IN_TCB   1
#define portMAX_CORE_COUNT            8
#ifndef configNUM_CORES
#define configNUM_CORES               1
#endif

/* This may be set to zero in the config file if the rtos_time
functions are not needed or if it is incremented elsewhere. */
#ifndef configUPDATE_RTOS_TIME_FROM_TICK_ISR
#define configUPDATE_RTOS_TIME_FROM_TICK_ISR 1
#endif

/*
 * When entering an ISR we need to grow the stack by one more word than
 * we actually need to save the thread context. This is because there are
 * some functions, written in assembly *cough* memcpy() *cough*, that think
 * it is OK to store words at SP[0]. Therefore the ISR must leave SP[0] alone
 * even though it is normally not necessary to do so.
 */
#define portTHREAD_CONTEXT_STACK_GROWTH RTOS_SUPPORT_INTERRUPT_STACK_GROWTH

#ifndef __ASSEMBLER__

/* Check validity of number of cores specified in config */
#if ( configNUM_CORES < 1 || portMAX_CORE_COUNT < configNUM_CORES )
#error "Invalid number of cores specified in config!"
#endif

#define portMEMORY_BARRIER() RTOS_MEMORY_BARRIER()
#define portTASK_STACK_DEPTH(pxTaskCode) RTOS_THREAD_STACK_SIZE(pxTaskCode)
/*-----------------------------------------------------------*/

/* Scheduler utilities. */
#define portYIELD() 	asm volatile( "KCALLI_lu6 0" ::: "memory" )

#define portEND_SWITCHING_ISR( xSwitchRequired ) \
do \
{ \
	if( xSwitchRequired != pdFALSE ) \
	{ \
		extern uint32_t ulPortYieldRequired[ portMAX_CORE_COUNT ]; \
	    ulPortYieldRequired[ portGET_CORE_ID() ] = pdTRUE; \
	} \
} while( 0 )

#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )
/*-----------------------------------------------------------*/

/* SMP utilities. */
#define portGET_CORE_ID() rtos_core_id_get()

void vPortYieldOtherCore( int xOtherCoreID );
#define portYIELD_CORE( x ) vPortYieldOtherCore( x )
/*-----------------------------------------------------------*/

/* Architecture specific optimisations. */
#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
#endif

#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1

    /* Store/clear the ready priorities in a bit map. */
    #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
    #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )

    /*-----------------------------------------------------------*/

    #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) )

#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
/*-----------------------------------------------------------*/

/* Critical section management. */

#define portGET_INTERRUPT_STATE() rtos_interrupt_mask_get()

/*
 * This differs from the standard portDISABLE_INTERRUPTS()
 * in that it also returns what the interrupt state was
 * before it disabling interrupts.
 */
#define portDISABLE_INTERRUPTS() rtos_interrupt_mask_all()

#define portENABLE_INTERRUPTS() rtos_interrupt_unmask_all()

/*
 * Will enable interrupts if ulState is non-zero.
 */
#define portRESTORE_INTERRUPTS(ulState) rtos_interrupt_mask_set(ulState)

/*
 * Returns non-zero if currently running in an
 * ISR or otherwise in kernel mode.
 */
#define portCHECK_IF_IN_ISR() rtos_isr_running()

#define portASSERT_IF_IN_ISR() configASSERT( portCHECK_IF_IN_ISR() == 0 )

#define portGET_ISR_LOCK()      rtos_lock_acquire(0)
#define portRELEASE_ISR_LOCK()  rtos_lock_release(0)
#define portGET_TASK_LOCK()     rtos_lock_acquire(1)
#define portRELEASE_TASK_LOCK() rtos_lock_release(1)

void vTaskEnterCritical(void);
void vTaskExitCritical(void);
#define portENTER_CRITICAL()                   vTaskEnterCritical()
#define portEXIT_CRITICAL()                    vTaskExitCritical()

/*
 * vTaskEnterCritical() has been modified to be safe to use
 * from within ISRs. The previous mask does not need to be
 * returned since in the xCORE interrupts are always disabled
 * in ISRs. Effectively this call just grabs the kernel lock
 * when called from an ISR.
 */
#define portSET_INTERRUPT_MASK_FROM_ISR() (vTaskEnterCritical(), 0)

/*
 * vTaskExitCritical() has been modified to be safe to use
 * from within ISRs. When the nesting level has reached zero
 * it releases the lock, but when called from within an ISR
 * it will *not* re-enable interrupts since it is assumed they
 * were previously disabled. Thus the previous state in x is
 * unused.
 */
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) (vTaskExitCritical(), (void) x)

/*-----------------------------------------------------------*/

/* Runtime stats support */
#if ( configGENERATE_RUN_TIME_STATS == 1 )
int xscope_gettime( void );
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 	/* nothing needed here */
#define portGET_RUN_TIME_COUNTER_VALUE()			xscope_gettime()
#endif
/*-----------------------------------------------------------*/

/* Maps sprintf and snprintf to the lite version in lib_rtos_support */
#if ( configUSE_DEBUG_SPRINTF == 1 )
#define sprintf(...) rtos_sprintf(__VA_ARGS__)
#define snprintf(...) rtos_snprintf(__VA_ARGS__)
#endif

/* Attribute for the pxCallbackFunction member of the Timer_t struct.
Required by xcc to calculate stack usage. */
#define portTIMER_CALLBACK_ATTRIBUTE __attribute__((fptrgroup("timerCallbackGroup")))

/* Timer callback function macros. For xcc this ensures they get added to the timer callback
group so that stack usage for certain functions in timers.c can be calculated. */
#define portTIMER_CALLBACK_FUNCTION_PROTO( vFunction, xTimer ) void vFunction( TimerHandle_t xTimer )
#define portTIMER_CALLBACK_FUNCTION( vFunction, xTimer ) portTIMER_CALLBACK_ATTRIBUTE void vFunction( TimerHandle_t xTimer )

/*-----------------------------------------------------------*/

/* Task function macros as described on the FreeRTOS.org WEB site.  These are
not necessary for to use this port.  They are defined so the common demo files
(which build with all the ports) will build. */
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
/*-----------------------------------------------------------*/


#ifdef __cplusplus
}
#endif

#endif /* __ASSEMBLER__ */

#endif /* PORTMACRO_H */

