kerneltest/e32test/mmu/d_cache.h
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// Copyright (c) 2006-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:
// e32test\mmu\d_cache.h
// 
//

#ifndef __D_CACHE_H__
#define __D_CACHE_H__

#include <e32cmn.h>
#ifndef __KERNEL_MODE__
#include <e32std.h>
#endif

_LIT(KCacheTestDriverName,"d_cache");
const TInt KMaxThresholdTypes = 5; // 1.Instruction/Unified, 2.Data, 3.AltD 4.Data_IMB  5.L210/L2XScale


const TInt KSingleCacheDescSize = 30;//Desc. of each particular cache. Must be *2 as t_cache converts TDes8 into TDes16.
const TInt KCacheDescSize = 200;//Desc. of the cache as a whole on the platforms. Must be *2 as t_cache converts TDes8 into TDes16.
const TInt KMaxCaches = 8; //Max number of caches. In theory, could be more but...
/**User side channel to Device Driver.*/
class RCacheTestDevice : public RBusLogicalChannel
	{
public:
	enum TControl
		{
		EGetCacheInfo,
		ETestDataChunk,
		ETestCodeChunk,
		ETestWriteBackReadAllocate,
		ETestWriteBackWriteAllocate,
		ETesL2Maintenance,
		EGetThreshold,
		ESetThreshold,
		ETestUseCase
		};

	struct TThresholdInfo
		{
		TInt iCacheType; 
		TUint32 iPurge; 
		TUint32 iClean; 
		TUint32 iFlush;
		};

	//Description of a single cache
	struct TCacheSingle
		{
		TInt8 iLevel;		// Cache level (1-8)
		TInt8 iData;		// 1 if it is data (or unified) cache, 0 otherwise
		TInt8 iCode;		// 1 if this is instruction (or unified) cache, 0 otherwise
		TInt iSize; 		// In bytes. Should be = iLineLength * iWays * iSets
		TInt iLineSize; 	// In bytes
		TInt iWays;			// Number of sets in cache
		TInt iSets;			// Number of ways in cache
		TBuf8<2*KSingleCacheDescSize> iDesc;	// Description, eg. L1_Instr_Inner L1_Data L2_Unified L210_Unified_Outer
		};

	struct TCacheInfo
		{
		TBuf8<2*KCacheDescSize> iDesc;	// General decription of the platform. E.g. '1176 with L210'.
		TInt iCacheCount;				// How many caches are there all together.
		TInt iMaxCacheSize;				// All caches considered. In bytes
		TInt iMemoryRemapping;			// 1 if memory remapping is ON.
		TInt iOuterCache;				// 1 if there is outer cache
		TInt iDmaBufferAlignment;		// Maximum size of any data cache line
		TCacheSingle iCache[KMaxCaches];// Info for each separate cache.
		};

	enum TCacheAttr//Specifies cache attributes 

		{   				//CacheAttr		BC(armv5)	TEX:BC(armv6)		memory_remapping(armv6K, armv7)
// Non-cached mapping
		E_FullyBlocking, 		//00 		00			SO/Shared			T0
		E_Buffered_NC,			//01		00			Device/Shared		T1
		E_Buffered_C, 			//02		01			Normal-Uncached		T1

// Inner cache
		E_InnerWT,				//05		10			Normal-InnerWT		T2
		E_InnerWBRA,			//06		11			Normal-InnerWB-RA	T3
		E_InnerWB,				//07		11			Normal-InnerWB-RAWA	T3
// Outer cache
		E_OuterWT,				//50		10			Normal/OuterWT		T2
		E_OuterWBRA,			//60		11			Normal/OuterBW-RA	T2
		E_OuterWB,				//70		11			Normal/OuterBW-RAWA	T2
// All cache
		E_InOutWT,				//55		10			Normal/FullyWT		T2
		E_InOutWBRA,			//66		11			Normal/FullyWB-RA	T3
		E_InOutWB,				//77		11			Normal/FullyWB-RAWA	T3

// Memory remapped attributes	
		E_StronglyOrder,		//--		T0/00		SO					T0
		E_Device,				//--		T0/00		Device				T1
		E_Normal_Uncached,		//--		T0/01		Normal/Uncached		T2
		E_Normal_Cached,		//--		T0/11		Normal/FullyBW		T3
		E_KernelInternal4,		//--		-----		---					T4
		E_PlatformSpecific5,	//--		-----		---					T5
		E_PlatformSpecific6,	//--		-----		---					T6
		E_PlatformSpecific7,	//--		-----		---					T7

// Inner cache
		E_InnerWT_Remapped,		//--		--			--					T4/Normal/InnerWT-OuterNC
		E_InnerWBRA_Remapped,	//--		--			--					T4/Normal/InnerWBRA-OuterNC
		E_InnerWB_Remapped,		//--		--			--					T4/Normal/InnerWB-OuterNC
// Outer cache
		E_OuterWT_Remapped,		//--		--			--					T4/Normal/InnerNC-OuterWT
		E_OuterWBRA_Remapped,	//--		--			--					T4/Normal/InnerNC-OuterWBRA
		E_OuterWB_Remapped,		//--		--			--					T4/Normal/InnerNC-OuterWBRA
// All cache
		E_InOutWT_Remapped,		//--		--			--					T4/Normal/InnerWT-OuterWT
		E_InOutWBRA_Remapped,	//--		--			--					T4/Normal/InnerWBRA-OuterWBRA
		E_InOutWB_Remapped,		//--		--			--					T4/Normal/InnerWB-OuterWB

// Kernel heap for data test / rom-image for code test
		E_Default,
		};
	
	struct TChunkTest
		{
		TChunkTest() {iShared=EFalse; iUseCase=0; iLoops=0;}
		TChunkTest(TInt aUseCase, TInt aSize, TInt aLoops) {iShared=EFalse;iUseCase=aUseCase;iLoops=aLoops;iSize=aSize;}
		
		TInt 		iSize;				//Defines the size of memory (either code or data) to test against.
		TCacheAttr	iCacheAttr;  		//Defines cache attributes of the memory to test.
		TBool		iShared;			//Defines the shared bit
		TInt		iUseCase;				//Specifies which test to execute.
		TInt		iLoops;				//The number of loops to execute.

		TUint32 	iActualMapAttr;		//The actual mapping attributes of the chunk. Will be set by the driver.
		TInt 		iTime; 				//The number of kernel ticks. Will be set by the driver. 
		};
public:
#ifndef __KERNEL_MODE__
	TInt Open()
		{return DoCreate(KCacheTestDriverName,TVersion(1,0,0),KNullUnit,NULL,NULL);}
	TInt GetCacheInfo (TCacheInfo& aCaches)
		{return DoControl(EGetCacheInfo, reinterpret_cast<TAny*>(&aCaches));}
	TInt TestDataChunk (TChunkTest& aChunkTest)
		{return DoControl(ETestDataChunk, reinterpret_cast<TAny*>(&aChunkTest));}
	TInt TestCodeChunk (TChunkTest& aChunkTest)
		{return DoControl(ETestCodeChunk, reinterpret_cast<TAny*>(&aChunkTest));}
	TInt TestWriteBackReadAllocate (TChunkTest& aChunkTest)
		{return DoControl(ETestWriteBackReadAllocate, reinterpret_cast<TAny*>(&aChunkTest));}
	TInt TestWriteBackWriteAllocate (TChunkTest& aChunkTest)
		{return DoControl(ETestWriteBackWriteAllocate, reinterpret_cast<TAny*>(&aChunkTest));}
	TInt TestL2Maintenance()
		{return DoControl(ETesL2Maintenance);}
	TInt GetThreshold(TThresholdInfo& aThreshold)
		{return DoControl(EGetThreshold, reinterpret_cast<TAny*>(&aThreshold));}
	TInt SetThreshold(TThresholdInfo& aThreshold)
		{return DoControl(ESetThreshold, reinterpret_cast<TAny*>(&aThreshold));}
	TInt TestUseCase (TChunkTest& aChunkTest)
		{return DoControl(ETestUseCase, reinterpret_cast<TAny*>(&aChunkTest));}
#endif //__KERNEL_MODE__
	};
#endif //__D_CACHE_H__