kerneltest/e32test/dmav2/dma2_sim.cpp
author hgs
Wed, 20 Oct 2010 13:58:28 +0100
changeset 293 0659d0e1a03c
parent 243 c7a0ce20c48c
permissions -rw-r--r--
201041_07
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
189ece41fa29 201027_05
hgs
parents:
diff changeset
     2
// All rights reserved.
189ece41fa29 201027_05
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
189ece41fa29 201027_05
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
189ece41fa29 201027_05
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
189ece41fa29 201027_05
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
189ece41fa29 201027_05
hgs
parents:
diff changeset
     7
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
     8
// Initial Contributors:
189ece41fa29 201027_05
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
189ece41fa29 201027_05
hgs
parents:
diff changeset
    10
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    11
// Contributors:
189ece41fa29 201027_05
hgs
parents:
diff changeset
    12
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    13
// Description:
189ece41fa29 201027_05
hgs
parents:
diff changeset
    14
// os/kernelhwsrv/kerneltest/e32test/dmav2/dma2_sim.cpp
189ece41fa29 201027_05
hgs
parents:
diff changeset
    15
// Partial simulation of DMA2 PSL
189ece41fa29 201027_05
hgs
parents:
diff changeset
    16
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    17
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    18
189ece41fa29 201027_05
hgs
parents:
diff changeset
    19
189ece41fa29 201027_05
hgs
parents:
diff changeset
    20
#include <kernel/kern_priv.h>
189ece41fa29 201027_05
hgs
parents:
diff changeset
    21
189ece41fa29 201027_05
hgs
parents:
diff changeset
    22
#include <drivers/dma.h>
189ece41fa29 201027_05
hgs
parents:
diff changeset
    23
#include <drivers/dma_hai.h>
189ece41fa29 201027_05
hgs
parents:
diff changeset
    24
189ece41fa29 201027_05
hgs
parents:
diff changeset
    25
#include "d_dma2.h"
189ece41fa29 201027_05
hgs
parents:
diff changeset
    26
189ece41fa29 201027_05
hgs
parents:
diff changeset
    27
// Debug support
189ece41fa29 201027_05
hgs
parents:
diff changeset
    28
static const char KDmaPanicCat[] = "DMA PSL - " __FILE__;
189ece41fa29 201027_05
hgs
parents:
diff changeset
    29
189ece41fa29 201027_05
hgs
parents:
diff changeset
    30
static const TInt KMaxTransferLen = 0x1000;	// max transfer length for this DMAC
189ece41fa29 201027_05
hgs
parents:
diff changeset
    31
static const TInt KMemAlignMask = 0; // memory addresses passed to DMAC must be multiple of 8
189ece41fa29 201027_05
hgs
parents:
diff changeset
    32
static const TInt KDesCount = 160;				// Initial DMA descriptor count
189ece41fa29 201027_05
hgs
parents:
diff changeset
    33
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
    34
#define TEST_RETURN(X) if (!(X))\
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
    35
	{\
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
    36
	__KTRACE_OPT(KPANIC, Kern::Printf("Simulated Dma test failure: " __FILE__ " line %d", __LINE__));\
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
    37
	return KErrAbort;\
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
    38
	}
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
    39
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
    40
class TDmaDesc
189ece41fa29 201027_05
hgs
parents:
diff changeset
    41
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    42
// Hardware DMA descriptor
189ece41fa29 201027_05
hgs
parents:
diff changeset
    43
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    44
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
    45
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
    46
	enum {KStopBitMask = 1};
189ece41fa29 201027_05
hgs
parents:
diff changeset
    47
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
    48
	TPhysAddr iDescAddr;
189ece41fa29 201027_05
hgs
parents:
diff changeset
    49
	TPhysAddr iSrcAddr;
189ece41fa29 201027_05
hgs
parents:
diff changeset
    50
	TPhysAddr iDestAddr;
189ece41fa29 201027_05
hgs
parents:
diff changeset
    51
	TUint32 iCmd;
189ece41fa29 201027_05
hgs
parents:
diff changeset
    52
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
    53
189ece41fa29 201027_05
hgs
parents:
diff changeset
    54
189ece41fa29 201027_05
hgs
parents:
diff changeset
    55
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
    56
// Test Support
189ece41fa29 201027_05
hgs
parents:
diff changeset
    57
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
    58
189ece41fa29 201027_05
hgs
parents:
diff changeset
    59
/**
189ece41fa29 201027_05
hgs
parents:
diff changeset
    60
TO DO: Fill in to provide information to the V1 test harness (t_dma.exe)
189ece41fa29 201027_05
hgs
parents:
diff changeset
    61
*/
189ece41fa29 201027_05
hgs
parents:
diff changeset
    62
TDmaTestInfo TestInfo =
189ece41fa29 201027_05
hgs
parents:
diff changeset
    63
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
    64
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    65
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    66
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    67
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    68
	NULL,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    69
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    70
	NULL,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    71
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    72
	NULL
189ece41fa29 201027_05
hgs
parents:
diff changeset
    73
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
    74
189ece41fa29 201027_05
hgs
parents:
diff changeset
    75
189ece41fa29 201027_05
hgs
parents:
diff changeset
    76
EXPORT_C const TDmaTestInfo& DmaTestInfo()
189ece41fa29 201027_05
hgs
parents:
diff changeset
    77
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    78
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    79
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
    80
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
    81
	return TestInfo;
189ece41fa29 201027_05
hgs
parents:
diff changeset
    82
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
    83
189ece41fa29 201027_05
hgs
parents:
diff changeset
    84
/**
189ece41fa29 201027_05
hgs
parents:
diff changeset
    85
TO DO: Fill in to provide information to the V2 test harness (t_dma2.exe)
189ece41fa29 201027_05
hgs
parents:
diff changeset
    86
*/
189ece41fa29 201027_05
hgs
parents:
diff changeset
    87
TDmaV2TestInfo TestInfov2 =
189ece41fa29 201027_05
hgs
parents:
diff changeset
    88
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
    89
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    90
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    91
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    92
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    93
	{0},
189ece41fa29 201027_05
hgs
parents:
diff changeset
    94
	0,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    95
	{0},
189ece41fa29 201027_05
hgs
parents:
diff changeset
    96
	1,
189ece41fa29 201027_05
hgs
parents:
diff changeset
    97
	{0}
189ece41fa29 201027_05
hgs
parents:
diff changeset
    98
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
    99
189ece41fa29 201027_05
hgs
parents:
diff changeset
   100
EXPORT_C const TDmaV2TestInfo& DmaTestInfoV2()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   101
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   102
	return TestInfov2;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   103
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   104
189ece41fa29 201027_05
hgs
parents:
diff changeset
   105
189ece41fa29 201027_05
hgs
parents:
diff changeset
   106
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   107
// Simulated channel
189ece41fa29 201027_05
hgs
parents:
diff changeset
   108
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   109
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   110
/**
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   111
An interface class to add simulation specific functionallity to any DMA channel
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   112
*/
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   113
class MSimChannel
189ece41fa29 201027_05
hgs
parents:
diff changeset
   114
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   115
public:
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   116
	virtual TInt PreOpen() =0;
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   117
	virtual TDmaChannel& Channel() =0;
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   118
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   119
189ece41fa29 201027_05
hgs
parents:
diff changeset
   120
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   121
// Derived Channel (Scatter/Gather)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   122
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   123
189ece41fa29 201027_05
hgs
parents:
diff changeset
   124
const SDmacCaps KSimSgChanCaps =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   125
	{0,										// TInt iChannelPriorities;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   126
	 EFalse,								// TBool iChannelPauseAndResume;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   127
	 EFalse,								// TBool iAddrAlignedToElementSize;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   128
	 EFalse,								// TBool i1DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   129
	 EFalse,								// TBool i2DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   130
	 KDmaSyncAuto,						   // TUint iSynchronizationTypes;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   131
	 KDmaBurstSizeAny,					   // TUint iBurstTransactions;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   132
	 EFalse,							   // TBool iDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   133
	 EFalse,							   // TBool iFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   134
	 EFalse,							   // TBool iLinkedListPausedInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   135
	 EFalse,							   // TBool iEndiannessConversion;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   136
	 KDmaGraphicsOpNone,				   // TUint iGraphicsOps;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   137
	 EFalse,							   // TBool iRepeatingTransfers;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   138
	 EFalse,							   // TBool iChannelLinking;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   139
	 ETrue,								   // TBool iHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   140
	 EFalse,							   // TBool iSrcDstAsymmetry;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   141
	 EFalse,							   // TBool iAsymHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   142
	 EFalse,							   // TBool iBalancedAsymSegments;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   143
	 EFalse,							   // TBool iAsymCompletionInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   144
	 EFalse,							   // TBool iAsymDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   145
	 EFalse,							   // TBool iAsymFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   146
	 {0, 0, 0, 0, 0}					   // TUint32 iReserved[5];
189ece41fa29 201027_05
hgs
parents:
diff changeset
   147
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   148
189ece41fa29 201027_05
hgs
parents:
diff changeset
   149
const SDmacCaps KSimSwChanCaps =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   150
	{0,										// TInt iChannelPriorities;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   151
	 EFalse,								// TBool iChannelPauseAndResume;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   152
	 EFalse,								// TBool iAddrAlignedToElementSize;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   153
	 EFalse,								// TBool i1DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   154
	 EFalse,								// TBool i2DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   155
	 KDmaSyncAuto,						   // TUint iSynchronizationTypes;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   156
	 KDmaBurstSizeAny,					   // TUint iBurstTransactions;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   157
	 EFalse,							   // TBool iDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   158
	 EFalse,							   // TBool iFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   159
	 EFalse,							   // TBool iLinkedListPausedInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   160
	 EFalse,							   // TBool iEndiannessConversion;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   161
	 KDmaGraphicsOpNone,				   // TUint iGraphicsOps;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   162
	 EFalse,							   // TBool iRepeatingTransfers;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   163
	 EFalse,							   // TBool iChannelLinking;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   164
	 EFalse,							   // TBool iHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   165
	 EFalse,							   // TBool iSrcDstAsymmetry;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   166
	 EFalse,							   // TBool iAsymHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   167
	 EFalse,							   // TBool iBalancedAsymSegments;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   168
	 EFalse,							   // TBool iAsymCompletionInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   169
	 EFalse,							   // TBool iAsymDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   170
	 EFalse,							   // TBool iAsymFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   171
	 {0, 0, 0, 0, 0}					   // TUint32 iReserved[5];
189ece41fa29 201027_05
hgs
parents:
diff changeset
   172
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   173
189ece41fa29 201027_05
hgs
parents:
diff changeset
   174
class TEmptyChannel : public TDmaChannel, public MSimChannel
189ece41fa29 201027_05
hgs
parents:
diff changeset
   175
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   176
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   177
	// Virtual from TDmaChannel
189ece41fa29 201027_05
hgs
parents:
diff changeset
   178
	void DoCancelAll();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   179
189ece41fa29 201027_05
hgs
parents:
diff changeset
   180
	void CallDefaultVirtuals();
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   181
	TInt CheckExtensionStubs();
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   182
189ece41fa29 201027_05
hgs
parents:
diff changeset
   183
	// From MSimChannel
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   184
	TInt PreOpen();
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   185
	TDmaChannel& Channel() {return *this;}
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   186
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   187
189ece41fa29 201027_05
hgs
parents:
diff changeset
   188
void TEmptyChannel::DoCancelAll()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   189
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   190
	__DMA_CANT_HAPPEN();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   191
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   192
189ece41fa29 201027_05
hgs
parents:
diff changeset
   193
void TEmptyChannel::CallDefaultVirtuals()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   194
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   195
	DMA_PSL_TRACE("Calling default virtual TDmaChannel functions");
189ece41fa29 201027_05
hgs
parents:
diff changeset
   196
189ece41fa29 201027_05
hgs
parents:
diff changeset
   197
	const DDmaRequest* req = NULL;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   198
	SDmaDesHdr* hdr = NULL;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   200
	DoQueue(*req);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   201
	DoDfc(*req, hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   202
	DoDfc(*req, hdr, hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   203
189ece41fa29 201027_05
hgs
parents:
diff changeset
   204
	QueuedRequestCountChanged();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   205
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   206
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   207
TInt TEmptyChannel::CheckExtensionStubs()
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   208
	{
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   209
	DMA_PSL_TRACE("Calling extension stubs");
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   210
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   211
	TInt r = Extension(0, NULL);
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   212
	TEST_RETURN(r == KErrNotSupported)
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   213
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   214
	r = StaticExtension(0, NULL);
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   215
	TEST_RETURN(r == KErrNotSupported)
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   216
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   217
	return KErrNone;
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   218
	}
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   219
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   220
TInt TEmptyChannel::PreOpen()
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   221
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   222
	CallDefaultVirtuals();
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   223
	return CheckExtensionStubs();
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   224
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   225
189ece41fa29 201027_05
hgs
parents:
diff changeset
   226
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   227
// Derived SkelControllerSw Class
189ece41fa29 201027_05
hgs
parents:
diff changeset
   228
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   229
189ece41fa29 201027_05
hgs
parents:
diff changeset
   230
class TSkelDmac : public TDmac
189ece41fa29 201027_05
hgs
parents:
diff changeset
   231
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   232
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   233
	TSkelDmac(const SCreateInfo& aInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   234
	TInt Create(const SCreateInfo& aInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   235
private:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   236
	// from TDmac (PIL pure virtual)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   237
	virtual void StopTransfer(const TDmaChannel& aChannel);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   238
	virtual TBool IsIdle(const TDmaChannel& aChannel);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   239
	virtual TUint MaxTransferLength(TDmaChannel& aChannel, TUint aSrcFlags,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   240
									TUint aDstFlags, TUint32 aPslInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   241
	virtual TUint AddressAlignMask(TDmaChannel& aChannel, TUint aSrcFlags,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   242
								   TUint aDstFlags, TUint32 aPslInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   243
189ece41fa29 201027_05
hgs
parents:
diff changeset
   244
	inline TDmaDesc* HdrToHwDes(const SDmaDesHdr& aHdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   245
189ece41fa29 201027_05
hgs
parents:
diff changeset
   246
	void CallDefaultVirtuals();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   247
	TInt TestPool();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   248
189ece41fa29 201027_05
hgs
parents:
diff changeset
   249
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   250
	static const SCreateInfo KDmacInfoHw;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   251
	static const SCreateInfo KDmacInfoSw;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   252
189ece41fa29 201027_05
hgs
parents:
diff changeset
   253
	TEmptyChannel iChannel;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   254
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   255
189ece41fa29 201027_05
hgs
parents:
diff changeset
   256
189ece41fa29 201027_05
hgs
parents:
diff changeset
   257
const TDmac::SCreateInfo TSkelDmac::KDmacInfoHw =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   258
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   259
	ETrue,													// iCapsHwDes
189ece41fa29 201027_05
hgs
parents:
diff changeset
   260
	KDesCount,												// iDesCount
189ece41fa29 201027_05
hgs
parents:
diff changeset
   261
	sizeof(TDmaDesc),										// iDesSize
189ece41fa29 201027_05
hgs
parents:
diff changeset
   262
#ifndef __WINS__
189ece41fa29 201027_05
hgs
parents:
diff changeset
   263
	EMapAttrSupRw | EMapAttrFullyBlocking					// iDesChunkAttribs
189ece41fa29 201027_05
hgs
parents:
diff changeset
   264
#endif
189ece41fa29 201027_05
hgs
parents:
diff changeset
   265
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   266
189ece41fa29 201027_05
hgs
parents:
diff changeset
   267
const TDmac::SCreateInfo TSkelDmac::KDmacInfoSw =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   268
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   269
	EFalse,													// iCapsHwDes
189ece41fa29 201027_05
hgs
parents:
diff changeset
   270
	KDesCount,												// iDesCount
189ece41fa29 201027_05
hgs
parents:
diff changeset
   271
	sizeof(TDmaTransferArgs),										// iDesSize
189ece41fa29 201027_05
hgs
parents:
diff changeset
   272
#ifndef __WINS__
189ece41fa29 201027_05
hgs
parents:
diff changeset
   273
	EMapAttrSupRw | EMapAttrFullyBlocking					// iDesChunkAttribs
189ece41fa29 201027_05
hgs
parents:
diff changeset
   274
#endif
189ece41fa29 201027_05
hgs
parents:
diff changeset
   275
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   276
189ece41fa29 201027_05
hgs
parents:
diff changeset
   277
static TSkelDmac SkelControllerSw(TSkelDmac::KDmacInfoSw);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   278
static TSkelDmac SkelControllerHw(TSkelDmac::KDmacInfoHw);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   279
189ece41fa29 201027_05
hgs
parents:
diff changeset
   280
189ece41fa29 201027_05
hgs
parents:
diff changeset
   281
TSkelDmac::TSkelDmac(const SCreateInfo& aInfo)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   282
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   283
// Constructor.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   284
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   285
	: TDmac(aInfo)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   286
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   287
	TInt r = Create(aInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   288
	__NK_ASSERT_ALWAYS(r == KErrNone);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   289
189ece41fa29 201027_05
hgs
parents:
diff changeset
   290
	CallDefaultVirtuals();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   291
	r = TestPool();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   292
	__NK_ASSERT_ALWAYS(r == KErrNone);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   293
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   294
189ece41fa29 201027_05
hgs
parents:
diff changeset
   295
189ece41fa29 201027_05
hgs
parents:
diff changeset
   296
TInt TSkelDmac::Create(const SCreateInfo& aInfo)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   297
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   298
// Second phase construction.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   299
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   300
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   301
	TInt r = TDmac::Create(aInfo);							// Base class Create()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   302
	if (r == KErrNone)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   303
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   304
		__DMA_ASSERTA(ReserveSetOfDes(1) == KErrNone);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   305
		}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   306
	return r;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   307
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   308
189ece41fa29 201027_05
hgs
parents:
diff changeset
   309
189ece41fa29 201027_05
hgs
parents:
diff changeset
   310
void TSkelDmac::StopTransfer(const TDmaChannel& aChannel)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   311
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   312
// Stops a running channel.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   313
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   314
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   315
	const TUint8 i = static_cast<TUint8>(aChannel.PslId());
189ece41fa29 201027_05
hgs
parents:
diff changeset
   316
189ece41fa29 201027_05
hgs
parents:
diff changeset
   317
	__KTRACE_OPT(KDMA, Kern::Printf(">TSkelDmac::StopTransfer channel=%d (unsupported)", i));
189ece41fa29 201027_05
hgs
parents:
diff changeset
   318
189ece41fa29 201027_05
hgs
parents:
diff changeset
   319
	(void) i;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   320
189ece41fa29 201027_05
hgs
parents:
diff changeset
   321
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   322
189ece41fa29 201027_05
hgs
parents:
diff changeset
   323
189ece41fa29 201027_05
hgs
parents:
diff changeset
   324
TBool TSkelDmac::IsIdle(const TDmaChannel& aChannel)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   325
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   326
// Returns the state of a given channel.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   327
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   328
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   329
	const TUint8 i = static_cast<TUint8>(aChannel.PslId());
189ece41fa29 201027_05
hgs
parents:
diff changeset
   330
189ece41fa29 201027_05
hgs
parents:
diff changeset
   331
	__KTRACE_OPT(KDMA, Kern::Printf(">TSkelDmac::IsIdle channel=%d (unsupported)", i));
189ece41fa29 201027_05
hgs
parents:
diff changeset
   332
189ece41fa29 201027_05
hgs
parents:
diff changeset
   333
	// TO DO (for instance): Return the state of the RUN bit of the channel.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   334
	// The return value should reflect the actual state.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   335
	(void) i;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   336
189ece41fa29 201027_05
hgs
parents:
diff changeset
   337
	return ETrue;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   338
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   339
189ece41fa29 201027_05
hgs
parents:
diff changeset
   340
189ece41fa29 201027_05
hgs
parents:
diff changeset
   341
TUint TSkelDmac::MaxTransferLength(TDmaChannel& /*aChannel*/, TUint /*aSrcFlags*/,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   342
									   TUint /*aDstFlags*/, TUint32 /*aPslInfo*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   343
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   344
// Returns the maximum transfer length in bytes for a given transfer.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   345
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   346
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   347
	// TO DO: Determine the proper return value, based on the arguments.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   348
189ece41fa29 201027_05
hgs
parents:
diff changeset
   349
	// For instance:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   350
	return KMaxTransferLen;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   351
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   352
189ece41fa29 201027_05
hgs
parents:
diff changeset
   353
189ece41fa29 201027_05
hgs
parents:
diff changeset
   354
TUint TSkelDmac::AddressAlignMask(TDmaChannel& /*aChannel*/, TUint /*aSrcFlags*/,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   355
									  TUint /*aDstFlags*/, TUint32 /*aPslInfo*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   356
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   357
// Returns the memory buffer alignment restrictions mask for a given transfer.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   358
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   359
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   360
	// TO DO: Determine the proper return value, based on the arguments.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   361
189ece41fa29 201027_05
hgs
parents:
diff changeset
   362
	// For instance:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   363
	return KMemAlignMask;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   364
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   365
189ece41fa29 201027_05
hgs
parents:
diff changeset
   366
189ece41fa29 201027_05
hgs
parents:
diff changeset
   367
inline TDmaDesc* TSkelDmac::HdrToHwDes(const SDmaDesHdr& aHdr)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   368
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   369
// Changes return type of base class call.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   370
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   371
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   372
	return static_cast<TDmaDesc*>(TDmac::HdrToHwDes(aHdr));
189ece41fa29 201027_05
hgs
parents:
diff changeset
   373
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   374
189ece41fa29 201027_05
hgs
parents:
diff changeset
   375
/**
189ece41fa29 201027_05
hgs
parents:
diff changeset
   376
Call the default virtual functions on the TDmac,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   377
that would never otherwise be called
189ece41fa29 201027_05
hgs
parents:
diff changeset
   378
189ece41fa29 201027_05
hgs
parents:
diff changeset
   379
*/
189ece41fa29 201027_05
hgs
parents:
diff changeset
   380
void TSkelDmac::CallDefaultVirtuals()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   381
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   382
	DMA_PSL_TRACE("Calling default virtual TDmac functions");
189ece41fa29 201027_05
hgs
parents:
diff changeset
   383
189ece41fa29 201027_05
hgs
parents:
diff changeset
   384
	TDmaChannel* channel = NULL;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   385
	SDmaDesHdr* hdr = NULL;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   386
189ece41fa29 201027_05
hgs
parents:
diff changeset
   387
	Transfer(*channel, *hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   388
	Transfer(*channel, *hdr, *hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   389
189ece41fa29 201027_05
hgs
parents:
diff changeset
   390
	const TDmaTransferArgs args;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   391
	TInt r = KErrNone;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   392
189ece41fa29 201027_05
hgs
parents:
diff changeset
   393
	r = InitHwDes(*hdr, args);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   394
	__NK_ASSERT_ALWAYS(r == KErrGeneral);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   395
189ece41fa29 201027_05
hgs
parents:
diff changeset
   396
	r = InitSrcHwDes(*hdr, args);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   397
	__NK_ASSERT_ALWAYS(r == KErrGeneral);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   398
189ece41fa29 201027_05
hgs
parents:
diff changeset
   399
	r = InitDstHwDes(*hdr, args);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   400
	__NK_ASSERT_ALWAYS(r == KErrGeneral);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   401
189ece41fa29 201027_05
hgs
parents:
diff changeset
   402
	r = UpdateHwDes(*hdr, KPhysAddrInvalid, KPhysAddrInvalid, 0, 0);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   403
	__NK_ASSERT_ALWAYS(r == KErrGeneral);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   404
189ece41fa29 201027_05
hgs
parents:
diff changeset
   405
	r = UpdateSrcHwDes(*hdr, KPhysAddrInvalid, 0, 0);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   406
	__NK_ASSERT_ALWAYS(r == KErrGeneral);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   407
189ece41fa29 201027_05
hgs
parents:
diff changeset
   408
	r = UpdateDstHwDes(*hdr, KPhysAddrInvalid, 0, 0);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   409
	__NK_ASSERT_ALWAYS(r == KErrGeneral);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   410
189ece41fa29 201027_05
hgs
parents:
diff changeset
   411
	ChainHwDes(*hdr, *hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   412
	AppendHwDes(*channel, *hdr, *hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   413
	AppendHwDes(*channel, *hdr, *hdr, *hdr, *hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   414
	UnlinkHwDes(*channel, *hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   415
189ece41fa29 201027_05
hgs
parents:
diff changeset
   416
	TUint32 count = 0;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   417
189ece41fa29 201027_05
hgs
parents:
diff changeset
   418
	count = HwDesNumDstElementsTransferred(*hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   419
	__NK_ASSERT_ALWAYS(count == 0);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   420
189ece41fa29 201027_05
hgs
parents:
diff changeset
   421
	count = HwDesNumSrcElementsTransferred(*hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   422
	__NK_ASSERT_ALWAYS(count == 0);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   423
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   424
189ece41fa29 201027_05
hgs
parents:
diff changeset
   425
TInt TSkelDmac::TestPool()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   426
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   427
	DMA_PSL_TRACE("TSkelDmac::TestPool()");
189ece41fa29 201027_05
hgs
parents:
diff changeset
   428
	TInt count = 0;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   429
	SDmaDesHdr* hdr = iFreeHdr;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   430
	TAny* des = iDesPool;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   431
189ece41fa29 201027_05
hgs
parents:
diff changeset
   432
	TInt r = KErrNone;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   433
	while(hdr->iNext)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   434
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   435
		TAny* receivedDes = NULL;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   436
		if(iCapsHwDes)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   437
			{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   438
			receivedDes = HdrToHwDes(*hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   439
			}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   440
		else
189ece41fa29 201027_05
hgs
parents:
diff changeset
   441
			{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   442
			TDmaTransferArgs& args = HdrToDes(*hdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   443
			receivedDes = &args;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   444
			}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   445
189ece41fa29 201027_05
hgs
parents:
diff changeset
   446
		if(receivedDes != des)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   447
			{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   448
			DMA_PSL_TRACE1("TSkelDmac::TestPool() failure: count=%d", count);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   449
			r = KErrGeneral;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   450
			break;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   451
			}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   452
189ece41fa29 201027_05
hgs
parents:
diff changeset
   453
		hdr = hdr->iNext;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   454
		des = (TAny*)((TUint)des + iDesSize);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   455
		count++;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   456
		}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   457
189ece41fa29 201027_05
hgs
parents:
diff changeset
   458
	if(count != (KDesCount - 1))
189ece41fa29 201027_05
hgs
parents:
diff changeset
   459
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   460
		DMA_PSL_TRACE2("TSkelDmac::TestPool() failure: count = %d != (iMaxDesCount -1) = %d", count, KDesCount-1);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   461
		r = KErrUnknown;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   462
		}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   463
	return r;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   464
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   465
189ece41fa29 201027_05
hgs
parents:
diff changeset
   466
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   467
// Simulated Fragmentation Dmac
189ece41fa29 201027_05
hgs
parents:
diff changeset
   468
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   469
189ece41fa29 201027_05
hgs
parents:
diff changeset
   470
189ece41fa29 201027_05
hgs
parents:
diff changeset
   471
const SDmacCaps KSimAsymmChanCaps =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   472
	{0,										// TInt iChannelPriorities;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   473
	 EFalse,								// TBool iChannelPauseAndResume;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   474
	 EFalse,								// TBool iAddrAlignedToElementSize;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   475
	 EFalse,								// TBool i1DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   476
	 EFalse,								// TBool i2DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   477
	 KDmaSyncAuto,						   // TUint iSynchronizationTypes;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   478
	 KDmaBurstSizeAny,					   // TUint iBurstTransactions;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   479
	 EFalse,							   // TBool iDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   480
	 EFalse,							   // TBool iFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   481
	 EFalse,							   // TBool iLinkedListPausedInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   482
	 EFalse,							   // TBool iEndiannessConversion;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   483
	 KDmaGraphicsOpNone,				   // TUint iGraphicsOps;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   484
	 EFalse,							   // TBool iRepeatingTransfers;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   485
	 EFalse,							   // TBool iChannelLinking;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   486
	 ETrue,								   // TBool iHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   487
	 EFalse,							   // TBool iSrcDstAsymmetry;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   488
	 ETrue,								   // TBool iAsymHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   489
	 EFalse,							   // TBool iBalancedAsymSegments;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   490
	 EFalse,							   // TBool iAsymCompletionInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   491
	 EFalse,							   // TBool iAsymDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   492
	 EFalse,							   // TBool iAsymFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   493
	 {0, 0, 0, 0, 0}					   // TUint32 iReserved[5];
189ece41fa29 201027_05
hgs
parents:
diff changeset
   494
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   495
189ece41fa29 201027_05
hgs
parents:
diff changeset
   496
const SDmacCaps KSimAsymmBalancedChanCaps =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   497
	{0,										// TInt iChannelPriorities;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   498
	 EFalse,								// TBool iChannelPauseAndResume;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   499
	 EFalse,								// TBool iAddrAlignedToElementSize;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   500
	 EFalse,								// TBool i1DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   501
	 EFalse,								// TBool i2DIndexAddressing;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   502
	 KDmaSyncAuto,						   // TUint iSynchronizationTypes;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   503
	 KDmaBurstSizeAny,					   // TUint iBurstTransactions;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   504
	 EFalse,							   // TBool iDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   505
	 EFalse,							   // TBool iFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   506
	 EFalse,							   // TBool iLinkedListPausedInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   507
	 EFalse,							   // TBool iEndiannessConversion;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   508
	 KDmaGraphicsOpNone,				   // TUint iGraphicsOps;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   509
	 EFalse,							   // TBool iRepeatingTransfers;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   510
	 EFalse,							   // TBool iChannelLinking;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   511
	 ETrue,								   // TBool iHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   512
	 EFalse,							   // TBool iSrcDstAsymmetry;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   513
	 ETrue,								   // TBool iAsymHwDescriptors;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   514
	 ETrue,								   // TBool iBalancedAsymSegments;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   515
	 EFalse,							   // TBool iAsymCompletionInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   516
	 EFalse,							   // TBool iAsymDescriptorInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   517
	 EFalse,							   // TBool iAsymFrameInterrupt;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   518
	 {0, 0, 0, 0, 0}					   // TUint32 iReserved[5];
189ece41fa29 201027_05
hgs
parents:
diff changeset
   519
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   520
189ece41fa29 201027_05
hgs
parents:
diff changeset
   521
189ece41fa29 201027_05
hgs
parents:
diff changeset
   522
class TAsymmDmac : public TDmac
189ece41fa29 201027_05
hgs
parents:
diff changeset
   523
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   524
	struct THwDes
189ece41fa29 201027_05
hgs
parents:
diff changeset
   525
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   526
		TUint iAddr;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   527
		TUint iLength;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   528
		TUint iCookie;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   529
		};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   530
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   531
	TAsymmDmac();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   532
	TInt Create();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   533
private:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   534
	// Work around for compiler which forbids this
189ece41fa29 201027_05
hgs
parents:
diff changeset
   535
	// class from accessing the protected, nested TDmac::SCreateInfo
189ece41fa29 201027_05
hgs
parents:
diff changeset
   536
	using TDmac::SCreateInfo;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   537
189ece41fa29 201027_05
hgs
parents:
diff changeset
   538
	// from TDmac (PIL pure virtual)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   539
	virtual void StopTransfer(const TDmaChannel& aChannel);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   540
	virtual TBool IsIdle(const TDmaChannel& aChannel);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   541
	virtual TUint MaxTransferLength(TDmaChannel& aChannel, TUint aSrcFlags,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   542
									TUint aDstFlags, TUint32 aPslInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   543
	virtual TUint AddressAlignMask(TDmaChannel& aChannel, TUint aSrcFlags,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   544
								   TUint aDstFlags, TUint32 aPslInfo);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   545
	// from TDmac (PIL virtual)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   546
	TInt InitSrcHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   547
	TInt InitDstHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   548
189ece41fa29 201027_05
hgs
parents:
diff changeset
   549
	void ChainHwDes(const SDmaDesHdr& aHdr, const SDmaDesHdr& aNextHdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   550
	void UnlinkHwDes(const TDmaChannel& aChannel, SDmaDesHdr& aHdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   551
189ece41fa29 201027_05
hgs
parents:
diff changeset
   552
	inline THwDes* HdrToHwDes(const SDmaDesHdr& aHdr);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   553
189ece41fa29 201027_05
hgs
parents:
diff changeset
   554
private:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   555
	static const SCreateInfo KInfo;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   556
public:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   557
	static const TInt iChannelCount;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   558
	TEmptyChannel iChannel;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   559
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   560
189ece41fa29 201027_05
hgs
parents:
diff changeset
   561
const TAsymmDmac::SCreateInfo TAsymmDmac::KInfo =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   562
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   563
	ETrue,													// iCapsHwDes
189ece41fa29 201027_05
hgs
parents:
diff changeset
   564
	KDesCount,												// iDesCount
189ece41fa29 201027_05
hgs
parents:
diff changeset
   565
	sizeof(THwDes),											// iDesSize
189ece41fa29 201027_05
hgs
parents:
diff changeset
   566
#ifndef __WINS__
189ece41fa29 201027_05
hgs
parents:
diff changeset
   567
	EMapAttrSupRw | EMapAttrFullyBlocking					// iDesChunkAttribs
189ece41fa29 201027_05
hgs
parents:
diff changeset
   568
#endif
189ece41fa29 201027_05
hgs
parents:
diff changeset
   569
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   570
189ece41fa29 201027_05
hgs
parents:
diff changeset
   571
const TInt TAsymmDmac::iChannelCount = 1;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   572
189ece41fa29 201027_05
hgs
parents:
diff changeset
   573
static TAsymmDmac AsymController;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   574
189ece41fa29 201027_05
hgs
parents:
diff changeset
   575
TAsymmDmac::TAsymmDmac()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   576
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   577
// Constructor.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   578
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   579
	: TDmac(KInfo)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   580
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   581
	TInt r = Create();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   582
	__NK_ASSERT_ALWAYS(r == KErrNone);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   583
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   584
189ece41fa29 201027_05
hgs
parents:
diff changeset
   585
189ece41fa29 201027_05
hgs
parents:
diff changeset
   586
TInt TAsymmDmac::Create()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   587
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   588
// Second phase construction.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   589
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   590
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   591
	TInt r = TDmac::Create(KInfo);							// Base class Create()
189ece41fa29 201027_05
hgs
parents:
diff changeset
   592
	if (r == KErrNone)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   593
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   594
		__DMA_ASSERTA(ReserveSetOfDes(iChannelCount) == KErrNone);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   595
		}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   596
	return r;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   597
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   598
189ece41fa29 201027_05
hgs
parents:
diff changeset
   599
189ece41fa29 201027_05
hgs
parents:
diff changeset
   600
void TAsymmDmac::StopTransfer(const TDmaChannel& /*aChannel*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   601
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   602
// Stops a running channel.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   603
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   604
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   605
	__DMA_CANT_HAPPEN();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   606
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   607
189ece41fa29 201027_05
hgs
parents:
diff changeset
   608
189ece41fa29 201027_05
hgs
parents:
diff changeset
   609
TBool TAsymmDmac::IsIdle(const TDmaChannel& /*aChannel*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   610
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   611
// Returns the state of a given channel.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   612
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   613
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   614
	__DMA_CANT_HAPPEN();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   615
	return ETrue;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   616
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   617
189ece41fa29 201027_05
hgs
parents:
diff changeset
   618
189ece41fa29 201027_05
hgs
parents:
diff changeset
   619
TUint TAsymmDmac::MaxTransferLength(TDmaChannel& /*aChannel*/, TUint /*aSrcFlags*/,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   620
									   TUint /*aDstFlags*/, TUint32 /*aPslInfo*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   621
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   622
// Returns the maximum transfer length in bytes for a given transfer.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   623
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   624
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   625
	// TO DO: Determine the proper return value, based on the arguments.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   626
189ece41fa29 201027_05
hgs
parents:
diff changeset
   627
	// For instance:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   628
	return KMaxTransferLen;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   629
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   630
189ece41fa29 201027_05
hgs
parents:
diff changeset
   631
189ece41fa29 201027_05
hgs
parents:
diff changeset
   632
TUint TAsymmDmac::AddressAlignMask(TDmaChannel& /*aChannel*/, TUint /*aSrcFlags*/,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   633
									  TUint /*aDstFlags*/, TUint32 /*aPslInfo*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   634
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   635
// Returns the memory buffer alignment restrictions mask for a given transfer.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   636
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   637
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   638
	// TO DO: Determine the proper return value, based on the arguments.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   639
189ece41fa29 201027_05
hgs
parents:
diff changeset
   640
	// For instance:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   641
	return KMemAlignMask;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   642
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   643
189ece41fa29 201027_05
hgs
parents:
diff changeset
   644
189ece41fa29 201027_05
hgs
parents:
diff changeset
   645
inline TAsymmDmac::THwDes* TAsymmDmac::HdrToHwDes(const SDmaDesHdr& aHdr)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   646
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   647
// Changes return type of base class call.
189ece41fa29 201027_05
hgs
parents:
diff changeset
   648
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   649
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   650
	return static_cast<THwDes*>(TDmac::HdrToHwDes(aHdr));
189ece41fa29 201027_05
hgs
parents:
diff changeset
   651
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   652
189ece41fa29 201027_05
hgs
parents:
diff changeset
   653
TInt TAsymmDmac::InitSrcHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   654
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   655
	return KErrNone;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   656
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   657
189ece41fa29 201027_05
hgs
parents:
diff changeset
   658
TInt TAsymmDmac::InitDstHwDes(const SDmaDesHdr& /*aHdr*/, const TDmaTransferArgs& /*aTransferArgs*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   659
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   660
	return KErrNone;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   661
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   662
189ece41fa29 201027_05
hgs
parents:
diff changeset
   663
void TAsymmDmac::ChainHwDes(const SDmaDesHdr& /*aHdr*/, const SDmaDesHdr& /*aNextHdr*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   664
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   665
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   666
189ece41fa29 201027_05
hgs
parents:
diff changeset
   667
void TAsymmDmac::UnlinkHwDes(const TDmaChannel& /*aChannel*/, SDmaDesHdr& /*aHdr*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   668
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   669
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   670
189ece41fa29 201027_05
hgs
parents:
diff changeset
   671
189ece41fa29 201027_05
hgs
parents:
diff changeset
   672
189ece41fa29 201027_05
hgs
parents:
diff changeset
   673
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   674
// Channel Opening/Closing (Channel Allocator)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   675
//////////////////////////////////////////////////////////////////////////////
189ece41fa29 201027_05
hgs
parents:
diff changeset
   676
189ece41fa29 201027_05
hgs
parents:
diff changeset
   677
struct TChanEntry
189ece41fa29 201027_05
hgs
parents:
diff changeset
   678
	{
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   679
	TChanEntry(TDmac& aController, MSimChannel& aChannel, const SDmacCaps& aCaps)
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   680
		:
189ece41fa29 201027_05
hgs
parents:
diff changeset
   681
			iController(aController),
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   682
			iSimChannel(aChannel),
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   683
			iCaps(aCaps)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   684
	{}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   685
189ece41fa29 201027_05
hgs
parents:
diff changeset
   686
	TDmac& iController;
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   687
	MSimChannel& iSimChannel;
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   688
	const SDmacCaps& iCaps;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   689
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   690
189ece41fa29 201027_05
hgs
parents:
diff changeset
   691
const TChanEntry ChannelTable[] =
189ece41fa29 201027_05
hgs
parents:
diff changeset
   692
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   693
		TChanEntry(SkelControllerSw, SkelControllerSw.iChannel, KSimSwChanCaps),
189ece41fa29 201027_05
hgs
parents:
diff changeset
   694
		TChanEntry(SkelControllerHw, SkelControllerHw.iChannel, KSimSgChanCaps),
189ece41fa29 201027_05
hgs
parents:
diff changeset
   695
		TChanEntry(AsymController, AsymController.iChannel, KSimAsymmChanCaps),
189ece41fa29 201027_05
hgs
parents:
diff changeset
   696
		TChanEntry(AsymController, AsymController.iChannel, KSimAsymmBalancedChanCaps)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   697
	};
189ece41fa29 201027_05
hgs
parents:
diff changeset
   698
189ece41fa29 201027_05
hgs
parents:
diff changeset
   699
static const TInt KChannelCount = ARRAY_LENGTH(ChannelTable);
189ece41fa29 201027_05
hgs
parents:
diff changeset
   700
189ece41fa29 201027_05
hgs
parents:
diff changeset
   701
TDmaChannel* DmaChannelMgr::Open(TUint32 aOpenId, TBool /*aDynChannel*/, TUint /*aPriority*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   702
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   703
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   704
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   705
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   706
	__KTRACE_OPT(KDMA, Kern::Printf(">DmaChannelMgr::Open aOpenId=%d", aOpenId));
189ece41fa29 201027_05
hgs
parents:
diff changeset
   707
189ece41fa29 201027_05
hgs
parents:
diff changeset
   708
	__DMA_ASSERTA(aOpenId < static_cast<TUint32>(KChannelCount));
189ece41fa29 201027_05
hgs
parents:
diff changeset
   709
189ece41fa29 201027_05
hgs
parents:
diff changeset
   710
	const TChanEntry& entry = ChannelTable[aOpenId];
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   711
	TDmaChannel* pC = &entry.iSimChannel.Channel();
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   712
	if (pC->IsOpened())
189ece41fa29 201027_05
hgs
parents:
diff changeset
   713
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   714
		pC = NULL;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   715
		}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   716
	else
189ece41fa29 201027_05
hgs
parents:
diff changeset
   717
		{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   718
		pC->iController = &entry.iController;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   719
		pC->iPslId = aOpenId;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   720
		pC->iDmacCaps = &entry.iCaps;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   721
189ece41fa29 201027_05
hgs
parents:
diff changeset
   722
		// It is safe to signal here,
189ece41fa29 201027_05
hgs
parents:
diff changeset
   723
		// setting iController marks the channel
189ece41fa29 201027_05
hgs
parents:
diff changeset
   724
		// as taken
189ece41fa29 201027_05
hgs
parents:
diff changeset
   725
		Signal();
189ece41fa29 201027_05
hgs
parents:
diff changeset
   726
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   727
		TInt r = entry.iSimChannel.PreOpen();
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   728
189ece41fa29 201027_05
hgs
parents:
diff changeset
   729
		Wait();
243
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   730
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   731
		// If there was an error
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   732
		// Close channel after retaking mutex
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   733
		if(r != KErrNone)
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   734
			{
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   735
			pC->iController = NULL;
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   736
			pC = NULL;
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   737
			}
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   738
c7a0ce20c48c 201031_07
hgs
parents: 199
diff changeset
   739
199
189ece41fa29 201027_05
hgs
parents:
diff changeset
   740
		}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   741
	return pC;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   742
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   743
189ece41fa29 201027_05
hgs
parents:
diff changeset
   744
189ece41fa29 201027_05
hgs
parents:
diff changeset
   745
void DmaChannelMgr::Close(TDmaChannel* /*aChannel*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   746
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   747
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   748
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   749
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   750
	// NOP
189ece41fa29 201027_05
hgs
parents:
diff changeset
   751
	}
189ece41fa29 201027_05
hgs
parents:
diff changeset
   752
189ece41fa29 201027_05
hgs
parents:
diff changeset
   753
189ece41fa29 201027_05
hgs
parents:
diff changeset
   754
TInt DmaChannelMgr::StaticExtension(TInt /*aCmd*/, TAny* /*aArg*/)
189ece41fa29 201027_05
hgs
parents:
diff changeset
   755
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   756
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   757
//
189ece41fa29 201027_05
hgs
parents:
diff changeset
   758
	{
189ece41fa29 201027_05
hgs
parents:
diff changeset
   759
	return KErrNotSupported;
189ece41fa29 201027_05
hgs
parents:
diff changeset
   760
	}