diff -r 72a7468afdd4 -r 01c1ffcc4fca baseport/syborg/soundsc/virtio_queue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baseport/syborg/soundsc/virtio_queue.h Thu Mar 04 00:55:21 2010 +0000 @@ -0,0 +1,139 @@ +/* +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Accenture Ltd +* +* Contributors: +* +* Description: This file is a part of sound driver for Syborg adaptation. +* +*/ + +#ifndef VIRTIO_QUEUE_H +#define VIRTIO_QUEUE_H + +#include "virtio.h" +#include + +namespace VirtIo +{ + +/// @brief implements VirtIo Queue. +/// +/// +/// @note functions are not enclosed with any synchronisation primitives. +/// However, implementation is believed to split operations in 3 groups with the following concurrency constraints: +///
  • A GetBuf, DetachBuf +///
  • B AddBuf +///
  • C Processing, Completed, Sync +/// Group C can be executed concurrently with any other functions. +/// Group A can be executed concurrently with a group B function. +/// Group A or B function cannot be executed concurrently with function from the same group. +/// +/// Memory barries would have to be introduced for SMP. +/// +class DQueue : public DBase, public MQueue + { + typedef TUint16 TIdx; + + struct TTransactionInfo + { + Token iToken; + TUint iTotalLen; + }; + + static const TUint KFreeDescriptorMarker = 0xFFFF; + +public: + + /// @brief Creates a VirtIo Queue with a MIo object, Queue Id, + /// and descriptor count/ring lenght. + DQueue( MIo& aVirtIo, TUint aId, TUint aCount ); + + /// Allocates resources + TInt Construct(); + + virtual ~DQueue(); + +public: // implementation of MQueue + + virtual TInt AddBuf( const TAddrLen aScatterList[], TUint32 aOutNum, TUint32 aInNum, Token aToken); + + virtual TInt DetachBuf( Token aToken ); + + virtual Token GetBuf( TUint& aLen ); + + virtual void Sync(); + + virtual TUint Id() + { return iId; } + + virtual TBool Restart() + { return ETrue; } + + virtual TInt Processing(); + + virtual TInt Completed(); + +public: // Debug functions + void DumpUsedPending(); + + void DumpUsed(TUint usedSlot); + void DumpAvailPending(); + + void DumpAvail(TUint availSlot); + void DumpDescs(TUint descId ); + + virtual void DumpAll(); + +private: + void Wipe(); + + TUint Slot( TUint i ) + { return i & (iCount - 1); } + + void FreeDescs( TUint firstDescIdx ); + + TUint8* AllocMem( TUint aSize ); + + TInt AllocQueue(); + + void PreInitQueue(); + + void PostInitQueue(); + +private: + MIo& iVirtIo; + const TUint iId; + const TUint iCount; + volatile TUint iNextUsedToRead; + TUint iFirstEverToRead; + volatile TUint iNextAvailToSync; + TUint iFirstEverToSync; + + TUint iDescSize; + TUint iAvailSize; + TUint iTokenSize; + TUint iUsedSize; + + TRingDesc* iDesc; + TRingAvail* iAvail; + volatile TRingUsed* iUsed; + TTransactionInfo* iToken; + + // managed + TUint8* iMem; + TPhysAddr iPhysAddr; + TBool iPhysMemReallyAllocated; + DPlatChunkHw* iChunk; + + }; + + +} // namespace VirtIo + +#endif