guestrendering/guestvideodriver/ldd/src/virtualvideohwinterface.cpp
branchbug235_bringup_0
changeset 1 d8d95053303a
child 2 e8ccf068ac7f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/guestrendering/guestvideodriver/ldd/src/virtualvideohwinterface.cpp	Fri Aug 20 18:02:40 2010 +0100
@@ -0,0 +1,267 @@
+/*
+ * =============================================================================
+ *  Name        : virtualvideohwinterface.cpp
+ *  Part of     : 
+ *  Description : Implementation file for the class DVirtualVideoHwInterface.
+ *  Version     : %version:3 %
+ *
+ *  Copyright © 2002-2009 Nokia. All rights reserved.
+ *  This material, including documentation and any related
+ *  computer programs, is protected by copyright controlled by
+ *  Nokia. All rights are reserved. Copying, including
+ *  reproducing, storing, adapting or translating, any
+ *  or all of this material requires the prior written consent of
+ *  Nokia. This material also contains confidential
+ *  information which may not be disclosed to others without the
+ *  prior written consent of Nokia.
+ * =============================================================================
+ */
+
+
+// INCLUDE FILES
+#include <platform.h>
+#include <kern_priv.h>
+
+#include "virtualvideointerfaceconstants.h"
+#include "virtualvideohwinterface.h"
+#include "virtualvideotracing.h"
+
+
+// CONSTANTS
+
+_LIT( KVirtualVideoHwInterfacePanic, "DVirtualVideoHwInterface" );
+
+// ============================ LOCAL DATA TYPES ===============================
+
+// Register offsets for playback and recording channels
+// Note: The orders of these must match the order of enumarations
+const TLinAddr KRegisterOffsets[] =
+    {
+    VVI_R_ID,
+    VVI_R_IRQ_ENABLE,
+    VVI_R_IRQ_STATUS,
+    VVI_R_COMMAND,
+    VVI_R_PARAMETER_LOAD,
+    VVI_R_ERROR,
+    VVI_R_INPUT_BUFFER_TAIL,
+    VVI_R_INPUT_BUFFER_HEAD,
+    VVI_R_INPUT_BUFFER_READ_COUNT,
+    VVI_R_INPUT_BUFFER_WRITE_COUNT,
+    VVI_R_INPUT_BUFFER_MAX_TAIL,
+    VVI_R_REQUEST_ID
+    };
+#define ASSERT_PANIC(c,p) __ASSERT_DEBUG(c,Kern::PanicCurrentThread(KVirtualVideoHwInterfacePanic,p));
+
+// ============================ LOCAL FUNCTIONS ================================
+
+// Get register offset for certain register range and register
+inline TLinAddr RegisterOffset( DVirtualVideoHwInterface::TRegister aRegister )
+    {
+    return KRegisterOffsets[aRegister];
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::DVirtualVideoHwInterface
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwInterface::DVirtualVideoHwInterface()
+    {
+    iInputParametersMemoryChunk = NULL;
+    iOutputParametersMemoryChunk = NULL;
+    iRegisterMemoryChunk = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::~DVirtualVideoHwInterface
+// -----------------------------------------------------------------------------
+//
+DVirtualVideoHwInterface::~DVirtualVideoHwInterface()
+    {
+    // Enter critical section
+    NKern::ThreadEnterCS();
+
+    if ( iInputParametersMemoryChunk )
+        {
+        Kern::ChunkClose( iInputParametersMemoryChunk );
+        }
+
+    if ( iOutputParametersMemoryChunk )
+        {
+        Kern::ChunkClose( iOutputParametersMemoryChunk );
+        }
+
+    if ( iRegisterMemoryChunk )
+        {
+        Kern::ChunkClose( iRegisterMemoryChunk );
+        }
+
+    iInputParametersMemoryChunk = NULL;
+    iOutputParametersMemoryChunk = NULL;
+    iRegisterMemoryChunk = NULL;
+
+    // Leave critical section
+    NKern::ThreadLeaveCS();
+    }
+
+TInt DVirtualVideoHwInterface::InitParametersInputMemory()
+    {
+    return InitPhysicalMemory( VVI_PARAMETERS_INPUT_BASE_ADDRESS, 
+            VVI_PARAMETERS_INPUT_MEMORY_SIZE, iInputParametersMemoryChunk, 
+            iInputParametersChunkKernelAddress );    
+    }
+
+TInt DVirtualVideoHwInterface::InitParametersOutputMemory()
+    {
+    return InitPhysicalMemory( VVI_PARAMETERS_OUTPUT_BASE_ADDRESS, 
+            VVI_PARAMETERS_OUTPUT_MEMORY_SIZE, iOutputParametersMemoryChunk, 
+            iOutputParametersChunkKernelAddress );    
+    }
+
+TInt DVirtualVideoHwInterface::InitRegisterMemory()
+    {
+    return InitPhysicalMemory( VVI_REGISTERS_BASE_ADDRESS, 
+            VVI_REGISTERS_MEMORY_SIZE, iRegisterMemoryChunk, 
+            iRegisterChunkKernelAddress );        
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::InitPhysicalMemory
+// -----------------------------------------------------------------------------
+//
+TInt DVirtualVideoHwInterface::InitPhysicalMemory( TUint32 aPhysicalAddress, 
+        TInt aMaxSize, DChunk*& aChunk, TLinAddr& aLinAddr )
+    {
+    TInt error = KErrNoMemory;
+    TChunkCreateInfo info;
+    info.iType = TChunkCreateInfo::ESharedKernelSingle;
+    info.iMaxSize = aMaxSize;
+	info.iMapAttr = EMapAttrFullyBlocking;
+    info.iOwnsMemory = EFalse;
+    info.iDestroyedDfc = NULL;
+    DChunk* chunk = NULL;
+    TUint32 mapAttr = 0;
+    TLinAddr chunkKernelAddress = 0;
+    
+    // Enter critical section while creating the chunk and commiting memory
+    NKern::ThreadEnterCS();
+
+    error = Kern::ChunkCreate( info, chunk, chunkKernelAddress, mapAttr );
+    if ( !error )
+        {
+        error = Kern::ChunkCommitPhysical(
+            chunk, 0, aMaxSize, aPhysicalAddress );
+        if ( error )
+            {
+            Kern::ChunkClose( chunk );
+            }
+        else
+            {
+            // Physical memory has been successfully committed to chunk
+            aChunk = chunk; 
+            aLinAddr = chunkKernelAddress;
+            }
+        }
+    chunk = NULL;
+
+    // Leave critical section
+    NKern::ThreadLeaveCS();
+    
+    VVHW_TRACE("DVirtualVideoHwInterface::InitPhysicalMemory return %d", error);
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::EnableInterrupts
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::EnableInterrupts( TUint32 aInterruptBitField )
+    {
+    SetRegisterValue( ERegIrqEnable, aInterruptBitField );
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::GetInterruptEnabledState
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::GetInterruptEnabledState( TUint32& aInterruptBitField )
+    {
+    GetRegisterValue( ERegIrqEnable, aInterruptBitField );
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::GetInterruptStatus
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::GetInterruptStatus( TUint32& aInterruptBitField )
+    {
+    GetRegisterValue( ERegIrqStatus, aInterruptBitField );
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::ResetInterruptStatus
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::ResetInterruptStatus( TUint32 aInterruptBitField )
+    {
+    SetRegisterValue( ERegIrqStatus, aInterruptBitField );
+    }
+
+
+// DVirtualVideoHwInterface::IssueCommand
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::IssueCommand( TUint32 aCommand )
+    {
+    SetRegisterValue( ERegCommand, aCommand );
+    }
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::GetRegisterValue
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::GetRegisterValue(
+    TRegister aRegister,
+    TUint32& aValue )
+    {
+    if ( iRegisterMemoryChunk )
+        {
+        TLinAddr offset = RegisterOffset( aRegister );
+        TUint32* ptr = reinterpret_cast<TUint32*>( iRegisterChunkKernelAddress + offset );
+        aValue = *ptr;
+        }
+    else
+        {
+        Kern::PanicCurrentThread( KVirtualVideoHwInterfacePanic, KErrNotReady );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// DVirtualVideoHwInterface::SetRegisterValue
+// -----------------------------------------------------------------------------
+//
+void DVirtualVideoHwInterface::SetRegisterValue(
+    TRegister aRegister,
+    TUint32 aValue )
+    {
+    if ( iRegisterMemoryChunk )
+        {
+        TLinAddr offset = RegisterOffset( aRegister );
+        TUint32* ptr = reinterpret_cast<TUint32*>( iRegisterChunkKernelAddress + offset );
+        *ptr = aValue;
+        }
+    else
+        {
+        Kern::PanicCurrentThread( KVirtualVideoHwInterfacePanic, KErrNotReady );
+        }
+    }
+
+
+// End of file