kernel/eka/include/drivers/resmanus.h
changeset 0 a41df078684a
child 244 a77889bee936
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/drivers/resmanus.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,334 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+// Resmanus.h
+//
+//
+
+// Base classes for implementating power resource support (Kernel-side only)
+
+/**
+@file
+@internalComponent
+*/
+#ifndef __RESMANUS_H__
+#define __RESMANUS_H__
+
+#include <platform.h>
+#include <d32resmanus.h>
+
+#define USERSIDE_LDD
+#include <drivers/resourcecontrol.h>	// For class DResourceController
+
+#include <e32ver.h>
+#include <e32des8.h>	// for HBufC8
+
+// Use the following macro for debug output of request-tracking information
+// #define _DUMP_TRACKERS
+
+const TInt KResManUsMajorVersionNumber = 1;
+const TInt KResManUsMinorVersionNumber = 0;
+const TInt KResManUsBuildVersionNumber = KE32BuildVersionNumber;
+
+const TInt KMaxNumChannels = 4;	// Limit for the number of channels to be open
+
+const TInt KNumClientNamesResCtrl	= 10; // Default number for kernel plus user side clients
+const TInt KNumClientNamesUserSide	= 10; // Sized as above (client may have PlatSec capabilities for access)
+const TInt KNumResourceInfoResCtrl	= 25; // To contain object types used by Resource Controller
+const TInt KNumResourceInfoUserSide	= 25; // To contain object types used by Client
+const TInt KNumResourceDependencies = 5; // Default number of dependencies for a resource
+
+const TUint8 KAllResInfoStored = 0xff;
+const TUint8 KAllClientInfoStored = 0xff;
+
+enum TAsyncOpType
+	{
+	EGetState,
+	ESetState,
+	ENotify
+	};
+
+#define USER_SIDE_CLIENT_BIT_MASK 0x4000 //Bit 14
+
+
+class DChannelResManUs;
+
+/*
+	Classes used to track client usage
+*/
+
+class TTrackingControl
+	{
+	public:
+	DChannelResManUs* iOwningChannel;
+	SDblQue* iFreeQue;
+	SDblQue* iBusyQue;
+	TAsyncOpType iType;
+	TUint8 iReserved1; // reserved for future expansion
+	TUint8 iReserved2; // reserved for future expansion
+	TUint8 iReserved3; // reserved for future expansion
+	};
+
+class TTrackingBuffer : public SDblQueLink
+	{
+	public:
+	inline void SetTrackingControl(TTrackingControl* aControl){iTrackingControl=aControl;};
+	inline TTrackingControl* GetTrackingControl(){return iTrackingControl;};
+	inline TUint GetResourceId(){return iResourceId;};
+	inline void SetResourceId(TUint aResourceId){iResourceId=aResourceId;};
+	inline SDblQue* GetQue() {return iQue;};
+	inline void SetQue(SDblQue* aQue) {iQue=aQue;};
+
+	private:
+	TTrackingControl* iTrackingControl;
+	SDblQue* iQue;
+	TUint iResourceId;
+	};
+
+class TTrackGetStateBuf : public TTrackingBuffer
+	{
+	public:
+	TTrackGetStateBuf(TPowerResourceCbFn aFn, TAny* aPtr, 
+					TDfcQue* aQue, TInt aPriority);
+	~TTrackGetStateBuf();
+
+	public:
+	TPowerResourceCb iCtrlBlock;
+	TClientDataRequest2<TInt,TInt>* iRequest;
+	};
+
+class TTrackSetStateBuf : public TTrackingBuffer
+	{
+	public:
+	TTrackSetStateBuf(TPowerResourceCbFn aFn, TAny* aPtr, 
+					TDfcQue* aQue, TInt aPriority);
+	~TTrackSetStateBuf();
+ 	public:
+	TPowerResourceCb iCtrlBlock;
+	TClientRequest* iRequest;
+	};
+
+class TTrackNotifyBuf : public TTrackingBuffer
+	{
+	public:
+	TTrackNotifyBuf(TPowerResourceCbFn aFn, TAny* aPtr, 
+					TDfcQue* aQue, TInt aPriority);
+	~TTrackNotifyBuf();
+	public:
+	DPowerResourceNotification iNotifyBlock;
+	TClientRequest* iRequest;
+	};
+
+
+/* 
+	Power resource logical device
+	The class representing the power resource logical device
+*/
+class DDeviceResManUs : public DLogicalDevice
+    {
+    public:
+    /**
+     * The constructor
+     */
+    DDeviceResManUs();
+    /**
+     * The destructor
+     */
+    ~DDeviceResManUs();
+    /**
+     * Second stage constructor - install the device
+     */
+    virtual TInt Install();
+    /**
+     * Get the Capabilites of the device
+     * @param aDes descriptor that will contain the returned capibilites
+     */
+    virtual void GetCaps(TDes8 &aDes) const;
+    /**
+     * Create a logical channel to the device
+     */
+    virtual TInt Create(DLogicalChannelBase*& aChannel);
+
+	public:
+#ifndef RESOURCE_MANAGER_SIMULATED_PSL
+	TDfcQue* iSharedDfcQue; // To allow access from device entry point
+#else
+	TDynamicDfcQue* iSharedDfcQue; // To allow LDD unload/re-load in testing
+#endif
+    };
+
+
+
+	// The logical channel for power resource devices
+class DChannelResManUs : public DLogicalChannel
+    {
+    public:
+
+	/*
+     * The constructor 
+     */
+    DChannelResManUs();
+	/*   
+     * The destructor
+     */
+    ~DChannelResManUs();
+
+	// Helper methods
+	TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
+	void FreeTrackingBuffer(TTrackingBuffer*& aBuffer);
+
+	inline TInt ClientHandle() {return iClientHandle;};
+
+    /**
+     * Create a logical power resource channel
+     * @param aUnit The channel number to create
+     * @param anInfo not used, can be NULL
+     * @param aVer The minimun driver version allowed
+     * @return KErrNone if channel created
+     */
+    virtual TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
+
+    protected:
+    /**
+     * Handle a message from the channels user
+     * @param aMsg The message to handle
+     */
+    virtual void HandleMsg(TMessageBase* aMsg);	// Note: this is a pure virtual in DLogicalChannel
+
+	virtual TInt SendMsg(TMessageBase* aMsg);
+
+	TInt SendControl(TMessageBase* aMsg);
+
+	TInt SendRequest(TMessageBase* aMsg);
+    /**
+     * Cancel an outstanding request
+     * @param aMask A mask containing the requests to be canceled
+     */
+    void DoCancel(TInt aMask);	// Name for convenience!
+    /**
+     * Preform a control operation on the channel
+     * Control operations are:
+     * - Get the current configuration
+     * - Configure the channel
+     * - Set the MAC address for the channel
+     * - Get the capibilities of the channel
+     * @param aId The operation to preform
+     * @param a1 The data to use with the operation
+     * @param a2 can be NULL - not used
+     * @return KErrNone if operation done
+     */
+   TInt DoControl(TInt aId, TAny* a1, TAny* a2); // Name for convenience!
+    /**
+     * Preform an asynchros operation on the channel
+     * Operations are:
+     * - Read data from the channel
+     * - Write data to the channel
+     * @param aId The operation to perform
+     * @param aStatus The status object to use when complete
+     * @param a1 The data to use
+     * @param a2 The length of the data to use
+     * @return KErrNone if operation started ok
+     * @see Complete()
+     */
+    TInt DoRequest(TInt aId, TRequestStatus* aStatus, TAny* a1, TAny* a2); // Name for convenience!
+
+
+	inline void SetClientHandle(TInt aHandle) {iClientHandle=aHandle;};
+
+	TInt InitTrackingControl(TTrackingControl*& aTracker, TUint8 aType, TUint8 aNumBuffers);
+#ifdef RESOURCE_MANAGER_SIMULATED_PSL
+	void GetNumCandidateAsyncResources(TUint& aNumResources);
+	TInt GetCandidateAsyncResourceId(TUint aIndex, TUint& aResourceId);
+	void GetNumCandidateSharedResources(TUint& aNumResources);
+	TInt GetCandidateSharedResourceId(TUint aIndex, TUint& aResourceId);
+#endif
+
+    private:
+	static void RegistrationDfcFunc(TAny* aChannel);
+	TInt RegisterWithResCtrlr();
+	TInt GetValidName(const TDesC8* aInfo);
+	void RemoveTrackingControl(TTrackingControl*& aTracker);
+	TInt GetAndInitTrackingBuffer(TTrackingControl*& aTracker, TTrackingBuffer*& aBuffer, TUint aResourceId, TRequestStatus* aStatus);
+	TInt GetStateBuffer(TTrackingControl*& aTracker, TTrackingBuffer*& aBuffer, TUint aResourceId, TInt *aState, TInt* aLevelOwnerPtr, TPowerResourceCb*& aCb, TRequestStatus* aStatus);
+	TTrackingControl* MapRequestToTracker(TInt aRequestType);
+	TInt CancelTrackerRequests(TTrackingControl* aTracker,TBool aSingleRsrc, TUint aResourceId, TRequestStatus* aStatus);
+	TInt CancelRequestsOfType(TInt aRequestType, TRequestStatus* aStatus);
+	TInt EnsureSizeIsSufficient(HBuf*& aBuffer, TInt aMinSize);
+	TInt ExtractResourceInfo(const TPowerResourceInfoV01* aPwrResInfo, TResourceInfoBuf& aInfo);
+#ifdef _DUMP_TRACKERS
+	TInt DumpResource(const TPowerResourceInfoV01* aResource);
+	TInt DumpTracker(TTrackingControl* aTracker);
+#endif
+#ifdef RESOURCE_MANAGER_SIMULATED_PSL
+	void CheckForCandidateAsyncResource(TPowerResourceInfoV01* aResource);
+	void CheckForCandidateSharedResource(TPowerResourceInfoV01* aResource);
+#endif
+	typedef void ClientCopyFunc(TDes8*, const TPowerClientInfoV01*);
+
+	// Registration and identification support
+    public:
+	DThread* iClient;
+
+	DPowerResourceController* iPddPtr;
+
+	private:
+	NFastMutex iBufferFastMutex;
+	NFastSemaphore *iFastSem;
+	TInt iClientHandle;
+	TUint iNameProvidedLength;
+	HBuf8* iUserNameUsed;
+
+	// Support for usage tracking
+	TTrackingControl *iGetStateTracker;
+	TTrackingControl *iSetStateTracker;
+	TTrackingControl *iListenableTracker;
+
+	// Buffers to support acquisition of resource and client information
+	HBuf8* iClientNamesResCtrl;		// Stores client information
+	TUint iClientInfoStoredResId;	// The ID of the resource for which the data is stored (none=0, all=KAllClientInfoStored)
+	TUint iClientInfoStoredNum;		// The number of clients for which data is stored
+
+	HBuf8* iResourceInfoResCtrl;	// Stores resource information
+	TUint iResInfoStoredClientId;	// The ID of the client for which the data is stored (none=0, all=KAllResInfoStored)
+	TUint iResInfoStoredNum;		// The number of resources for which data is stored
+
+	HBuf8* iResourceDependencyIds;	// To contain the identifiers for resource dependencies
+	TUint iNumResDepsStored;
+
+#ifdef RESOURCE_MANAGER_SIMULATED_PSL
+	// Support for testing
+	TBool iHaveLongLatencyResource;
+
+	// Array for candidate resources to use for testing
+	// Store a maximum of MAX_NUM_CANDIDATE_RESOURCES
+	#define MAX_NUM_CANDIDATE_RESOURCES 10
+	TUint iNoCandidateAsyncRes;
+	TUint iCandidateAsyncResIds[MAX_NUM_CANDIDATE_RESOURCES];
+	TUint iNoCandidateSharedRes;
+	TUint iCandidateSharedResIds[MAX_NUM_CANDIDATE_RESOURCES];
+#endif
+
+	// 8-bit values, placed here to aid size management
+	TUint8 iClientInfoValid;		// To indicate if a valid set of client data is stored
+	TUint8 iResInfoValid;			// To indicate if a valid set of resource data is stored
+	TUint8 iResDepsValid;			// Guard flag for the RArray
+
+	TUint8 iReserved1;				 // reserved for future expansion
+
+    };
+
+
+#endif