diff options
Diffstat (limited to 'drivers/gpu/pvr/buffer_manager.c')
-rw-r--r-- | drivers/gpu/pvr/buffer_manager.c | 453 |
1 files changed, 430 insertions, 23 deletions
diff --git a/drivers/gpu/pvr/buffer_manager.c b/drivers/gpu/pvr/buffer_manager.c index 32367e215f8..7026a58d1bc 100644 --- a/drivers/gpu/pvr/buffer_manager.c +++ b/drivers/gpu/pvr/buffer_manager.c | |||
@@ -787,8 +787,11 @@ static PVRSRV_ERROR BM_DestroyContextCallBack(IMG_PVOID pvParam, | |||
787 | } | 787 | } |
788 | else | 788 | else |
789 | { | 789 | { |
790 | 790 | if (pBMContext->ppsThis != IMG_NULL) | |
791 | List_BM_CONTEXT_Remove(pBMContext); | 791 | { |
792 | |||
793 | List_BM_CONTEXT_Remove(pBMContext); | ||
794 | } | ||
792 | } | 795 | } |
793 | 796 | ||
794 | OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(BM_CONTEXT), pBMContext, IMG_NULL); | 797 | OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(BM_CONTEXT), pBMContext, IMG_NULL); |
@@ -1006,6 +1009,11 @@ BM_CreateHeap (IMG_HANDLE hBMContext, | |||
1006 | psDeviceNode = pBMContext->psDeviceNode; | 1009 | psDeviceNode = pBMContext->psDeviceNode; |
1007 | 1010 | ||
1008 | 1011 | ||
1012 | |||
1013 | PVR_ASSERT((psDevMemHeapInfo->ui32HeapSize & (psDevMemHeapInfo->ui32DataPageSize - 1)) == 0); | ||
1014 | PVR_ASSERT(psDevMemHeapInfo->ui32HeapSize > 0); | ||
1015 | |||
1016 | |||
1009 | 1017 | ||
1010 | 1018 | ||
1011 | 1019 | ||
@@ -1096,7 +1104,7 @@ ErrorExit: | |||
1096 | if (psBMHeap->pMMUHeap != IMG_NULL) | 1104 | if (psBMHeap->pMMUHeap != IMG_NULL) |
1097 | { | 1105 | { |
1098 | psDeviceNode->pfnMMUDelete (psBMHeap->pMMUHeap); | 1106 | psDeviceNode->pfnMMUDelete (psBMHeap->pMMUHeap); |
1099 | psDeviceNode->pfnMMUFinalise (pBMContext->psMMUContext); | 1107 | |
1100 | } | 1108 | } |
1101 | 1109 | ||
1102 | 1110 | ||
@@ -1379,6 +1387,11 @@ BM_Wrap ( IMG_HANDLE hDevMemHeap, | |||
1379 | 1387 | ||
1380 | return IMG_TRUE; | 1388 | return IMG_TRUE; |
1381 | } | 1389 | } |
1390 | else | ||
1391 | { | ||
1392 | |||
1393 | HASH_Remove(psBMContext->pBufferHash, (IMG_UINTPTR_T)sHashAddress.uiAddr); | ||
1394 | } | ||
1382 | } | 1395 | } |
1383 | 1396 | ||
1384 | 1397 | ||
@@ -1567,7 +1580,7 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, | |||
1567 | { | 1580 | { |
1568 | PVRSRV_DEVICE_NODE *psDeviceNode; | 1581 | PVRSRV_DEVICE_NODE *psDeviceNode; |
1569 | #ifdef PDUMP | 1582 | #ifdef PDUMP |
1570 | IMG_UINT32 ui32PDumpSize = pMapping->uSize; | 1583 | IMG_UINT32 ui32PDumpSize = (IMG_UINT32)pMapping->uSize; |
1571 | #endif | 1584 | #endif |
1572 | 1585 | ||
1573 | psDeviceNode = pBMContext->psDeviceNode; | 1586 | psDeviceNode = pBMContext->psDeviceNode; |
@@ -1613,8 +1626,8 @@ DevMemoryAlloc (BM_CONTEXT *pBMContext, | |||
1613 | #if defined(SUPPORT_PDUMP_MULTI_PROCESS) | 1626 | #if defined(SUPPORT_PDUMP_MULTI_PROCESS) |
1614 | psDeviceNode->pfnMMUIsHeapShared(pMapping->pBMHeap->pMMUHeap), | 1627 | psDeviceNode->pfnMMUIsHeapShared(pMapping->pBMHeap->pMMUHeap), |
1615 | #else | 1628 | #else |
1616 | IMG_FALSE, | 1629 | IMG_FALSE, |
1617 | #endif | 1630 | #endif |
1618 | (IMG_HANDLE)pMapping); | 1631 | (IMG_HANDLE)pMapping); |
1619 | #endif | 1632 | #endif |
1620 | 1633 | ||
@@ -1677,35 +1690,321 @@ static IMG_VOID | |||
1677 | DevMemoryFree (BM_MAPPING *pMapping) | 1690 | DevMemoryFree (BM_MAPPING *pMapping) |
1678 | { | 1691 | { |
1679 | PVRSRV_DEVICE_NODE *psDeviceNode; | 1692 | PVRSRV_DEVICE_NODE *psDeviceNode; |
1693 | IMG_DEV_PHYADDR sDevPAddr; | ||
1680 | #ifdef PDUMP | 1694 | #ifdef PDUMP |
1681 | IMG_UINT32 ui32PSize; | 1695 | IMG_UINT32 ui32PSize; |
1682 | #endif | 1696 | #endif |
1683 | 1697 | ||
1698 | psDeviceNode = pMapping->pBMHeap->pBMContext->psDeviceNode; | ||
1699 | sDevPAddr = psDeviceNode->pfnMMUGetPhysPageAddr(pMapping->pBMHeap->pMMUHeap, pMapping->DevVAddr); | ||
1700 | |||
1701 | if (sDevPAddr.uiAddr != 0) | ||
1702 | { | ||
1684 | #ifdef PDUMP | 1703 | #ifdef PDUMP |
1704 | |||
1705 | if(pMapping->ui32Flags & PVRSRV_MEM_DUMMY) | ||
1706 | { | ||
1707 | |||
1708 | ui32PSize = pMapping->pBMHeap->sDevArena.ui32DataPageSize; | ||
1709 | } | ||
1710 | else | ||
1711 | { | ||
1712 | ui32PSize = (IMG_UINT32)pMapping->uSize; | ||
1713 | } | ||
1685 | 1714 | ||
1686 | if(pMapping->ui32Flags & PVRSRV_MEM_DUMMY) | 1715 | PDUMPFREEPAGES(pMapping->pBMHeap, |
1716 | pMapping->DevVAddr, | ||
1717 | ui32PSize, | ||
1718 | pMapping->pBMHeap->sDevArena.ui32DataPageSize, | ||
1719 | (IMG_HANDLE)pMapping, | ||
1720 | (pMapping->ui32Flags & PVRSRV_MEM_INTERLEAVED) ? IMG_TRUE : IMG_FALSE); | ||
1721 | #endif | ||
1722 | } | ||
1723 | psDeviceNode->pfnMMUFree (pMapping->pBMHeap->pMMUHeap, pMapping->DevVAddr, IMG_CAST_TO_DEVVADDR_UINT(pMapping->uSize)); | ||
1724 | } | ||
1725 | |||
1726 | #define XPROC_WORKAROUND_NUM_SHAREABLES 200 | ||
1727 | |||
1728 | #define XPROC_WORKAROUND_BAD_SHAREINDEX 0773407734 | ||
1729 | |||
1730 | static IMG_UINT32 gXProcWorkaroundShareIndex = XPROC_WORKAROUND_BAD_SHAREINDEX; | ||
1731 | |||
1732 | |||
1733 | static struct { | ||
1734 | IMG_UINT32 ui32RefCount; | ||
1735 | IMG_UINT32 ui32AllocFlags; | ||
1736 | IMG_UINT32 ui32Size; | ||
1737 | IMG_UINT32 ui32PageSize; | ||
1738 | RA_ARENA *psArena; | ||
1739 | IMG_SYS_PHYADDR sSysPAddr; | ||
1740 | IMG_VOID *pvCpuVAddr; | ||
1741 | IMG_HANDLE hOSMemHandle; | ||
1742 | } gXProcWorkaroundShareData[XPROC_WORKAROUND_NUM_SHAREABLES] = {{0}}; | ||
1743 | |||
1744 | PVRSRV_ERROR BM_XProcWorkaroundSetShareIndex(IMG_UINT32 ui32Index) | ||
1745 | { | ||
1746 | |||
1747 | |||
1748 | |||
1749 | if (gXProcWorkaroundShareIndex != XPROC_WORKAROUND_BAD_SHAREINDEX) | ||
1687 | { | 1750 | { |
1688 | 1751 | PVR_DPF((PVR_DBG_ERROR, "No, it's already set!")); | |
1689 | ui32PSize = pMapping->pBMHeap->sDevArena.ui32DataPageSize; | 1752 | return PVRSRV_ERROR_INVALID_PARAMS; |
1753 | } | ||
1754 | |||
1755 | gXProcWorkaroundShareIndex = ui32Index; | ||
1756 | |||
1757 | return PVRSRV_OK; | ||
1758 | } | ||
1759 | |||
1760 | PVRSRV_ERROR BM_XProcWorkaroundUnsetShareIndex(IMG_UINT32 ui32Index) | ||
1761 | { | ||
1762 | |||
1763 | |||
1764 | |||
1765 | if (gXProcWorkaroundShareIndex == XPROC_WORKAROUND_BAD_SHAREINDEX) | ||
1766 | { | ||
1767 | PVR_DPF((PVR_DBG_ERROR, "huh? how can it be bad??")); | ||
1768 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1769 | } | ||
1770 | if (gXProcWorkaroundShareIndex != ui32Index) | ||
1771 | { | ||
1772 | PVR_DPF((PVR_DBG_ERROR, "gXProcWorkaroundShareIndex == 0x%08x != 0x%08x == ui32Index", gXProcWorkaroundShareIndex, ui32Index)); | ||
1773 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1774 | } | ||
1775 | |||
1776 | gXProcWorkaroundShareIndex = XPROC_WORKAROUND_BAD_SHAREINDEX; | ||
1777 | |||
1778 | return PVRSRV_OK; | ||
1779 | } | ||
1780 | |||
1781 | PVRSRV_ERROR BM_XProcWorkaroundFindNewBufferAndSetShareIndex(IMG_UINT32 *pui32Index) | ||
1782 | { | ||
1783 | |||
1784 | |||
1785 | |||
1786 | if (gXProcWorkaroundShareIndex != XPROC_WORKAROUND_BAD_SHAREINDEX) | ||
1787 | { | ||
1788 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1789 | } | ||
1790 | |||
1791 | for (*pui32Index = 0; *pui32Index < XPROC_WORKAROUND_NUM_SHAREABLES; (*pui32Index)++) | ||
1792 | { | ||
1793 | if (gXProcWorkaroundShareData[*pui32Index].ui32RefCount == 0) | ||
1794 | { | ||
1795 | gXProcWorkaroundShareIndex = *pui32Index; | ||
1796 | return PVRSRV_OK; | ||
1797 | } | ||
1798 | } | ||
1799 | |||
1800 | PVR_DPF((PVR_DBG_ERROR, "ran out of shared buffers")); | ||
1801 | return PVRSRV_ERROR_OUT_OF_MEMORY; | ||
1802 | } | ||
1803 | |||
1804 | static PVRSRV_ERROR | ||
1805 | XProcWorkaroundAllocShareable(RA_ARENA *psArena, | ||
1806 | IMG_UINT32 ui32AllocFlags, | ||
1807 | IMG_UINT32 ui32Size, | ||
1808 | IMG_UINT32 ui32PageSize, | ||
1809 | IMG_VOID **ppvCpuVAddr, | ||
1810 | IMG_HANDLE *phOSMemHandle) | ||
1811 | { | ||
1812 | if ((ui32AllocFlags & PVRSRV_MEM_XPROC) == 0) | ||
1813 | { | ||
1814 | PVR_DPF((PVR_DBG_VERBOSE, "XProcWorkaroundAllocShareable: bad flags")); | ||
1815 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1816 | } | ||
1817 | |||
1818 | if (gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32RefCount > 0) | ||
1819 | { | ||
1820 | PVR_DPF((PVR_DBG_VERBOSE, | ||
1821 | "XProcWorkaroundAllocShareable: re-using previously allocated pages")); | ||
1822 | |||
1823 | ui32AllocFlags &= ~PVRSRV_HAP_MAPTYPE_MASK; | ||
1824 | ui32AllocFlags |= PVRSRV_HAP_SINGLE_PROCESS; | ||
1825 | |||
1826 | if (ui32AllocFlags != gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags) | ||
1827 | { | ||
1828 | PVR_DPF((PVR_DBG_ERROR, | ||
1829 | "Can't! Flags don't match! (I had 0x%08x, you gave 0x%08x)", | ||
1830 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags, | ||
1831 | ui32AllocFlags)); | ||
1832 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1833 | } | ||
1834 | |||
1835 | if (ui32Size != gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32Size) | ||
1836 | { | ||
1837 | PVR_DPF((PVR_DBG_ERROR, | ||
1838 | "Can't! Size doesn't match!")); | ||
1839 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1840 | } | ||
1841 | |||
1842 | if (ui32PageSize != gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32PageSize) | ||
1843 | { | ||
1844 | PVR_DPF((PVR_DBG_ERROR, | ||
1845 | "Can't! Page Size doesn't match!")); | ||
1846 | return PVRSRV_ERROR_INVALID_PARAMS; | ||
1847 | } | ||
1848 | |||
1849 | *ppvCpuVAddr = gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].pvCpuVAddr; | ||
1850 | *phOSMemHandle = gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].hOSMemHandle; | ||
1851 | |||
1852 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32RefCount ++; | ||
1853 | |||
1854 | return PVRSRV_OK; | ||
1690 | } | 1855 | } |
1691 | else | 1856 | else |
1692 | { | 1857 | { |
1693 | ui32PSize = pMapping->uSize; | 1858 | if (psArena != IMG_NULL) |
1859 | { | ||
1860 | IMG_CPU_PHYADDR sCpuPAddr; | ||
1861 | IMG_SYS_PHYADDR sSysPAddr; | ||
1862 | |||
1863 | PVR_DPF((PVR_DBG_VERBOSE, | ||
1864 | "XProcWorkaroundAllocShareable: making a NEW allocation from local mem")); | ||
1865 | |||
1866 | if (!RA_Alloc (psArena, | ||
1867 | ui32Size, | ||
1868 | IMG_NULL, | ||
1869 | IMG_NULL, | ||
1870 | 0, | ||
1871 | ui32PageSize, | ||
1872 | 0, | ||
1873 | (IMG_UINTPTR_T *)&sSysPAddr.uiAddr)) | ||
1874 | { | ||
1875 | PVR_DPF((PVR_DBG_ERROR, "XProcWorkaroundAllocShareable: RA_Alloc(0x%x) FAILED", ui32Size)); | ||
1876 | return PVRSRV_ERROR_OUT_OF_MEMORY; | ||
1877 | } | ||
1878 | |||
1879 | sCpuPAddr = SysSysPAddrToCpuPAddr(sSysPAddr); | ||
1880 | if(OSReservePhys(sCpuPAddr, | ||
1881 | ui32Size, | ||
1882 | ui32AllocFlags, | ||
1883 | (IMG_VOID **)&gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].pvCpuVAddr, | ||
1884 | &gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].hOSMemHandle) != PVRSRV_OK) | ||
1885 | { | ||
1886 | PVR_DPF((PVR_DBG_ERROR, "XProcWorkaroundAllocShareable: OSReservePhys failed")); | ||
1887 | return PVRSRV_ERROR_OUT_OF_MEMORY; | ||
1888 | } | ||
1889 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].sSysPAddr = sSysPAddr; | ||
1890 | } | ||
1891 | else | ||
1892 | { | ||
1893 | PVR_DPF((PVR_DBG_VERBOSE, | ||
1894 | "XProcWorkaroundAllocShareable: making a NEW allocation from OS")); | ||
1895 | |||
1896 | ui32AllocFlags &= ~PVRSRV_HAP_MAPTYPE_MASK; | ||
1897 | ui32AllocFlags |= PVRSRV_HAP_SINGLE_PROCESS; | ||
1898 | |||
1899 | |||
1900 | if (OSAllocPages(ui32AllocFlags, | ||
1901 | ui32Size, | ||
1902 | ui32PageSize, | ||
1903 | (IMG_VOID **)&gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].pvCpuVAddr, | ||
1904 | &gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].hOSMemHandle) != PVRSRV_OK) | ||
1905 | { | ||
1906 | PVR_DPF((PVR_DBG_ERROR, | ||
1907 | "XProcWorkaroundAllocShareable: OSAllocPages(0x%x) failed", | ||
1908 | ui32PageSize)); | ||
1909 | return PVRSRV_ERROR_OUT_OF_MEMORY; | ||
1910 | } | ||
1911 | } | ||
1912 | |||
1913 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].psArena = psArena; | ||
1914 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32AllocFlags = ui32AllocFlags; | ||
1915 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32Size = ui32Size; | ||
1916 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32PageSize = ui32PageSize; | ||
1917 | |||
1918 | *ppvCpuVAddr = gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].pvCpuVAddr; | ||
1919 | *phOSMemHandle = gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].hOSMemHandle; | ||
1920 | |||
1921 | gXProcWorkaroundShareData[gXProcWorkaroundShareIndex].ui32RefCount ++; | ||
1922 | |||
1923 | return PVRSRV_OK; | ||
1694 | } | 1924 | } |
1925 | } | ||
1695 | 1926 | ||
1696 | PDUMPFREEPAGES(pMapping->pBMHeap, | 1927 | static PVRSRV_ERROR XProcWorkaroundHandleToSI(IMG_HANDLE hOSMemHandle, IMG_UINT32 *pui32SI) |
1697 | pMapping->DevVAddr, | 1928 | { |
1698 | ui32PSize, | 1929 | |
1699 | pMapping->pBMHeap->sDevArena.ui32DataPageSize, | 1930 | IMG_UINT32 ui32SI; |
1700 | (IMG_HANDLE)pMapping, | 1931 | IMG_BOOL bFound; |
1701 | (pMapping->ui32Flags & PVRSRV_MEM_INTERLEAVED) ? IMG_TRUE : IMG_FALSE); | 1932 | IMG_BOOL bErrorDups; |
1702 | #endif | ||
1703 | 1933 | ||
1704 | psDeviceNode = pMapping->pBMHeap->pBMContext->psDeviceNode; | 1934 | bFound = IMG_FALSE; |
1935 | bErrorDups = IMG_FALSE; | ||
1705 | 1936 | ||
1706 | psDeviceNode->pfnMMUFree (pMapping->pBMHeap->pMMUHeap, pMapping->DevVAddr, IMG_CAST_TO_DEVVADDR_UINT(pMapping->uSize)); | 1937 | for (ui32SI = 0; ui32SI < XPROC_WORKAROUND_NUM_SHAREABLES; ui32SI++) |
1938 | { | ||
1939 | if (gXProcWorkaroundShareData[ui32SI].ui32RefCount>0 && gXProcWorkaroundShareData[ui32SI].hOSMemHandle == hOSMemHandle) | ||
1940 | { | ||
1941 | if (bFound) | ||
1942 | { | ||
1943 | bErrorDups = IMG_TRUE; | ||
1944 | } | ||
1945 | else | ||
1946 | { | ||
1947 | *pui32SI = ui32SI; | ||
1948 | bFound = IMG_TRUE; | ||
1949 | } | ||
1950 | } | ||
1951 | } | ||
1952 | |||
1953 | if (bErrorDups || !bFound) | ||
1954 | { | ||
1955 | return PVRSRV_ERROR_BM_BAD_SHAREMEM_HANDLE; | ||
1956 | } | ||
1957 | |||
1958 | return PVRSRV_OK; | ||
1959 | } | ||
1960 | |||
1961 | static IMG_VOID XProcWorkaroundFreeShareable(IMG_HANDLE hOSMemHandle) | ||
1962 | { | ||
1963 | IMG_UINT32 ui32SI = (IMG_UINT32)((IMG_UINTPTR_T)hOSMemHandle & 0xffffU); | ||
1964 | PVRSRV_ERROR eError; | ||
1965 | |||
1966 | eError = XProcWorkaroundHandleToSI(hOSMemHandle, &ui32SI); | ||
1967 | if (eError != PVRSRV_OK) | ||
1968 | { | ||
1969 | PVR_DPF((PVR_DBG_ERROR, "bad handle")); | ||
1970 | return; | ||
1971 | } | ||
1972 | |||
1973 | gXProcWorkaroundShareData[ui32SI].ui32RefCount --; | ||
1974 | |||
1975 | PVR_DPF((PVR_DBG_VERBOSE, "Reduced refcount of SI[%d] from %d to %d", | ||
1976 | ui32SI, gXProcWorkaroundShareData[ui32SI].ui32RefCount+1, gXProcWorkaroundShareData[ui32SI].ui32RefCount)); | ||
1977 | |||
1978 | if (gXProcWorkaroundShareData[ui32SI].ui32RefCount == 0) | ||
1979 | { | ||
1980 | if (gXProcWorkaroundShareData[ui32SI].psArena != IMG_NULL) | ||
1981 | { | ||
1982 | IMG_SYS_PHYADDR sSysPAddr; | ||
1983 | |||
1984 | if (gXProcWorkaroundShareData[ui32SI].pvCpuVAddr != IMG_NULL) | ||
1985 | { | ||
1986 | OSUnReservePhys(gXProcWorkaroundShareData[ui32SI].pvCpuVAddr, | ||
1987 | gXProcWorkaroundShareData[ui32SI].ui32Size, | ||
1988 | gXProcWorkaroundShareData[ui32SI].ui32AllocFlags, | ||
1989 | gXProcWorkaroundShareData[ui32SI].hOSMemHandle); | ||
1990 | } | ||
1991 | sSysPAddr = gXProcWorkaroundShareData[ui32SI].sSysPAddr; | ||
1992 | RA_Free (gXProcWorkaroundShareData[ui32SI].psArena, | ||
1993 | sSysPAddr.uiAddr, | ||
1994 | IMG_FALSE); | ||
1995 | } | ||
1996 | else | ||
1997 | { | ||
1998 | PVR_DPF((PVR_DBG_VERBOSE, "freeing OS memory")); | ||
1999 | OSFreePages(gXProcWorkaroundShareData[ui32SI].ui32AllocFlags, | ||
2000 | gXProcWorkaroundShareData[ui32SI].ui32PageSize, | ||
2001 | gXProcWorkaroundShareData[ui32SI].pvCpuVAddr, | ||
2002 | gXProcWorkaroundShareData[ui32SI].hOSMemHandle); | ||
2003 | } | ||
2004 | } | ||
1707 | } | 2005 | } |
1708 | 2006 | ||
2007 | |||
1709 | static IMG_BOOL | 2008 | static IMG_BOOL |
1710 | BM_ImportMemory (IMG_VOID *pH, | 2009 | BM_ImportMemory (IMG_VOID *pH, |
1711 | IMG_SIZE_T uRequestSize, | 2010 | IMG_SIZE_T uRequestSize, |
@@ -1720,7 +2019,7 @@ BM_ImportMemory (IMG_VOID *pH, | |||
1720 | IMG_BOOL bResult; | 2019 | IMG_BOOL bResult; |
1721 | IMG_SIZE_T uSize; | 2020 | IMG_SIZE_T uSize; |
1722 | IMG_SIZE_T uPSize; | 2021 | IMG_SIZE_T uPSize; |
1723 | IMG_UINT32 uDevVAddrAlignment = 0; | 2022 | IMG_SIZE_T uDevVAddrAlignment = 0; |
1724 | 2023 | ||
1725 | PVR_DPF ((PVR_DBG_MESSAGE, | 2024 | PVR_DPF ((PVR_DBG_MESSAGE, |
1726 | "BM_ImportMemory (pBMContext=0x%x, uRequestSize=0x%x, uFlags=0x%x, uAlign=0x%x)", | 2025 | "BM_ImportMemory (pBMContext=0x%x, uRequestSize=0x%x, uFlags=0x%x, uAlign=0x%x)", |
@@ -1771,6 +2070,103 @@ BM_ImportMemory (IMG_VOID *pH, | |||
1771 | uPSize = pMapping->uSize; | 2070 | uPSize = pMapping->uSize; |
1772 | } | 2071 | } |
1773 | 2072 | ||
2073 | if (uFlags & PVRSRV_MEM_XPROC) | ||
2074 | { | ||
2075 | IMG_UINT32 ui32Attribs = pBMHeap->ui32Attribs | PVRSRV_MEM_XPROC; | ||
2076 | IMG_BOOL bBadBackingStoreType; | ||
2077 | |||
2078 | bBadBackingStoreType = IMG_TRUE; | ||
2079 | |||
2080 | if ((ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) != 0) | ||
2081 | { | ||
2082 | #ifndef MAX | ||
2083 | #define MAX(a,b) ((a) > (b) ? (a) : (b)) | ||
2084 | #endif | ||
2085 | uDevVAddrAlignment = MAX(pBMHeap->sDevArena.ui32DataPageSize, HOST_PAGESIZE()); | ||
2086 | |||
2087 | |||
2088 | if (uPSize % uDevVAddrAlignment != 0) | ||
2089 | { | ||
2090 | PVR_DPF((PVR_DBG_ERROR, "Cannot use use this memory sharing workaround with allocations that might be suballocated")); | ||
2091 | goto fail_mapping_alloc; | ||
2092 | } | ||
2093 | uDevVAddrAlignment = 0; | ||
2094 | |||
2095 | |||
2096 | if (pMapping->ui32Flags & PVRSRV_HAP_CACHETYPE_MASK) | ||
2097 | { | ||
2098 | ui32Attribs &= ~PVRSRV_HAP_CACHETYPE_MASK; | ||
2099 | ui32Attribs |= (pMapping->ui32Flags & PVRSRV_HAP_CACHETYPE_MASK); | ||
2100 | } | ||
2101 | |||
2102 | |||
2103 | if (XProcWorkaroundAllocShareable(IMG_NULL, | ||
2104 | ui32Attribs, | ||
2105 | (IMG_UINT32)uPSize, | ||
2106 | pBMHeap->sDevArena.ui32DataPageSize, | ||
2107 | (IMG_VOID **)&pMapping->CpuVAddr, | ||
2108 | &pMapping->hOSMemHandle) != PVRSRV_OK) | ||
2109 | { | ||
2110 | PVR_DPF((PVR_DBG_ERROR, | ||
2111 | "BM_ImportMemory: XProcWorkaroundAllocShareable(0x%x) failed", | ||
2112 | uPSize)); | ||
2113 | goto fail_mapping_alloc; | ||
2114 | } | ||
2115 | |||
2116 | |||
2117 | |||
2118 | |||
2119 | pMapping->eCpuMemoryOrigin = hm_env; | ||
2120 | bBadBackingStoreType = IMG_FALSE; | ||
2121 | } | ||
2122 | |||
2123 | if ((ui32Attribs & PVRSRV_BACKINGSTORE_LOCALMEM_CONTIG) != 0) | ||
2124 | { | ||
2125 | uDevVAddrAlignment = pBMHeap->sDevArena.ui32DataPageSize; | ||
2126 | |||
2127 | if (uPSize % uDevVAddrAlignment != 0) | ||
2128 | { | ||
2129 | PVR_DPF((PVR_DBG_ERROR, "Cannot use use this memory sharing workaround with allocations that might be suballocated")); | ||
2130 | goto fail_mapping_alloc; | ||
2131 | } | ||
2132 | uDevVAddrAlignment = 0; | ||
2133 | |||
2134 | |||
2135 | if (pMapping->ui32Flags & PVRSRV_HAP_CACHETYPE_MASK) | ||
2136 | { | ||
2137 | ui32Attribs &= ~PVRSRV_HAP_CACHETYPE_MASK; | ||
2138 | ui32Attribs |= (pMapping->ui32Flags & PVRSRV_HAP_CACHETYPE_MASK); | ||
2139 | } | ||
2140 | |||
2141 | |||
2142 | if (XProcWorkaroundAllocShareable(pBMHeap->pLocalDevMemArena, | ||
2143 | ui32Attribs, | ||
2144 | (IMG_UINT32)uPSize, | ||
2145 | pBMHeap->sDevArena.ui32DataPageSize, | ||
2146 | (IMG_VOID **)&pMapping->CpuVAddr, | ||
2147 | &pMapping->hOSMemHandle) != PVRSRV_OK) | ||
2148 | { | ||
2149 | PVR_DPF((PVR_DBG_ERROR, | ||
2150 | "BM_ImportMemory: XProcWorkaroundAllocShareable(0x%x) failed", | ||
2151 | uPSize)); | ||
2152 | goto fail_mapping_alloc; | ||
2153 | } | ||
2154 | |||
2155 | |||
2156 | |||
2157 | |||
2158 | pMapping->eCpuMemoryOrigin = hm_env; | ||
2159 | bBadBackingStoreType = IMG_FALSE; | ||
2160 | } | ||
2161 | |||
2162 | if (bBadBackingStoreType) | ||
2163 | { | ||
2164 | PVR_DPF((PVR_DBG_ERROR, "Cannot use this memory sharing workaround with this type of backing store")); | ||
2165 | goto fail_mapping_alloc; | ||
2166 | } | ||
2167 | } | ||
2168 | else | ||
2169 | |||
1774 | 2170 | ||
1775 | 2171 | ||
1776 | if(pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) | 2172 | if(pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) |
@@ -1854,7 +2250,7 @@ BM_ImportMemory (IMG_VOID *pH, | |||
1854 | pMapping, | 2250 | pMapping, |
1855 | IMG_NULL, | 2251 | IMG_NULL, |
1856 | uFlags, | 2252 | uFlags, |
1857 | uDevVAddrAlignment, | 2253 | (IMG_UINT32)uDevVAddrAlignment, |
1858 | &pMapping->DevVAddr); | 2254 | &pMapping->DevVAddr); |
1859 | if (!bResult) | 2255 | if (!bResult) |
1860 | { | 2256 | { |
@@ -1892,7 +2288,12 @@ fail_dev_mem_alloc: | |||
1892 | uPSize = pMapping->uSize; | 2288 | uPSize = pMapping->uSize; |
1893 | } | 2289 | } |
1894 | 2290 | ||
1895 | if(pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) | 2291 | if (uFlags & PVRSRV_MEM_XPROC) |
2292 | { | ||
2293 | XProcWorkaroundFreeShareable(pMapping->hOSMemHandle); | ||
2294 | } | ||
2295 | else | ||
2296 | if(pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) | ||
1896 | { | 2297 | { |
1897 | OSFreePages(pBMHeap->ui32Attribs, | 2298 | OSFreePages(pBMHeap->ui32Attribs, |
1898 | uPSize, | 2299 | uPSize, |
@@ -1959,7 +2360,12 @@ BM_FreeMemory (IMG_VOID *h, IMG_UINTPTR_T _base, BM_MAPPING *psMapping) | |||
1959 | uPSize = psMapping->uSize; | 2360 | uPSize = psMapping->uSize; |
1960 | } | 2361 | } |
1961 | 2362 | ||
1962 | if(pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) | 2363 | if (psMapping->ui32Flags & PVRSRV_MEM_XPROC) |
2364 | { | ||
2365 | XProcWorkaroundFreeShareable(psMapping->hOSMemHandle); | ||
2366 | } | ||
2367 | else | ||
2368 | if(pBMHeap->ui32Attribs & PVRSRV_BACKINGSTORE_SYSMEM_NONCONTIG) | ||
1963 | { | 2369 | { |
1964 | OSFreePages(pBMHeap->ui32Attribs, | 2370 | OSFreePages(pBMHeap->ui32Attribs, |
1965 | uPSize, | 2371 | uPSize, |
@@ -2002,6 +2408,7 @@ IMG_VOID BM_GetPhysPageAddr(PVRSRV_KERNEL_MEM_INFO *psMemInfo, | |||
2002 | 2408 | ||
2003 | PVR_ASSERT((sDevVPageAddr.uiAddr & 0xFFF) == 0); | 2409 | PVR_ASSERT((sDevVPageAddr.uiAddr & 0xFFF) == 0); |
2004 | 2410 | ||
2411 | |||
2005 | psDeviceNode = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->pBMContext->psDeviceNode; | 2412 | psDeviceNode = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->pBMContext->psDeviceNode; |
2006 | 2413 | ||
2007 | *psDevPAddr = psDeviceNode->pfnMMUGetPhysPageAddr(((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->pMMUHeap, | 2414 | *psDevPAddr = psDeviceNode->pfnMMUGetPhysPageAddr(((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->pMMUHeap, |