summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c')
-rw-r--r--jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c301
1 files changed, 152 insertions, 149 deletions
diff --git a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c
index 40c969c..4a1a758 100644
--- a/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c
+++ b/jacinto6/sgx_src/eurasia_km/services4/srvkm/bridged/bridged_pvr_bridge.c
@@ -89,10 +89,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
89 89
90 90
91#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) 91#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC)
92#include <linux/fcntl.h>
92#include <linux/file.h> 93#include <linux/file.h>
93#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
94#include <asm/fcntl.h>
95#endif
96#include <linux/version.h> 94#include <linux/version.h>
97#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)) 95#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0))
98#include <linux/sync.h> 96#include <linux/sync.h>
@@ -667,7 +665,9 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID,
667 psAllocDeviceMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags; 665 psAllocDeviceMemOUT->sClientMemInfo.ui32Flags = psMemInfo->ui32Flags;
668 psAllocDeviceMemOUT->sClientMemInfo.uAllocSize = psMemInfo->uAllocSize; 666 psAllocDeviceMemOUT->sClientMemInfo.uAllocSize = psMemInfo->uAllocSize;
669 psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo = psMemInfo->sMemBlk.hOSMemHandle; 667 psAllocDeviceMemOUT->sClientMemInfo.hMappingInfo = psMemInfo->sMemBlk.hOSMemHandle;
670 668#if defined (PVRSRV_DEVMEM_TIME_STATS)
669 psAllocDeviceMemOUT->sClientMemInfo.sDevMemTimingStats.sDevMemMapTimes.ui32TimeToDevMap = psMemInfo->ui32TimeToDevMap;
670#endif
671 PVRSRVAllocHandleNR(psPerProc->psHandleBase, 671 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
672 &psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo, 672 &psAllocDeviceMemOUT->sClientMemInfo.hKernelMemInfo,
673 psMemInfo, 673 psMemInfo,
@@ -722,43 +722,54 @@ PVRSRVAllocDeviceMemBW(IMG_UINT32 ui32BridgeID,
722static IMG_INT 722static IMG_INT
723PVRSRVFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, 723PVRSRVFreeDeviceMemBW(IMG_UINT32 ui32BridgeID,
724 PVRSRV_BRIDGE_IN_FREEDEVICEMEM *psFreeDeviceMemIN, 724 PVRSRV_BRIDGE_IN_FREEDEVICEMEM *psFreeDeviceMemIN,
725 PVRSRV_BRIDGE_RETURN *psRetOUT, 725 PVRSRV_BRIDGE_OUT_FREEDEVICEMEM *psFreeDeviceMemOUT,
726 PVRSRV_PER_PROCESS_DATA *psPerProc) 726 PVRSRV_PER_PROCESS_DATA *psPerProc)
727{ 727{
728 IMG_HANDLE hDevCookieInt; 728 IMG_HANDLE hDevCookieInt;
729 IMG_VOID *pvKernelMemInfo; 729 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
730#if defined (PVRSRV_DEVMEM_TIME_STATS)
731 IMG_UINT32 ui32TimeToDevUnmap;
732#endif
730 733
731 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_FREE_DEVICEMEM); 734 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_FREE_DEVICEMEM);
732 735
733 psRetOUT->eError = 736 psFreeDeviceMemOUT->eError =
734 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt, 737 PVRSRVLookupHandle(psPerProc->psHandleBase, &hDevCookieInt,
735 psFreeDeviceMemIN->hDevCookie, 738 psFreeDeviceMemIN->hDevCookie,
736 PVRSRV_HANDLE_TYPE_DEV_NODE); 739 PVRSRV_HANDLE_TYPE_DEV_NODE);
737 740
738 if(psRetOUT->eError != PVRSRV_OK) 741 if(psFreeDeviceMemOUT->eError != PVRSRV_OK)
739 { 742 {
740 return 0; 743 return 0;
741 } 744 }
742 745
743 psRetOUT->eError = 746 psFreeDeviceMemOUT->eError =
744 PVRSRVLookupHandle(psPerProc->psHandleBase, 747 PVRSRVLookupHandle(psPerProc->psHandleBase,
745 &pvKernelMemInfo, 748 (IMG_PVOID *)&psKernelMemInfo,
746 psFreeDeviceMemIN->psKernelMemInfo, 749 psFreeDeviceMemIN->psKernelMemInfo,
747 PVRSRV_HANDLE_TYPE_MEM_INFO); 750 PVRSRV_HANDLE_TYPE_MEM_INFO);
748 751
749 if(psRetOUT->eError != PVRSRV_OK) 752 if(psFreeDeviceMemOUT->eError != PVRSRV_OK)
750 { 753 {
751 return 0; 754 return 0;
752 } 755 }
753 756
754 psRetOUT->eError = PVRSRVFreeDeviceMemKM(hDevCookieInt, pvKernelMemInfo); 757#if defined (PVRSRV_DEVMEM_TIME_STATS)
758 psKernelMemInfo->pui32TimeToDevUnmap = &ui32TimeToDevUnmap;
759#endif
755 760
756 if(psRetOUT->eError != PVRSRV_OK) 761 psFreeDeviceMemOUT->eError = PVRSRVFreeDeviceMemKM(hDevCookieInt, psKernelMemInfo);
762
763 if(psFreeDeviceMemOUT->eError != PVRSRV_OK)
757 { 764 {
758 return 0; 765 return 0;
759 } 766 }
760 767
761 psRetOUT->eError = 768#if defined (PVRSRV_DEVMEM_TIME_STATS)
769 psFreeDeviceMemOUT->ui32TimeToDevUnmap = ui32TimeToDevUnmap;
770#endif
771
772 psFreeDeviceMemOUT->eError =
762 PVRSRVReleaseHandle(psPerProc->psHandleBase, 773 PVRSRVReleaseHandle(psPerProc->psHandleBase,
763 psFreeDeviceMemIN->psKernelMemInfo, 774 psFreeDeviceMemIN->psKernelMemInfo,
764 PVRSRV_HANDLE_TYPE_MEM_INFO); 775 PVRSRV_HANDLE_TYPE_MEM_INFO);
@@ -1395,301 +1406,306 @@ PVRSRVUnwrapExtMemoryBW(IMG_UINT32 ui32BridgeID,
1395 return 0; 1406 return 0;
1396} 1407}
1397 1408
1398#if defined(SUPPORT_DRM_GEM) 1409#if defined(SUPPORT_ION)
1399static IMG_INT 1410static IMG_INT
1400PVRSRVMapDmabufBW(IMG_UINT32 ui32BridgeID, 1411PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID,
1401 PVRSRV_BRIDGE_IN_MAP_DMABUF *psMapDmabufIN, 1412 PVRSRV_BRIDGE_IN_MAP_ION_HANDLE *psMapIonIN,
1402 PVRSRV_BRIDGE_OUT_MAP_DMABUF *psMapDmabufOUT, 1413 PVRSRV_BRIDGE_OUT_MAP_ION_HANDLE *psMapIonOUT,
1403 PVRSRV_PER_PROCESS_DATA *psPerProc) 1414 PVRSRV_PER_PROCESS_DATA *psPerProc)
1404{ 1415{
1405 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; 1416 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
1406 IMG_UINT64 ui64Stamp; 1417 IMG_UINT64 ui64Stamp;
1407 1418
1408 psMapDmabufOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, 1419 psMapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1409 &psMapDmabufIN->hDevCookie, 1420 &psMapIonIN->hDevCookie,
1410 psMapDmabufIN->hDevCookie, 1421 psMapIonIN->hDevCookie,
1411 PVRSRV_HANDLE_TYPE_DEV_NODE); 1422 PVRSRV_HANDLE_TYPE_DEV_NODE);
1412 if (psMapDmabufOUT->eError != PVRSRV_OK) 1423 if (psMapIonOUT->eError != PVRSRV_OK)
1413 { 1424 {
1414 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup device node handle", __FUNCTION__)); 1425 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup device node handle", __FUNCTION__));
1415 return 0; 1426 return 0;
1416 } 1427 }
1417 1428
1418 psMapDmabufOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, 1429 psMapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1419 &psMapDmabufIN->hDevMemHeap, 1430 &psMapIonIN->hDevMemHeap,
1420 psMapDmabufIN->hDevMemHeap, 1431 psMapIonIN->hDevMemHeap,
1421 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP); 1432 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
1422 if (psMapDmabufOUT->eError != PVRSRV_OK) 1433 if (psMapIonOUT->eError != PVRSRV_OK)
1423 { 1434 {
1424 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup memory context handle", __FUNCTION__)); 1435 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup memory context handle", __FUNCTION__));
1425 return 0; 1436 return 0;
1426 } 1437 }
1427 1438
1428 psMapDmabufOUT->eError = PVRSRVMapDmabufKM(psPerProc, 1439 psMapIonOUT->eError = PVRSRVMapIonHandleKM(psPerProc,
1429 psMapDmabufIN->hDevCookie, 1440 psMapIonIN->hDevCookie,
1430 psMapDmabufIN->hDevMemHeap, 1441 psMapIonIN->hDevMemHeap,
1431 psMapDmabufIN->ui32NumFDs, 1442 psMapIonIN->ui32NumFDs,
1432 psMapDmabufIN->ai32BufferFDs, 1443 psMapIonIN->ai32BufferFDs,
1433 psMapDmabufIN->ui32Attribs, 1444 psMapIonIN->ui32Attribs,
1434 psMapDmabufIN->ui32ChunkCount, 1445 psMapIonIN->ui32ChunkCount,
1435 psMapDmabufIN->auiOffset, 1446 psMapIonIN->auiOffset,
1436 psMapDmabufIN->auiSize, 1447 psMapIonIN->auiSize,
1437 &psMapDmabufOUT->uiDmabufBufferSize, 1448 &psMapIonOUT->uiIonBufferSize,
1438 &psKernelMemInfo, 1449 &psKernelMemInfo,
1439 &ui64Stamp); 1450 &ui64Stamp);
1440 if (psMapDmabufOUT->eError != PVRSRV_OK) 1451 if (psMapIonOUT->eError != PVRSRV_OK)
1441 { 1452 {
1442 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to map ion handle", __FUNCTION__)); 1453 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to map ion handle", __FUNCTION__));
1443 return 0; 1454 return 0;
1444 } 1455 }
1445 1456
1446 OSMemSet(&psMapDmabufOUT->sClientMemInfo, 1457 OSMemSet(&psMapIonOUT->sClientMemInfo,
1447 0, 1458 0,
1448 sizeof(psMapDmabufOUT->sClientMemInfo)); 1459 sizeof(psMapIonOUT->sClientMemInfo));
1449 1460
1450 psMapDmabufOUT->sClientMemInfo.pvLinAddrKM = 1461 psMapIonOUT->sClientMemInfo.pvLinAddrKM =
1451 psKernelMemInfo->pvLinAddrKM; 1462 psKernelMemInfo->pvLinAddrKM;
1452 1463
1453 psMapDmabufOUT->sClientMemInfo.pvLinAddr = 0; 1464 psMapIonOUT->sClientMemInfo.pvLinAddr = 0;
1454 psMapDmabufOUT->sClientMemInfo.sDevVAddr = psKernelMemInfo->sDevVAddr; 1465 psMapIonOUT->sClientMemInfo.sDevVAddr = psKernelMemInfo->sDevVAddr;
1455 psMapDmabufOUT->sClientMemInfo.ui32Flags = psKernelMemInfo->ui32Flags; 1466 psMapIonOUT->sClientMemInfo.ui32Flags = psKernelMemInfo->ui32Flags;
1456 psMapDmabufOUT->sClientMemInfo.uAllocSize = psKernelMemInfo->uAllocSize; 1467 psMapIonOUT->sClientMemInfo.uAllocSize = psKernelMemInfo->uAllocSize;
1457 1468
1458 /* No mapping info, we map through ion */ 1469 /* No mapping info, we map through ion */
1459 psMapDmabufOUT->sClientMemInfo.hMappingInfo = IMG_NULL; 1470 psMapIonOUT->sClientMemInfo.hMappingInfo = IMG_NULL;
1460 1471
1461#if defined(SUPPORT_MEMINFO_IDS) 1472#if defined(SUPPORT_MEMINFO_IDS)
1462 psMapDmabufOUT->sClientMemInfo.ui64Stamp = ui64Stamp; 1473 psMapIonOUT->sClientMemInfo.ui64Stamp = ui64Stamp;
1463#endif 1474#endif
1464 1475
1465 PVRSRVAllocHandleNR(psPerProc->psHandleBase, 1476 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1466 &psMapDmabufOUT->sClientMemInfo.hKernelMemInfo, 1477 &psMapIonOUT->sClientMemInfo.hKernelMemInfo,
1467 psKernelMemInfo, 1478 psKernelMemInfo,
1468 PVRSRV_HANDLE_TYPE_MEM_INFO, 1479 PVRSRV_HANDLE_TYPE_MEM_INFO,
1469 PVRSRV_HANDLE_ALLOC_FLAG_NONE); 1480 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1470 1481
1471 if(psMapDmabufIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ) 1482 if(psMapIonIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ)
1472 { 1483 {
1473 /* signal no syncinfo */ 1484 /* signal no syncinfo */
1474 OSMemSet(&psMapDmabufOUT->sClientSyncInfo, 1485 OSMemSet(&psMapIonOUT->sClientSyncInfo,
1475 0, 1486 0,
1476 sizeof (PVRSRV_CLIENT_SYNC_INFO)); 1487 sizeof (PVRSRV_CLIENT_SYNC_INFO));
1477 psMapDmabufOUT->sClientMemInfo.psClientSyncInfo = IMG_NULL; 1488 psMapIonOUT->sClientMemInfo.psClientSyncInfo = IMG_NULL;
1478 } 1489 }
1479 else 1490 else
1480 { 1491 {
1481 /* and setup the sync info */ 1492 /* and setup the sync info */
1482#if !defined(PVRSRV_DISABLE_UM_SYNCOBJ_MAPPINGS) 1493#if !defined(PVRSRV_DISABLE_UM_SYNCOBJ_MAPPINGS)
1483 psMapDmabufOUT->sClientSyncInfo.psSyncData = 1494 psMapIonOUT->sClientSyncInfo.psSyncData =
1484 psKernelMemInfo->psKernelSyncInfo->psSyncData; 1495 psKernelMemInfo->psKernelSyncInfo->psSyncData;
1485 psMapDmabufOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr = 1496 psMapIonOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
1486 psKernelMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr; 1497 psKernelMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr;
1487 psMapDmabufOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr = 1498 psMapIonOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
1488 psKernelMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr; 1499 psKernelMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
1489 psMapDmabufOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = 1500 psMapIonOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr =
1490 psKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; 1501 psKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr;
1491 1502
1492 psMapDmabufOUT->sClientSyncInfo.hMappingInfo = 1503 psMapIonOUT->sClientSyncInfo.hMappingInfo =
1493 psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; 1504 psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle;
1494#endif 1505#endif
1495 1506
1496 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, 1507 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1497 &psMapDmabufOUT->sClientSyncInfo.hKernelSyncInfo, 1508 &psMapIonOUT->sClientSyncInfo.hKernelSyncInfo,
1498 psKernelMemInfo->psKernelSyncInfo, 1509 psKernelMemInfo->psKernelSyncInfo,
1499 PVRSRV_HANDLE_TYPE_SYNC_INFO, 1510 PVRSRV_HANDLE_TYPE_SYNC_INFO,
1500 PVRSRV_HANDLE_ALLOC_FLAG_NONE, 1511 PVRSRV_HANDLE_ALLOC_FLAG_NONE,
1501 psMapDmabufOUT->sClientMemInfo.hKernelMemInfo); 1512 psMapIonOUT->sClientMemInfo.hKernelMemInfo);
1502 1513
1503 psMapDmabufOUT->sClientMemInfo.psClientSyncInfo = 1514 psMapIonOUT->sClientMemInfo.psClientSyncInfo =
1504 &psMapDmabufOUT->sClientSyncInfo; 1515 &psMapIonOUT->sClientSyncInfo;
1505 } 1516 }
1506 return 0; 1517 return 0;
1507} 1518}
1508 1519
1509static IMG_INT 1520static IMG_INT
1510PVRSRVUnmapDmabufBW(IMG_UINT32 ui32BridgeID, 1521PVRSRVUnmapIonHandleBW(IMG_UINT32 ui32BridgeID,
1511 PVRSRV_BRIDGE_IN_UNMAP_DMABUF *psUnmapDmabufIN, 1522 PVRSRV_BRIDGE_IN_UNMAP_ION_HANDLE *psUnmapIonIN,
1512 PVRSRV_BRIDGE_RETURN *psUnmapDmabufOUT, 1523 PVRSRV_BRIDGE_RETURN *psUnmapIonOUT,
1513 PVRSRV_PER_PROCESS_DATA *psPerProc) 1524 PVRSRV_PER_PROCESS_DATA *psPerProc)
1514{ 1525{
1515 IMG_VOID *pvKernelMemInfo; 1526 IMG_VOID *pvKernelMemInfo;
1516 1527
1517 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNMAP_DMABUF); 1528 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNMAP_ION_HANDLE);
1518 1529
1519 psUnmapDmabufOUT->eError = 1530 psUnmapIonOUT->eError =
1520 PVRSRVLookupHandle(psPerProc->psHandleBase, 1531 PVRSRVLookupHandle(psPerProc->psHandleBase,
1521 &pvKernelMemInfo, 1532 &pvKernelMemInfo,
1522 psUnmapDmabufIN->psKernelMemInfo, 1533 psUnmapIonIN->psKernelMemInfo,
1523 PVRSRV_HANDLE_TYPE_MEM_INFO); 1534 PVRSRV_HANDLE_TYPE_MEM_INFO);
1524 1535
1525 if(psUnmapDmabufOUT->eError != PVRSRV_OK) 1536 if(psUnmapIonOUT->eError != PVRSRV_OK)
1526 { 1537 {
1527 return 0; 1538 return 0;
1528 } 1539 }
1529 1540
1530 psUnmapDmabufOUT->eError = PVRSRVUnmapDmabufKM(pvKernelMemInfo); 1541 psUnmapIonOUT->eError = PVRSRVUnmapIonHandleKM(pvKernelMemInfo);
1531 1542
1532 if(psUnmapDmabufOUT->eError != PVRSRV_OK) 1543 if(psUnmapIonOUT->eError != PVRSRV_OK)
1533 { 1544 {
1534 return 0; 1545 return 0;
1535 } 1546 }
1536 1547
1537 psUnmapDmabufOUT->eError = 1548 psUnmapIonOUT->eError =
1538 PVRSRVReleaseHandle(psPerProc->psHandleBase, 1549 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1539 psUnmapDmabufIN->psKernelMemInfo, 1550 psUnmapIonIN->psKernelMemInfo,
1540 PVRSRV_HANDLE_TYPE_MEM_INFO); 1551 PVRSRV_HANDLE_TYPE_MEM_INFO);
1541 1552
1542 return 0; 1553 return 0;
1543} 1554}
1544#endif /* SUPPORT_ION */ 1555#endif /* SUPPORT_ION */
1545 1556
1546#if defined(SUPPORT_ION) 1557#if defined(SUPPORT_DMABUF)
1547static IMG_INT 1558static IMG_INT
1548PVRSRVMapIonHandleBW(IMG_UINT32 ui32BridgeID, 1559PVRSRVMapDmaBufBW(IMG_UINT32 ui32BridgeID,
1549 PVRSRV_BRIDGE_IN_MAP_ION_HANDLE *psMapIonIN, 1560 PVRSRV_BRIDGE_IN_MAP_DMABUF *psMapDmaBufIN,
1550 PVRSRV_BRIDGE_OUT_MAP_ION_HANDLE *psMapIonOUT, 1561 PVRSRV_BRIDGE_OUT_MAP_DMABUF *psMapDmaBufOUT,
1551 PVRSRV_PER_PROCESS_DATA *psPerProc) 1562 PVRSRV_PER_PROCESS_DATA *psPerProc)
1552{ 1563{
1553 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo; 1564 PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
1554 IMG_UINT64 ui64Stamp; 1565 IMG_UINT64 ui64Stamp;
1555 1566
1556 psMapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, 1567 psMapDmaBufOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1557 &psMapIonIN->hDevCookie, 1568 &psMapDmaBufIN->hDevCookie,
1558 psMapIonIN->hDevCookie, 1569 psMapDmaBufIN->hDevCookie,
1559 PVRSRV_HANDLE_TYPE_DEV_NODE); 1570 PVRSRV_HANDLE_TYPE_DEV_NODE);
1560 if (psMapIonOUT->eError != PVRSRV_OK) 1571 if (psMapDmaBufOUT->eError != PVRSRV_OK)
1561 { 1572 {
1562 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup device node handle", __FUNCTION__)); 1573 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup device node handle", __FUNCTION__));
1563 return 0; 1574 return 0;
1564 } 1575 }
1565 1576
1566 psMapIonOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase, 1577 psMapDmaBufOUT->eError = PVRSRVLookupHandle(psPerProc->psHandleBase,
1567 &psMapIonIN->hDevMemHeap, 1578 &psMapDmaBufIN->hDevMemHeap,
1568 psMapIonIN->hDevMemHeap, 1579 psMapDmaBufIN->hDevMemHeap,
1569 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP); 1580 PVRSRV_HANDLE_TYPE_DEV_MEM_HEAP);
1570 if (psMapIonOUT->eError != PVRSRV_OK) 1581 if (psMapDmaBufOUT->eError != PVRSRV_OK)
1571 { 1582 {
1572 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup memory context handle", __FUNCTION__)); 1583 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to lookup memory context handle", __FUNCTION__));
1573 return 0; 1584 return 0;
1574 } 1585 }
1575 1586
1576 psMapIonOUT->eError = PVRSRVMapIonHandleKM(psPerProc, 1587 psMapDmaBufOUT->eError = PVRSRVMapDmaBufKM(psPerProc,
1577 psMapIonIN->hDevCookie, 1588 psMapDmaBufIN->hDevCookie,
1578 psMapIonIN->hDevMemHeap, 1589 psMapDmaBufIN->hDevMemHeap,
1579 psMapIonIN->ui32NumFDs, 1590 psMapDmaBufIN->ui32Attribs,
1580 psMapIonIN->ai32BufferFDs, 1591 psMapDmaBufIN->ui32NumFDs,
1581 psMapIonIN->ui32Attribs, 1592 psMapDmaBufIN->ai32FD,
1582 psMapIonIN->ui32ChunkCount, 1593 psMapDmaBufIN->auiOffset,
1583 psMapIonIN->auiOffset, 1594 psMapDmaBufIN->auiSize,
1584 psMapIonIN->auiSize,
1585 &psMapIonOUT->uiIonBufferSize,
1586 &psKernelMemInfo, 1595 &psKernelMemInfo,
1596 &psMapDmaBufOUT->uiSize,
1597 psMapDmaBufOUT->auiOffset,
1587 &ui64Stamp); 1598 &ui64Stamp);
1588 if (psMapIonOUT->eError != PVRSRV_OK) 1599 if (psMapDmaBufOUT->eError != PVRSRV_OK)
1589 { 1600 {
1590 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to map ion handle", __FUNCTION__)); 1601 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to map dma-buf handle", __FUNCTION__));
1591 return 0; 1602 return 0;
1592 } 1603 }
1593 1604
1594 OSMemSet(&psMapIonOUT->sClientMemInfo, 1605 OSMemSet(&psMapDmaBufOUT->sClientMemInfo,
1595 0, 1606 0,
1596 sizeof(psMapIonOUT->sClientMemInfo)); 1607 sizeof(psMapDmaBufOUT->sClientMemInfo));
1597 1608
1598 psMapIonOUT->sClientMemInfo.pvLinAddrKM = 1609 psMapDmaBufOUT->sClientMemInfo.pvLinAddrKM =
1599 psKernelMemInfo->pvLinAddrKM; 1610 psKernelMemInfo->pvLinAddrKM;
1600 1611
1601 psMapIonOUT->sClientMemInfo.pvLinAddr = 0; 1612 psMapDmaBufOUT->sClientMemInfo.pvLinAddr = 0;
1602 psMapIonOUT->sClientMemInfo.sDevVAddr = psKernelMemInfo->sDevVAddr; 1613 psMapDmaBufOUT->sClientMemInfo.sDevVAddr = psKernelMemInfo->sDevVAddr;
1603 psMapIonOUT->sClientMemInfo.ui32Flags = psKernelMemInfo->ui32Flags; 1614 psMapDmaBufOUT->sClientMemInfo.ui32Flags = psKernelMemInfo->ui32Flags;
1604 psMapIonOUT->sClientMemInfo.uAllocSize = psKernelMemInfo->uAllocSize; 1615 psMapDmaBufOUT->sClientMemInfo.uAllocSize = psKernelMemInfo->uAllocSize;
1605 1616
1606 /* No mapping info, we map through ion */ 1617 /* No mapping info, we map through dma_buf */
1607 psMapIonOUT->sClientMemInfo.hMappingInfo = IMG_NULL; 1618 psMapDmaBufOUT->sClientMemInfo.hMappingInfo = IMG_NULL;
1608 1619
1609#if defined(SUPPORT_MEMINFO_IDS) 1620#if defined(SUPPORT_MEMINFO_IDS)
1610 psMapIonOUT->sClientMemInfo.ui64Stamp = ui64Stamp; 1621 psMapDmaBufOUT->sClientMemInfo.ui64Stamp = ui64Stamp;
1611#endif 1622#endif
1612 1623
1613 PVRSRVAllocHandleNR(psPerProc->psHandleBase, 1624 PVRSRVAllocHandleNR(psPerProc->psHandleBase,
1614 &psMapIonOUT->sClientMemInfo.hKernelMemInfo, 1625 &psMapDmaBufOUT->sClientMemInfo.hKernelMemInfo,
1615 psKernelMemInfo, 1626 psKernelMemInfo,
1616 PVRSRV_HANDLE_TYPE_MEM_INFO, 1627 PVRSRV_HANDLE_TYPE_MEM_INFO,
1617 PVRSRV_HANDLE_ALLOC_FLAG_NONE); 1628 PVRSRV_HANDLE_ALLOC_FLAG_NONE);
1618 1629
1619 if(psMapIonIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ) 1630 if(psMapDmaBufIN->ui32Attribs & PVRSRV_MEM_NO_SYNCOBJ)
1620 { 1631 {
1621 /* signal no syncinfo */ 1632 /* signal no syncinfo */
1622 OSMemSet(&psMapIonOUT->sClientSyncInfo, 1633 OSMemSet(&psMapDmaBufOUT->sClientSyncInfo,
1623 0, 1634 0,
1624 sizeof (PVRSRV_CLIENT_SYNC_INFO)); 1635 sizeof (PVRSRV_CLIENT_SYNC_INFO));
1625 psMapIonOUT->sClientMemInfo.psClientSyncInfo = IMG_NULL; 1636 psMapDmaBufOUT->sClientMemInfo.psClientSyncInfo = IMG_NULL;
1626 } 1637 }
1627 else 1638 else
1628 { 1639 {
1629 /* and setup the sync info */ 1640 /* and setup the sync info */
1630#if !defined(PVRSRV_DISABLE_UM_SYNCOBJ_MAPPINGS) 1641#if !defined(PVRSRV_DISABLE_UM_SYNCOBJ_MAPPINGS)
1631 psMapIonOUT->sClientSyncInfo.psSyncData = 1642 psMapDmaBufOUT->sClientSyncInfo.psSyncData =
1632 psKernelMemInfo->psKernelSyncInfo->psSyncData; 1643 psKernelMemInfo->psKernelSyncInfo->psSyncData;
1633 psMapIonOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr = 1644 psMapDmaBufOUT->sClientSyncInfo.sWriteOpsCompleteDevVAddr =
1634 psKernelMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr; 1645 psKernelMemInfo->psKernelSyncInfo->sWriteOpsCompleteDevVAddr;
1635 psMapIonOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr = 1646 psMapDmaBufOUT->sClientSyncInfo.sReadOpsCompleteDevVAddr =
1636 psKernelMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr; 1647 psKernelMemInfo->psKernelSyncInfo->sReadOpsCompleteDevVAddr;
1637 psMapIonOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr = 1648 psMapDmaBufOUT->sClientSyncInfo.sReadOps2CompleteDevVAddr =
1638 psKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr; 1649 psKernelMemInfo->psKernelSyncInfo->sReadOps2CompleteDevVAddr;
1639 1650
1640 psMapIonOUT->sClientSyncInfo.hMappingInfo = 1651 psMapDmaBufOUT->sClientSyncInfo.hMappingInfo =
1641 psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle; 1652 psKernelMemInfo->psKernelSyncInfo->psSyncDataMemInfoKM->sMemBlk.hOSMemHandle;
1642#endif 1653#endif
1643 1654
1655 /*
1656 * If the DMA Buffer is imported into the same process that
1657 * exported it, there will be two handles for the same sync
1658 * info, hence the PVRSRV_HANDLE_ALLOC_FLAG_MULTI flag.
1659 */
1644 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase, 1660 PVRSRVAllocSubHandleNR(psPerProc->psHandleBase,
1645 &psMapIonOUT->sClientSyncInfo.hKernelSyncInfo, 1661 &psMapDmaBufOUT->sClientSyncInfo.hKernelSyncInfo,
1646 psKernelMemInfo->psKernelSyncInfo, 1662 psKernelMemInfo->psKernelSyncInfo,
1647 PVRSRV_HANDLE_TYPE_SYNC_INFO, 1663 PVRSRV_HANDLE_TYPE_SYNC_INFO,
1648 PVRSRV_HANDLE_ALLOC_FLAG_NONE, 1664 PVRSRV_HANDLE_ALLOC_FLAG_MULTI,
1649 psMapIonOUT->sClientMemInfo.hKernelMemInfo); 1665 psMapDmaBufOUT->sClientMemInfo.hKernelMemInfo);
1650 1666
1651 psMapIonOUT->sClientMemInfo.psClientSyncInfo = 1667 psMapDmaBufOUT->sClientMemInfo.psClientSyncInfo =
1652 &psMapIonOUT->sClientSyncInfo; 1668 &psMapDmaBufOUT->sClientSyncInfo;
1653 } 1669 }
1654 return 0; 1670 return 0;
1655} 1671}
1656 1672
1657static IMG_INT 1673static IMG_INT
1658PVRSRVUnmapIonHandleBW(IMG_UINT32 ui32BridgeID, 1674PVRSRVUnmapDmaBufBW(IMG_UINT32 ui32BridgeID,
1659 PVRSRV_BRIDGE_IN_UNMAP_ION_HANDLE *psUnmapIonIN, 1675 PVRSRV_BRIDGE_IN_UNMAP_DMABUF *psUnmapDmaBufIN,
1660 PVRSRV_BRIDGE_RETURN *psUnmapIonOUT, 1676 PVRSRV_BRIDGE_RETURN *psUnmapDmaBufOUT,
1661 PVRSRV_PER_PROCESS_DATA *psPerProc) 1677 PVRSRV_PER_PROCESS_DATA *psPerProc)
1662{ 1678{
1663 IMG_VOID *pvKernelMemInfo; 1679 IMG_VOID *pvKernelMemInfo;
1664 1680
1665 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNMAP_ION_HANDLE); 1681 PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_UNMAP_DMABUF);
1666 1682
1667 psUnmapIonOUT->eError = 1683 psUnmapDmaBufOUT->eError =
1668 PVRSRVLookupHandle(psPerProc->psHandleBase, 1684 PVRSRVLookupHandle(psPerProc->psHandleBase,
1669 &pvKernelMemInfo, 1685 &pvKernelMemInfo,
1670 psUnmapIonIN->psKernelMemInfo, 1686 psUnmapDmaBufIN->psKernelMemInfo,
1671 PVRSRV_HANDLE_TYPE_MEM_INFO); 1687 PVRSRV_HANDLE_TYPE_MEM_INFO);
1672 1688
1673 if(psUnmapIonOUT->eError != PVRSRV_OK) 1689 if(psUnmapDmaBufOUT->eError != PVRSRV_OK)
1674 { 1690 {
1675 return 0; 1691 return 0;
1676 } 1692 }
1677 1693
1678 psUnmapIonOUT->eError = PVRSRVUnmapIonHandleKM(pvKernelMemInfo); 1694 psUnmapDmaBufOUT->eError = PVRSRVUnmapDmaBufKM(pvKernelMemInfo);
1679 1695
1680 if(psUnmapIonOUT->eError != PVRSRV_OK) 1696 if(psUnmapDmaBufOUT->eError != PVRSRV_OK)
1681 { 1697 {
1682 return 0; 1698 return 0;
1683 } 1699 }
1684 1700
1685 psUnmapIonOUT->eError = 1701 psUnmapDmaBufOUT->eError =
1686 PVRSRVReleaseHandle(psPerProc->psHandleBase, 1702 PVRSRVReleaseHandle(psPerProc->psHandleBase,
1687 psUnmapIonIN->psKernelMemInfo, 1703 psUnmapDmaBufIN->psKernelMemInfo,
1688 PVRSRV_HANDLE_TYPE_MEM_INFO); 1704 PVRSRV_HANDLE_TYPE_MEM_INFO);
1689 1705
1690 return 0; 1706 return 0;
1691} 1707}
1692#endif /* SUPPORT_ION */ 1708#endif /* SUPPORT_DMABUF */
1693 1709
1694static IMG_INT 1710static IMG_INT
1695PVRSRVGetFreeDeviceMemBW(IMG_UINT32 ui32BridgeID, 1711PVRSRVGetFreeDeviceMemBW(IMG_UINT32 ui32BridgeID,
@@ -2275,15 +2291,6 @@ PVRSRVGetMiscInfoBW(IMG_UINT32 ui32BridgeID,
2275 return 0; 2291 return 0;
2276 } 2292 }
2277 2293
2278 if((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_GET_DRM_FD_PRESENT) != 0)
2279 {
2280 PVR_DPF((PVR_DBG_ERROR, "Get DRM FD BW"));
2281 }
2282 if((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_SET_DRM_FD_PRESENT) != 0)
2283 {
2284 PVR_DPF((PVR_DBG_ERROR, "Set DRM FD BW"));
2285 }
2286
2287 if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) || 2294 if (((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_MEMSTATS_PRESENT) != 0) ||
2288 ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0) || 2295 ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_DDKVERSION_PRESENT) != 0) ||
2289 ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_FREEMEM_PRESENT) != 0)) 2296 ((psGetMiscInfoIN->sMiscInfo.ui32StateRequest & PVRSRV_MISC_INFO_FREEMEM_PRESENT) != 0))
@@ -3035,11 +3042,7 @@ PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID,
3035 IMG_UINT32 i; 3042 IMG_UINT32 i;
3036 3043
3037#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC) 3044#if defined(PVR_ANDROID_NATIVE_WINDOW_HAS_SYNC)
3038#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0))
3039 int iReleaseFd = get_unused_fd_flags(O_CLOEXEC); 3045 int iReleaseFd = get_unused_fd_flags(O_CLOEXEC);
3040#else
3041 int iReleaseFd = get_unused_fd();
3042#endif
3043 if(iReleaseFd < 0) 3046 if(iReleaseFd < 0)
3044 { 3047 {
3045 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to find unused fd (%d)", 3048 PVR_DPF((PVR_DBG_ERROR, "%s: Failed to find unused fd (%d)",
@@ -3126,7 +3129,7 @@ PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID,
3126 3129
3127 if(psSwapDispClassBufferIN->ui32PrivDataLength > 0) 3130 if(psSwapDispClassBufferIN->ui32PrivDataLength > 0)
3128 { 3131 {
3129 if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, 3132 if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP | PVRSRV_SWAP_BUFFER_ALLOCATION,
3130 psSwapDispClassBufferIN->ui32PrivDataLength, 3133 psSwapDispClassBufferIN->ui32PrivDataLength,
3131 (IMG_VOID **)&pvPrivData, IMG_NULL, 3134 (IMG_VOID **)&pvPrivData, IMG_NULL,
3132 "Swap Command Private Data") != PVRSRV_OK) 3135 "Swap Command Private Data") != PVRSRV_OK)
@@ -3142,7 +3145,7 @@ PVRSRVSwapToDCBuffer2BW(IMG_UINT32 ui32BridgeID,
3142 psSwapDispClassBufferIN->ui32PrivDataLength) != PVRSRV_OK) 3145 psSwapDispClassBufferIN->ui32PrivDataLength) != PVRSRV_OK)
3143 { 3146 {
3144 PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to copy private data")); 3147 PVR_DPF((PVR_DBG_ERROR, "PVRSRVSwapToDCBuffer2BW: Failed to copy private data"));
3145 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, 3148 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP | PVRSRV_SWAP_BUFFER_ALLOCATION,
3146 psSwapDispClassBufferIN->ui32PrivDataLength, 3149 psSwapDispClassBufferIN->ui32PrivDataLength,
3147 pvPrivData, IMG_NULL); 3150 pvPrivData, IMG_NULL);
3148 return -EFAULT; 3151 return -EFAULT;
@@ -4653,14 +4656,14 @@ CommonBridgeInit(IMG_VOID)
4653 SetDispatchTableEntry(PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS, PVRSRVChangeDeviceMemoryAttributesBW); 4656 SetDispatchTableEntry(PVRSRV_BRIDGE_CHG_DEV_MEM_ATTRIBS, PVRSRVChangeDeviceMemoryAttributesBW);
4654 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEV_MEMORY_2, PVRSRVMapDeviceMemoryBW); 4657 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DEV_MEMORY_2, PVRSRVMapDeviceMemoryBW);
4655 SetDispatchTableEntry(PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2, PVRSRVExportDeviceMemBW); 4658 SetDispatchTableEntry(PVRSRV_BRIDGE_EXPORT_DEVICEMEM_2, PVRSRVExportDeviceMemBW);
4656#if defined(SUPPORT_DRM_GEM)
4657 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DMABUF, PVRSRVMapDmabufBW);
4658 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DMABUF, PVRSRVUnmapDmabufBW);
4659#endif
4660#if defined(SUPPORT_ION) 4659#if defined(SUPPORT_ION)
4661 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_ION_HANDLE, PVRSRVMapIonHandleBW); 4660 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_ION_HANDLE, PVRSRVMapIonHandleBW);
4662 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_ION_HANDLE, PVRSRVUnmapIonHandleBW); 4661 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_ION_HANDLE, PVRSRVUnmapIonHandleBW);
4663#endif 4662#endif
4663#if defined(SUPPORT_DMABUF)
4664 SetDispatchTableEntry(PVRSRV_BRIDGE_MAP_DMABUF, PVRSRVMapDmaBufBW);
4665 SetDispatchTableEntry(PVRSRV_BRIDGE_UNMAP_DMABUF, PVRSRVUnmapDmaBufBW);
4666#endif
4664 4667
4665 /* SIM */ 4668 /* SIM */
4666 SetDispatchTableEntry(PVRSRV_BRIDGE_PROCESS_SIMISR_EVENT, DummyBW); 4669 SetDispatchTableEntry(PVRSRV_BRIDGE_PROCESS_SIMISR_EVENT, DummyBW);