/*
 *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
 

/*
 * qosregistry.h
 *
 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
 */


#ifndef __QOSTI_H__

#define __QOSTI_H__

#include <dbapi.h>

/*  ============================================================================

  name   TLoadMode



  desc   The node load mode for qos.

 ============================================================================ */

enum TLoadMode
{

	EStaticLoad,

	EDynamicLoad
};

/*  ============================================================================

  name    CQosTI



  desc    An example class that uses the DSP BIOS/Bridge interfaces.and

          demonstrates creating an xDAIS Socket Node on the DSP. It sends

          messages and data buffers to the DSP, and then receives the qosd

          data back from the DSP for display.



  ============================================================================

	RHwaOmap            iDsp ;

  ============================================================================

  name   TQosResourceID



  desc   List of available resource types

  ============================================================================
 */

typedef enum _QOSDATATYPE {

	QOSDataType_Memory_DynLoad = 0,

	QOSDataType_Memory_DynAlloc,

	QOSDataType_Memory_Scratch,

	QOSDataType_Processor_C55X,

	QOSDataType_Processor_C6X,

	QOSDataType_Peripheral_DMA,

	QOSDataType_Stream,

	QOSDataType_Component,

	QOSDataType_Registry,

	QOSDataType_DynDependentLibrary
} QOSDATATYPE;

#define QOS_USER_DATA_TYPE	0x80000000	/* Flag indicating a application-defined
										   data type ID */

/*  ============================================================================

  name   QOSDATA



  desc   Generic data for resource management is described by the following
  structure

  ============================================================================
*/
struct QOSDATA {

	ULONG Id;

	struct QOSDATA *Next;

	 ULONG(*TypeSpecific)(struct QOSDATA *DataObject, ULONG FunctionCode,
			 											ULONG Parameter1);	
	 /* ptr to type-specific func. */

	ULONG Size;		/* size of data plus this header */

	char Data[];

};

//  ============================================================================

//  name   QOSFNTYPESPECIFIC

//

//  desc   Pointer to type-specific function handler for the data object

//  ============================================================================

typedef ULONG(*QOSFNTYPESPECIFIC)(struct QOSDATA *DataObject,ULONG FunctionCode,
															ULONG Parameter1);

ULONG QOS_Memory_Scratch_FunctionHandler(struct QOSDATA *DataObject,
										ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_Memory_DynAlloc_FunctionHandler(struct QOSDATA *DataObject,
										ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_Memory_DynLoad_FunctionHandler(struct QOSDATA *DataObject,
										ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_Processor_FunctionHandler(struct QOSDATA *DataObject,
										ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_Resource_DefaultFunctionHandler(struct QOSDATA *DataObject,
										  ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_Component_DefaultFunctionHandler(struct QOSDATA *DataObject,
										ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_DynDependentLibrary_FunctionHandler(struct QOSDATA *DataObject,
									      ULONG FunctionCode, ULONG Parameter1);

ULONG QOS_Registry_FunctionHandler(struct QOSDATA *DataObject,
										ULONG FunctionCode, ULONG Parameter1);

/*  ============================================================================

  name   QOSREGISTRY



  desc   The QOSREGISTRY structure contains a list of all resources and
  components in the system


  ============================================================================
*/

struct QOSREGISTRY {

	struct QOSDATA data;

	struct QOSDATA *ResourceRegistry;

	struct QOSDATA *ComponentRegistry;

};

//  ============================================================================

//  name   QOSRESOURCE_MEMORY

//

//  desc   System memory resources are characterized by the following structure

//  ============================================================================

struct QOSRESOURCE_MEMORY {

	struct QOSDATA data;

	UINT align;		/* alignment of memory heap */

	UINT heapId;		/* resource heap ID */

	UINT size;		/* size of memory heap */

	UINT type;		/* type of memory: prefer/require/scratch/persist */

	UINT allocated;		/* size of heap in use (not free) */

	UINT largestfree;	/* size of largest contiguous free block */

	UINT group;		/* scratch group ID (only for scratch memory) */

};

/*  ============================================================================

  name   QOSRESOURCE_PROCESSOR



  desc   Each processor is described by its processor type, hardware
  attributes, and available processing cycles (MIPS). 

  ============================================================================*/

struct QOSRESOURCE_PROCESSOR {

	struct QOSDATA data;

	UINT MaxMips;		/* max cpu cycles required for component */

	UINT TypicalMips;	/* typical cpu cycles required */

	UINT MaxCycles;		/* max cpu cycles for single iteration */

	UINT TypicalCycles;	/* typical cpu cycles for single iteration */

	UINT Utilization;	/* percentage of time cpu is idle */

	UINT currentLoad;

	UINT predLoad;

	UINT currDspFreq;

	UINT predictedFreq;


} ;

/*  ============================================================================

  name   QOSRESOURCE_STREAM



  desc   Bridge Streams are introduced as a QoS resource structure

  ============================================================================
*/

struct QOSRESOURCE_STREAM {

	struct QOSDATA data;

	struct DSP_STRMATTR Attrs;	/* Stream attributes for this stream */

	UINT Direction;		/* DSP_TONODE or DSP_FROMNODE */

};

 struct QOSDYNDEPLIB {

	struct QOSDATA data;

	struct DSP_UUID depLibUuid;	/* UUID of Dynamic Dependent Library */

	const CHAR *depLibPath;	/* Path to Dynamic Dependent Library */

};

/*  ============================================================================

  name   QOSCOMPONENT



  desc   Bridge Streams are introduced as a QoS resource structure

  ============================================================================
*/  

struct QOSCOMPONENT {

	struct QOSDATA data;

	UINT InUse;		/* Count of instances of this component in use */

	UINT aTaskId;

	UINT VariantID;

	UINT InterfaceID;

	struct DSP_UUID NodeUuid;

	PVOID dynNodePath;

	struct QOSDATA *resourceList;

	struct QOSDYNDEPLIB *dynDepLibList;

};

/*  ============================================================================

  name   Registry-specific QOS_FN_xxx definitions



  desc   These are defines for the registry-specific function codes

  ============================================================================
 */

#define QOS_FN_GetNumDynAllocMemHeaps 		1

#define QOS_FN_HasAvailableResource			2

/*  ============================================================================

  name   Resource-specific QOS_FN_xxx definitions



  desc   These are defines for the resource-specific function codes

  ============================================================================
*/

#define QOS_FN_ResourceIsAvailable	1

#define QOS_FN_ResourceUpdateInfo	2

//  ============================================================================

/*  name        DSPRegistry_Create



	Implementation

		Creates empty Registry, then adds all the default system resources

	Parameters

		none

	Return

		QOSREGISTRY*	ptr to new system registry

		NULL			Failure (out of memory)

	Requirement Coverage

		This method addresses requirement(s):  SR10085

*/

struct QOSREGISTRY *DSPRegistry_Create();

/*  ============================================================================

  name        DSPRegistry_Delete



	Implementation

		Deletes Registry and cleans up QoS Gateway & Registry objects that it
		owns.

	Parameters

		registry		ptr to previously created registry

	Return

		none

	Requirement Coverage

		This method addresses requirement(s):  SR10085

*/

void DSPRegistry_Delete(struct QOSREGISTRY *registry);

/*  ============================================================================

  name        DSPRegistry_Find



	Implementation

		Finds resource(s) or component(s) that match the given Id. For
		resources, each matching

		resource's TypeSpecific function is called with the function 
		ID QOS_FN_ResourceUpdateInfo to 

		ensure that all resources have current data in their structures.

	Parameters	

		Id	requested Id

		registry		system registry

		ResultList		ptr to results array

		Size			ptr to ULONG number of entries available in array

	Return

		DSP_OK			successful

		DSP_ESIZE		block for results is too small

		DSP_ENOTFOUND	item not found

	Requirement Coverage

		This method addresses requirement(s):  SR10008

*/

DSP_STATUS DSPRegistry_Find(UINT Id, struct QOSREGISTRY *registry,
									struct QOSDATA **ResultList, ULONG *Size);

/*  ============================================================================

  name        DSPRegistry_Add



	Implementation

		Add given resource or component to the list

	Parameters

		listhead		system registry (in the case of adding resources or
		components to the system)

						or component (in the case of adding required resources
						to a component)

		entry			entry to add in list

	Return

		DSP_STATUS		Error code or DSP_SOK for success

	Requirement Coverage

		This method addresses requirement(s):  SR10085

*/

DSP_STATUS DSPRegistry_Add(struct QOSDATA *listhead, struct QOSDATA *entry);

/* ============================================================================

  name        DSPRegistry_Remove



	Implementation

		Removes given resource or component from the list

	Parameters

		listhead		system registry (in the case of removing resources or
		components from the system)

						or component (in the case of removing required
						resources from a component)

		entry			resource or component to remove

	Return

		DSP_STATUS	Error code or DSP_SOK for success

	Requirement Coverage

		This method addresses requirement(s):  SR10085

*/

DSP_STATUS DSPRegistry_Remove(struct QOSDATA *listhead, struct QOSDATA *entry);

/*  ============================================================================

  name        DSPQos_TypeSpecific



	Implementation

		Calls the type-specific function defined for this data type. 
		Internally, this is implemented 

		as a call to the QOSDATA structure's TypeSpecific() function. 

	Parameters	

		DataObject		Far pointer to the structure for the data object

		FunctionCode	Type-specific function code

		Parameter1		Function-specific parameter

	Return

		ULONG			Function-specific return code.

	Requirement Coverage	

		This method addresses requirement(s):  SR10085, SR10008

*/

ULONG DSPQos_TypeSpecific(struct QOSDATA *DataObject, ULONG FunctionCode,
															ULONG Parameter1);

/*  ============================================================================

  name        DSPComponent_Register



	Implementation

		Informs Registry that the given component is using system resources.
		Internally, this 

		increments the InUse field of the QOSCOMPONENT structure.

	Parameters

		registry		system registry

		comp			component using system resources

	Return

		DSP_STATUS		Error code or DSP_SOK for success

	Requirement Coverage

		This method addresses requirement(s):  SR10085

*/

DSP_STATUS DSPComponent_Register(struct QOSREGISTRY *registry,
													struct QOSCOMPONENT *comp);

/*  ============================================================================

  name        DSPComponent_Unregister



	Implementation

		Informs Registry that component is no longer using system resources.
		Internally, this 

		decrements the InUse field of the QOSCOMPONENT structure.

	Parameters

		registry		system registry

		comp			component releasing system resources

	Return

		DSP_STATUS		Error code or DSP_SOK for success

	Requirement Coverage

		This method addresses requirement(s):  SR10085

*/

DSP_STATUS DSPComponent_Unregister(struct QOSREGISTRY *registry,
													struct QOSCOMPONENT *comp);

/*  ============================================================================

  name        DSPData_Create



	Implementation

		Allocates and initializes a QOSDATA structure.

	Parameters

		id				type of data

	Return

		QOSDATA *		ptr to data structure or NULL for failure

	Requirement Coverage

		This method addresses requirement(s):

*/

struct QOSDATA *DSPData_Create(ULONG id);

/*  ============================================================================

  name        DSPData_Delete



	Implementation

		Deletes a QOSDATA structure, recursively deleting any associated lists.

	Parameters

		data			ptr to data structure to delete

	Return

		DSP_STATUS		Error code or DSP_SOK for success

	Requirement Coverage

		This method addresses requirement(s):

*/

DSP_STATUS DSPData_Delete(struct QOSDATA *data);

/*  ============================================================================

  name        DSPData_IsResource



	Implementation

		Determines whether a QOSDATA structure Id is a "resource" type ID.

	Parameters

		Id				type ID to check

	Return

		bool			TRUE for resources, FALSE otherwise.

	Requirement Coverage

		This method addresses requirement(s):

*/

bool DSPData_IsResource(ULONG Id);

#endif

