summaryrefslogtreecommitdiffstats
path: root/pvr-source/services4/srvkm/env/linux/ion.c
diff options
context:
space:
mode:
authorEric Luong <x0119002@ti.com>2015-02-06 10:54:56 -0800
committerHashcode <hashcode0f@gmail.com>2015-02-06 10:59:59 -0800
commit391c312c8964088c512de2cfb1e29c78d245d06b (patch)
treebdef0b7ecb2ff0da3c9b5922fa358fca1bdbbe73 /pvr-source/services4/srvkm/env/linux/ion.c
parent882c2b4c53e1b2633700906b50c86d4b5f4ce274 (diff)
downloadhardware_ti_omap4-391c312c8964088c512de2cfb1e29c78d245d06b.tar.gz
hardware_ti_omap4-391c312c8964088c512de2cfb1e29c78d245d06b.tar.bz2
hardware_ti_omap4-391c312c8964088c512de2cfb1e29c78d245d06b.zip
IMG DDK 1.9@2166536 for Android
IMG DDK Release 1.9@2166536 for Android. Included in this release: - User space and Kernel module binaries - Kernel module source code TI's Patches: - 084d3db SGX-KM: sgxfreq: Enable on3demand governor as default - c1e1f93 SGX-KM: on3demand: Added polling based on timeout - 1baf19c Build: Compile OMAP4 kernel modules with arm-eabi toolchain - e166956 Build: Add production build option to build script - 9efd5d3 SGX UM: Properly update vertex shader constants when recompiled - f6e71f1 Revert "Build: Add optional flag to disable uKernel logging" - a49e042 SGXKM: Inherit PVRSRV_HAP_GPU_PAGEABLE flag - f05da87 SGXUM: Creates a new PVRSRV_HAP MAPPING CTRL mask - 0e6ac23 SGXKM: Creates a new PVRSRV_HAP MAPPING CTRL mask - 5044cbb SGXKM: Divorce Sparse Mapping from GPU Pageable - 4abdd37 SGX-KM: sgxfreq: Header for GPL license - 7a1e61b gpu: thermal: adding cooling device for "case" management - 1221aba SGX-KM: Add 'userspace' governor to sgxfreq - 7cc1319 SGX-KM: Add on3demand governor to sgxfreq - c3283ff SGX-KM: Allow sgxfreq active notification when prev state was active - 7275e62 SGX-KM: Add idle and active time caluclation to sgxfreq - e15265c SGX-KM: Add frame_done interface to sgxfreq - a021f10 SGX-KM: Add activeidle governor to sgxfreq - bbdceee SGX-KM: Add active/idle notification to sgxfreq - 4e1e8d9 SGX-UM: Rework SGX idle notification - fce3459 SGX-KM: Rework SGX idle notification - 17cdf8c SGX-KM: Add onoff governor to sgxfreq - 403caa1 SGX-KM: Add cooling device interface to sgxfreq - 1d785b8 SGX-KM: Add sgxfreq subsystem for DVFS control - 14de6d8 Build: Add optional flag to disable uKernel logging - 374bea1 SGX UM: Set ro.product.processor before loading modules - 91d286d SGX UM: Pvrsrvinit fix typo in remount command - 3d08869 SGX UM: Remove BRN32044 for omap5 - 086f52b OMAP5: WA: Race condition when SGX is powered down - 1a904c2 SGX KM: ShrinkPagePool statistics changed to PVR_DBG_MESSAGE - fbf2890 SGX KM: Fix num_handle calculation for ion handles - 322af97 BUILD: fix usage and help - 50440d3 BUILD: Add install option "adb" - ee66bfb pvr-km: gc: Add page offset for ion allocated buffers - be4fe11 pvr-km: gc: Improve gc map/unmap logging - 51da16d gralloc: Map NV12 buffers with the GC MMU - 210b590 SGX-KM: Enable APM for OMAP5 - 31e2f05 SGX-UM: Enable APM for OMAP5 - a98b81b SGX-UM: Don't load omaplfb module when in-kernel driver is present - b20f5c6 SGX-KM: Support in-kernel omaplfb - 0955f19 SGXKM: Multi-plane support for deviceclass i-face - 11f6682 build: remove omaplfb from install step - 9ecd6e0 pvr-um: use arm-linux-androideabi- and fix JB debug build - abef31d PVR-UM: Make pvrsrvinit wrapper compatible with Jellybean - 5b4e4f0 Revert "SGXUM: Implements Gralloc late CPU mapping" - 5f25289 SGX-UM: build - Remove target platform based configuration - 9d5ac31 OMAP5: BUILD: Remove unused variable - 5365b64 readme: Correct DDK version - 8095cc6 SGX-UM: Add support for hardware specific powervr.ini files - 7e13d26 PVR-UM: Add support to DDK for powervr.ini files - e545f59 SGX-UM: Added 16 bit depth EGL configs - 27da0ae SGX UM: Srvinit block until services ready - ba35538 SGX UM: HAL block OpenPVRServices until services initialized - 43f8c1f SGX UM: Fix calculation of chroma plane in blit_internal - f6a6944 SGX KM: Dump dsscomp info during HW recovery - fc6d85b SGXKM: Adds support for 1D buffer allocation - d8d061b SGXKM: Do not perform explicit invalidate on mmap - 3ac6e1f SGXUM: Implements Gralloc late CPU mapping - b621744 SGXUM: Gralloc allow for late or no GPU mapping - dde30cf SGXUM: Add allocation of images from system heap - 552c0f5 SGXUM: Adds A8/U8/Y8 color format to WSEGL - f1c7822 SGXKM: Increase XPROC_WORKAROUND to 500 - 65f61bf SGXKM: Fix cc-check.sh file permissions - 0dfe392 SGXKM: Make the DMM offset optional - 946eb30 gralloc: add support for GRALLOC_USAGE_EXCLUSIVE_DISP - 5cf7248 gralloc: publicly define omap specific usage flags - afcb9bd SGX-KM: Block DPLL cascading when SGX clock is enabled - 616ff0b SGX-KM: Hold wake lock during hardware recovery - 872b4c0 SGXKM: Fix NULL handle warning when blitting GC320 - 39de55c SGXKM: Allow for late or no GPU mapping - d229a7b SGXKM: Allow for SW access to a tiler buffer - 7024790 SGXUM: Adds YUV plane offsets for MM - d202649 SGXKM: SGX Tiler non-page-aligned support - 2b2ac18 SGXUM: Implements GPU Common Buffer Interface - 86cd052 SGXUM: Multi-buffer manage bridge - d272c49 SGXKM: Multi-buffer manage bridge - 4d8facf SGXKM: Implements Heap Alloc Failure Report - 6d4253a SGXUM: Add support for GPU unmap/remap - 64f4805 SGXKM: Add support for GPU unmap/remap - 5425356 SGX-KM: Use CONFIG_DRM_OMAP_DMM_TILER for kernel 3.4 - 853be19 SGX-KM: Use pud_offset to get pmd_offset - 5ec5d70 PVR-KM: Prevent compilation of dc_omapfb3_linux - 1bbe8a2 SGX-KM: Remove hardcoding of values in egl.cfg - 83b8af6 pvr-km: kfree phys info at unmap instead of map - f347fb9 pvr-km: add a struct size to the physical descriptor - 6ccff8f gralloc: Set flag to enable GC MMU mapping in PVR services - 0cfaa6d PVR-KM: Add function to obtain BV descriptor through 3PDC interface - c8f4c5f PVR-KM: Map buffers to GC core MMU on allocation time with Bltsville - 65b2b84 SGXKM: Prevent mapping of export with zero ref - f4cc0a2 OMAP4-SGX-UM: Allow for tiler buffer SW access - 5c97ded OMAP4-SGX-UM: Gralloc SW access and caching flags - bbf5424 OMAP4-SGX-UM: Gralloc HAL_PIXEL_FORMAT_NV12 format - ec6cc69 SGX-KM: Make PVRSRVExportFDToIONHandles generic and register it with ion - 8c1255d PVR-KM: OMAP5: Use shared device for Tiler 2D Mappings - 2391ac8 PVR-KM: OMAP5: Hardcode core version value - 7d87962 SGX-KM: OMAP5: HACK: Set the size of the SGX registers - 9f40224 SGX-UM: add detection of OMAP5432 in pvrsrvinit - f75d48b SGX-UM: build: Add panda5 and omap5sevm to product list - c23eff9 SGX-KM: BUILD: Add OMAP5 support - 5cc4ade SGX-UM: BUILD: Consolidate build into a single Makefile - 2c6a2f6 SGX-KM: (build) Remove Android product and version dependency - 6f54fe8 Build: Don't install egl.cfg anymore - a49c59c SGX-KM: egl.cfg sysfs entry - c759928 SGX-KM: Enable DPF, TRACE and ASSERT - 1628094 build-km: Enable blaze and blaze_tablet for ICS environment - 05f00eb build: Enable blaze and blaze_tablet for ICS environment - 542e279 SGX-KM: Add ability to build multiple sets of GFX kernel modules - 69d3661 build: Set correct load directory for kernel modules. - 2dfe14b KM: add support for sgx544sc - 58f317a SGX-UM: Add ability to build multiple sets of GFX binaries - 04e5deb SGX-KM: Use platform data for OPP symbols. - 5eed373 SGX-UM: Enable building binaries for specific SGX - 0801be2 readme: Add README - 649d010 build: Add build_DDK.sh - fe34640 Create gitignore file - 519ca9a IMG DDK 1.9@2166536 for Android Change-Id: I4a060344fa134a2484d1b7a69fc87963455e9e34 Signed-off-by: Eric Luong <x0119002@ti.com>
Diffstat (limited to 'pvr-source/services4/srvkm/env/linux/ion.c')
-rw-r--r--pvr-source/services4/srvkm/env/linux/ion.c363
1 files changed, 363 insertions, 0 deletions
diff --git a/pvr-source/services4/srvkm/env/linux/ion.c b/pvr-source/services4/srvkm/env/linux/ion.c
new file mode 100644
index 0000000..3e772bc
--- /dev/null
+++ b/pvr-source/services4/srvkm/env/linux/ion.c
@@ -0,0 +1,363 @@
+/*************************************************************************/ /*!
+@Title Ion driver inter-operability code.
+@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
+@License Dual MIT/GPLv2
+
+The contents of this file are subject to the MIT license as set out below.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+Alternatively, the contents of this file may be used under the terms of
+the GNU General Public License Version 2 ("GPL") in which case the provisions
+of GPL are applicable instead of those above.
+
+If you wish to allow use of your version of this file only under the terms of
+GPL, and not to allow others to use your version of this file under the terms
+of the MIT license, indicate your decision by deleting the provisions above
+and replace them with the notice and other provisions required by GPL as set
+out in the file called "GPL-COPYING" included in this distribution. If you do
+not delete the provisions above, a recipient may use your version of this file
+under the terms of either the MIT license or GPL.
+
+This License is also included in this distribution in the file called
+"MIT-COPYING".
+
+EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
+PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/ /**************************************************************************/
+
+#include "ion.h"
+
+#include "services.h"
+#include "servicesint.h"
+#include "mutex.h"
+#include "lock.h"
+#include "mm.h"
+#include "handle.h"
+#include "perproc.h"
+#include "env_perproc.h"
+#include "private_data.h"
+#include "pvr_debug.h"
+
+#include <linux/module.h>
+#include <linux/file.h>
+#include <linux/fs.h>
+
+#if defined (CONFIG_ION_OMAP)
+#define MAX_HANDLES_PER_FD 2
+extern struct ion_client *gpsIONClient;
+
+int PVRSRVExportFDToIONHandles(int fd, struct ion_client **client,
+ struct ion_handle **handles,
+ unsigned int *num_handles)
+{
+ PVRSRV_FILE_PRIVATE_DATA *psPrivateData;
+ PVRSRV_KERNEL_MEM_INFO *psKernelMemInfo;
+ LinuxMemArea *psLinuxMemArea;
+ PVRSRV_ERROR eError;
+ struct file *psFile;
+ int i;
+ unsigned int ui32NumHandles = *num_handles;
+ int ret = -EINVAL;
+
+ /* Take the bridge mutex so the handle won't be freed underneath us */
+ LinuxLockMutex(&gPVRSRVLock);
+
+ psFile = fget(fd);
+ if(!psFile)
+ goto err_unlock;
+
+ psPrivateData = psFile->private_data;
+ if(!psPrivateData)
+ {
+ PVR_DPF((PVR_DBG_ERROR, "%s: struct file* has no private_data; "
+ "invalid export handle", __func__));
+ goto err_fput;
+ }
+
+ eError = PVRSRVLookupHandle(KERNEL_HANDLE_BASE,
+ (IMG_PVOID *)&psKernelMemInfo,
+ psPrivateData->hKernelMemInfo,
+ PVRSRV_HANDLE_TYPE_MEM_INFO);
+ if(eError != PVRSRV_OK)
+ {
+ PVR_DPF((PVR_DBG_ERROR, "%s: Failed to look up MEM_INFO handle",
+ __func__));
+ goto err_fput;
+ }
+
+ psLinuxMemArea = (LinuxMemArea *)psKernelMemInfo->sMemBlk.hOSMemHandle;
+ BUG_ON(psLinuxMemArea == IMG_NULL);
+
+ if(psLinuxMemArea->eAreaType != LINUX_MEM_AREA_ION)
+ {
+ PVR_DPF((PVR_DBG_ERROR, "%s: Valid handle, but not an ION buffer",
+ __func__));
+ goto err_fput;
+ }
+
+ /* Client is requesting fewer handles then we have */
+ if(ui32NumHandles < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes) {
+
+ PVR_DPF((PVR_DBG_ERROR, "%s: Client requested %u handles, but we have %u",
+ __func__,
+ ui32NumHandles,
+ psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes));
+
+ /* Clear client handles */
+ for (i = 0; i < ui32NumHandles; i++)
+ handles[i] = NULL;
+
+ /* Return number of handles to client */
+ *num_handles = psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes;
+ goto err_fput;
+ }
+
+ for (i = 0; (i < psLinuxMemArea->uData.sIONTilerAlloc.ui32NumValidPlanes) && (i < MAX_HANDLES_PER_FD); i++)
+ handles[i] = psLinuxMemArea->uData.sIONTilerAlloc.psIONHandle[i];
+
+ *num_handles = i;
+
+ if(client)
+ *client = gpsIONClient;
+
+ ret = 0;
+
+err_fput:
+ fput(psFile);
+err_unlock:
+ /* Allow PVRSRV clients to communicate with srvkm again */
+ LinuxUnLockMutex(&gPVRSRVLock);
+
+ return ret;
+}
+
+struct ion_handle *
+PVRSRVExportFDToIONHandle(int fd, struct ion_client **client)
+{
+ unsigned int num_handles = 1;
+ struct ion_handle *psHandle = IMG_NULL;
+ PVRSRVExportFDToIONHandles(fd, client, &psHandle, &num_handles);
+ return psHandle;
+}
+
+EXPORT_SYMBOL(PVRSRVExportFDToIONHandles);
+EXPORT_SYMBOL(PVRSRVExportFDToIONHandle);
+#endif
+
+#if defined (SUPPORT_ION)
+#include "syscommon.h"
+#include "env_data.h"
+#include "../drivers/gpu/ion/ion_priv.h"
+#include "linux/kernel.h"
+
+struct ion_heap **apsIonHeaps;
+struct ion_device *psIonDev;
+
+static struct ion_platform_data generic_config = {
+ .nr = 2,
+ .heaps = {
+ {
+ .type = ION_HEAP_TYPE_SYSTEM_CONTIG,
+ .name = "System contig",
+ .id = ION_HEAP_TYPE_SYSTEM_CONTIG,
+ },
+ {
+ .type = ION_HEAP_TYPE_SYSTEM,
+ .name = "System",
+ .id = ION_HEAP_TYPE_SYSTEM,
+ }
+ }
+};
+
+PVRSRV_ERROR IonInit(IMG_VOID)
+{
+ int uiHeapCount = generic_config.nr;
+ int uiError;
+ int i;
+
+ apsIonHeaps = kzalloc(sizeof(struct ion_heap *) * uiHeapCount, GFP_KERNEL);
+ /* Create the ion devicenode */
+ psIonDev = ion_device_create(NULL);
+ if (IS_ERR_OR_NULL(psIonDev)) {
+ kfree(apsIonHeaps);
+ return PVRSRV_ERROR_OUT_OF_MEMORY;
+ }
+
+ /* Register all the heaps */
+ for (i = 0; i < generic_config.nr; i++)
+ {
+ struct ion_platform_heap *psPlatHeapData = &generic_config.heaps[i];
+
+ apsIonHeaps[i] = ion_heap_create(psPlatHeapData);
+ if (IS_ERR_OR_NULL(apsIonHeaps[i]))
+ {
+ uiError = PTR_ERR(apsIonHeaps[i]);
+ goto failHeapCreate;
+ }
+ ion_device_add_heap(psIonDev, apsIonHeaps[i]);
+ }
+
+ return PVRSRV_OK;
+failHeapCreate:
+ for (i = 0; i < uiHeapCount; i++) {
+ if (apsIonHeaps[i])
+ {
+ ion_heap_destroy(apsIonHeaps[i]);
+ }
+ }
+ kfree(apsIonHeaps);
+ return PVRSRV_ERROR_OUT_OF_MEMORY;
+}
+
+IMG_VOID IonDeinit(IMG_VOID)
+{
+ int uiHeapCount = generic_config.nr;
+ int i;
+
+ for (i = 0; i < uiHeapCount; i++) {
+ if (apsIonHeaps[i])
+ {
+ ion_heap_destroy(apsIonHeaps[i]);
+ }
+ }
+ kfree(apsIonHeaps);
+ ion_device_destroy(psIonDev);
+}
+
+typedef struct _ION_IMPORT_DATA_
+{
+ struct ion_client *psIonClient;
+ struct ion_handle *psIonHandle;
+ IMG_PVOID pvKernAddr;
+} ION_IMPORT_DATA;
+
+PVRSRV_ERROR IonImportBufferAndAquirePhysAddr(IMG_HANDLE hIonDev,
+ IMG_HANDLE hIonFD,
+ IMG_UINT32 *pui32PageCount,
+ IMG_SYS_PHYADDR **ppasSysPhysAddr,
+ IMG_PVOID *ppvKernAddr,
+ IMG_HANDLE *phPriv)
+{
+ struct ion_client *psIonClient = hIonDev;
+ struct ion_handle *psIonHandle;
+ struct scatterlist *psScatterList;
+ struct scatterlist *psTemp;
+ IMG_SYS_PHYADDR *pasSysPhysAddr = NULL;
+ ION_IMPORT_DATA *psImportData;
+ PVRSRV_ERROR eError;
+ IMG_UINT32 ui32PageCount = 0;
+ IMG_UINT32 i;
+ IMG_PVOID pvKernAddr;
+ int fd = (int) hIonFD;
+
+ psImportData = kmalloc(sizeof(ION_IMPORT_DATA), GFP_KERNEL);
+ if (psImportData == NULL)
+ {
+ return PVRSRV_ERROR_OUT_OF_MEMORY;
+ }
+
+ /* Get the buffer handle */
+ psIonHandle = ion_import_fd(psIonClient, fd);
+ if (psIonHandle == IMG_NULL)
+ {
+ eError = PVRSRV_ERROR_BAD_MAPPING;
+ goto exitFailImport;
+ }
+
+ /* Create data for free callback */
+ psImportData->psIonClient = psIonClient;
+ psImportData->psIonHandle = psIonHandle;
+
+ psScatterList = ion_map_dma(psIonClient, psIonHandle);
+ if (psScatterList == NULL)
+ {
+ eError = PVRSRV_ERROR_INVALID_PARAMS;
+ goto exitFailMap;
+ }
+
+ /*
+ We do a two pass process, 1st workout how many pages there
+ are, 2nd fill in the data.
+ */
+ for (i=0;i<2;i++)
+ {
+ psTemp = psScatterList;
+ if (i == 1)
+ {
+ pasSysPhysAddr = kmalloc(sizeof(IMG_SYS_PHYADDR) * ui32PageCount, GFP_KERNEL);
+ if (pasSysPhysAddr == NULL)
+ {
+ eError = PVRSRV_ERROR_OUT_OF_MEMORY;
+ goto exitFailAlloc;
+ }
+ ui32PageCount = 0; /* Reset the page count a we use if for the index */
+ }
+
+ while(psTemp)
+ {
+ IMG_UINT32 j;
+
+ for (j=0;j<psTemp->length;j+=PAGE_SIZE)
+ {
+ if (i == 1)
+ {
+ /* Pass 2: Get the page data */
+ pasSysPhysAddr[ui32PageCount].uiAddr = sg_phys(psTemp);
+ }
+ ui32PageCount++;
+ }
+ psTemp = sg_next(psTemp);
+ }
+ }
+
+ pvKernAddr = ion_map_kernel(psIonClient, psIonHandle);
+ if (IS_ERR(pvKernAddr))
+ {
+ pvKernAddr = IMG_NULL;
+ }
+
+ psImportData->pvKernAddr = pvKernAddr;
+
+ *ppvKernAddr = pvKernAddr;
+ *pui32PageCount = ui32PageCount;
+ *ppasSysPhysAddr = pasSysPhysAddr;
+ *phPriv = psImportData;
+ return PVRSRV_OK;
+
+exitFailAlloc:
+ ion_unmap_dma(psIonClient, psIonHandle);
+exitFailMap:
+ ion_free(psIonClient, psIonHandle);
+exitFailImport:
+ kfree(psImportData);
+ return eError;
+}
+
+
+IMG_VOID IonUnimportBufferAndReleasePhysAddr(IMG_HANDLE hPriv)
+{
+ ION_IMPORT_DATA *psImportData = hPriv;
+
+ ion_unmap_dma(psImportData->psIonClient, psImportData->psIonHandle);
+ if (psImportData->pvKernAddr)
+ {
+ ion_unmap_kernel(psImportData->psIonClient, psImportData->psIonHandle);
+ }
+ ion_free(psImportData->psIonClient, psImportData->psIonHandle);
+ kfree(psImportData);
+}
+#endif