IMG_EXPORT PVRSRV_ERROR IMG_CALLCONV PVRSRVCreateDeviceMemContextKM(IMG_HANDLE hDevCookie, PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE *phDevMemContext, IMG_UINT32 *pui32ClientHeapCount, PVRSRV_HEAP_INFO *psHeapInfo, IMG_BOOL *pbCreated, IMG_BOOL *pbShared) { PVRSRV_DEVICE_NODE *psDeviceNode; IMG_UINT32 ui32HeapCount, ui32ClientHeapCount=0; DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; IMG_HANDLE hDevMemContext; IMG_HANDLE hDevMemHeap; IMG_DEV_PHYADDR sPDDevPAddr; IMG_UINT32 i; #if !defined(PVR_SECURE_HANDLES) PVR_UNREFERENCED_PARAMETER(pbShared); #endif if (hDevCookie == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR, "PVRSRVCreateDeviceMemContextKM: hDevCookie invalid")); PVR_DBG_BREAK; return PVRSRV_ERROR_INVALID_PARAMS; } psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevCookie; ui32HeapCount = psDeviceNode->sDevMemoryInfo.ui32HeapCount; psDeviceMemoryHeap = psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap; PVR_ASSERT(ui32HeapCount <= PVRSRV_MAX_CLIENT_HEAPS); hDevMemContext = BM_CreateContext(psDeviceNode, &sPDDevPAddr, psPerProc, pbCreated); if (hDevMemContext == IMG_NULL) { PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDeviceMemContextKM: Failed BM_CreateContext")); return PVRSRV_ERROR_OUT_OF_MEMORY; } for(i=0; i<ui32HeapCount; i++) { switch(psDeviceMemoryHeap[i].DevMemHeapType) { case DEVICE_MEMORY_HEAP_SHARED_EXPORTED: { psHeapInfo[ui32ClientHeapCount].ui32HeapID = psDeviceMemoryHeap[i].ui32HeapID; psHeapInfo[ui32ClientHeapCount].hDevMemHeap = psDeviceMemoryHeap[i].hDevMemHeap; psHeapInfo[ui32ClientHeapCount].sDevVAddrBase = psDeviceMemoryHeap[i].sDevVAddrBase; psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize = psDeviceMemoryHeap[i].ui32HeapSize; psHeapInfo[ui32ClientHeapCount].ui32Attribs = psDeviceMemoryHeap[i].ui32Attribs; #if defined(PVR_SECURE_HANDLES) pbShared[ui32ClientHeapCount] = IMG_TRUE; #endif ui32ClientHeapCount++; break; } case DEVICE_MEMORY_HEAP_PERCONTEXT: { hDevMemHeap = BM_CreateHeap(hDevMemContext, &psDeviceMemoryHeap[i]); psHeapInfo[ui32ClientHeapCount].ui32HeapID = psDeviceMemoryHeap[i].ui32HeapID; psHeapInfo[ui32ClientHeapCount].hDevMemHeap = hDevMemHeap; psHeapInfo[ui32ClientHeapCount].sDevVAddrBase = psDeviceMemoryHeap[i].sDevVAddrBase; psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize = psDeviceMemoryHeap[i].ui32HeapSize; psHeapInfo[ui32ClientHeapCount].ui32Attribs = psDeviceMemoryHeap[i].ui32Attribs; #if defined(PVR_SECURE_HANDLES) pbShared[ui32ClientHeapCount] = IMG_FALSE; #endif ui32ClientHeapCount++; break; } } } *pui32ClientHeapCount = ui32ClientHeapCount; *phDevMemContext = hDevMemContext; return PVRSRV_OK; }
enum PVRSRV_ERROR PVRSRVCreateDeviceMemContextKM(void *hDevCookie, struct PVRSRV_PER_PROCESS_DATA *psPerProc, void **phDevMemContext, u32 *pui32ClientHeapCount, struct PVRSRV_HEAP_INFO *psHeapInfo, IMG_BOOL *pbCreated, IMG_BOOL *pbShared) { struct PVRSRV_DEVICE_NODE *psDeviceNode; u32 ui32HeapCount, ui32ClientHeapCount = 0; struct DEVICE_MEMORY_HEAP_INFO *psDeviceMemoryHeap; void *hDevMemContext; void *hDevMemHeap; struct IMG_DEV_PHYADDR sPDDevPAddr; u32 i; if (hDevCookie == NULL) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDeviceMemContextKM: hDevCookie invalid"); PVR_DBG_BREAK; return PVRSRV_ERROR_INVALID_PARAMS; } psDeviceNode = (struct PVRSRV_DEVICE_NODE *)hDevCookie; ui32HeapCount = psDeviceNode->sDevMemoryInfo.ui32HeapCount; psDeviceMemoryHeap = psDeviceNode->sDevMemoryInfo.psDeviceMemoryHeap; PVR_ASSERT(ui32HeapCount <= PVRSRV_MAX_CLIENT_HEAPS); hDevMemContext = BM_CreateContext(psDeviceNode, &sPDDevPAddr, psPerProc, pbCreated); if (hDevMemContext == NULL) { PVR_DPF(PVR_DBG_ERROR, "PVRSRVCreateDeviceMemContextKM: Failed BM_CreateContext"); return PVRSRV_ERROR_OUT_OF_MEMORY; } for (i = 0; i < ui32HeapCount; i++) { switch (psDeviceMemoryHeap[i].DevMemHeapType) { case DEVICE_MEMORY_HEAP_SHARED_EXPORTED: psHeapInfo[ui32ClientHeapCount].ui32HeapID = psDeviceMemoryHeap[i].ui32HeapID; psHeapInfo[ui32ClientHeapCount].hDevMemHeap = psDeviceMemoryHeap[i].hDevMemHeap; psHeapInfo[ui32ClientHeapCount].sDevVAddrBase = psDeviceMemoryHeap[i].sDevVAddrBase; psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize = psDeviceMemoryHeap[i].ui32HeapSize; psHeapInfo[ui32ClientHeapCount].ui32Attribs = psDeviceMemoryHeap[i].ui32Attribs; pbShared[ui32ClientHeapCount] = IMG_TRUE; ui32ClientHeapCount++; break; case DEVICE_MEMORY_HEAP_PERCONTEXT: hDevMemHeap = BM_CreateHeap(hDevMemContext, &psDeviceMemoryHeap[i]); psHeapInfo[ui32ClientHeapCount].ui32HeapID = psDeviceMemoryHeap[i].ui32HeapID; psHeapInfo[ui32ClientHeapCount].hDevMemHeap = hDevMemHeap; psHeapInfo[ui32ClientHeapCount].sDevVAddrBase = psDeviceMemoryHeap[i].sDevVAddrBase; psHeapInfo[ui32ClientHeapCount].ui32HeapByteSize = psDeviceMemoryHeap[i].ui32HeapSize; psHeapInfo[ui32ClientHeapCount].ui32Attribs = psDeviceMemoryHeap[i].ui32Attribs; pbShared[ui32ClientHeapCount] = IMG_FALSE; ui32ClientHeapCount++; break; } } *pui32ClientHeapCount = ui32ClientHeapCount; *phDevMemContext = hDevMemContext; return PVRSRV_OK; }