aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/pvr/buffer_manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/pvr/buffer_manager.c')
-rw-r--r--drivers/gpu/pvr/buffer_manager.c453
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
1677DevMemoryFree (BM_MAPPING *pMapping) 1690DevMemoryFree (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
1730static IMG_UINT32 gXProcWorkaroundShareIndex = XPROC_WORKAROUND_BAD_SHAREINDEX;
1731
1732
1733static 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
1744PVRSRV_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
1760PVRSRV_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
1781PVRSRV_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
1804static PVRSRV_ERROR
1805XProcWorkaroundAllocShareable(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, 1927static 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
1961static 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
1709static IMG_BOOL 2008static IMG_BOOL
1710BM_ImportMemory (IMG_VOID *pH, 2009BM_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,