/*************************************************************************/ /*!
@File
@Title          PowerVR services server header file
@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
@License        Dual MIT/GPLv2

The contents of this file are subject to the MIT license as set out below.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

Alternatively, the contents of this file may be used under the terms of
the GNU General Public License Version 2 ("GPL") in which case the provisions
of GPL are applicable instead of those above.

If you wish to allow use of your version of this file only under the terms of
GPL, and not to allow others to use your version of this file under the terms
of the MIT license, indicate your decision by deleting the provisions above
and replace them with the notice and other provisions required by GPL as set
out in the file called "GPL-COPYING" included in this distribution. If you do
not delete the provisions above, a recipient may use your version of this file
under the terms of either the MIT license or GPL.

This License is also included in this distribution in the file called
"MIT-COPYING".

EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ /**************************************************************************/

#ifndef PVRSRV_H
#define PVRSRV_H

#include "connection_server.h"
#include "device.h"
#include "power.h"
#include "syscommon.h"
#include "sysinfo.h"
#include "physheap.h"
#include "cache_ops.h"
#include "pvr_notifier.h"
#include "pvr_bridge.h"
#if defined(SUPPORT_RGX)
#include "rgx_bridge.h"
#endif
#if defined(__KERNEL__) && defined(LINUX) && !defined(__GENKSYMS__)
#define __pvrsrv_defined_struct_enum__
#include <services_kernel_client.h>
#endif

#include "pvrsrv_pool.h"

#if defined(SUPPORT_GPUVIRT_VALIDATION)
#include "virt_validation_defs.h"
#endif

#include "dma_support.h"
#include "vz_support.h"
#include "vz_physheap.h"

/*!
 * For OSThreadDestroy(), which may require a retry
 * Try for 100 ms to destroy an OS thread before failing
 */
#define OS_THREAD_DESTROY_TIMEOUT_US 100000ULL
#define OS_THREAD_DESTROY_RETRY_COUNT 10

typedef enum _VMM_CONF_PARAM_
{
	VMM_CONF_PRIO_OSID0 = 0,
	VMM_CONF_PRIO_OSID1 = 1,
	VMM_CONF_PRIO_OSID2 = 2,
	VMM_CONF_PRIO_OSID3 = 3,
	VMM_CONF_PRIO_OSID4 = 4,
	VMM_CONF_PRIO_OSID5 = 5,
	VMM_CONF_PRIO_OSID6 = 6,
	VMM_CONF_PRIO_OSID7 = 7,
	VMM_CONF_ISOL_THRES = 8,
	VMM_CONF_HCS_DEADLINE = 9
} VMM_CONF_PARAM;

typedef struct _BUILD_INFO_
{
	IMG_UINT32	ui32BuildOptions;
	IMG_UINT32	ui32BuildVersion;
	IMG_UINT32	ui32BuildRevision;
	IMG_UINT32	ui32BuildType;
#define BUILD_TYPE_DEBUG	0
#define BUILD_TYPE_RELEASE	1
	/* The above fields are self explanatory */
	/* B.V.N.C can be added later if required */
} BUILD_INFO;

typedef struct _DRIVER_INFO_
{
	BUILD_INFO	sUMBuildInfo;
	BUILD_INFO	sKMBuildInfo;
	IMG_UINT8	ui8UMSupportedArch;
	IMG_UINT8	ui8KMBitArch;

#define	BUILD_ARCH_64BIT			(1 << 0)
#define	BUILD_ARCH_32BIT			(1 << 1)
#define	BUILD_ARCH_BOTH		(BUILD_ARCH_32BIT | BUILD_ARCH_64BIT)
	IMG_BOOL	bIsNoMatch;
}DRIVER_INFO;

typedef struct PVRSRV_DATA_TAG
{
	PVRSRV_DRIVER_MODE			eDriverMode;				/*!< Driver mode (i.e. native, host or guest) */
	DRIVER_INFO					sDriverInfo;
	IMG_UINT32					ui32RegisteredDevices;
	PVRSRV_DEVICE_NODE			*psDeviceNodeList;			/*!< List head of device nodes */
	PVRSRV_DEVICE_NODE			*psHostMemDeviceNode;		/*!< DeviceNode to be used for device independent
	                                                             host based memory allocations where the DevMem
	                                                             framework is to be used e.g. TL */
	PVRSRV_SERVICES_STATE		eServicesState;				/*!< global driver state */

	HASH_TABLE					*psProcessHandleBase_Table; /*!< Hash table with process handle bases */
	POS_LOCK					hProcessHandleBase_Lock;	/*!< Lock for the process handle base table */
	PVRSRV_HANDLE_BASE			*psProcessHandleBaseBeingFreed; /*!< Pointer to process handle base currently being freed */

	IMG_HANDLE					hGlobalEventObject;			/*!< OS Global Event Object */
	IMG_UINT32					ui32GEOConsecutiveTimeouts;	/*!< OS Global Event Object Timeouts */

	IMG_HANDLE					hCleanupThread;				/*!< Cleanup thread */
	IMG_HANDLE					hCleanupEventObject;		/*!< Event object to drive cleanup thread */
	POS_LOCK					hCleanupThreadWorkListLock;	/*!< Lock protecting the cleanup thread work list */
	DLLIST_NODE					sCleanupThreadWorkList;		/*!< List of work for the cleanup thread */
	IMG_PID						cleanupThreadPid;			/*!< Cleanup thread process id */
	ATOMIC_T					i32NumCleanupItems;			/*!< Number of items in cleanup thread work list */

	IMG_HANDLE					hDevicesWatchdogThread;		/*!< Devices watchdog thread */
	IMG_HANDLE					hDevicesWatchdogEvObj;		/*! Event object to drive devices watchdog thread */
	volatile IMG_UINT32			ui32DevicesWatchdogPwrTrans;/*! Number of off -> on power state transitions */
#if !defined(PVRSRV_SERVER_THREADS_INDEFINITE_SLEEP)
	volatile IMG_UINT32			ui32DevicesWatchdogTimeout; /*! Timeout for the Devices watchdog Thread */
#endif
#ifdef PVR_TESTING_UTILS
	volatile IMG_UINT32			ui32DevicesWdWakeupCounter;	/* Need this for the unit tests. */
#endif

	POS_LOCK					hHWPerfHostPeriodicThread_Lock;	/*!< Lock for the HWPerf Host periodic thread */
	IMG_HANDLE					hHWPerfHostPeriodicThread;		/*!< HWPerf Host periodic thread */
	IMG_HANDLE					hHWPerfHostPeriodicEvObj;		/*! Event object to drive HWPerf thread */
	volatile IMG_BOOL			bHWPerfHostThreadStop;
	IMG_UINT32					ui32HWPerfHostThreadTimeout;

	IMG_HANDLE					hPvzConnection;				/*!< PVZ connection used for cross-VM hyper-calls */
	POS_LOCK					hPvzConnectionLock;			/*!< Lock protecting PVZ connection */
	IMG_BOOL					abVmOnline[RGXFW_NUM_OS];

	IMG_BOOL					bUnload;					/*!< Driver unload is in progress */

	IMG_HANDLE					hTLCtrlStream;				/*! Control plane for TL streams */

	IMG_HANDLE					hDriverThreadEventObject;	/*! Event object relating to multi-threading in the Server */
	IMG_BOOL					bDriverSuspended;			/*! if TRUE, the driver is suspended and new threads should not enter */
	ATOMIC_T					iNumActiveDriverThreads;	/*! Number of threads active in the Server */

	PMR							*psInfoPagePMR;				/*! Handle to exportable PMR of the information page. */
	IMG_UINT32					*pui32InfoPage;				/*! CPU memory mapping for information page. */
	DEVMEM_MEMDESC				*psInfoPageMemDesc;			/*! Memory descriptor of the information page. */
	POS_LOCK					hInfoPageLock;				/*! Lock guarding access to information page. */

	POS_LOCK                    hConnectionsLock;           /*!< Lock protecting sConnections */
	DLLIST_NODE                 sConnections;               /*!< The list of currently active connection objects */
} PVRSRV_DATA;


/*!
******************************************************************************
 @Function	PVRSRVGetPVRSRVData

 @Description	Get a pointer to the global data

 @Return   PVRSRV_DATA *
******************************************************************************/
PVRSRV_DATA *PVRSRVGetPVRSRVData(void);

/*!
******************************************************************************
@Note	Kernel code must always query the driver mode using the
		PVRSRV_VZ_MODE_IS() macro _only_ and PVRSRV_DATA->eDriverMode should
		not be read directly as the field also overloads as driver OSID (i.e.
		not to be confused with hardware kick register OSID) when running on
		non-VZ capable BVNC as the driver has to simulate OSID propagation to
		the firmware in the absence of the hardware kick register propagating
		this OSID on any non-VZ BVNC.
******************************************************************************/
#define PVRSRV_VZ_MODE_IS(_expr)              (((((IMG_INT)_expr)>0)&&((IMG_INT)PVRSRVGetPVRSRVData()->eDriverMode>0)) ? \
                                                   (IMG_TRUE) : ((_expr) == (PVRSRVGetPVRSRVData()->eDriverMode)))
#define PVRSRV_VZ_RETN_IF_MODE(_expr)         do { if (  PVRSRV_VZ_MODE_IS(_expr)) { return; } } while(0)
#define PVRSRV_VZ_RETN_IF_NOT_MODE(_expr)     do { if (! PVRSRV_VZ_MODE_IS(_expr)) { return; } } while(0)
#define PVRSRV_VZ_RET_IF_MODE(_expr, _rc)     do { if (  PVRSRV_VZ_MODE_IS(_expr)) { return (_rc); } } while(0)
#define PVRSRV_VZ_RET_IF_NOT_MODE(_expr, _rc) do { if (! PVRSRV_VZ_MODE_IS(_expr)) { return (_rc); } } while(0)
#define PVRSRV_VZ_DRIVER_OSID                 (((IMG_INT)PVRSRVGetPVRSRVData()->eDriverMode) > (0) ? \
												   ((IMG_UINT32)(PVRSRVGetPVRSRVData()->eDriverMode)) : (0))

/*!
******************************************************************************
@Note	The driver execution mode AppHint (i.e. PVRSRV_APPHINT_DRIVERMODE)
		can be an override or non-override 32-bit value. An override value
		has the MSB bit set & a non-override value has this MSB bit cleared.
		Excluding this MSB bit & interpreting the remaining 31-bit as a
		signed 31-bit integer, the mode values are:
		  [-1 native <default>: 0 host : +1 guest ].
******************************************************************************/
#define PVRSRV_VZ_APPHINT_MODE_IS_OVERRIDE(_expr)   ((IMG_UINT32)(_expr)&(IMG_UINT32)(1<<31))
#define PVRSRV_VZ_APPHINT_MODE(_expr)				\
	((((IMG_UINT32)(_expr)&(IMG_UINT32)0x7FFFFFFF) == (IMG_UINT32)0x7FFFFFFF) ? DRIVER_MODE_NATIVE : \
		!((IMG_UINT32)(_expr)&(IMG_UINT32)0x7FFFFFFF) ? DRIVER_MODE_HOST : \
			((IMG_UINT32)((IMG_UINT32)(_expr)&(IMG_UINT)0x7FFFFFFF)==(IMG_UINT32)0x1) ? DRIVER_MODE_GUEST : \
				((IMG_UINT32)(_expr)&(IMG_UINT32)0x7FFFFFFF))

/*!
******************************************************************************

 @Function	LMA memory management API

******************************************************************************/
PVRSRV_ERROR LMA_PhyContigPagesAlloc(PVRSRV_DEVICE_NODE *psDevNode, size_t uiSize,
							PG_HANDLE *psMemHandle, IMG_DEV_PHYADDR *psDevPAddr);

void LMA_PhyContigPagesFree(PVRSRV_DEVICE_NODE *psDevNode, PG_HANDLE *psMemHandle);

PVRSRV_ERROR LMA_PhyContigPagesMap(PVRSRV_DEVICE_NODE *psDevNode, PG_HANDLE *psMemHandle,
							size_t uiSize, IMG_DEV_PHYADDR *psDevPAddr,
							void **pvPtr);

void LMA_PhyContigPagesUnmap(PVRSRV_DEVICE_NODE *psDevNode, PG_HANDLE *psMemHandle,
					void *pvPtr);

PVRSRV_ERROR LMA_PhyContigPagesClean(PVRSRV_DEVICE_NODE *psDevNode,
                                     PG_HANDLE *psMemHandle,
                                     IMG_UINT32 uiOffset,
                                     IMG_UINT32 uiLength);

IMG_BOOL IsPhysmemNewRamBackedByLMA(PVRSRV_DEVICE_NODE *psDeviceNode, PVRSRV_DEVICE_PHYS_HEAP ePhysHeapIdx);

/*!
******************************************************************************
 @Function	PVRSRVPollForValueKM

 @Description
 Polls for a value to match a masked read

 @Input pui32LinMemAddr : CPU linear address to poll
 @Input ui32Value : required value
 @Input ui32Mask : Mask

 @Return   PVRSRV_ERROR :
******************************************************************************/
PVRSRV_ERROR IMG_CALLCONV PVRSRVPollForValueKM(
		volatile IMG_UINT32 __iomem *pui32LinMemAddr,
		IMG_UINT32                   ui32Value,
		IMG_UINT32                   ui32Mask);

/*!
******************************************************************************
 @Function	PVRSRVWaitForValueKM

 @Description
 Waits (using EventObjects) for a value to match a masked read

 @Input pui32LinMemAddr			: CPU linear address to poll
 @Input ui32Value				: required value
 @Input ui32Mask				: Mask

 @Return   PVRSRV_ERROR :
******************************************************************************/
PVRSRV_ERROR IMG_CALLCONV PVRSRVWaitForValueKM(
		volatile IMG_UINT32 __iomem *pui32LinMemAddr,
		IMG_UINT32                   ui32Value,
		IMG_UINT32                   ui32Mask);

/*!
******************************************************************************
 @Function	PVRSRVWaitForValueKMAndHoldBridgeLockKM

 @Description
 Waits without releasing bridge lock (using EventObjects) for a value
 to match a masked read

 @Input pui32LinMemAddr			: CPU linear address to poll
 @Input ui32Value				: required value
 @Input ui32Mask				: Mask

 @Return   PVRSRV_ERROR :
******************************************************************************/
PVRSRV_ERROR IMG_CALLCONV PVRSRVWaitForValueKMAndHoldBridgeLockKM(
		volatile IMG_UINT32 __iomem *pui32LinMemAddr,
		IMG_UINT32                   ui32Value,
		IMG_UINT32                   ui32Mask);

/*!
******************************************************************************
 @Function	: PVRSRVSystemHasCacheSnooping

 @Description	: Returns whether the system has cache snooping

 @Return : IMG_TRUE if the system has cache snooping
******************************************************************************/
IMG_BOOL PVRSRVSystemHasCacheSnooping(PVRSRV_DEVICE_CONFIG *psDevConfig);

/*!
******************************************************************************
 @Function	: PVRSRVSystemSnoopingIsEmulated

 @Description : Returns whether system cache snooping support is emulated

 @Return : IMG_TRUE if the system cache snooping is emulated in software
******************************************************************************/
IMG_BOOL PVRSRVSystemSnoopingIsEmulated(PVRSRV_DEVICE_CONFIG *psDevConfig);

/*!
******************************************************************************
 @Function	: PVRSRVSystemSnoopingOfCPUCache

 @Description	: Returns whether the system supports snooping of the CPU cache

 @Return : IMG_TRUE if the system has CPU cache snooping
******************************************************************************/
IMG_BOOL PVRSRVSystemSnoopingOfCPUCache(PVRSRV_DEVICE_CONFIG *psDevConfig);

/*!
******************************************************************************
 @Function	: PVRSRVSystemSnoopingOfDeviceCache

 @Description	: Returns whether the system supports snooping of the device cache

 @Return : IMG_TRUE if the system has device cache snooping
******************************************************************************/
IMG_BOOL PVRSRVSystemSnoopingOfDeviceCache(PVRSRV_DEVICE_CONFIG *psDevConfig);

/*!
******************************************************************************
 @Function	: PVRSRVSystemHasNonMappableLocalMemory

 @Description	: Returns whether the device has non-mappable part of local memory

 @Return : IMG_TRUE if the device has non-mappable part of local memory
******************************************************************************/
IMG_BOOL PVRSRVSystemHasNonMappableLocalMemory(PVRSRV_DEVICE_CONFIG *psDevConfig);

/*!
******************************************************************************
 @Function	: PVRSRVSystemWaitCycles

 @Description	: Waits for at least ui32Cycles of the Device clk.
******************************************************************************/
void PVRSRVSystemWaitCycles(PVRSRV_DEVICE_CONFIG *psDevConfig, IMG_UINT32 ui32Cycles);

PVRSRV_ERROR PVRSRVSystemInstallDeviceLISR(void *pvOSDevice,
										   IMG_UINT32 ui32IRQ,
										   const IMG_CHAR *pszName,
										   PFN_LISR pfnLISR,
										   void *pvData,
										   IMG_HANDLE *phLISRData);

PVRSRV_ERROR PVRSRVSystemUninstallDeviceLISR(IMG_HANDLE hLISRData);

int PVRSRVGetDriverStatus(void);

/*!
******************************************************************************
 @Function	: PVRSRVIsBridgeEnabled

 @Description	: Returns whether the given bridge group is enabled

 @Return : IMG_TRUE if the given bridge group is enabled
******************************************************************************/
static inline IMG_BOOL PVRSRVIsBridgeEnabled(IMG_HANDLE hServices, IMG_UINT32 ui32BridgeGroup)
{
	IMG_UINT32 ui32Bridges;
	IMG_UINT32 ui32Offset;

	PVR_UNREFERENCED_PARAMETER(hServices);

#if defined(SUPPORT_RGX)
	if (ui32BridgeGroup >= PVRSRV_BRIDGE_RGX_FIRST)
	{
		ui32Bridges = gui32RGXBridges;
		ui32Offset = PVRSRV_BRIDGE_RGX_FIRST;
	}
	else
#endif /* SUPPORT_RGX */
	{
		ui32Bridges = gui32PVRBridges;
		ui32Offset = PVRSRV_BRIDGE_FIRST;
	}

	return ((1U << (ui32BridgeGroup - ui32Offset)) & ui32Bridges) != 0;
}

/*!
******************************************************************************
 @Function	: PVRSRVSystemBIFTilingHeapGetXStride

 @Description	: return the default x-stride configuration for the given
                  BIF tiling heap number

 @Input psDevConfig: Pointer to a device config

 @Input uiHeapNum: BIF tiling heap number, starting from 1

 @Output puiXStride: pointer to x-stride output of the requested heap
******************************************************************************/
PVRSRV_ERROR
PVRSRVSystemBIFTilingHeapGetXStride(PVRSRV_DEVICE_CONFIG *psDevConfig,
									IMG_UINT32 uiHeapNum,
									IMG_UINT32 *puiXStride);

/*!
******************************************************************************
 @Function              : PVRSRVSystemBIFTilingGetConfig

 @Description           : return the BIF tiling mode and number of BIF
                          tiling heaps for the given device config

 @Input psDevConfig     : Pointer to a device config

 @Output peBifTilingMode: Pointer to a BIF tiling mode enum

 @Output puiNumHeaps    : pointer to uint to hold number of heaps

******************************************************************************/
PVRSRV_ERROR
PVRSRVSystemBIFTilingGetConfig(PVRSRV_DEVICE_CONFIG  *psDevConfig,
                               RGXFWIF_BIFTILINGMODE *peBifTilingMode,
                               IMG_UINT32            *puiNumHeaps);

#if defined(SUPPORT_GPUVIRT_VALIDATION)
/*!
******************************************************************************
 @Function				: PopulateLMASubArenas

 @Description			: Uses the Apphints passed by the client at
						  initialization time to add bases and sizes in the
						  various arenas in the LMA memory

 @Input psDeviceNode	: Pointer to the device node struct containing all the
						  arena information

 @Input aui32OSidMin	: Single dimensional array containing the minimum
						  values for each OSid area

 @Input aui32OSidMax	: Single dimensional array containing the maximum
						  values for each OSid area
******************************************************************************/

void PopulateLMASubArenas(PVRSRV_DEVICE_NODE *psDeviceNode, IMG_UINT32 aui32OSidMin[GPUVIRT_VALIDATION_NUM_REGIONS][GPUVIRT_VALIDATION_NUM_OS], IMG_UINT32 aui32OSidMax[GPUVIRT_VALIDATION_NUM_REGIONS][GPUVIRT_VALIDATION_NUM_OS]);

#if defined(EMULATOR)
	void SetAxiProtOSid(IMG_UINT32 ui32OSid, IMG_BOOL bState);
	void SetTrustedDeviceAceEnabled(void);
#endif

#endif

/*!
******************************************************************************
 @Function			PVRSRVVzRegisterFirmwarePhysHeap

 @Description		Request to map a physical heap to kernel FW memory context

 @Return			PVRSRV_ERROR	PVRSRV_OK on success. Otherwise, a PVRSRV_
									error code
******************************************************************************/
PVRSRV_ERROR PVRSRVVzRegisterFirmwarePhysHeap(PVRSRV_DEVICE_NODE *psDeviceNode,
											  IMG_DEV_PHYADDR sDevPAddr,
											  IMG_UINT64 ui64DevPSize,
											  IMG_UINT32 uiOSID);

/*!
******************************************************************************
 @Function			PVRSRVVzUnregisterFirmwarePhysHeap

 @Description		Request to unmap a physical heap from kernel FW memory context

 @Return			PVRSRV_ERROR	PVRSRV_OK on success. Otherwise, a PVRSRV_
									error code
******************************************************************************/
PVRSRV_ERROR PVRSRVVzUnregisterFirmwarePhysHeap(PVRSRV_DEVICE_NODE *psDeviceNode,
												IMG_UINT32 uiOSID);

/*!
******************************************************************************
 @Function			: PVRSRVCreateHWPerfHostThread

 @Description		: Creates HWPerf event object and thread unless already created

 @Input ui32Timeout	: Initial timeout (ms) between updates on the HWPerf thread

 @Return			: PVRSRV_ERROR	PVRSRV_OK on success. Otherwise, a PVRSRV_
									error code
******************************************************************************/
PVRSRV_ERROR PVRSRVCreateHWPerfHostThread(IMG_UINT32 ui32Timeout);

/*!
******************************************************************************
 @Function			: PVRSRVDestroyHWPerfHostThread

 @Description		: Destroys HWPerf event object and thread if created

 @Return			: PVRSRV_ERROR	PVRSRV_OK on success. Otherwise, a PVRSRV_
									error code
******************************************************************************/
PVRSRV_ERROR PVRSRVDestroyHWPerfHostThread(void);

/*!
******************************************************************************
 @Function			: PVRSRVPhysMemHeapsInit

 @Description		: Registers and acquires physical memory heaps

 @Return			: PVRSRV_ERROR	PVRSRV_OK on success. Otherwise, a PVRSRV_
									error code
******************************************************************************/
PVRSRV_ERROR PVRSRVPhysMemHeapsInit(PVRSRV_DEVICE_NODE *psDeviceNode, PVRSRV_DEVICE_CONFIG *psDevConfig);

/*!
******************************************************************************
 @Function			: PVRSRVPhysMemHeapsDeinit

 @Description		: Releases and unregisters physical memory heaps

 @Return			: PVRSRV_ERROR	PVRSRV_OK on success. Otherwise, a PVRSRV_
									error code
******************************************************************************/
void PVRSRVPhysMemHeapsDeinit(PVRSRV_DEVICE_NODE *psDeviceNode);

#endif /* PVRSRV_H */
