/*************************************************************************/ /*!
@File
@Title          Interface between 3rd party display controller (DC) drivers
                and the Services server module.
@Description    API between Services and the 3rd party DC driver and vice versa.
@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
@License        MIT

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.

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.
*/ /**************************************************************************/

#if !defined (__KERNELDISPLAY_H__)
#define __KERNELDISPLAY_H__

#if defined (__cplusplus)
extern "C" {
#endif

#include <powervr/mem_types.h>

#include "pvrsrv_error.h"
#include "img_types.h"
#include "pvrsrv_surface.h"
#include "dc_external.h"

/*!
 ******************************************************************************
 @mainpage Introduction and Document Scope
This document is a function reference for the 3rd party display
controller interface. The interface ensures that the 3rd party display driver and
Services can exchange configurations and buffers and can inform each
other about occurring events like render completion or vsyncs.

This interface should be used and implemented if the 3rd party display driver
is not using a native OS interface such as the Linux DRM/KMS API.

To fully understand the document the reader should be aware that
the Services driver - offering PowerVR core and platform functionality to the
driver layers (OGLES etc.) above - is split into the "Services Client"
user mode library and the "Services Server" kernel mode driver that communicate
via the "Services Bridge". The terms "User-Mode" and "Client" are used as
synonyms as well as "Kernel-Mode" and "Server".

Please refer to the more comprehensive '3rd Party Display Integration Guide'
for an architecture overview and an explanation of the data flow between a
client process, Services and the 3rd party display driver. It also contains
descriptions about how to make use of the client side interface that is supposed
to be integrated in some kind of display manager like e.g. the Rogue DDK WSEGL
window manager.

The documented functions are split into different parts:
- Callbacks that need an implementation by the 3rd party display driver and
that are used by the Services server, some of them optional (kerneldisplay.h)
- Functions that the Services server module exports and can be used by the
3rd party display driver. Mainly to register/deregister a new display device
and to query state information (kerneldisplay.h)
- Functions that are called by the client process (a display manager e.g. WSEGL)
to control the DC interaction (dc_client.h)
- Commonly used structure definitions to exchange data between the modules
(dc_external.h, pvrsrv_surface.h)
 *****************************************************************************/

/*************************************************************************/ /*!
@Function       GetInfo

@Description    Query the display controller for its information structure.

   Called by client function: #PVRSRVDCGetInfo()

   Implementation of this callback is mandatory.

@Input          hDeviceData             Device private data

@Output         psDisplayInfo           Display info structure
*/
/*****************************************************************************/
typedef void (*GetInfo)(IMG_HANDLE hDeviceData,
                        DC_DISPLAY_INFO *psDisplayInfo);

/*************************************************************************/ /*!
@Function       PanelQueryCount

@Description    Query the display controller for how many panels are
                connected to it.

   Called by client function: #PVRSRVDCPanelQueryCount()

   Implementation of this callback is mandatory.

@Input          hDeviceData            Device private data

@Output         pui32NumPanels         Number of panels

@Return         PVRSRV_OK if the query was successful
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*PanelQueryCount)(IMG_HANDLE hDeviceData,
                                        IMG_UINT32 *pui32NumPanels);

/*************************************************************************/ /*!
@Function       PanelQuery

@Description    Query the display controller for information on what panel(s)
                are connected to it and their properties.

   Called by client function: #PVRSRVDCPanelQuery()

   Implementation of this callback is mandatory.

@Input          hDeviceData             Device private data

@Input          ui32PanelsArraySize     Size of the PanelInfo array
                                        (i.e. number of panels that
                                        can be returned)

@Output         pui32NumPanels          Number of panels returned

@Output         pasPanelInfo            Array of formats, allocated beforehand

@Return         PVRSRV_OK if the query was successful
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*PanelQuery)(IMG_HANDLE hDeviceData,
                                   IMG_UINT32 ui32PanelsArraySize,
                                   IMG_UINT32 *pui32NumPanels,
                                   PVRSRV_PANEL_INFO *pasPanelInfo);

/*************************************************************************/ /*!
@Function       FormatQuery

@Description    Query the display controller to check if it supports the specified
                format(s).

   Called by client function: #PVRSRVDCFormatQuery()

   Implementation of this callback is mandatory.

@Input          hDeviceData             Device private data

@Input          ui32NumFormats          Number of formats to check
                                        (i.e. length of the Format array)

@Input          pasFormat               Array of formats to check

@Output         pui32Supported          For each format, the number of display
                                        pipes that support that format

@Return         PVRSRV_OK if the query was successful
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*FormatQuery)(IMG_HANDLE hDeviceData,
                                    IMG_UINT32 ui32NumFormats,
                                    PVRSRV_SURFACE_FORMAT *pasFormat,
                                    IMG_UINT32 *pui32Supported);

/*************************************************************************/ /*!
@Function       DimQuery

@Description    Query the specified display plane for the display dimensions
                it supports.

   Called by client function: #PVRSRVDCDimQuery()

   Implementation of this callback is mandatory.

@Input          hDeviceData             Device private data

@Input          ui32NumDims             Number of dimensions to check
                                        (i.e. length of the Dim array)

@Input          pasDim                  Array of dimensions to check

@Output         pui32Supported          For each dimension, the number of
                                        display pipes that support that
                                        dimension

@Return         PVRSRV_OK if the query was successful
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*DimQuery)(IMG_HANDLE hDeviceData,
                                 IMG_UINT32 ui32NumDims,
                                 PVRSRV_SURFACE_DIMS *pasDim,
                                 IMG_UINT32 *pui32Supported);

/*************************************************************************/ /*!
@Function       SetBlank

@Description    Enable/disable blanking of the screen.

   Called by client function: #PVRSRVDCSetBlank()

   Implementation of this callback is optional.

@Input          hDeviceData             Device private data

@Input          bEnable                 Enable/Disable the blanking

@Return         PVRSRV_OK on success
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*SetBlank)(IMG_HANDLE hDeviceData,
                                 IMG_BOOL bEnable);

/*************************************************************************/ /*!
@Function       SetVSyncReporting

@Description    Enable VSync reporting. If enabled, the 3rd party display
                driver is expected to call PVRSRVCheckStatus() after a VSync
                event occurred. This will signal the Services driver global 
                event object.

   Called by client function: #PVRSRVDCSetVSyncReporting()

   Implementation of this callback is optional.

@Input          hDeviceData             Device private data

@Input          bEnable                 Enable/Disable the reporting

@Return         PVRSRV_OK on success
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*SetVSyncReporting)(IMG_HANDLE hDeviceData,
                                          IMG_BOOL bEnable);

/*************************************************************************/ /*!
@Function       LastVSyncQuery

@Description    Query the time the last vsync happened.

   Called by client function: #PVRSRVDCLastVSyncQuery()

   Implementation of this callback is optional.

@Input          hDeviceData             Device private data

@Output         pi64Timestamp           The requested timestamp
                                        of the system time in ns

@Return         PVRSRV_OK if the query was successful
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*LastVSyncQuery)(IMG_HANDLE hDeviceData,
                                       IMG_INT64 *pi64Timestamp);

/*************************************************************************/ /*!
@Function       ContextCreate

@Description    Create display context.
                The client application and the display driver have to agree
                as to what exactly a context represents, Services will just
                pass it through and tie it to its own concept of a
                display context.
                It might contain additional locks, work-queues or other
                important data that is necessary to drive the interaction
                with Services. A context is usually associated with one device
                but that is not a hard requirement.

   Called by client function: #PVRSRVDCDisplayContextCreate()

   Implementation of this callback is mandatory.

@Input          hDeviceData             Device private data

@Output         hDisplayContext         Created display context

@Return         PVRSRV_OK if the context was created
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*ContextCreate)(IMG_HANDLE hDeviceData,
                                      IMG_HANDLE *hDisplayContext);

/*************************************************************************/ /*!
@Function       ContextConfigureCheck

@Description    Check to see if a configuration is valid for the display
                controller. Because of runtime changes the display context
                might not be able to work with a certain configuration anymore.
                This function is intended to be called before ContextConfigure
                so that the application can query details about the current
                surface config and then do the ContextConfigure call with
                the updated data.
                The arrays should be z-sorted, with the farthest plane
                first and the nearest plane last.

   Called by client function: #PVRSRVDCContextConfigureCheck()

   Implementation of this callback is optional.

@Input          hDisplayContext         Display context

@Input          ui32PipeCount           Number of display pipes to configure
                                        (length of the input arrays)

@Input          pasSurfAttrib           Array of surface attributes (one for
                                        each display plane)

@Input          ahBuffers               Array of buffers (one for
                                        each display plane)

@Return         PVRSRV_OK if the configuration is valid
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*ContextConfigureCheck)(IMG_HANDLE hDisplayContext,
                                              IMG_UINT32 ui32PipeCount,
                                              PVRSRV_SURFACE_CONFIG_INFO *pasSurfAttrib,
                                              IMG_HANDLE *ahBuffers);

/*************************************************************************/ /*!
@Function       ContextConfigure

@Description    Configure the display pipeline to display a given buffer.
                The arrays should be z-sorted, with the farthest plane first
                and the nearest plane last.

   Called by client function: #PVRSRVDCContextConfigure(), #PVRSRVDCContextConfigureWithFDSync()

   Implementation of this callback is mandatory.

@Input          hDisplayContext         Display context

@Input          ui32PipeCount           Number of display pipes to configure
                                        (i.e. length of the input arrays)

@Input          pasSurfAttrib           Array of surface attributes (one for
                                        each display plane)

@Input          ahBuffers               Array of buffers (one for
                                        each display plane)

@Input          ui32DisplayPeriod		The number of VSync periods this
                                        configuration should be displayed for

@Input          hConfigData             Config handle which gets passed to
                                        DisplayConfigurationRetired when this
                                        configuration is retired
*/
/*****************************************************************************/
typedef void (*ContextConfigure)(IMG_HANDLE hDisplayContext,
                                 IMG_UINT32 ui32PipeCount,
                                 PVRSRV_SURFACE_CONFIG_INFO *pasSurfAttrib,
                                 IMG_HANDLE *ahBuffers,
                                 IMG_UINT32 ui32DisplayPeriod,
                                 IMG_HANDLE hConfigData);

/*************************************************************************/ /*!
@Function       ContextDestroy

@Description    Destroy a display context.

   Called by client function: #PVRSRVDCDisplayContextDestroy()

   Implementation of this callback is mandatory.

@Input          hDisplayContext         Display context to destroy

@Return         None
*/
/*****************************************************************************/
typedef void (*ContextDestroy)(IMG_HANDLE hDisplayContext);

/*************************************************************************/ /*!
@Function       BufferAlloc

@Description    Allocate a display buffer. This is a request to the display
                controller to allocate a buffer from memory that is addressable
                by the display controller.

                Note: The actual allocation of display memory can be deferred
                until the first call to acquire, but the handle for the buffer
                still needs to be created and returned to the caller as well
                as some information about the buffer that's required upfront.

   Called by client function: #PVRSRVDCBufferAlloc()

   Implementation of this callback is mandatory.

@Input          hDisplayContext         Display context this buffer will be
                                        used on

@Input          psSurfInfo              Attributes of the buffer

@Output         puiLog2PageSize         Pagesize in log2(bytes) of one page

@Output         pui32PageCount          Number of pages in the buffer

@Output         pui32PhysHeapID         Physical heap ID to use. The physical
                                        heap has been created in the Services
                                        system layer.

@Output         pui32ByteStride         Stride (in bytes) of allocated buffer

@Output         phBuffer                Handle to allocated buffer

@Return         PVRSRV_OK if the buffer was successfully allocated
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*BufferAlloc)(IMG_HANDLE hDisplayContext,
                                    DC_BUFFER_CREATE_INFO *psSurfInfo,
                                    IMG_DEVMEM_LOG2ALIGN_T *puiLog2PageSize,
                                    IMG_UINT32 *pui32PageCount,
                                    IMG_UINT32 *pui32PhysHeapID,
                                    IMG_UINT32 *pui32ByteStride,
                                    IMG_HANDLE *phBuffer);

/*************************************************************************/ /*!
@Function       BufferImport

@Description    Import memory allocated from an external source (e.g. Services)
                to the display controller. The DC checks to see if the import
                is compatible and potentially sets up HW to map the imported
                buffer, although this isn't required to happen until the first
                call to BufferMap.

                Note: Provide this function if the controller
                can scan out arbitrary memory, allocated for another purpose by
                Services. To be able to use this buffer (depending on its
                origin) the display controller probably will need a MMU.

   Called by client function: #PVRSRVDCBufferImport()

   Implementation of this callback is optional.

@Input          hDisplayContext         Display context this buffer will be
                                        used on

@Input          ui32NumPlanes           Number of planes

@Input          pahImport               Array of handles (one per colour channel)

@Input          psSurfAttrib            Surface attributes of the buffer

@Output         phBuffer                Handle to imported buffer

@Return         PVRSRV_OK if the buffer was successfully imported
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*BufferImport)(IMG_HANDLE hDisplayContext,
                                     IMG_UINT32 ui32NumPlanes,
                                     IMG_HANDLE **pahImport,
                                     DC_BUFFER_IMPORT_INFO *psSurfAttrib,
                                     IMG_HANDLE *phBuffer);

/*************************************************************************/ /*!
@Function       BufferAcquire

@Description    Acquire the buffer's physical memory pages. If the buffer doesn't
                have any memory backing yet then this will trigger the 3rd
                party driver to allocate it.

                Note: The page count isn't passed back in this function as
                Services has already obtained it during BufferAlloc.

   Called when Services requests buffer access for the first time. Usually part
   of non display class functions.

   Implementation of this callback is mandatory.

@Input          hBuffer                 Handle to the buffer

@Output         pasDevPAddr             Array of device physical page address
                                        of this buffer

@Output         ppvLinAddr              CPU virtual address of buffer. This is
                                        optional but if you have one you must
                                        return it otherwise return NULL.

@Return         PVRSRV_OK if the buffer was successfully acquired
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*BufferAcquire)(IMG_HANDLE hBuffer,
                                      IMG_DEV_PHYADDR *pasDevPAddr,
                                      void **ppvLinAddr);

/*************************************************************************/ /*!
@Function       BufferRelease

@Description    Undo everything done by BufferAcquire.
                Will release the buffer's physical memory pages if
                BufferAcquire allocated them.

   Called when Services finished buffer access.

   Implementation of this callback is mandatory.

@Input          hBuffer                 Handle to the buffer
*/
/*****************************************************************************/
typedef void (*BufferRelease)(IMG_HANDLE hBuffer);

/*************************************************************************/ /*!
@Function       BufferFree

@Description    Release a reference to the device buffer. If this was the last
                reference the 3rd party driver is entitled to free the backing
                memory and other related resources.

   Called by client function: #PVRSRVDCBufferFree()

   Implementation of this callback is mandatory.

@Input          hBuffer                 Buffer handle we're releasing
*/
/*****************************************************************************/
typedef void (*BufferFree)(IMG_HANDLE hBuffer);

/*************************************************************************/ /*!
@Function       BufferMap

@Description    Map the buffer into the display controller
                Note: This function depends on the behaviour of
                BufferAlloc/BufferAcquire/BufferImport/BufferSystemAcquire
                and the controller's ability to map in memory.
                If the controller has no MMU or the above functions already
                map the buffer this callback does not need an implementation.

   Called by client function: #PVRSRVDCBufferPin()

   Implementation of this callback is optional.

@Input          hBuffer                 Buffer to map

@Return         PVRSRV_OK if the buffer was successfully mapped
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*BufferMap)(IMG_HANDLE hBuffer);

/*************************************************************************/ /*!
@Function       BufferUnmap

@Description    Undo everything done by BufferMap.
                Usually that means to unmap a buffer from the display controller.

   Called by client function: #PVRSRVDCBufferUnpin()

   Implementation of this callback is optional.

@Input          hBuffer                 Buffer to unmap
*/
/*****************************************************************************/
typedef void (*BufferUnmap)(IMG_HANDLE hBuffer);


/*************************************************************************/ /*!
@Function       BufferSystemAcquire

@Description    DEPRICATED, please use BufferAlloc
                Acquire the system buffer from the display driver.
                If the OS should trigger a mode change then it's not allowed to
                free the previous buffer until Services has released it
                via BufferSystemRelease. The system buffer has to be associated
                to a PhysHeapID which can be one of the existing physical heaps
                if the system buffer is compatible with it or must be a separate
                heap created for this use.

   Called by client function: #PVRSRVDCSystemBufferAcquire()

   Implementation of this callback is optional.

@Input          hDeviceData             Device private data

@Output         puiLog2PageSize         The physical pagesize in log2(bytes)
                                        of one page that the buffer is composed of

@Output         pui32PageCount          The number of pages the buffer contains

@Output         pui32PhysHeapID         The ID of the Services PhysHeap that has
                                        been setup in the system layer

@Output         pui32ByteStride         Byte stride of the buffer

@Output         phSystemBuffer          Handle to the buffer object

@Return         PVRSRV_OK if the query was successful
*/
/*****************************************************************************/
typedef PVRSRV_ERROR (*BufferSystemAcquire)(IMG_HANDLE hDeviceData,
                                            IMG_DEVMEM_LOG2ALIGN_T *puiLog2PageSize,
                                            IMG_UINT32 *pui32PageCount,
                                            IMG_UINT32 *pui32PhysHeapID,
                                            IMG_UINT32 *pui32ByteStride,
                                            IMG_HANDLE *phSystemBuffer);

/*************************************************************************/ /*!
@Function       BufferSystemRelease

@Description    DEPRICATED, please use BufferFree
                Release a display buffer acquired with BufferSystemAcquire.
                Services calls this after it has no use for the buffer anymore.
                The buffer must not be destroyed before Services releases it
                with this call.

   Called by client function: #PVRSRVDCSystemBufferRelease()

   Implementation of this callback is optional.

@Input          hSystemBuffer          Handle to the buffer object
*/
/*****************************************************************************/
typedef	void (*BufferSystemRelease)(IMG_HANDLE hSystemBuffer);

#if defined(INTEGRITY_OS)
typedef PVRSRV_ERROR (*AcquireKernelMappingData)(IMG_HANDLE hBuffer, IMG_HANDLE *phMapping, void **ppPhysAddr);
typedef PVRSRV_ERROR (*MapMemoryObject)(IMG_HANDLE hBuffer, IMG_HANDLE *phMemObj, void **ppvClientAddr);
typedef PVRSRV_ERROR (*UnmapMemoryObject)(IMG_HANDLE hBuffer);

#if defined(USING_HYPERVISOR)
typedef IMG_HANDLE (*GetPmr)(IMG_HANDLE hBuffer, size_t ulOffset);
#endif
#endif

/*!
 * Function table for functions to be implemented by the display controller
 * that will be called from within Services.
 * The table will be provided to Services with the call to DCRegisterDevice.
 */
typedef struct _DC_DEVICE_FUNCTIONS_
{
	/* Mandatory query functions */
	GetInfo						pfnGetInfo;
	PanelQueryCount				pfnPanelQueryCount;
	PanelQuery					pfnPanelQuery;
	FormatQuery					pfnFormatQuery;
	DimQuery					pfnDimQuery;

	/* Optional blank/vsync functions */
	SetBlank					pfnSetBlank;
	SetVSyncReporting			pfnSetVSyncReporting;
	LastVSyncQuery				pfnLastVSyncQuery;

	/* Mandatory configure functions */
	ContextCreate				pfnContextCreate;
	ContextDestroy				pfnContextDestroy;
	ContextConfigure			pfnContextConfigure;

	/* Optional context functions */
	ContextConfigureCheck		pfnContextConfigureCheck;

	/* Mandatory buffer functions */
	BufferAlloc					pfnBufferAlloc;
	BufferAcquire				pfnBufferAcquire;
	BufferRelease				pfnBufferRelease;
	BufferFree					pfnBufferFree;

	/* Optional - Provide this function if your controller can
	 * scan out arbitrary memory, allocated for another purpose
	 * by Services. */
	BufferImport				pfnBufferImport;

	/* Optional - Provide these functions if your controller
	 * has an MMU and does not (or cannot) map/unmap buffers at
	 * alloc/free time */
	BufferMap					pfnBufferMap;
	BufferUnmap					pfnBufferUnmap;

	/* Optional - DEPRICATED */
	BufferSystemAcquire			pfnBufferSystemAcquire;
	BufferSystemRelease			pfnBufferSystemRelease;

#if defined(INTEGRITY_OS)
	/* The addition of these functions allow dc_server to delegate calls to
	 * the respective functions on its PMRs towards the DC module
	 */
	AcquireKernelMappingData	pfnAcquireKernelMappingData;
	MapMemoryObject             pfnMapMemoryObject;
	UnmapMemoryObject           pfnUnmapMemoryObject;

#if defined(USING_HYPERVISOR)
	GetPmr				pfnGetPmr;
#endif
#endif
} DC_DEVICE_FUNCTIONS;


/*
 * Functions exported by kernel Services for use by 3rd party kernel display
 * controller device driver
*/

/*************************************************************************/ /*!
@Function       DCRegisterDevice

@Description    This needs to be called by the display driver before any further
                communication with Services.
                It registers a display controller device with Services. After this
                registration Services is able to use the display controller
                and will make use of the callbacks. Services will provide the
                hDeviceData in the callbacks whenever necessary.

@Input          psFuncTable             Callback function table

@Input          ui32MaxConfigsInFlight  The maximum number of configs that this
                                        display device can have in-flight. This
                                        determines the number of possible calls
                                        to ContextConfigure before Services has to
                                        wait for DCDisplayConfigurationRetired
                                        calls.

@Input          hDeviceData             Device private data passed into callbacks

@Output         phSrvHandle             Services handle to pass back into
                                        UnregisterDCDevice

@Return         PVRSRV_OK if the display controller driver was successfully registered
*/
/*****************************************************************************/
PVRSRV_ERROR DCRegisterDevice(DC_DEVICE_FUNCTIONS *psFuncTable,
                              IMG_UINT32 ui32MaxConfigsInFlight,
                              IMG_HANDLE hDeviceData,
                              IMG_HANDLE *phSrvHandle);

/*************************************************************************/ /*!
@Function       DCUnregisterDevice

@Description    Unregister a display controller device. Undo everything done with
                DCRegisterDevice. Services will stop using this device.

@Input          hSrvHandle              Services device handle
*/
/*****************************************************************************/
void DCUnregisterDevice(IMG_HANDLE hSrvHandle);

/*************************************************************************/ /*!
@Function       DCDisplayConfigurationRetired

@Description    Called when a configuration as been retired due to a new
                configuration now being active. See #PVRSRVDCContextConfigure().

@Input          hConfigData             ConfigData that is being retired
*/
/*****************************************************************************/
void DCDisplayConfigurationRetired(IMG_HANDLE hConfigData);

/*************************************************************************/ /*!
@Function       DCDisplayHasPendingCommand

@Description    Called to check if there are still pending commands in
                the Software Command Processor queue.

@Input          hConfigData             ConfigData to check for pending
                                        commands

@Return         IMG_TRUE if there is at least one pending command
*/
/*****************************************************************************/
IMG_BOOL DCDisplayHasPendingCommand(IMG_HANDLE hConfigData);

/*************************************************************************/ /*!
@Function       DCImportBufferAcquire

@Description    Acquire information about a buffer that was imported with
                BufferImport. DCImportBufferRelease has to be called after
                the buffer will not be used anymore.

@Input          hImport                 Import buffer

@Input          uiLog2PageSize          Pagesize in log2(bytes) of the buffer

@Output         pui32PageCount          Size of the buffer in pages

@Output         pasDevPAddr             Array of device physical page address
                                        of this buffer

@Return         PVRSRV_OK if the import buffer was successfully acquired
*/
/*****************************************************************************/
PVRSRV_ERROR DCImportBufferAcquire(IMG_HANDLE hImport,
                                   IMG_DEVMEM_LOG2ALIGN_T uiLog2PageSize,
                                   IMG_UINT32 *pui32PageCount,
                                   IMG_DEV_PHYADDR **pasDevPAddr);

/*************************************************************************/ /*!
@Function       DCImportBufferRelease

@Description    Release an imported buffer.

@Input          hImport                 Import handle we are releasing

@Input          pasDevPAddr             Import data which was returned from
                                        DCImportBufferAcquire
*/
/*****************************************************************************/
void DCImportBufferRelease(IMG_HANDLE hImport,
                           IMG_DEV_PHYADDR *pasDevPAddr);



#if defined (__cplusplus)
}
#endif

#endif/* #if !defined (__KERNELDISPLAY_H__) */

/******************************************************************************
 End of file (kerneldisplay.h)
******************************************************************************/
