blob: b118855b7fb2b619be73c58628aec40f999b8358 [file] [log] [blame]
/*************************************************************************/ /*!
@File
@Title Device Memory Management core
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
@Description Client side part of device memory management -- This
file defines the exposed Services API to core memory management
functions.
@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_DEVMEM_H
#define PVRSRV_DEVMEM_H
#if defined __cplusplus
extern "C" {
#endif
#include "img_types.h"
#include "devicemem_typedefs.h"
#include "pdumpdefs.h"
#include "pvrsrv_error.h"
#include "pvrsrv_memallocflags.h"
#include <powervr/sync_external.h>
#include "services_km.h" /* for PVRSRV_DEV_CONNECTION */
/*
Device memory contexts, heaps and memory descriptors are passed
through to underlying memory APIs directly, but are to be regarded
as an opaque handle externally.
*/
typedef struct _PVRSRV_DEVMEMCTX_ *PVRSRV_DEVMEMCTX; /*!< Device-Mem Client-Side Interface: Typedef for Context Ptr */
typedef DEVMEM_HEAP *PVRSRV_HEAP; /*!< Device-Mem Client-Side Interface: Typedef for Heap Ptr */
typedef DEVMEM_MEMDESC *PVRSRV_MEMDESC; /*!< Device-Mem Client-Side Interface: Typedef for Memory Descriptor Ptr */
typedef DEVMEM_EXPORTCOOKIE PVRSRV_DEVMEM_EXPORTCOOKIE; /*!< Device-Mem Client-Side Interface: Typedef for Export Cookie */
typedef DEVMEM_FLAGS_T PVRSRV_MEMMAP_FLAGS_T; /*!< Device-Mem Client-Side Interface: Typedef for Memory-Mapping Flags Enum */
typedef IMG_HANDLE PVRSRV_REMOTE_DEVMEMCTX; /*!< Type to use with context export import */
typedef struct _PVRSRV_EXPORT_DEVMEMCTX_ *PVRSRV_EXPORT_DEVMEMCTX;
/* To use with PVRSRVSubAllocDeviceMem() as the default factor if no
* over-allocation is desired. */
#define PVRSRV_DEVMEM_PRE_ALLOC_MULTIPLIER_NONE DEVMEM_NO_PRE_ALLOCATE_MULTIPLIER
/* N.B. Flags are now defined in pvrsrv_memallocflags.h as they need
to be omnipresent. */
/*
*
* API functions
*
*/
/**************************************************************************/ /*!
@Function PVRSRVCreateDeviceMemContext
@Description Creates a device memory context. There is a one-to-one
correspondence between this context data structure and the top
level MMU page table (known as the Page Catalogue, in the case of a
3-tier MMU). It is intended that a process with its own virtual
space on the CPU will also have its own virtual space on the GPU.
Thus there is loosely a one-to-one correspondence between process
and device memory context, but this is not enforced at this API.
Every process must create the device memory context before any
memory allocations are made, and is responsible for freeing all
such allocations before destroying the context
This is a wrapper function above the "bare-metal" device memory
context creation function which would create just a context and no
heaps. This function will also create the heaps, according to the
heap config that the device specific initialization code has
nominated for use by this API.
The number of heaps thus created is returned to the caller, such
that the caller can allocate an array and the call in to fetch
details of each heap, or look up the heap with the "Find Heap" API
described below.
In order to derive the details of the MMU configuration for the
device, and for retrieving the "bridge handle" for communication
internally in services, it is necessary to pass in a
PVRSRV_DEV_CONNECTION.
@Input psDev dev data
@Output phCtxOut On success, the returned DevMem Context. The
caller is responsible for providing storage
for this.
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVCreateDeviceMemContext(PVRSRV_DEV_CONNECTION *psDevConnection,
PVRSRV_DEVMEMCTX *phCtxOut);
/**************************************************************************/ /*!
@Function PVRSRVDestroyDeviceMemContext
@Description Destroy cannot fail. Well. It shouldn't, assuming the caller
has obeyed the protocol, i.e. has freed all his allocations
beforehand.
@Input hCtx Handle to a DevMem Context
@Return None
*/ /***************************************************************************/
extern IMG_IMPORT void
PVRSRVDestroyDeviceMemContext(PVRSRV_DEVMEMCTX hCtx);
/**************************************************************************/ /*!
@Function PVRSRVFindHeapByName
@Description Returns the heap handle for the named heap which is assumed to
exist in this context. PVRSRV_HEAP *phHeapOut,
N.B. No need for acquire/release semantics here, as when using
this wrapper layer, the heaps are automatically instantiated at
context creation time and destroyed when the context is
destroyed.
The caller is required to know the heap names already as these
will vary from device to device and from purpose to purpose.
@Input hCtx Handle to a DevMem Context
@Input pszHeapName Name of the heap to look for
@Output phHeapOut a handle to the heap, for use in future calls
to OpenAllocation / AllocDeviceMemory / Map
DeviceClassMemory, etc. (The PVRSRV_HEAP type
to be regarded by caller as an opaque, but
strongly typed, handle)
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVFindHeapByName(PVRSRV_DEVMEMCTX hCtx,
const IMG_CHAR *pszHeapName,
PVRSRV_HEAP *phHeapOut);
/**************************************************************************/ /*!
@Function PVRSRVDevmemGetHeapBaseDevVAddr
@Description returns the device virtual address of the base of the heap.
@Input hHeap Handle to a Heap
@Output pDevVAddr On success, the device virtual address of the
base of the heap.
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
IMG_IMPORT PVRSRV_ERROR
PVRSRVDevmemGetHeapBaseDevVAddr(PVRSRV_HEAP hHeap,
IMG_DEV_VIRTADDR *pDevVAddr);
/**************************************************************************/ /*!
@Function PVRSRVSubAllocDeviceMem
@Description Allocate memory from the specified heap, acquiring physical
memory from OS as we go and mapping this into
the GPU (mandatorily) and CPU (optionally)
Size must be a positive integer multiple of alignment, or, to
put it another way, the uiLog2Align LSBs should all be zero, but
at least one other bit should not be.
Caller to take charge of the PVRSRV_MEMDESC (the memory
descriptor) which is to be regarded as an opaque handle.
If the allocation is supposed to be used with PVRSRVDevmemUnpin()
the size must be a page multiple.
This is a general rule when suballocations are to
be avoided.
@Input uiPreAllocMultiplier Size factor for internal pre-allocation of
memory to make subsequent calls with the
same flags faster. Independently if a value
is set, the function will try to allocate
from any pre-allocated memory first and -if
successful- not pre-allocate anything more.
That means the factor can always be set and
the correct thing will be done internally.
@Input hHeap Handle to the heap from which memory will be
allocated
@Input uiSize Amount of memory to be allocated.
@Input uiLog2Align LOG2 of the required alignment
@Input uiMemAllocFlags Allocation Flags
@Input pszText Text to describe the allocation
@Output phMemDescOut On success, the resulting memory descriptor
@Return PVRSRV_OK on success. Otherwise, a PVRSRV_ error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVSubAllocDeviceMem(IMG_UINT8 uiPreAllocMultiplier,
PVRSRV_HEAP hHeap,
IMG_DEVMEM_SIZE_T uiSize,
IMG_DEVMEM_LOG2ALIGN_T uiLog2Align,
PVRSRV_MEMALLOCFLAGS_T uiMemAllocFlags,
const IMG_CHAR *pszText,
PVRSRV_MEMDESC *phMemDescOut);
#define PVRSRVAllocDeviceMem(...) \
PVRSRVSubAllocDeviceMem(PVRSRV_DEVMEM_PRE_ALLOC_MULTIPLIER_NONE, __VA_ARGS__)
/**************************************************************************/ /*!
@Function PVRSRVFreeDeviceMem
@Description Free that allocated by PVRSRVSubAllocDeviceMem (Memory descriptor
will be destroyed)
@Input hMemDesc Handle to the descriptor of the memory to be
freed
@Return None
*/ /***************************************************************************/
extern IMG_IMPORT void
PVRSRVFreeDeviceMem(PVRSRV_MEMDESC hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVAcquireCPUMapping
@Description Causes the allocation referenced by this memory descriptor to be
mapped into cpu virtual memory, if it wasn't already, and the
CPU virtual address returned in the caller-provided location.
The caller must call PVRSRVReleaseCPUMapping to advise when he
has finished with the mapping.
Does not accept unpinned allocations.
Returns PVRSRV_ERROR_INVALID_MAP_REQUEST if an unpinned
MemDesc is passed in.
@Input hMemDesc Handle to the memory descriptor for which a
CPU mapping is required
@Output ppvCpuVirtAddrOut On success, the caller's ptr is set to the
new CPU mapping
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVAcquireCPUMapping(PVRSRV_MEMDESC hMemDesc,
void **ppvCpuVirtAddrOut);
/**************************************************************************/ /*!
@Function PVRSRVReleaseCPUMapping
@Description Relinquishes the cpu mapping acquired with
PVRSRVAcquireCPUMapping()
@Input hMemDesc Handle of the memory descriptor
@Return None
*/ /***************************************************************************/
extern IMG_IMPORT void
PVRSRVReleaseCPUMapping(PVRSRV_MEMDESC hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVMapToDevice
@Description Map allocation into the device MMU. This function must only be
called once, any further calls will return
PVRSRV_ERROR_DEVICEMEM_ALREADY_MAPPED
The caller must call PVRSRVReleaseDeviceMapping when they
are finished with the mapping.
Does not accept unpinned allocations.
Returns PVRSRV_ERROR_INVALID_MAP_REQUEST if an unpinned
MemDesc is passed in.
@Input hMemDesc Handle of the memory descriptor
@Input hHeap Device heap to map the allocation into
@Output psDevVirtAddrOut Device virtual address
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVMapToDevice(PVRSRV_MEMDESC hMemDesc,
PVRSRV_HEAP hHeap,
IMG_DEV_VIRTADDR *psDevVirtAddrOut);
/**************************************************************************/ /*!
@Function PVRSRVMapToDeviceAddress
@Description Same as PVRSRVMapToDevice but caller chooses the address to
map into.
The caller is able to overwrite existing mappings so never use
this function on a heap where PVRSRVMapToDevice() has been
used before or will be used in the future.
In general the caller has to know which regions of the heap have
been mapped already and should avoid overlapping mappings.
@Input hMemDesc Handle of the memory descriptor
@Input hHeap Device heap to map the allocation into
@Output sDevVirtAddr Device virtual address to map to
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVMapToDeviceAddress(DEVMEM_MEMDESC *psMemDesc,
DEVMEM_HEAP *psHeap,
IMG_DEV_VIRTADDR sDevVirtAddr);
/**************************************************************************/ /*!
@Function PVRSRVAcquireDeviceMapping
@Description Acquire a reference on the device mapping the allocation.
If the allocation wasn't mapped into the device then
and the device virtual address returned in the
PVRSRV_ERROR_DEVICEMEM_NO_MAPPING will be returned as
PVRSRVMapToDevice must be called first.
The caller must call PVRSRVReleaseDeviceMapping when they
are finished with the mapping.
Does not accept unpinned allocations.
Returns PVRSRV_ERROR_INVALID_MAP_REQUEST if an unpinned
MemDesc is passed in.
@Input hMemDesc Handle to the memory descriptor for which a
device mapping is required
@Output psDevVirtAddrOut On success, the caller's ptr is set to the
new device mapping
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern IMG_IMPORT PVRSRV_ERROR
PVRSRVAcquireDeviceMapping(PVRSRV_MEMDESC hMemDesc,
IMG_DEV_VIRTADDR *psDevVirtAddrOut);
/**************************************************************************/ /*!
@Function PVRSRVReleaseDeviceMapping
@Description Relinquishes the device mapping acquired with
PVRSRVAcquireDeviceMapping or PVRSRVMapToDevice
@Input hMemDesc Handle of the memory descriptor
@Return None
*/ /***************************************************************************/
extern IMG_IMPORT void
PVRSRVReleaseDeviceMapping(PVRSRV_MEMDESC hMemDesc);
/*************************************************************************/ /*!
@Function PVRSRVDevmemLocalImport
@Description Import a PMR that was created with this connection.
The general usage of this function is as follows:
1) Create a devmem allocation on server side.
2) Pass back the PMR of that allocation to client side by
creating a handle of type PMR_LOCAL_EXPORT_HANDLE.
3) Pass the PMR_LOCAL_EXPORT_HANDLE to
PVRSRVMakeLocalImportHandle()to create a new handle type
(DEVMEM_MEM_IMPORT) that can be used with this function.
@Input hExtHandle External memory handle
@Input uiFlags Import flags
@Output phMemDescPtr Created MemDesc
@Output puiSizePtr Size of the created MemDesc
@Input pszAnnotation Annotation string for this allocation/import
@Return PVRSRV_OK is successful
*/
/*****************************************************************************/
PVRSRV_ERROR PVRSRVDevmemLocalImport(const PVRSRV_DEV_CONNECTION *psDevConnection,
IMG_HANDLE hExtHandle,
PVRSRV_MEMMAP_FLAGS_T uiFlags,
PVRSRV_MEMDESC *phMemDescPtr,
IMG_DEVMEM_SIZE_T *puiSizePtr,
const IMG_CHAR *pszAnnotation);
/*************************************************************************/ /*!
@Function PVRSRVDevmemGetImportUID
@Description Get the UID of the import that backs this MemDesc
@Input hMemDesc MemDesc
@Return UID of import
*/
/*****************************************************************************/
PVRSRV_ERROR PVRSRVDevmemGetImportUID(PVRSRV_MEMDESC hMemDesc,
IMG_UINT64 *pui64UID);
/**************************************************************************/ /*!
@Function PVRSRVAllocExportableDevMem
@Description Allocate memory without mapping into device memory context. This
memory is exported and ready to be mapped into the device memory
context of other processes, or to CPU only with
PVRSRVMapMemoryToCPUOnly(). The caller agrees to later call
PVRSRVFreeUnmappedExportedMemory(). The caller must give the page
size of the heap into which this memory may be subsequently
mapped, or the largest of such page sizes if it may be mapped
into multiple places. This information is to be communicated in
the Log2Align field.
Size must be a positive integer multiple of the page size
@Input uiLog2Align Log2 of the alignment required
@Input uiLog2HeapPageSize The page size to allocate. Must be a
multiple of the heap that this is going
to be mapped into.
@Input uiSize the amount of memory to be allocated
@Input uiFlags Allocation flags
@Input pszText Text to describe the allocation
@Output hMemDesc
@Return PVRSRV_OK on success. Otherwise, a PVRSRV_ error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVAllocExportableDevMem(const PVRSRV_DEV_CONNECTION *psDevConnection,
IMG_DEVMEM_SIZE_T uiSize,
IMG_DEVMEM_LOG2ALIGN_T uiLog2Align,
IMG_UINT32 uiLog2HeapPageSize,
PVRSRV_MEMALLOCFLAGS_T uiFlags,
const IMG_CHAR *pszText,
PVRSRV_MEMDESC *hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVChangeSparseDevMem
@Description This function alters the underlying memory layout of the given
allocation by allocating/removing pages as requested
This function also re-writes the GPU & CPU Maps accordingly
The specific actions can be controlled by corresponding flags
@Input psMemDesc The memory layout that needs to be modified
@Input ui32AllocPageCount New page allocation count
@Input pai32AllocIndices New page allocation indices (page granularity)
@Input ui32FreePageCount Number of pages that need to be freed
@Input pai32FreeIndices Indices of the pages that need to be freed
@Input uiFlags Flags that control the behaviour of the call
@Return PVRSRV_OK on success. Otherwise, a PVRSRV_ error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVChangeSparseDevMem(PVRSRV_MEMDESC psMemDesc,
IMG_UINT32 ui32AllocPageCount,
IMG_UINT32 *pai32AllocIndices,
IMG_UINT32 ui32FreePageCount,
IMG_UINT32 *pai32FreeIndices,
SPARSE_MEM_RESIZE_FLAGS uiFlags);
/**************************************************************************/ /*!
@Function PVRSRVAllocSparseDevMem2
@Description Allocate sparse memory without mapping into device memory context.
Sparse memory is used where you have an allocation that has a
logical size (i.e. the amount of VM space it will need when
mapping it into a device) that is larger than the amount of
physical memory that allocation will use. An example of this
is a NPOT texture where the twiddling algorithm requires you
to round the width and height to next POT and so you know there
will be pages that are never accessed.
This memory is can to be exported and mapped into the device
memory context of other processes, or to CPU.
Size must be a positive integer multiple of the page size
@Input psDevConnection Device to allocation the memory for
@Input uiSize The logical size of allocation
@Input uiChunkSize The size of the chunk
@Input ui32NumPhysChunks The number of physical chunks required
@Input ui32NumVirtChunks The number of virtual chunks required
@Input pui32MappingTable index based Mapping table
@Input uiLog2Align Log2 of the required alignment
@Input uiLog2HeapPageSize Log2 of the heap we map this into
@Input uiFlags Allocation flags
@Input pszText Text to describe the allocation
@Output hMemDesc
@Return PVRSRV_OK on success. Otherwise, a PVRSRV_ error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVAllocSparseDevMem2(const PVRSRV_DEVMEMCTX psDevMemCtx,
IMG_DEVMEM_SIZE_T uiSize,
IMG_DEVMEM_SIZE_T uiChunkSize,
IMG_UINT32 ui32NumPhysChunks,
IMG_UINT32 ui32NumVirtChunks,
IMG_UINT32 *pui32MappingTable,
IMG_DEVMEM_LOG2ALIGN_T uiLog2Align,
IMG_UINT32 uiLog2HeapPageSize,
PVRSRV_MEMMAP_FLAGS_T uiFlags,
const IMG_CHAR *pszText,
PVRSRV_MEMDESC *hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVAllocSparseDevMem (DEPRECATED and will be removed in future)
@Description Allocate sparse memory without mapping into device memory context.
Sparse memory is used where you have an allocation that has a
logical size (i.e. the amount of VM space it will need when
mapping it into a device) that is larger than the amount of
physical memory that allocation will use. An example of this
is a NPOT texture where the twiddling algorithm requires you
to round the width and height to next POT and so you know there
will be pages that are never accessed.
This memory is can to be exported and mapped into the device
memory context of other processes, or to CPU.
Size must be a positive integer multiple of the page size
This function is deprecated and should not be used in any new code
It will be removed in the subsequent changes.
@Input psDevConnection Device to allocation the memory for
@Input uiSize The logical size of allocation
@Input uiChunkSize The size of the chunk
@Input ui32NumPhysChunks The number of physical chunks required
@Input ui32NumVirtChunks The number of virtual chunks required
@Input pabMappingTable boolean based Mapping table
@Input uiLog2Align Log2 of the required alignment
@Input uiLog2HeapPageSize Log2 of the heap we map this into
@Input uiFlags Allocation flags
@Input pszText Text to describe the allocation
@Output hMemDesc
@Return PVRSRV_OK on success. Otherwise, a PVRSRV_ error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVAllocSparseDevMem(const PVRSRV_DEVMEMCTX psDevMemCtx,
IMG_DEVMEM_SIZE_T uiSize,
IMG_DEVMEM_SIZE_T uiChunkSize,
IMG_UINT32 ui32NumPhysChunks,
IMG_UINT32 ui32NumVirtChunks,
IMG_BOOL *pabMappingTable,
IMG_DEVMEM_LOG2ALIGN_T uiLog2Align,
IMG_UINT32 uiLog2HeapPageSize,
DEVMEM_FLAGS_T uiFlags,
const IMG_CHAR *pszText,
PVRSRV_MEMDESC *hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVGetOSLog2PageSize
@Description Just call AFTER setting up the connection to the kernel module
otherwise it will run into an assert.
Gives the log2 of the page size that is utilised by the OS.
@Return The page size
*/ /***************************************************************************/
IMG_UINT32 PVRSRVGetOSLog2PageSize(void);
/**************************************************************************/ /*!
@Function PVRSRVGetHeapLog2PageSize
@Description Queries the page size of a passed heap.
@Input hHeap Heap that is queried
@Output puiLog2PageSize Log2 page size will be returned in this
@Return PVRSRV_OK on success. Otherwise, a PVRSRV error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVGetHeapLog2PageSize(PVRSRV_HEAP hHeap, IMG_UINT32* puiLog2PageSize);
/**************************************************************************/ /*!
@Function PVRSRVGetHeapTilingProperties
@Description Queries the import alignment and tiling stride conversion
factor of a passed heap.
@Input hHeap Heap that is queried
@Output puiLog2ImportAlignment Log2 import alignment will be
returned in this
@Output puiLog2TilingStrideFactor Log2 alignment to tiling stride
conversion factor will be returned
in this
@Return PVRSRV_OK on success. Otherwise, a PVRSRV error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVGetHeapTilingProperties(PVRSRV_HEAP hHeap,
IMG_UINT32* puiLog2ImportAlignment,
IMG_UINT32* puiLog2TilingStrideFactor);
/**************************************************************************/ /*!
@Function PVRSRVMakeLocalImportHandle
@Description This is a "special case" function for making a local import
handle. The server handle is a handle to a PMR of bridge type
PMR_LOCAL_EXPORT_HANDLE. The returned local import handle will
be of the bridge type DEVMEM_MEM_IMPORT that can be used with
PVRSRVDevmemLocalImport().
@Input psConnection Services connection
@Input hServerHandle Server export handle
@Output hLocalImportHandle Returned client import handle
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVMakeLocalImportHandle(const PVRSRV_DEV_CONNECTION *psConnection,
IMG_HANDLE hServerHandle,
IMG_HANDLE *hLocalImportHandle);
/**************************************************************************/ /*!
@Function PVRSRVUnmakeLocalImportHandle
@Description Destroy the hLocalImportHandle created with
PVRSRVMakeLocalImportHandle().
@Input psConnection Services connection
@Output hLocalImportHandle Local import handle
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
PVRSRV_ERROR
PVRSRVUnmakeLocalImportHandle(const PVRSRV_DEV_CONNECTION *psConnection,
IMG_HANDLE hLocalImportHandle);
#if defined(SUPPORT_INSECURE_EXPORT)
/**************************************************************************/ /*!
@Function PVRSRVExport
@Description Given a memory allocation allocated with Devmem_Allocate(),
create a "cookie" that can be passed intact by the caller's own
choice of secure IPC to another process and used as the argument
to "map" to map this memory into a heap in the target processes.
N.B. This can also be used to map into multiple heaps in one
process, though that's not the intention.
Note, the caller must later call Unexport before freeing the
memory.
@Input hMemDesc handle to the descriptor of the memory to be
exported
@Output phExportCookie On success, a handle to the exported cookie
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
PVRSRV_ERROR PVRSRVExportDevMem(PVRSRV_MEMDESC hMemDesc,
PVRSRV_DEVMEM_EXPORTCOOKIE *phExportCookie);
/**************************************************************************/ /*!
@Function PVRSRVUnexport
@Description Undo the export caused by "PVRSRVExport" - note - it doesn't
actually tear down any mapping made by processes that received
the export cookie. It will simply make the cookie null and void
and prevent further mappings.
@Input hMemDesc handle to the descriptor of the memory which
will no longer be exported
@Output phExportCookie On success, the export cookie provided will be
set to null
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
PVRSRV_ERROR PVRSRVUnexportDevMem(PVRSRV_MEMDESC hMemDesc,
PVRSRV_DEVMEM_EXPORTCOOKIE *phExportCookie);
/**************************************************************************/ /*!
@Function PVRSRVImportDevMem
@Description Import memory that was previously exported with PVRSRVExport()
into the current process.
Note: This call only makes the memory accessible to this
process, it doesn't map it into the device or CPU.
@Input psConnection Connection to services
@Input phExportCookie Ptr to the handle of the export-cookie
identifying
@Output phMemDescOut On Success, a handle to a new memory descriptor
representing the memory as mapped into the
local process address space.
@Input uiFlags Device memory mapping flags
@Input pszText Text to describe the import
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
PVRSRV_ERROR PVRSRVImportDevMem(const PVRSRV_DEV_CONNECTION *psConnection,
PVRSRV_DEVMEM_EXPORTCOOKIE *phExportCookie,
PVRSRV_MEMMAP_FLAGS_T uiFlags,
PVRSRV_MEMDESC *phMemDescOut);
#endif /* SUPPORT_INSECURE_EXPORT */
/**************************************************************************/ /*!
@Function PVRSRVIsDeviceMemAddrValid
@Description Checks if given device virtual memory address is valid
from the GPU's point of view.
This method is intended to be called by a process that imported
another process' memory context, hence the expected
PVRSRV_REMOTE_DEVMEMCTX parameter.
See PVRSRVAcquireRemoteDevMemContext for details about
importing memory contexts.
@Input hContext handle to memory context
@Input sDevVAddr device 40bit virtual memory address
@Return PVRSRV_OK if address is valid or
PVRSRV_ERROR_INVALID_GPU_ADDR when address is invalid
*/ /***************************************************************************/
PVRSRV_ERROR PVRSRVIsDeviceMemAddrValid(PVRSRV_REMOTE_DEVMEMCTX hContext,
IMG_DEV_VIRTADDR sDevVAddr);
/**************************************************************************/ /*!
@Function PVRSRVDevmemPin
@Description This is the counterpart to PVRSRVDevmemUnpin. It is meant to be
called after unpinning an allocation.
It will make an unpinned allocation available again and
unregister it from the OS shrinker. In the case the shrinker
was invoked by the OS while the allocation was unpinned it will
allocate new physical pages.
If any GPU mapping existed before, the same virtual address
range will be valid again.
@Input hMemDesc The MemDesc that is going to be pinned.
@Return PVRSRV_ERROR: PVRSRV_OK on success and the pre-unpin content
is still present and can be reused.
PVRSRV_ERROR_PMR_NEW_MEMORY if the memory has
been pinned successfully but the pre-unpin
content was lost.
PVRSRV_ERROR_INVALID_PARAMS if the MemDesc is
invalid e.g. NULL.
PVRSRV_ERROR_PMR_FAILED_TO_ALLOC_PAGES if the
memory of the allocation is lost and we failed
to allocate new one.
*/ /***************************************************************************/
extern PVRSRV_ERROR
PVRSRVDevmemPin(PVRSRV_MEMDESC hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVDevmemUnpin
@Description Unpins an allocation. Unpinning means that the
memory must not be accessed anymore by neither CPU nor GPU.
The physical memory pages will be registered with a shrinker
and the OS is able to reclaim them in OOM situations when the
shrinker is invoked.
The counterpart to this is PVRSRVDevmemPin() which
checks if the physical pages were reclaimed by the OS and then
either allocates new physical pages or just unregisters the
allocation from the shrinker. The device virtual address range
(if any existed) will be kept.
The GPU mapping will be kept but is going be invalidated.
It is allowed to free an unpinned allocation or remove the GPU
mapping.
RESTRICTIONS:
- Unpinning should only be done if the caller is sure that
the GPU finished all pending/running operations on the allocation.
- The caller must ensure that no other process than the calling
one itself has imported or mapped the allocation, otherwise the
unpinning will fail.
- All CPU mappings have to be removed beforehand by the caller.
- Any attempts to map the allocation while it is unpinned are
forbidden.
- When using PVRSRVAllocDeviceMem() the caller must allocate
whole pages from the chosen heap to avoid suballocations.
@Input hMemDesc The MemDesc that is going to be unpinned.
@Return PVRSRV_ERROR: PVRSRV_OK on success.
PVRSRV_ERROR_INVALID_PARAMS if the passed
allocation is not a multiple of the heap page
size but was allocated with
PVRSRVAllocDeviceMem(), or if its NULL.
PVRSRV_ERROR_PMR_STILL_REFERENCED if the passed
allocation is still referenced i.e. is still
exported or mapped somewhere else.
PVRSRV_ERROR_STILL_MAPPED will be thrown if the
calling process still has CPU mappings set up
or the GPU mapping was acquired more than once.
*/ /***************************************************************************/
extern PVRSRV_ERROR
PVRSRVDevmemUnpin(PVRSRV_MEMDESC hMemDesc);
/**************************************************************************/ /*!
@Function PVRSRVDevmemGetSize
@Description Returns the allocated size for this device-memory.
@Input hMemDesc handle to memory allocation
@Output puiSize return value for size
@Return PVRSRV_OK on success or
PVRSRV_ERROR_INVALID_PARAMS
*/ /***************************************************************************/
extern PVRSRV_ERROR
PVRSRVDevmemGetSize(PVRSRV_MEMDESC hMemDesc, IMG_DEVMEM_SIZE_T* puiSize);
/**************************************************************************/ /*!
@Function PVRSRVExportDevMemContext
@Description Makes the given memory context available to other processes that
can get a handle to it via PVRSRVAcquireRemoteDevmemContext.
This handle can be used for e.g. the breakpoint functions.
The context will be only available to other processes that are able
to pass in a memory descriptor that is shared between this and the
importing process. We use the memory descriptor to identify the
correct context and verify that the caller is allowed to request
the context.
The whole mechanism is intended to be used with the debugger that
for example can load USC breakpoint handlers into the shared allocation
and then use the acquired remote context (that is exported here)
to set/clear breakpoints in USC code.
@Input hLocalDevmemCtx Context to export
@Input hSharedAllocation A memory descriptor that points to a shared allocation
between the two processes. Must be in the given context.
@Output phExportCtx A handle to the exported context that is needed for
the destruction with PVRSRVUnexportDevMemContext().
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern PVRSRV_ERROR
PVRSRVExportDevMemContext(PVRSRV_DEVMEMCTX hLocalDevmemCtx,
PVRSRV_MEMDESC hSharedAllocation,
PVRSRV_EXPORT_DEVMEMCTX *phExportCtx);
/**************************************************************************/ /*!
@Function PVRSRVUnexportDevMemContext
@Description Removes the context from the list of sharable contexts that
that can be imported via PVRSRVReleaseRemoteDevmemContext.
@Input psExportCtx An export context retrieved from
PVRSRVExportDevmemContext.
*/ /***************************************************************************/
extern void
PVRSRVUnexportDevMemContext(PVRSRV_EXPORT_DEVMEMCTX hExportCtx);
/**************************************************************************/ /*!
@Function PVRSRVAcquireRemoteDevMemContext
@Description Retrieves an exported context that has been made available with
PVRSRVExportDevmemContext in the remote process.
hSharedMemDesc must be a memory descriptor pointing to the same
physical resource as the one passed to PVRSRVExportDevmemContext
in the remote process.
The memory descriptor has to be retrieved from the remote process
via a secure buffer export/import mechanism like DMABuf.
@Input hDevmemCtx Memory context of the calling process.
@Input hSharedAllocation The memory descriptor used to export the context
@Output phRemoteCtx Handle to the remote context.
@Return PVRSRV_ERROR: PVRSRV_OK on success. Otherwise, a PVRSRV_
error code
*/ /***************************************************************************/
extern PVRSRV_ERROR
PVRSRVAcquireRemoteDevMemContext(PVRSRV_DEVMEMCTX hDevmemCtx,
PVRSRV_MEMDESC hSharedAllocation,
PVRSRV_REMOTE_DEVMEMCTX *phRemoteCtx);
/**************************************************************************/ /*!
@Function PVRSRVReleaseRemoteDevMemContext
@Description Releases the remote context and destroys it if this is the last
reference.
@Input hRemoteCtx Handle to the remote context that will be removed.
*/ /***************************************************************************/
extern void
PVRSRVReleaseRemoteDevMemContext(PVRSRV_REMOTE_DEVMEMCTX hRemoteCtx);
/*************************************************************************/ /*!
@Function PVRSRVRegisterDevmemPageFaultNotify
@Description Registers to be notified when a page fault occurs on a
specific device memory context.
@Input psDevmemCtx The context to be notified about.
@Return PVRSRV_ERROR.
*/ /**************************************************************************/
extern PVRSRV_ERROR
PVRSRVRegisterDevmemPageFaultNotify(PVRSRV_DEVMEMCTX psDevmemCtx);
/*************************************************************************/ /*!
@Function PVRSRVUnregisterDevmemPageFaultNotify
@Description Unegisters to be notified when a page fault occurs on a
specific device memory context.
@Input psDevmemCtx The context to be unregistered from.
@Return PVRSRV_ERROR.
*/ /**************************************************************************/
extern PVRSRV_ERROR
PVRSRVUnregisterDevmemPageFaultNotify(PVRSRV_DEVMEMCTX psDevmemCtx);
#if defined __cplusplus
};
#endif
#endif /* PVRSRV_DEVMEM_H */