kernel/eka/include/nkernsmp/arm/nk_plat.h
changeset 90 947f0dc9f7a8
parent 0 a41df078684a
child 177 a232af6b0b1f
equal deleted inserted replaced
52:2d65c2f76d7b 90:947f0dc9f7a8
    35 #define __PRI_LIST_MACHINE_CODED__
    35 #define __PRI_LIST_MACHINE_CODED__
    36 #define __FAST_SEM_MACHINE_CODED__
    36 #define __FAST_SEM_MACHINE_CODED__
    37 #define __FAST_MUTEX_MACHINE_CODED__
    37 #define __FAST_MUTEX_MACHINE_CODED__
    38 #define __NTHREAD_WAITSTATE_MACHINE_CODED__
    38 #define __NTHREAD_WAITSTATE_MACHINE_CODED__
    39 
    39 
       
    40 class TSubScheduler;
       
    41 class TScheduler;
       
    42 struct SFullArmRegSet;
       
    43 struct ArmScu;
       
    44 struct GicDistributor;
       
    45 struct GicCpuIfc;
       
    46 struct ArmLocalTimer;
       
    47 struct ArmGlobalTimer;
       
    48 
    40 // TSubScheduler member data
    49 // TSubScheduler member data
    41 #define	i_ScuAddr			iExtras[4]		// Address of SCU (also in TScheduler)
    50 struct TSubSchedulerX
    42 #define	i_GicDistAddr		iExtras[5]		// Address of GIC Distributor (also in TScheduler)
    51 	{
    43 #define	i_GicCpuIfcAddr		iExtras[6]		// Address of GIC CPU Interface (also in TScheduler)
    52 	TUint32				iSSXP[3];
    44 #define	i_LocalTimerAddr	iExtras[7]		// Address of local timer registers (also in TScheduler)
    53 	ArmGlobalTimer*		iGlobalTimerAddr;		// Address of global timer registers (also in TScheduler)
    45 #define	i_IrqCount			iExtras[8]		// count of interrupts handled
    54 	ArmScu*				iScuAddr;				// Address of SCU (also in TScheduler)
    46 #define	i_IrqNestCount		iExtras[9]		// IRQ nest count for this CPU (starts at -1)
    55 	GicDistributor*		iGicDistAddr;			// Address of GIC Distributor (also in TScheduler)
    47 #define	i_ExcInfo			iExtras[10]		// pointer to exception info for crash debugger
    56 	GicCpuIfc*			iGicCpuIfcAddr;			// Address of GIC CPU Interface (also in TScheduler)
    48 #define	i_CrashState		iExtras[11]		// 0=normal, 1=this CPU faulted, 2=this CPU has received an NMI and halted
    57 	ArmLocalTimer*		iLocalTimerAddr;		// Address of local timer registers (also in TScheduler)
    49 #define	i_AbtStackTop		iExtras[12]		// Top of ABT stack for this CPU, also used to point to SFullArmRegSet
    58 	volatile TUint32	iIrqCount;				// count of interrupts handled
    50 #define	i_UndStackTop		iExtras[13]		// Top of UND stack for this CPU
    59 	volatile TInt		iIrqNestCount;			// IRQ nest count for this CPU (starts at -1)
    51 #define	i_FiqStackTop		iExtras[14]		// Top of FIQ stack for this CPU
    60 	TAny*				iExcInfo;				// pointer to exception info for crash debugger
    52 #define	i_IrqStackTop		iExtras[15]		// Top of IRQ stack for this CPU
    61 	volatile TInt		iCrashState;			// 0=normal, 1=this CPU faulted, 2=this CPU has received an NMI and halted
    53 #define	i_TimerMultF		iExtras[16]		// Timer frequency / Max Timer frequency * 2^32
    62 	union {
    54 #define	i_TimerMultI		iExtras[17]		// Max Timer frequency / Timer frequency * 2^24
    63 		TLinAddr		iAbtStackTop;			// Top of ABT stack for this CPU, also used to point to SFullArmRegSet
    55 #define	i_CpuMult			iExtras[18]		// CPU frequency / Max CPU frequency * 2^32
    64 		SFullArmRegSet* iRegs;
    56 #define	i_LastTimerSet		iExtras[20]		// Value last written to local timer counter
    65 		};
    57 #define	i_TimestampError	iExtras[21]		// Current error in the timestamp
    66 	TLinAddr			iUndStackTop;			// Top of UND stack for this CPU
    58 #define	i_MaxCorrection		iExtras[22]		// Maximum correction to timestamp in one go
    67 	TLinAddr			iFiqStackTop;			// Top of FIQ stack for this CPU
    59 #define	i_TimerGap			iExtras[23]		// Timestamp ticks taken to read and write local timer counter
    68 	TLinAddr			iIrqStackTop;			// Top of IRQ stack for this CPU
    60 
    69 	volatile TUint32	iCpuFreqM;				// CPU frequency / Max CPU frequency (mantissa, bit 31=1) f/fmax=mantissa/2^shift
    61 #define	i_Regs				iExtras[12]		// Alias for i_AbtStackTop
    70 	volatile TInt		iCpuFreqS;				// CPU frequency / Max CPU frequency (shift)
       
    71 	volatile TUint32	iCpuPeriodM;			// Max CPU frequency / CPU frequency (mantissa, bit 31=1) fmax/f=mantissa/2^shift
       
    72 	volatile TInt		iCpuPeriodS;			// Max CPU frequency / CPU frequency (shift)
       
    73 	volatile TUint32	iNTimerFreqM;			// Nominal Timer frequency / Max Timer frequency (mantissa, bit 31=1) f/fmax=mantissa/2^shift
       
    74 	volatile TInt		iNTimerFreqS;			// Nominal Timer frequency / Max Timer frequency (shift)
       
    75 	volatile TUint32	iNTimerPeriodM;			// Nominal Max Timer frequency / Timer frequency (mantissa, bit 31=1) fmax/f=mantissa/2^shift
       
    76 	volatile TInt		iNTimerPeriodS;			// Nominal Max Timer frequency / Timer frequency (shift)
       
    77 	volatile TUint32	iTimerFreqM;			// Timer frequency / Max Timer frequency (mantissa, bit 31=1) f/fmax=mantissa/2^shift
       
    78 	volatile TInt		iTimerFreqS;			// Timer frequency / Max Timer frequency (shift)
       
    79 	volatile TUint32	iTimerPeriodM;			// Max Timer frequency / Timer frequency (mantissa, bit 31=1) fmax/f=mantissa/2^shift
       
    80 	volatile TInt		iTimerPeriodS;			// Max Timer frequency / Timer frequency (shift)
       
    81 	volatile TUint64	iLastSyncTime;			// Timestamp at which last reference check occurred
       
    82 	volatile TUint32	iTicksSinceLastSync;	// Local timer ticks between last ref. check and next zero crossing
       
    83 	volatile TUint32	iLastTimerSet;			// Value last written to local timer counter
       
    84 	volatile TUint32	iGapEstimate;			// 2^16 * estimated gap in ticks whenever local timer counter is read then written
       
    85 	volatile TUint32	iGapCount;				// count of local timer counter RMW ops
       
    86 	volatile TUint32	iTotalTicks;			// programmed ticks since last sync
       
    87 	volatile TUint32	iDitherer;				// PRNG state for dither generation
       
    88 	volatile TInt		iFreqErrorEstimate;		// Current frequency offset between local timer and reference
       
    89 	volatile TInt		iFreqErrorLimit;		// Saturation level for frequency offset
       
    90 	volatile TInt64		iErrorIntegrator;		// Accumulator to integrate time error measurements
       
    91 	volatile TUint64	iRefAtLastCorrection;	// Value of reference timer at last correction
       
    92 	volatile TUint8		iM;						// Value controlling loop bandwidth (larger->lower loop bandwidth)
       
    93 	volatile TUint8		iN;						// Number of timer ticks between corrections = 2^iN
       
    94 	volatile TUint8		iD;						// Value controlling loop damping
       
    95 	volatile TUint8		iSSXP1;
       
    96 
       
    97 	TUint32				iSSXP2[19];
       
    98 	TUint64				iSSXP3;					// one 64 bit value to guarantee alignment
       
    99 	};
    62 
   100 
    63 // TScheduler member data
   101 // TScheduler member data
    64 #define	i_TimerMax			iExtras[16]		// Maximum per-CPU timer frequency (after prescaling)
   102 struct TSchedulerX
    65 
   103 	{
    66 
   104 	TUint64				iTimerMax;				// Maximum per-CPU timer frequency (after prescaling)
    67 #define	RESCHED_IPI_VECTOR			0x00
   105 	TUint32				iSXP[1];
    68 #define	GENERIC_IPI_VECTOR			0x01
   106 	ArmGlobalTimer*		iGlobalTimerAddr;		// Address of global timer registers (also in TSubScheduler)
    69 #define	TRANSFERRED_IRQ_VECTOR		0x02
   107 	ArmScu*				iScuAddr;				// Address of SCU (also in TSubScheduler)
    70 #define	CRASH_IPI_VECTOR			0x03	// would really like this to be a FIQ
   108 	GicDistributor*		iGicDistAddr;			// Address of GIC Distributor (also in TSubScheduler)
    71 #define	BOOT_IPI_VECTOR				0x04	// used during boot to handshake with APs
   109 	GicCpuIfc*			iGicCpuIfcAddr;			// Address of GIC CPU Interface (also in TSubScheduler)
    72 #define RESERVED_IPI_VECTOR_1		0x05	// reserved for future kernel functionality
   110 	ArmLocalTimer*		iLocalTimerAddr;		// Address of local timer registers (also in TSubScheduler)
    73 #define RESERVED_IPI_VECTOR_2		0x06	// reserved for future kernel functionality
   111 	TUint32				iSXP2[8];
    74 #define RESERVED_IPI_VECTOR_3		0x07	// reserved for future kernel functionality
   112 	};
       
   113 
       
   114 
       
   115 #define	RESCHED_IPI_VECTOR				0x00
       
   116 #define	GENERIC_IPI_VECTOR				0x01
       
   117 #define	TRANSFERRED_IRQ_VECTOR			0x02
       
   118 #define	CRASH_IPI_VECTOR				0x03	// would really like this to be a FIQ
       
   119 #define	BOOT_IPI_VECTOR					0x04	// used during boot to handshake with APs
       
   120 #define	INDIRECT_POWERDOWN_IPI_VECTOR	0x04	// used to trigger core power down
       
   121 #define RESERVED_IPI_VECTOR_1			0x05	// reserved for future kernel functionality
       
   122 #define RESERVED_IPI_VECTOR_2			0x06	// reserved for future kernel functionality
       
   123 #define IDLE_WAKEUP_IPI_VECTOR			0x07	// for use of Idle handler/Wakeup handler
    75 
   124 
    76 #if defined(__CPU_ARM11MP__)
   125 #if defined(__CPU_ARM11MP__)
    77 #define	TIMESLICE_VECTOR			0x1D	// vector 29 is per-CPU timer interrupt
   126 #define	TIMESLICE_VECTOR			0x1D	// vector 29 is per-CPU timer interrupt
    78 											// vector 30 is per-CPU Watchdog timer when not in watchdog mode
   127 											// vector 30 is per-CPU Watchdog timer when not in watchdog mode
    79 											// vector 31 is external nIRQ local interrupt pin
   128 											// vector 31 is external nIRQ local interrupt pin
   189  */
   238  */
   190 class NThread : public NThreadBase
   239 class NThread : public NThreadBase
   191 	{
   240 	{
   192 public:
   241 public:
   193 	TInt Create(SNThreadCreateInfo& aInfo, TBool aInitial);
   242 	TInt Create(SNThreadCreateInfo& aInfo, TBool aInitial);
   194 	inline void Stillborn()
   243 	void Stillborn();
   195 		{}
       
   196 
   244 
   197 	/** Value indicating what event caused thread to enter privileged mode.
   245 	/** Value indicating what event caused thread to enter privileged mode.
   198 		@publishedPartner
   246 		@publishedPartner
   199 		@released
   247 		@released
   200 	 */
   248 	 */
   297 #define	smp_mb()	mb()
   345 #define	smp_mb()	mb()
   298 #define	wmb()		mb()
   346 #define	wmb()		mb()
   299 #define	smp_wmb()	mb()
   347 #define	smp_wmb()	mb()
   300 
   348 
   301 #ifdef	__IN_KERNEL__
   349 #ifdef	__IN_KERNEL__
   302 struct ArmScu;
   350 #define	SCU				(*TheScheduler.iSX.iScuAddr)
   303 struct GicDistributor;
   351 #define	GIC_DIST		(*TheScheduler.iSX.iGicDistAddr)
   304 struct GicCpuIfc;
   352 #define	GIC_CPU_IFC		(*TheScheduler.iSX.iGicCpuIfcAddr)
   305 struct ArmLocalTimer;
   353 #define	LOCAL_TIMER		(*TheScheduler.iSX.iLocalTimerAddr)
   306 #define	SCU			(*(ArmScu*)TheScheduler.i_ScuAddr)
   354 
   307 #define	GIC_DIST	(*(GicDistributor*)TheScheduler.i_GicDistAddr)
   355 #ifdef	__CPU_ARM_HAS_GLOBAL_TIMER_BLOCK
   308 #define	GIC_CPU_IFC	(*(GicCpuIfc*)TheScheduler.i_GicCpuIfcAddr)
   356 #define	GLOBAL_TIMER	(*TheScheduler.iSX.iGlobalTimerAddr)
   309 #define	LOCAL_TIMER	(*(ArmLocalTimer*)TheScheduler.i_LocalTimerAddr)
   357 #endif
       
   358 
   310 #endif
   359 #endif
   311 
   360 
   312 
   361 
   313 // End of file
   362 // End of file
   314 #endif
   363 #endif