void *pvPDCpuVAddr;
struct IMG_DEV_PHYADDR sPDDevPAddr;
struct IMG_CPU_PHYADDR sCpuPAddr;
+ struct IMG_SYS_PHYADDR sSysPAddr;
struct MMU_CONTEXT *psMMUContext;
void *hPDOSMemHandle;
struct SYS_DATA *psSysData;
&hPDOSMemHandle) != PVRSRV_OK) {
PVR_DPF(PVR_DBG_ERROR, "MMU_Initialise: "
"ERROR call to OSAllocPages failed");
- return PVRSRV_ERROR_GENERIC;
+ goto err1;
}
if (pvPDCpuVAddr)
sPDDevPAddr =
SysCpuPAddrToDevPAddr(PVRSRV_DEVICE_TYPE_SGX, sCpuPAddr);
} else {
- struct IMG_SYS_PHYADDR sSysPAddr;
-
if (RA_Alloc(psDeviceNode->psLocalDevMemArena,
SGX_MMU_PAGE_SIZE, NULL, 0, SGX_MMU_PAGE_SIZE,
&(sSysPAddr.uiAddr)) != IMG_TRUE) {
PVR_DPF(PVR_DBG_ERROR, "MMU_Initialise: "
"ERROR call to RA_Alloc failed");
- return PVRSRV_ERROR_GENERIC;
+
+ goto err1;
}
sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr);
if (!pvPDCpuVAddr) {
PVR_DPF(PVR_DBG_ERROR, "MMU_Initialise: "
"ERROR failed to map page tables");
- return PVRSRV_ERROR_GENERIC;
+
+ goto err2;
}
}
} else {
PVR_DPF(PVR_DBG_ERROR,
"MMU_Initialise: pvPDCpuVAddr invalid");
- return PVRSRV_ERROR_GENERIC;
+ goto err3;
}
for (i = 0; i < SGX_MMU_PD_SIZE; i++)
return PVRSRV_OK;
+err3:
+ if (psDeviceNode->psLocalDevMemArena)
+ OSUnMapPhysToLin((void __iomem __force *)pvPDCpuVAddr,
+ SGX_MMU_PAGE_SIZE, PVRSRV_HAP_WRITECOMBINE |
+ PVRSRV_HAP_KERNEL_ONLY,
+ hPDOSMemHandle);
+err2:
+ if (!psDeviceNode->psLocalDevMemArena)
+ OSFreePages(PVRSRV_HAP_WRITECOMBINE | PVRSRV_HAP_KERNEL_ONLY,
+ SGX_MMU_PAGE_SIZE, pvPDCpuVAddr, hPDOSMemHandle);
+ else
+ RA_Free(psDeviceNode->psLocalDevMemArena,
+ sSysPAddr.uiAddr, IMG_FALSE);
+err1:
+ OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(struct MMU_CONTEXT),
+ psMMUContext, NULL);
+
+ return PVRSRV_ERROR_GENERIC;
}
void MMU_Finalise(struct MMU_CONTEXT *psMMUContext)