// 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;

#define portBASE_TYPE   BaseType_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 configNUMBER_OF_CORES
#define configNUMBER_OF_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 ( configNUMBER_OF_CORES < 1 || portMAX_CORE_COUNT < configNUMBER_OF_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()

/*
 * Port set interrupt mask and clear interrupt mask.
 */
#define portSET_INTERRUPT_MASK()                rtos_interrupt_mask_all()
#define portCLEAR_INTERRUPT_MASK( ulState )     rtos_interrupt_mask_set( ulState )

#define portSET_INTERRUPT_MASK_FROM_ISR()       ( 0 )
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)    ( (void) x )

/*
 * 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()

extern UBaseType_t vTaskEnterCriticalFromISR( void );
extern void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus );
#define portENTER_CRITICAL_FROM_ISR             vTaskEnterCriticalFromISR
#define portEXIT_CRITICAL_FROM_ISR              vTaskExitCriticalFromISR

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

/* 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 */

