os/security/cryptoplugins/cryptospiplugins/test/h4drv/crypto_h4/cryptoh4aes.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
/**
sl@0
    20
 @file
sl@0
    21
 @internalComponent
sl@0
    22
 @released
sl@0
    23
*/
sl@0
    24
#include <kernel/kern_priv.h>
sl@0
    25
#include "cryptodriver.h"
sl@0
    26
#ifdef __MARM__
sl@0
    27
#include <omap_hrp/assp/shared/omap_reg.h>
sl@0
    28
#include <omap_hrp/assp/shared/omap_interrupt.h>
sl@0
    29
#endif
sl@0
    30
#include "cryptoh4aes.h"
sl@0
    31
sl@0
    32
#if 0
sl@0
    33
#undef __MARM__
sl@0
    34
#ifndef __MARM__
sl@0
    35
#warning "h/w disabled"
sl@0
    36
#endif
sl@0
    37
#endif
sl@0
    38
sl@0
    39
#ifdef DUMPBUFFER
sl@0
    40
LOCAL_D void dumpBuffer(const char *aName, TUint32 *aBuf, TUint32 aLen);
sl@0
    41
#else
sl@0
    42
#define dumpBuffer(aName, aBuf, aLen)
sl@0
    43
#endif
sl@0
    44
sl@0
    45
CryptoH4JobAes::CryptoH4JobAes(DLddChanAes &aLddChanAes)
sl@0
    46
	: iLddChanAes(aLddChanAes),
sl@0
    47
	  iEncrypt(EFalse),
sl@0
    48
	  iKeyLengthBytes(0),
sl@0
    49
	  iSwWriteByteOffset(0),
sl@0
    50
	  iHwReadIndex(0),
sl@0
    51
	  iHwWriteIndex(0),
sl@0
    52
	  iSwReadByteOffset(0),
sl@0
    53
	  iHwRunning(EFalse),
sl@0
    54
	  iDmaToHwPending(0),
sl@0
    55
	  iDmaFromHwPending(0),
sl@0
    56
#ifdef FAKE_DMA
sl@0
    57
	  iFakeDmaToHwQueued(0),
sl@0
    58
	  iFakeDmaFromHwQueued(0),
sl@0
    59
#endif
sl@0
    60
	  iDmaToHwCompleteDfc(DmaToHwCompleteDfc, this, 1), // DFC is priority '1'
sl@0
    61
	  iDmaFromHwCompleteDfc(DmaFromHwCompleteDfc, this, 1)
sl@0
    62
	{
sl@0
    63
	TRACE_FUNCTION("CryptoH4JobAes");
sl@0
    64
	}
sl@0
    65
sl@0
    66
CryptoH4JobAes::~CryptoH4JobAes()
sl@0
    67
	{
sl@0
    68
	TRACE_FUNCTION("~CryptoH4JobAes");
sl@0
    69
	StopHw();
sl@0
    70
	}
sl@0
    71
sl@0
    72
sl@0
    73
void CryptoH4JobAes::SetDfcQ(TDfcQue *aDfcQue)
sl@0
    74
	{
sl@0
    75
	TRACE_FUNCTION("SetDfcQ");
sl@0
    76
	iDmaToHwCompleteDfc.SetDfcQ(aDfcQue);
sl@0
    77
	iDmaFromHwCompleteDfc.SetDfcQ(aDfcQue);
sl@0
    78
	}
sl@0
    79
sl@0
    80
TUint8 *CryptoH4JobAes::GetKeyBuffer()
sl@0
    81
	{
sl@0
    82
	TRACE_FUNCTION("GetKeyBuffer");
sl@0
    83
	return (TUint8 *) &iKey;
sl@0
    84
	}
sl@0
    85
sl@0
    86
TUint8 *CryptoH4JobAes::GetIVBuffer()
sl@0
    87
	{
sl@0
    88
	TRACE_FUNCTION("GetIVBuffer");
sl@0
    89
	return (TUint8 *) &iIV;
sl@0
    90
	}
sl@0
    91
	
sl@0
    92
TUint32 CryptoH4JobAes::MaxBytes() const
sl@0
    93
	{
sl@0
    94
	TRACE_FUNCTION("MaxBytes");
sl@0
    95
	return sizeof(iAesBuffer); // return size in bytes
sl@0
    96
	}
sl@0
    97
sl@0
    98
TUint8 *CryptoH4JobAes::GetIOBuffer()
sl@0
    99
	{
sl@0
   100
	TRACE_FUNCTION("GetIOBuffer");
sl@0
   101
	return (TUint8 *) &iAesBuffer;
sl@0
   102
	}
sl@0
   103
sl@0
   104
void CryptoH4JobAes::GetToPddBuffer(TUint8 * &aBuf, TUint32 &aBufLen, TBool &aMore)
sl@0
   105
	{
sl@0
   106
	TRACE_FUNCTION("GetToPddBuffer");
sl@0
   107
	CheckIndexes();
sl@0
   108
	TUint8 *p = (TUint8 *) iAesBuffer;
sl@0
   109
	aBuf = &p[iSwWriteByteOffset];
sl@0
   110
sl@0
   111
	if(iSwReadByteOffset > iSwWriteByteOffset)
sl@0
   112
		{
sl@0
   113
		// Available buffer is contiguous
sl@0
   114
		aBufLen = iSwReadByteOffset - iSwWriteByteOffset;
sl@0
   115
		if(aBufLen) --aBufLen; // Never use all space to stop index collision
sl@0
   116
		aMore = EFalse;
sl@0
   117
		return;
sl@0
   118
		}
sl@0
   119
	else
sl@0
   120
		{
sl@0
   121
		// Available data crosses buffer end so return two regions
sl@0
   122
		// OR indexes are equal
sl@0
   123
		aBufLen = sizeof(iAesBuffer) - iSwWriteByteOffset;
sl@0
   124
		if(iSwReadByteOffset == 0)
sl@0
   125
			{
sl@0
   126
			// Do not fill to end of buffer because index would wrap and collid
sl@0
   127
			--aBufLen;
sl@0
   128
			aMore = EFalse;
sl@0
   129
			return;
sl@0
   130
			}
sl@0
   131
		aMore = (iSwReadByteOffset != iSwWriteByteOffset); // Another region to read
sl@0
   132
		return;
sl@0
   133
		}
sl@0
   134
	// Never gets here
sl@0
   135
	}
sl@0
   136
sl@0
   137
void CryptoH4JobAes::BytesWrittenToPdd(TUint32 aBytes)
sl@0
   138
	{
sl@0
   139
	TRACE_FUNCTION("BytesWrittenToPdd");
sl@0
   140
	CheckIndexes();
sl@0
   141
	iSwWriteByteOffset += aBytes;
sl@0
   142
	if(iSwWriteByteOffset >= sizeof(iAesBuffer))
sl@0
   143
		{
sl@0
   144
		iSwWriteByteOffset -= sizeof(iAesBuffer);
sl@0
   145
		}
sl@0
   146
		
sl@0
   147
	CheckIndexes();
sl@0
   148
	}
sl@0
   149
sl@0
   150
void CryptoH4JobAes::GetFromPddBuffer(TUint8 * &aBuf, TUint32 &aBufLen, TBool &aMore)
sl@0
   151
	{
sl@0
   152
	TRACE_FUNCTION("GetFromPddBuffer");
sl@0
   153
	CheckIndexes();
sl@0
   154
	TInt hwWrite8Index = iHwWriteIndex * 4;
sl@0
   155
	TUint8 *p = (TUint8 *) iAesBuffer;
sl@0
   156
	aBuf = &p[iSwReadByteOffset];
sl@0
   157
sl@0
   158
	TInt len = hwWrite8Index - iSwReadByteOffset;
sl@0
   159
	if(len >= 0)
sl@0
   160
		{
sl@0
   161
		aBufLen = len;
sl@0
   162
		aMore = EFalse;
sl@0
   163
		}
sl@0
   164
	else
sl@0
   165
		{
sl@0
   166
		// Wrap round condition, but can only return contiguous bytes
sl@0
   167
		aBufLen = sizeof(iAesBuffer) - iSwReadByteOffset;
sl@0
   168
		aMore = (hwWrite8Index != 0);
sl@0
   169
		}
sl@0
   170
	CheckIndexes();
sl@0
   171
	}
sl@0
   172
sl@0
   173
void CryptoH4JobAes::BytesReadFromPdd(TUint32 aBytes)
sl@0
   174
	{
sl@0
   175
	TRACE_FUNCTION("BytesReadFromPdd");
sl@0
   176
	CheckIndexes();
sl@0
   177
	iSwReadByteOffset += aBytes;
sl@0
   178
	if(iSwReadByteOffset >= sizeof(iAesBuffer))
sl@0
   179
		{
sl@0
   180
		iSwReadByteOffset -= sizeof(iAesBuffer);
sl@0
   181
		}
sl@0
   182
	CheckIndexes();
sl@0
   183
	iReadRequestLength -= aBytes;
sl@0
   184
	}
sl@0
   185
sl@0
   186
sl@0
   187
sl@0
   188
TInt CryptoH4JobAes::SetDetails(DCryptoJobScheduler *aJobScheduler, 
sl@0
   189
								MCryptoJobCallbacks *aCallbacks,
sl@0
   190
								TBool aEncrypt, 
sl@0
   191
								TInt aKeyLengthBytes,
sl@0
   192
								RCryptoDriver::TChainingMode aMode)
sl@0
   193
	{
sl@0
   194
	TRACE_FUNCTION("TChainingMode");
sl@0
   195
	//	Kern::Printf("AES Details %s: Key len %d, Mode %s (%d)",
sl@0
   196
	//				 aEncrypt?"Encrypt":"Decrypt", aKeyLengthBytes, (aMode == RCryptoDriver::ECbcMode)?"CBC":"ECB", aMode);
sl@0
   197
sl@0
   198
	if(State() != ECreated)
sl@0
   199
		{
sl@0
   200
        return KErrArgument;
sl@0
   201
		}
sl@0
   202
	
sl@0
   203
	iJobScheduler = aJobScheduler;
sl@0
   204
	iCallbacks = aCallbacks;
sl@0
   205
	iEncrypt = aEncrypt;
sl@0
   206
	iKeyLengthBytes = aKeyLengthBytes;
sl@0
   207
sl@0
   208
	if((aMode != RCryptoDriver::EEcbMode) && (aMode != RCryptoDriver::ECbcMode))
sl@0
   209
		{
sl@0
   210
		return KErrArgument;
sl@0
   211
		}
sl@0
   212
	iMode = aMode;
sl@0
   213
	if(iMode == RCryptoDriver::ECbcMode)
sl@0
   214
		{
sl@0
   215
		// For CBC we need to save the IV incase we need to
sl@0
   216
		// re-initialise the h/w mid-job
sl@0
   217
		TUint32 *from;
sl@0
   218
		TUint32 *to;
sl@0
   219
		if(iEncrypt)
sl@0
   220
			{
sl@0
   221
			// For encryption - DoSaveState saves the last encrypted
sl@0
   222
			// block. We set this to the IV to handle the case where
sl@0
   223
			// we do not encrypt any blocks before being suspended.
sl@0
   224
			from = &iIV[0];
sl@0
   225
			to = &iAesBuffer[((sizeof(iAesBuffer)-16)/4)];
sl@0
   226
			}
sl@0
   227
		else
sl@0
   228
			{
sl@0
   229
			// For decryption - MaybeSetupWriteDmaToHw maintains
sl@0
   230
			// iSavedState as a copy of the last ciphertext
sl@0
   231
			// (pre-decryption) so DoSaveState does not need to do
sl@0
   232
			// anything.
sl@0
   233
			//
sl@0
   234
			// To cover the case where we do not decrypt any blocks
sl@0
   235
			// before being suspended, we initialise iSavedState to the IV.
sl@0
   236
			from = &iIV[0];
sl@0
   237
			to = &iSavedState[0];
sl@0
   238
			}
sl@0
   239
		// Save the IV
sl@0
   240
		*to++ = *from++;
sl@0
   241
		*to++ = *from++;
sl@0
   242
		*to++ = *from++;
sl@0
   243
		*to++ = *from++;
sl@0
   244
		if(iEncrypt)
sl@0
   245
			{
sl@0
   246
			dumpBuffer("SetDetails - end of iAesBuffer", to-4, 4);
sl@0
   247
			}
sl@0
   248
		else
sl@0
   249
			{
sl@0
   250
			dumpBuffer("SetDetails - iSavedState", iSavedState, 4);
sl@0
   251
			}
sl@0
   252
		}
sl@0
   253
sl@0
   254
	// Reset indexes
sl@0
   255
	iSwWriteByteOffset = 0;
sl@0
   256
	iHwReadIndex = 0,
sl@0
   257
	iHwWriteIndex = 0,
sl@0
   258
	iSwReadByteOffset = 0;
sl@0
   259
sl@0
   260
	return KErrNone;
sl@0
   261
	}
sl@0
   262
sl@0
   263
void CryptoH4JobAes::DoSlice(TBool aFirstSlice)
sl@0
   264
	{
sl@0
   265
	TRACE_FUNCTION("DoSlice");
sl@0
   266
	//	Kern::Printf("DoSlice %s", aFirstSlice?"FIRST":"");
sl@0
   267
	if(aFirstSlice)
sl@0
   268
		{
sl@0
   269
		SetupHw(EFalse);
sl@0
   270
		}
sl@0
   271
	
sl@0
   272
	// Push any available data to user
sl@0
   273
	TInt r = iCallbacks->DataAvailable();
sl@0
   274
	if(r != KErrNone)
sl@0
   275
		{
sl@0
   276
		iJobScheduler->JobComplete(this,r);
sl@0
   277
		return;
sl@0
   278
		}
sl@0
   279
	// Read available data from user
sl@0
   280
	r = iCallbacks->DataRequired();
sl@0
   281
	if(r != KErrNone)
sl@0
   282
		{
sl@0
   283
		iJobScheduler->JobComplete(this,r);
sl@0
   284
		return;
sl@0
   285
		}
sl@0
   286
	
sl@0
   287
	// Setup to read data (if enough is available).
sl@0
   288
	// 	Kern::Printf("DoSlice - calling MaybeSetupWriteDmaToHw");
sl@0
   289
	MaybeSetupWriteDmaToHw();
sl@0
   290
sl@0
   291
	FAKE_DMA();
sl@0
   292
sl@0
   293
	if(!iDmaToHwPending && !iDmaFromHwPending)
sl@0
   294
		{
sl@0
   295
		Stalled();
sl@0
   296
		}
sl@0
   297
sl@0
   298
	return;
sl@0
   299
	}
sl@0
   300
sl@0
   301
TBool CryptoH4JobAes::DoSaveState()
sl@0
   302
	{
sl@0
   303
	TRACE_FUNCTION("DoSaveState");
sl@0
   304
sl@0
   305
	if((iMode == RCryptoDriver::ECbcMode) && iEncrypt)
sl@0
   306
		{
sl@0
   307
		// Doing CBC encryption - Need to save a copy of the last
sl@0
   308
		// ciphertext block (after encryption) so we can use it as the
sl@0
   309
		// IV if we are later resumed.
sl@0
   310
		//
sl@0
   311
		// Last block processed by h/w just BEFORE iHwWriteIndex. If
sl@0
   312
		// we have not processed any data, then SetDetails will have
sl@0
   313
		// initialised this to the IV
sl@0
   314
		TInt32 fromIndex = (iHwWriteIndex!=0) ? (iHwWriteIndex-4) : ((sizeof(iAesBuffer)-16)/4);
sl@0
   315
		TUint32 *from = &iAesBuffer[fromIndex];
sl@0
   316
		TUint32 *to = &iSavedState[0];
sl@0
   317
		*to++ = *from++;
sl@0
   318
		*to++ = *from++;
sl@0
   319
		*to++ = *from++;
sl@0
   320
		*to++ = *from++;
sl@0
   321
		dumpBuffer("DoSaveState - iSavedState", iSavedState, 4);
sl@0
   322
		}
sl@0
   323
sl@0
   324
	StopHw();
sl@0
   325
	return ETrue; // We want DoRestoreState to be called
sl@0
   326
	}
sl@0
   327
sl@0
   328
void CryptoH4JobAes::DoRestoreState()
sl@0
   329
	{
sl@0
   330
	TRACE_FUNCTION("DoRestoreState");
sl@0
   331
	SetupHw(ETrue);
sl@0
   332
	}
sl@0
   333
sl@0
   334
void CryptoH4JobAes::DoReleaseHw()
sl@0
   335
	{
sl@0
   336
	TRACE_FUNCTION("DoReleaseHw");
sl@0
   337
	StopHw();
sl@0
   338
#ifndef FAKE_DMA
sl@0
   339
	// Cancel DFCs - Doesn't work for FAKE_DMA case....
sl@0
   340
	iDmaToHwCompleteDfc.Cancel();
sl@0
   341
	iDmaFromHwCompleteDfc.Cancel();
sl@0
   342
#endif
sl@0
   343
	}
sl@0
   344
sl@0
   345
void CryptoH4JobAes::MaybeSetupWriteDmaToHw()
sl@0
   346
	{
sl@0
   347
	TRACE_FUNCTION("MaybeSetupWriteDmaToHw");
sl@0
   348
	if(!iDmaToHwPending)
sl@0
   349
		{
sl@0
   350
		// Calculate space between H/W read index and S/W write index or end of buffer
sl@0
   351
		TInt hwReadIndex8 = iHwReadIndex*4;
sl@0
   352
		TInt avail = (iSwWriteByteOffset >= hwReadIndex8) ? (iSwWriteByteOffset - hwReadIndex8) : (sizeof(iAesBuffer) - hwReadIndex8);
sl@0
   353
		
sl@0
   354
		if(avail >= 16)
sl@0
   355
			{
sl@0
   356
			// At least another block of data is available.
sl@0
   357
			if((avail <= 31) && (iMode == RCryptoDriver::ECbcMode) && !iEncrypt)
sl@0
   358
				{
sl@0
   359
				// Only one complete block is available
sl@0
   360
sl@0
   361
				// Doing CBC decryption, so need to save a copy of the
sl@0
   362
				// last ciphertext block (before it is decrypted) so we
sl@0
   363
				// can use it as the IV if we are kicked off the h/w
sl@0
   364
				// and have to reconfigure.
sl@0
   365
				// Last block available for h/w is at hwReadIndex8
sl@0
   366
				TUint32 *from = &iAesBuffer[iHwReadIndex];
sl@0
   367
				TUint32 *to = &iSavedState[0];
sl@0
   368
				*to++ = *from++;
sl@0
   369
				*to++ = *from++;
sl@0
   370
				*to++ = *from++;
sl@0
   371
				*to++ = *from++;
sl@0
   372
				dumpBuffer("MaybeSetupWriteDmaToHw - iSavedState", iSavedState, 4);
sl@0
   373
				}
sl@0
   374
			SetupDma((TUint32)&iAesBuffer[iHwReadIndex], ETrue);
sl@0
   375
			}
sl@0
   376
		}
sl@0
   377
	}
sl@0
   378
sl@0
   379
sl@0
   380
#ifdef FAKE_DMA
sl@0
   381
void CryptoH4JobAes::FakeDma()
sl@0
   382
	{
sl@0
   383
	TRACE_FUNCTION("FakeDma");
sl@0
   384
	if(iFakeDmaToHwQueued < iDmaToHwPending)
sl@0
   385
		{
sl@0
   386
		// Calculate number of 32 bit values in the h/w
sl@0
   387
		TInt inHw32 = iHwReadIndex - iHwWriteIndex;
sl@0
   388
		if(inHw32 < 0)
sl@0
   389
			{
sl@0
   390
			inHw32 += sizeof(iAesBuffer)/sizeof(iAesBuffer[0]);
sl@0
   391
			}
sl@0
   392
		// Convert to number of 16 byte blocks in h/w
sl@0
   393
		TInt inHwBlocks = inHw32/4;
sl@0
   394
sl@0
   395
		if((inHwBlocks + iFakeDmaToHwQueued) < 2)
sl@0
   396
			{
sl@0
   397
			// Pipeline is not full, so the next DMA to complete would be a "to h/w"
sl@0
   398
			// Wait for h/w to be ready
sl@0
   399
#ifdef __MARM__
sl@0
   400
			//		Kern::Printf("CryptoH4JobAes::FakeDma - Start waiting for h/w input ready (%x)", TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   401
			while(! (TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL) & KHtAesCtrlInputReady))
sl@0
   402
				{
sl@0
   403
				Kern::Printf("CryptoH4JobAes::FakeDma - Waiting for h/w input ready (%x)", TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   404
				}
sl@0
   405
#endif			
sl@0
   406
			// Queue the fake "to dma" complete DFC
sl@0
   407
			iDmaToHwCompleteDfc.Enque();
sl@0
   408
			++iFakeDmaToHwQueued;
sl@0
   409
			return;
sl@0
   410
			}
sl@0
   411
		}
sl@0
   412
sl@0
   413
	// Either pipeline is full, or we are out of input data.
sl@0
   414
sl@0
   415
	// Check for output
sl@0
   416
	if(iFakeDmaFromHwQueued < iDmaFromHwPending)
sl@0
   417
		{
sl@0
   418
#ifdef __MARM__
sl@0
   419
		//		Kern::Printf("CryptoH4JobAes::FakeDma - Start waiting for output ready (%x)", TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   420
		while(! (TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL) & KHtAesCtrlOutputReady))
sl@0
   421
			{
sl@0
   422
			Kern::Printf("CryptoH4JobAes::FakeDma - waiting for output ready (%x)",TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   423
			}
sl@0
   424
#endif
sl@0
   425
		// Queue the fake "from dma" complete DFC
sl@0
   426
		iDmaFromHwCompleteDfc.Enque();
sl@0
   427
		++iFakeDmaFromHwQueued;
sl@0
   428
		return;
sl@0
   429
		}
sl@0
   430
sl@0
   431
	return;
sl@0
   432
	}
sl@0
   433
#endif
sl@0
   434
sl@0
   435
sl@0
   436
sl@0
   437
sl@0
   438
void CryptoH4JobAes::SetupHw(TBool aUseSavedState)
sl@0
   439
	{
sl@0
   440
	TRACE_FUNCTION("SetupHw");
sl@0
   441
	//	Kern::Printf("SetupHw");
sl@0
   442
#ifdef __MARM__
sl@0
   443
	// AES_MASK
sl@0
   444
#ifdef FAKE_DMA
sl@0
   445
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_MASK, KHtAesMaskAutoIdle);
sl@0
   446
#else
sl@0
   447
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_MASK, 
sl@0
   448
						 KHtAesMaskDmaReqIn | KHtAesMaskDmaReqOut | KHtAesMaskAutoIdle);
sl@0
   449
#endif
sl@0
   450
	iHwRunning = EFalse; // Previous MASK register write cleared the start bit.
sl@0
   451
	
sl@0
   452
	TUint32 ctrl = 0;
sl@0
   453
	if(iEncrypt)
sl@0
   454
		{
sl@0
   455
			ctrl |= KHtAesCtrlDirection;
sl@0
   456
		}
sl@0
   457
sl@0
   458
	switch(iKeyLengthBytes)
sl@0
   459
		{
sl@0
   460
		case 32:
sl@0
   461
			// KEYS
sl@0
   462
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY1_L, iKey[0]);
sl@0
   463
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY1_H, iKey[1]);
sl@0
   464
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY2_L, iKey[2]);
sl@0
   465
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY2_H, iKey[3]);
sl@0
   466
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY3_L, iKey[4]);
sl@0
   467
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY3_H, iKey[5]);
sl@0
   468
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY4_L, iKey[6]);
sl@0
   469
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY4_H, iKey[7]);
sl@0
   470
			ctrl |= KHtAesCtrlKeySize256;
sl@0
   471
			break;
sl@0
   472
		case 24:
sl@0
   473
			// KEYS
sl@0
   474
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY1_L, iKey[0]);
sl@0
   475
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY1_H, iKey[1]);
sl@0
   476
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY2_L, iKey[2]);
sl@0
   477
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY2_H, iKey[3]);
sl@0
   478
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY3_L, iKey[4]);
sl@0
   479
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY3_H, iKey[5]);
sl@0
   480
			ctrl |= KHtAesCtrlKeySize192;
sl@0
   481
			break;
sl@0
   482
		case 16:
sl@0
   483
			// KEYS
sl@0
   484
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY1_L, iKey[0]);
sl@0
   485
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY1_H, iKey[1]);
sl@0
   486
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY2_L, iKey[2]);
sl@0
   487
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_KEY2_H, iKey[3]);
sl@0
   488
			ctrl |= KHtAesCtrlKeySize128;
sl@0
   489
			break;
sl@0
   490
		}
sl@0
   491
	
sl@0
   492
			
sl@0
   493
	
sl@0
   494
	// IV (CBC only)
sl@0
   495
	if(iMode == RCryptoDriver::ECbcMode)
sl@0
   496
		{
sl@0
   497
		if(!aUseSavedState)
sl@0
   498
			{
sl@0
   499
			//		Kern::Printf("Setting IV");
sl@0
   500
			// Set IV
sl@0
   501
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_1, iIV[0]);
sl@0
   502
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_2, iIV[1]);
sl@0
   503
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_3, iIV[2]);
sl@0
   504
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_4, iIV[3]);
sl@0
   505
			dumpBuffer("SetupHw(EFalse) - iIV", iIV, 4);
sl@0
   506
			}
sl@0
   507
		else
sl@0
   508
			{
sl@0
   509
			// Set IV to saved state
sl@0
   510
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_1, iSavedState[0]);
sl@0
   511
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_2, iSavedState[1]);
sl@0
   512
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_3, iSavedState[2]);
sl@0
   513
			TOmap::SetRegister32(KHwBaseAesReg + KHoAES_IV_4, iSavedState[3]);
sl@0
   514
			dumpBuffer("SetupHw(ETrue) - iSavedState", iSavedState, 4);
sl@0
   515
			}
sl@0
   516
		
sl@0
   517
		ctrl |= KHsAesCtrlCBC;
sl@0
   518
		}
sl@0
   519
	
sl@0
   520
	// AES_CTRL
sl@0
   521
	//	Kern::Printf("Setting crtl to %x", ctrl);
sl@0
   522
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_CTRL, ctrl);
sl@0
   523
sl@0
   524
	// AES_MASK START bit to start DMA
sl@0
   525
	// This is done by SetupDma
sl@0
   526
#else
sl@0
   527
	(void)aUseSavedState;
sl@0
   528
sl@0
   529
#endif
sl@0
   530
	}
sl@0
   531
sl@0
   532
void CryptoH4JobAes::SetupDma(TUint32 aPtr, TBool aToHw)
sl@0
   533
	{
sl@0
   534
	TRACE_FUNCTION("SetupDma");
sl@0
   535
	//	Kern::Printf("\t\tSetupDMA - %s, iHwReadIndex %d iHwWriteIndex %d", 
sl@0
   536
	//				 aToHw?"toHw":"fromHw", iHwReadIndex, iHwWriteIndex);
sl@0
   537
	// Start the h/w
sl@0
   538
	if(!iHwRunning)
sl@0
   539
		{
sl@0
   540
		//		Kern::Printf("SetupDma - starting h/w");
sl@0
   541
#ifdef __MARM__
sl@0
   542
		// If h/w is not enabled yet, then set the start bit. This is
sl@0
   543
		// required even when NOT using DMA...
sl@0
   544
		TUint32 mask = TOmap::Register32(KHwBaseAesReg + KHoAES_MASK);
sl@0
   545
		//		Kern::Printf("mask is %x", mask);
sl@0
   546
		mask |= KHtDesMaskDmaReqStart;
sl@0
   547
		TOmap::SetRegister32(KHwBaseAesReg + KHoAES_MASK, mask);
sl@0
   548
		//		Kern::Printf("changed to %x", TOmap::Register32(KHwBaseAesReg + KHoAES_MASK));
sl@0
   549
#else
sl@0
   550
		(void)aPtr;
sl@0
   551
#endif
sl@0
   552
		iHwRunning = ETrue;
sl@0
   553
		}
sl@0
   554
sl@0
   555
	if(aToHw)
sl@0
   556
		{
sl@0
   557
		++iDmaToHwPending;
sl@0
   558
		SetRunning(ETrue);
sl@0
   559
		}
sl@0
   560
	else
sl@0
   561
		{
sl@0
   562
		++iDmaFromHwPending;
sl@0
   563
		SetRunning(ETrue);
sl@0
   564
		}
sl@0
   565
	
sl@0
   566
	}
sl@0
   567
sl@0
   568
sl@0
   569
void CryptoH4JobAes::StopHw()
sl@0
   570
	{
sl@0
   571
	TRACE_FUNCTION("StopHw");
sl@0
   572
#ifdef __MARM__
sl@0
   573
	// Disable h/w
sl@0
   574
	TUint32 mask = TOmap::Register32(KHwBaseAesReg + KHoAES_MASK);
sl@0
   575
	mask &= ~KHtDesMaskDmaReqStart;
sl@0
   576
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_MASK, mask);
sl@0
   577
#endif
sl@0
   578
	iHwRunning = EFalse;
sl@0
   579
	}
sl@0
   580
sl@0
   581
sl@0
   582
sl@0
   583
/**
sl@0
   584
  Called when the current h/w opperation is complete
sl@0
   585
*/
sl@0
   586
void CryptoH4JobAes::DmaComplete(DDmaRequest::TResult aResult, TAny *aPtr)
sl@0
   587
	{
sl@0
   588
	TRACE_FUNCTION("TResult");
sl@0
   589
	(void)aResult;
sl@0
   590
	// Queue our DFC to action the DMA complete notification in our thread.
sl@0
   591
	reinterpret_cast<TDfc *>(aPtr)->Enque();
sl@0
   592
	}
sl@0
   593
sl@0
   594
sl@0
   595
sl@0
   596
sl@0
   597
void CryptoH4JobAes::DmaToHwCompleteDfc(TAny* aPtr)
sl@0
   598
    {
sl@0
   599
    ((CryptoH4JobAes*)aPtr)->DoDmaToHwCompleteDfc();
sl@0
   600
    }
sl@0
   601
sl@0
   602
sl@0
   603
void CryptoH4JobAes::DoDmaToHwCompleteDfc()
sl@0
   604
	{
sl@0
   605
	TRACE_FUNCTION("DoDmaToHwCompleteDfc");
sl@0
   606
	//	Kern::Printf("**DoDmaToHwCompleteDfc iHwReadIndex %d, iHwWriteIndex %d",iHwReadIndex, iHwWriteIndex);
sl@0
   607
	--iDmaToHwPending;
sl@0
   608
	if(iDmaToHwPending < 0) Kern::Fault("DoDmaToHwCompleteDfc - iDmaToHwPending is negative",1);
sl@0
   609
sl@0
   610
#ifdef FAKE_DMA
sl@0
   611
	--iFakeDmaToHwQueued;
sl@0
   612
	if(iFakeDmaToHwQueued < 0) Kern::Fault("DoDmaToHwCompleteDfc - iFakeDmaToHwQueued is negative",2);
sl@0
   613
#endif
sl@0
   614
sl@0
   615
	CheckIndexes();
sl@0
   616
sl@0
   617
#ifdef __MARM__
sl@0
   618
	if(! (TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL) & KHtAesCtrlInputReady))
sl@0
   619
		{
sl@0
   620
		Kern::Fault("DoDmaToHwCompleteDfc - h/w not ready for input!",3);
sl@0
   621
		}
sl@0
   622
	//		Kern::Printf("DoDmaToHwCompleteDfc - Writing data into h/w index %d (%x)", iHwReadIndex, TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   623
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_1, iAesBuffer[iHwReadIndex]);
sl@0
   624
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_2, iAesBuffer[iHwReadIndex+1]);
sl@0
   625
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_3, iAesBuffer[iHwReadIndex+2]);
sl@0
   626
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_4, iAesBuffer[iHwReadIndex+3]);
sl@0
   627
#endif
sl@0
   628
sl@0
   629
	// Update index to point at next block to be passed to the h/w
sl@0
   630
	iHwReadIndex += 4; // 4x32bit == 16bytes == block length
sl@0
   631
	if(iHwReadIndex == sizeof(iAesBuffer)/sizeof(TUint32))
sl@0
   632
		{
sl@0
   633
		iHwReadIndex = 0;
sl@0
   634
		}
sl@0
   635
sl@0
   636
	if(!iDmaFromHwPending)
sl@0
   637
		{
sl@0
   638
		SetupDma((TUint32)&iAesBuffer[iHwWriteIndex], EFalse);
sl@0
   639
		}
sl@0
   640
	
sl@0
   641
	CheckIndexes();
sl@0
   642
	
sl@0
   643
	// Setup to read data (if enough is available).
sl@0
   644
	MaybeSetupWriteDmaToHw();
sl@0
   645
	
sl@0
   646
	FAKE_DMA();
sl@0
   647
	}
sl@0
   648
sl@0
   649
void CryptoH4JobAes::DmaFromHwCompleteDfc(TAny* aPtr)
sl@0
   650
    {
sl@0
   651
    ((CryptoH4JobAes*)aPtr)->DoDmaFromHwCompleteDfc();
sl@0
   652
    }
sl@0
   653
sl@0
   654
sl@0
   655
void CryptoH4JobAes::DoDmaFromHwCompleteDfc()
sl@0
   656
	{
sl@0
   657
	TRACE_FUNCTION("DoDmaFromHwCompleteDfc");
sl@0
   658
	//	Kern::Printf("**DoDmaFromHwCompleteDfc iHwReadIndex %d, iHwWriteIndex %d", iHwReadIndex, iHwWriteIndex);
sl@0
   659
sl@0
   660
	--iDmaFromHwPending;
sl@0
   661
	if(iDmaFromHwPending < 0) Kern::Fault("DoDmaFromHwCompleteDfc - iDmaFromHwPending is negative",1);
sl@0
   662
sl@0
   663
#ifdef FAKE_DMA
sl@0
   664
	--iFakeDmaFromHwQueued;
sl@0
   665
	if(iFakeDmaFromHwQueued < 0) Kern::Fault("iFakeDmaFromHwQueued - iFakeDmaFromHwQueued is negative",2);
sl@0
   666
#endif
sl@0
   667
sl@0
   668
	CheckIndexes();
sl@0
   669
sl@0
   670
#ifdef __MARM__
sl@0
   671
	if(! (TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL) & KHtAesCtrlOutputReady))
sl@0
   672
		{
sl@0
   673
		Kern::Fault("DoDmaToHwCompleteDfc - h/w not ready for output!",3);
sl@0
   674
		}
sl@0
   675
sl@0
   676
	//	Kern::Printf("DoDmaFromHwCompleteDfc - Reading data from h/w index %d (%x)", iHwWriteIndex, TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   677
	iAesBuffer[iHwWriteIndex] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_1);
sl@0
   678
	iAesBuffer[iHwWriteIndex+1] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_2);
sl@0
   679
	iAesBuffer[iHwWriteIndex+2] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_3);
sl@0
   680
	iAesBuffer[iHwWriteIndex+3] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_4);
sl@0
   681
#endif
sl@0
   682
sl@0
   683
	// Update index to point at next block to be read from the h/w
sl@0
   684
	iHwWriteIndex += 4; // 4x32bit == 16bytes == block length
sl@0
   685
	if(iHwWriteIndex == sizeof(iAesBuffer)/sizeof(TUint32))
sl@0
   686
		{
sl@0
   687
		iHwWriteIndex= 0;
sl@0
   688
		}
sl@0
   689
sl@0
   690
	CheckIndexes();
sl@0
   691
sl@0
   692
sl@0
   693
sl@0
   694
	TInt hwWrite8Index = iHwWriteIndex * 4;
sl@0
   695
	TInt hwRead8Index = iHwReadIndex * 4;
sl@0
   696
sl@0
   697
	// Check if we either have enough data to finish the current LDD
sl@0
   698
	// user read request, or if we are running out of space
sl@0
   699
	//
sl@0
   700
	// Calculate data available for xfer to user
sl@0
   701
	TInt availableForUser = hwWrite8Index - iSwReadByteOffset;
sl@0
   702
	if(availableForUser < 0)
sl@0
   703
		{
sl@0
   704
		availableForUser += sizeof(iAesBuffer);
sl@0
   705
		}
sl@0
   706
sl@0
   707
	if((availableForUser >= sizeof(iAesBuffer) - 32) ||
sl@0
   708
	   (availableForUser >= iReadRequestLength))
sl@0
   709
		{
sl@0
   710
		// Pass available data to user
sl@0
   711
		TInt r = iCallbacks->DataAvailable();
sl@0
   712
		if(r != KErrNone)
sl@0
   713
			{
sl@0
   714
			iJobScheduler->JobComplete(this,r);
sl@0
   715
			return;
sl@0
   716
			}
sl@0
   717
		}
sl@0
   718
sl@0
   719
	// Are we running short of data?
sl@0
   720
	TInt availableForHw = iSwWriteByteOffset - hwRead8Index;
sl@0
   721
	if(availableForHw < 0)
sl@0
   722
		{
sl@0
   723
		availableForHw += sizeof(iAesBuffer);
sl@0
   724
		}
sl@0
   725
	
sl@0
   726
	if(availableForHw < 16)
sl@0
   727
		{
sl@0
   728
		TInt r = iCallbacks->DataRequired();
sl@0
   729
		if(r != KErrNone)
sl@0
   730
			{
sl@0
   731
			iJobScheduler->JobComplete(this,r);
sl@0
   732
			return;
sl@0
   733
			}
sl@0
   734
		}
sl@0
   735
sl@0
   736
	// Kick off a new to h/w DMA if one is not already running
sl@0
   737
	MaybeSetupWriteDmaToHw();
sl@0
   738
		
sl@0
   739
	// Current h/w -> iAesBuffer DMA request has completed
sl@0
   740
	if(iHwWriteIndex != iHwReadIndex)
sl@0
   741
		{
sl@0
   742
		SetupDma((TUint32)&iAesBuffer[iHwWriteIndex], EFalse);
sl@0
   743
		}
sl@0
   744
sl@0
   745
	if(!iDmaToHwPending && ! iDmaFromHwPending)
sl@0
   746
		{
sl@0
   747
		//		Kern::Printf("\t\tDoDmaFromHwCompleteDfc STALLED (underrun), iHwReadIndex %d iHwWriteIndex %d",
sl@0
   748
		//					 iHwReadIndex, iHwWriteIndex);
sl@0
   749
		// Run out of data to process!
sl@0
   750
		// Tell the scheduler that we are stalled & therefore this slice is done
sl@0
   751
		Stalled();
sl@0
   752
		return;
sl@0
   753
		}
sl@0
   754
sl@0
   755
sl@0
   756
	CheckIndexes();
sl@0
   757
sl@0
   758
	FAKE_DMA();
sl@0
   759
	}
sl@0
   760
sl@0
   761
void CryptoH4JobAes::CheckIndexes() const
sl@0
   762
	{
sl@0
   763
	TRACE_FUNCTION("CheckIndexes");
sl@0
   764
	if(iSwWriteByteOffset < 0 || iSwWriteByteOffset > sizeof(iAesBuffer)) Kern::Fault("CryptoH4JobAes::checkIndexes", 1);
sl@0
   765
sl@0
   766
	if(iHwReadIndex < 0 || iHwReadIndex > sizeof(iAesBuffer)/sizeof(iAesBuffer[0])) Kern::Fault("CryptoH4JobAes::checkIndexes", 2);
sl@0
   767
sl@0
   768
	if(iHwWriteIndex < 0 || iHwWriteIndex > sizeof(iAesBuffer)/sizeof(iAesBuffer[0])) Kern::Fault("CryptoH4JobAes::checkIndexes", 3);
sl@0
   769
sl@0
   770
	if(iSwReadByteOffset < 0 || iSwReadByteOffset > sizeof(iAesBuffer)) Kern::Fault("CryptoH4JobAes::checkIndexes", 4);
sl@0
   771
	
sl@0
   772
	
sl@0
   773
	TInt32 d = iSwWriteByteOffset;
sl@0
   774
	TInt32 c = iHwReadIndex * 4;
sl@0
   775
	TInt32 b = 	iHwWriteIndex * 4;
sl@0
   776
	TInt32 a = 	iSwReadByteOffset;
sl@0
   777
sl@0
   778
	//	Kern::Printf("%d %d %d %d", a, b, c, d);
sl@0
   779
	
sl@0
   780
	TInt32 offset = 0;
sl@0
   781
	if(b < a) offset = sizeof(iAesBuffer);
sl@0
   782
	b += offset;
sl@0
   783
	if(c < b) offset = sizeof(iAesBuffer);
sl@0
   784
	c += offset;
sl@0
   785
	if(d < c) offset = sizeof(iAesBuffer);
sl@0
   786
	d += offset;
sl@0
   787
	
sl@0
   788
	if(a>b) Kern::Fault("CryptoH4JobAes::CheckIndexes", 5);
sl@0
   789
	if(b>c) Kern::Fault("CryptoH4JobAes::CheckIndexes", 6);
sl@0
   790
	if(c>d) Kern::Fault("CryptoH4JobAes::CheckIndexes", 7);
sl@0
   791
	}
sl@0
   792
sl@0
   793
sl@0
   794
void CryptoH4JobAes::NotifyReadRequestLength(TUint32 aReadRequestLength)
sl@0
   795
	{
sl@0
   796
	TRACE_FUNCTION("NotifyReadRequestLength");
sl@0
   797
	iReadRequestLength = aReadRequestLength;
sl@0
   798
	}
sl@0
   799
sl@0
   800
/**
sl@0
   801
   HwPerfCheck
sl@0
   802
sl@0
   803
   This function uses 100% of the CPU power to attempt to drive
sl@0
   804
   the AES h/w as fast as possible.
sl@0
   805
sl@0
   806
   This will give some indication of the maximum achievable speed of the h/w
sl@0
   807
   excluding the overhead of (almost all of) the driver framework.
sl@0
   808
 */
sl@0
   809
void CryptoH4JobAes::HwPerfCheck()
sl@0
   810
	{
sl@0
   811
	TRACE_FUNCTION("HwPerfCheck");
sl@0
   812
	SetupHw(EFalse);
sl@0
   813
sl@0
   814
	// Start h/w
sl@0
   815
#ifdef __MARM__
sl@0
   816
	TUint32 mask = TOmap::Register32(KHwBaseAesReg + KHoAES_MASK);
sl@0
   817
	mask |= KHtDesMaskDmaReqStart;
sl@0
   818
	TOmap::SetRegister32(KHwBaseAesReg + KHoAES_MASK, mask);
sl@0
   819
#endif
sl@0
   820
sl@0
   821
	// Reset indexes
sl@0
   822
	iSwWriteByteOffset = 0;
sl@0
   823
	iHwReadIndex = 0,
sl@0
   824
	iHwWriteIndex = 0,
sl@0
   825
	iSwReadByteOffset = 0;
sl@0
   826
sl@0
   827
	// Read data
sl@0
   828
	iCallbacks->DataRequired();
sl@0
   829
	// Process all data
sl@0
   830
	while(iHwWriteIndex*4 < iSwWriteByteOffset)
sl@0
   831
		{
sl@0
   832
#ifdef __MARM__
sl@0
   833
		//		Kern::Printf("Ctrl %08x", TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL));
sl@0
   834
#endif
sl@0
   835
		// Have we got more data to write to h/w?
sl@0
   836
		if(iHwReadIndex < iSwWriteByteOffset/4)
sl@0
   837
			{
sl@0
   838
			// Yes, but is h/w ready for it?
sl@0
   839
#ifdef __MARM__
sl@0
   840
			if(TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL) & KHtAesCtrlInputReady)
sl@0
   841
				{
sl@0
   842
				//				Kern::Printf("toHw iHwReadIndex=%d", iHwReadIndex);
sl@0
   843
				// ok, write data to h/w
sl@0
   844
				TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_1, iAesBuffer[iHwReadIndex]);
sl@0
   845
				TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_2, iAesBuffer[iHwReadIndex+1]);
sl@0
   846
				TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_3, iAesBuffer[iHwReadIndex+2]);
sl@0
   847
				TOmap::SetRegister32(KHwBaseAesReg + KHoAES_DATA_4, iAesBuffer[iHwReadIndex+3]);
sl@0
   848
				iHwReadIndex += 4;
sl@0
   849
				}
sl@0
   850
#else
sl@0
   851
			iHwReadIndex += 4;
sl@0
   852
#endif
sl@0
   853
			}
sl@0
   854
		// Do we expect more data from the h/w?
sl@0
   855
		if(iHwWriteIndex < iSwWriteByteOffset/4)
sl@0
   856
			{
sl@0
   857
			// Yes, but is h/w ready?
sl@0
   858
#ifdef __MARM__
sl@0
   859
			if(TOmap::Register32(KHwBaseAesReg + KHoAES_CTRL) & KHtAesCtrlOutputReady)
sl@0
   860
				{
sl@0
   861
				//				Kern::Printf("ReadHw to iHwWriteIndex=%d", iHwWriteIndex);
sl@0
   862
				iAesBuffer[iHwWriteIndex] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_1);
sl@0
   863
				iAesBuffer[iHwWriteIndex+1] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_2);
sl@0
   864
				iAesBuffer[iHwWriteIndex+2] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_3);
sl@0
   865
				iAesBuffer[iHwWriteIndex+3] = TOmap::Register32(KHwBaseAesReg + KHoAES_DATA_4);
sl@0
   866
				iHwWriteIndex += 4;
sl@0
   867
				}
sl@0
   868
#else
sl@0
   869
			iHwWriteIndex += 4;
sl@0
   870
#endif
sl@0
   871
			}
sl@0
   872
		}
sl@0
   873
	
sl@0
   874
	// Write data back to user
sl@0
   875
	iCallbacks->DataAvailable();
sl@0
   876
	}
sl@0
   877
sl@0
   878
sl@0
   879
sl@0
   880
	
sl@0
   881
#ifdef TDFC_WRAPPER
sl@0
   882
TDfcWrapper::TDfcWrapper(const TDfcWrapper &aOrig)
sl@0
   883
	: TDfc(DfcWrapperFunc, this, aOrig.iPriority)
sl@0
   884
	{
sl@0
   885
	TRACE_FUNCTION("TDfcWrapper");
sl@0
   886
	iRealFunction = aOrig.iRealFunction,
sl@0
   887
	iRealPtr = aOrig.iRealPtr;
sl@0
   888
	SetDfcQ(aOrig.iDfcQ);
sl@0
   889
	}
sl@0
   890
sl@0
   891
sl@0
   892
TDfcWrapper::TDfcWrapper(TDfcFn aFunction, TAny* aPtr, TInt aPriority)
sl@0
   893
	: TDfc(DfcWrapperFunc, this, aPriority),
sl@0
   894
	  iRealFunction(aFunction),
sl@0
   895
	  iRealPtr(aPtr)
sl@0
   896
	{
sl@0
   897
	TRACE_FUNCTION("TDfcWrapper");
sl@0
   898
	}
sl@0
   899
sl@0
   900
void TDfcWrapper::Enque()
sl@0
   901
	{
sl@0
   902
	TRACE_FUNCTION("Enque");
sl@0
   903
	// Clone self and queue the clone
sl@0
   904
	TDfcWrapper *p = new TDfcWrapper(*this);
sl@0
   905
	p->BaseEnque();
sl@0
   906
	}
sl@0
   907
sl@0
   908
void TDfcWrapper::BaseEnque()
sl@0
   909
	{
sl@0
   910
	TRACE_FUNCTION("BaseEnque");
sl@0
   911
	TDfc::Enque();
sl@0
   912
	}
sl@0
   913
sl@0
   914
sl@0
   915
void TDfcWrapper::DfcWrapperFunc(TAny* aPtr)
sl@0
   916
	{
sl@0
   917
	TRACE_FUNCTION("DfcWrapperFunc");
sl@0
   918
	TDfcWrapper *p = (TDfcWrapper *) aPtr;
sl@0
   919
	p->iRealFunction(p->iRealPtr);
sl@0
   920
	delete p;
sl@0
   921
	}
sl@0
   922
#endif
sl@0
   923
sl@0
   924
#ifdef DUMPBUFFER
sl@0
   925
LOCAL_D void dumpBuffer(const char *aName, TUint32 *aBuf, TUint32 aLen)
sl@0
   926
	{
sl@0
   927
	Kern::Printf("%s =", aName);
sl@0
   928
	TUint8 *buf8 = reinterpret_cast<TUint8 *>(aBuf);
sl@0
   929
	for(TInt i = 0 ; i < aLen*4; ++i)
sl@0
   930
		{
sl@0
   931
		if(i%16 == 0)
sl@0
   932
			{
sl@0
   933
			Kern::Printf("\n    ");
sl@0
   934
			}
sl@0
   935
		Kern::Printf("%02x ", buf8[i]);
sl@0
   936
		}
sl@0
   937
	Kern::Printf("\n");
sl@0
   938
	}
sl@0
   939
#endif
sl@0
   940
sl@0
   941
// End of file