kernel/eka/include/nkernsmp/arm/arm_gic.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// e32\include\nkernsmp\arm\arm_gic.h
// Register definitions for ARM Generic Interrupt Controller
// 
// WARNING: This file contains some APIs which are internal and are subject
//          to change without notice. Such APIs should therefore not be used
//          outside the Kernel and Hardware Services package.
//

#ifndef	__ARM_GIC_H__
#define	__ARM_GIC_H__
#include <e32def.h>

#ifdef	__STANDALONE_NANOKERNEL__
#undef	__IN_KERNEL__
#define	__IN_KERNEL__
#endif

enum TGicIntId
	{
	E_GicIntId_Soft0		=0,				// IDs 0-15 are for software triggered IPIs
	E_GicIntId_Soft1		=1,
	E_GicIntId_Soft2		=2,
	E_GicIntId_Soft3		=3,
	E_GicIntId_Soft4		=4,
	E_GicIntId_Soft5		=5,
	E_GicIntId_Soft6		=6,
	E_GicIntId_Soft7		=7,
	E_GicIntId_Soft8		=8,
	E_GicIntId_Soft9		=9,
	E_GicIntId_Soft10		=10,
	E_GicIntId_Soft11		=11,
	E_GicIntId_Soft12		=12,
	E_GicIntId_Soft13		=13,
	E_GicIntId_Soft14		=14,
	E_GicIntId_Soft15		=15,

	E_GicIntId_Private0		=16,			// IDs 16-31 are for private peripherals
	E_GicIntId_Private1		=17,
	E_GicIntId_Private2		=18,
	E_GicIntId_Private3		=19,
	E_GicIntId_Private4		=20,
	E_GicIntId_Private5		=21,
	E_GicIntId_Private6		=22,
	E_GicIntId_Private7		=23,
	E_GicIntId_Private8		=24,
	E_GicIntId_Private9		=25,
	E_GicIntId_Private10	=26,
	E_GicIntId_Private11	=27,
	E_GicIntId_Private12	=28,
	E_GicIntId_Private13	=29,
	E_GicIntId_Private14	=30,
	E_GicIntId_Private15	=31,

	E_GicIntId_Normal0		=32,			// first normal interrupt ID

	E_GicIntId_NormalLast	=1019,			// last possible normal interrupt ID
	E_GicIntId_Reserved0	=1020,			// reserved interrupt ID
	E_GicIntId_Reserved1	=1021,			// reserved interrupt ID
	E_GicIntId_NS			=1022,			// only nonsecure interrupts are serviceable
	E_GicIntId_Spurious		=1023			// no interrupts are serviceable
	};

struct GicDistributor
	{
	volatile TUint32	iCtrl;				// 000 Control register
	volatile TUint32	iType;				// 004 Type register
	volatile TUint32	iImpId;				// 008 Implementor Identification register (not on MPCore)
	volatile TUint32	i_Skip_1[29];		// 00C unused
	volatile TUint32	iIntSec[32];		// 080 Interrupt Security register (not on MPCore) (1 bit per interrupt)
	volatile TUint32	iEnableSet[32];		// 100 Enable set register (1 bit per interrupt)
	volatile TUint32	iEnableClear[32];	// 180 Enable clear register (1 bit per interrupt)
	volatile TUint32	iPendingSet[32];	// 200 Pending set register (1 bit per interrupt)
	volatile TUint32	iPendingClear[32];	// 280 Pending clear register (1 bit per interrupt)
	volatile TUint32	iActive[32];		// 300 Active status register (1 bit per interrupt)
	volatile TUint32	i_Skip_2[32];		// 380 unused
	volatile TUint32	iPriority[256];		// 400 Interrupt priority register (8 bits per interrupt)
	volatile TUint32	iTarget[256];		// 800 Interrupt target CPUs register (8 bits per interrupt)
	volatile TUint32	iConfig[64];		// C00 Interrupt configuration register (2 bits per interrupt)
	volatile TUint32	iImpDef[64];		// D00 Implementation defined registers
											// = Interrupt line level on MPCore
	volatile TUint32	i_Skip_3[64];		// E00 unused
	volatile TUint32	iSoftIrq;			// F00 Software triggered interrupt register
	volatile TUint32	i_Skip_4[51];		// F04 unused
	volatile TUint32	iIdent[12];			// FD0 Identification registers
	};

__ASSERT_COMPILE(sizeof(GicDistributor)==0x1000);

struct GicCpuIfc
	{
	volatile TUint32	iCtrl;				// 00 Control register
	volatile TUint32	iPriMask;			// 04 Priority mask register
	volatile TUint32	iBinaryPoint;		// 08 Binary point register
	volatile TUint32	iAck;				// 0C Interrupt acknowledge register
	volatile TUint32	iEoi;				// 10 End of interrupt register
	volatile TUint32	iRunningPri;		// 14 Running priority register
	volatile TUint32	iHighestPending;	// 18 Highest pending interrupt register
	volatile TUint32	iNSBinaryPoint;		// 1C Aliased nonsecure binary point register (not on MPCore)
	volatile TUint32	i_Skip_1[8];		// 20 unused
	volatile TUint32	iImpDef[36];		// 40 Implementation defined (not present on MPCore)
	volatile TUint32	i_Skip_2[11];		// D0 unused
	volatile TUint32	iImpId;				// FC Implementor Identification register (not on MPCore)
	};

__ASSERT_COMPILE(sizeof(GicCpuIfc)==0x100);

enum TGicDistCtrl
	{
	E_GicDistCtrl_Enable	=1,				// Enable interrupt distributor
	};

enum TGicDistType
	{
	E_GicDistType_ITShift	=0u,			// bits 0-4 = number of sets of 32 interrupts supported
	E_GicDistType_ITMask	=0x1fu,
	E_GicDistType_CPUNShift	=5u,			// bits 5-7 = number of CPUs supported - 1
	E_GicDistType_CPUNMask	=0xe0u,
	E_GicDistType_Domains	=0x400u,		// set if two security domains supported
	E_GicDistType_LSPIShift	=11u,			// bits 11-15 = number of lockable shared peripheral interrupts
	E_GicDistType_LSPIMask	=0xf800u,
	};

enum TGicDistIntConfig
	{
	E_GicDistICfg1N			=1u,			// if set use 1-N model else use N-N model
											// peripheral interrupts support only 1-N model, s/w interrupts N-N
											// 1-N means the interrupt is cleared by the first CPU to accept it
	E_GicDistICfgEdge		=2u,			// if set, rising edge triggered, else active high level triggered
	};

enum TGicDistSoftIrqDestType
	{
	E_GicDestTypeList		=0u,			// send to all CPUs in list (bit mask)
	E_GicDestTypeOthers		=1u,			// send to all CPUs other than self
	E_GicDestTypeSelf		=2u,			// send to self only
	E_GicDestTypeRsvd		=3u
	};

// Compile word to generate IPI
// dt = destination type, dl = bit mask of destination CPUs, id = interrupt ID (0-15)
#define	GIC_SOFT_IRQ_WORD(dt,dl,id)		((TUint32(dt)<<24)|(TUint32(dl)<<16)|(TUint32(id)))

#define	GIC_IPI_SELF(id)				GIC_SOFT_IRQ_WORD(E_GicDestTypeSelf, 0, id)
#define	GIC_IPI_OTHERS(id)				GIC_SOFT_IRQ_WORD(E_GicDestTypeOthers, 0, id)
#define	GIC_IPI(dl,id)					GIC_SOFT_IRQ_WORD(E_GicDestTypeList, dl, id)


#endif	// 	__ARM_GIC_H__