]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android/vendor-ti-am57x.git/blobdiff - sgx_km/eurasia_km/services4/srvkm/devices/sgx/mmu.h
sgx_km: Build SGX KM from source
[android/vendor-ti-am57x.git] / sgx_km / eurasia_km / services4 / srvkm / devices / sgx / mmu.h
diff --git a/sgx_km/eurasia_km/services4/srvkm/devices/sgx/mmu.h b/sgx_km/eurasia_km/services4/srvkm/devices/sgx/mmu.h
new file mode 100644 (file)
index 0000000..3c849fc
--- /dev/null
@@ -0,0 +1,501 @@
+/*************************************************************************/ /*!
+@Title          MMU Management
+@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
+@Description    Implements basic low level control of MMU.
+@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.
+*/ /**************************************************************************/
+
+#ifndef _MMU_H_
+#define _MMU_H_
+
+#include "sgxinfokm.h"
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_Initialise
+
+       PURPOSE:    Initialise the mmu module.
+                               
+       PARAMETERS:     None
+       RETURNS:        PVRSRV_ERROR
+******************************************************************************/
+PVRSRV_ERROR
+MMU_Initialise (PVRSRV_DEVICE_NODE *psDeviceNode, MMU_CONTEXT **ppsMMUContext, IMG_DEV_PHYADDR *psPDDevPAddr);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_Finalise
+
+       PURPOSE:    Finalise the mmu module, deallocate all resources.
+                               
+       PARAMETERS:     None.
+       RETURNS:        None.
+******************************************************************************/
+IMG_VOID
+MMU_Finalise (MMU_CONTEXT *psMMUContext);
+
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_InsertHeap
+
+       PURPOSE:    Inserts shared heap into the specified context 
+                               from the kernel context
+                               
+       PARAMETERS:     None.
+       RETURNS:        None.
+******************************************************************************/
+IMG_VOID
+MMU_InsertHeap(MMU_CONTEXT *psMMUContext, MMU_HEAP *psMMUHeap);
+
+/*
+******************************************************************************
+    FUNCTION:   MMU_Create
+
+    PURPOSE:    Create an mmu device.
+
+    PARAMETERS: In: psMMUContext -
+                In: psDevArena - 
+                               Out: ppsVMArena
+    RETURNS:   MMU_HEAP
+******************************************************************************/
+MMU_HEAP *
+MMU_Create (MMU_CONTEXT *psMMUContext,
+                       DEV_ARENA_DESCRIPTOR *psDevArena,
+                       RA_ARENA **ppsVMArena,
+                       PDUMP_MMU_ATTRIB **ppsMMUAttrib);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_Delete
+
+       PURPOSE:    Delete an mmu device.
+                               
+       PARAMETERS:     In:  pMMUHeap - The mmu to delete.
+       RETURNS:        
+******************************************************************************/
+IMG_VOID
+MMU_Delete (MMU_HEAP *pMMUHeap);
+
+/*
+******************************************************************************
+    FUNCTION:   MMU_Alloc
+    PURPOSE:    Allocate space in an mmu's virtual address space.
+    PARAMETERS:        In:  pMMUHeap - MMU to allocate on.
+                In:  uSize - Size in bytes to allocate.
+                Out: pActualSize - If non null receives actual size allocated. 
+                In:  uFlags - Allocation flags.
+                In:  uDevVAddrAlignment - Required alignment.
+                Out: pDevVAddr - Receives base address of allocation.
+    RETURNS:   IMG_TRUE - Success
+                IMG_FALSE - Failure
+******************************************************************************/
+IMG_BOOL
+MMU_Alloc (MMU_HEAP *pMMUHeap,
+           IMG_SIZE_T uSize,
+           IMG_SIZE_T *pActualSize,
+           IMG_UINT32 uFlags,
+                  IMG_UINT32 uDevVAddrAlignment,
+           IMG_DEV_VIRTADDR *pDevVAddr);
+
+/*
+******************************************************************************
+    FUNCTION:   MMU_Free
+    PURPOSE:    Frees space in an mmu's virtual address space.
+    PARAMETERS:        In: pMMUHeap - MMU to free on.
+                In: DevVAddr - Base address of allocation.
+    RETURNS:   IMG_TRUE - Success
+                IMG_FALSE - Failure
+******************************************************************************/
+IMG_VOID
+MMU_Free (MMU_HEAP *pMMUHeap,
+          IMG_DEV_VIRTADDR DevVAddr,
+                 IMG_UINT32 ui32Size);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_Enable
+
+       PURPOSE:    Enable an mmu. Establishes pages tables and takes the mmu out
+                   of bypass and waits for the mmu to acknowledge enabled.
+                               
+       PARAMETERS:     In:  pMMUHeap - the mmu
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID 
+MMU_Enable (MMU_HEAP *pMMUHeap);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_Disable
+
+       PURPOSE:    Disable an mmu, takes the mmu into bypass.
+                               
+       PARAMETERS:     In:  pMMUHeap - the mmu
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID 
+MMU_Disable (MMU_HEAP *pMMUHeap);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_MapPages
+
+       PURPOSE:    Create a mapping for a range of pages from a device physical
+                adddress to a specified device virtual address.
+
+       PARAMETERS:     In:  pMMUHeap - the mmu.
+                   In:  DevVAddr - the device virtual address.
+                   In:  SysPAddr - the system physical address of the page to map.
+                   In:  uSize - size of memory range in bytes
+                In:  ui32MemFlags - page table flags.
+                   In:  hUniqueTag - A unique ID for use as a tag identifier 
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID
+MMU_MapPages (MMU_HEAP *pMMUHeap,
+                         IMG_DEV_VIRTADDR DevVAddr,
+                         IMG_SYS_PHYADDR SysPAddr,
+                         IMG_SIZE_T uSize,
+                         IMG_UINT32 ui32MemFlags,
+                         IMG_HANDLE hUniqueTag);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_MapPagesSparse
+
+       PURPOSE:    Create a mapping for a range of pages from a device physical
+                adddress to a specified device virtual address.
+
+       PARAMETERS:     In:  pMMUHeap - the mmu.
+                   In:  DevVAddr - the device virtual address.
+                   In:  SysPAddr - the system physical address of the page to map.
+                               In:  ui32ChunkSize - Size of the chunk (must be page multiple)
+                               In:  ui32NumVirtChunks - Number of virtual chunks
+                               In:  ui32NumPhysChunks - Number of physical chunks
+                               In:  pabMapChunk - Mapping array
+                In:  ui32MemFlags - page table flags.
+                   In:  hUniqueTag - A unique ID for use as a tag identifier 
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID
+MMU_MapPagesSparse (MMU_HEAP *pMMUHeap,
+                                       IMG_DEV_VIRTADDR DevVAddr,
+                                       IMG_SYS_PHYADDR SysPAddr,
+                                       IMG_UINT32 ui32ChunkSize,
+                                       IMG_UINT32 ui32NumVirtChunks,
+                                       IMG_UINT32 ui32NumPhysChunks,
+                                       IMG_BOOL *pabMapChunk,
+                                       IMG_UINT32 ui32MemFlags,
+                                       IMG_HANDLE hUniqueTag);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_MapShadow
+
+       PURPOSE:    Create a mapping for a range of pages from a CPU virtual
+                adddress to a specified device virtual address.
+                               
+       PARAMETERS: In:  pMMUHeap - the mmu.
+                In:  MapBaseDevVAddr - A page aligned device virtual address
+                                       to start mapping from.
+                In:  uByteSize - A page aligned mapping length in bytes.
+                In:  CpuVAddr - A page aligned CPU virtual address.
+                In:  hOSMemHandle - An alternative OS specific memory handle
+                                    for mapping RAM without a CPU virtual
+                                    address
+                Out: pDevVAddr - deprecated
+                In: hUniqueTag - A unique ID for use as a tag identifier
+                In: ui32MemFlags - page table flags.
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID
+MMU_MapShadow (MMU_HEAP          * pMMUHeap,
+               IMG_DEV_VIRTADDR    MapBaseDevVAddr,
+               IMG_SIZE_T          uByteSize,
+               IMG_CPU_VIRTADDR    CpuVAddr,
+               IMG_HANDLE          hOSMemHandle,
+               IMG_DEV_VIRTADDR  * pDevVAddr,
+               IMG_UINT32          ui32MemFlags,
+               IMG_HANDLE          hUniqueTag);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_MapShadowSparse
+
+       PURPOSE:    Create a mapping for a range of pages from a CPU virtual
+                adddress to a specified device virtual address.
+                               
+       PARAMETERS: In:  pMMUHeap - the mmu.
+                In:  MapBaseDevVAddr - A page aligned device virtual address
+                                       to start mapping from.
+                               In:  ui32ChunkSize - Size of the chunk (must be page multiple)
+                               In:  ui32NumVirtChunks - Number of virtual chunks
+                               In:  ui32NumPhysChunks - Number of physical chunks
+                               In:  pabMapChunk - Mapping array
+                In:  CpuVAddr - A page aligned CPU virtual address.
+                In:  hOSMemHandle - An alternative OS specific memory handle
+                                    for mapping RAM without a CPU virtual
+                                    address
+                Out: pDevVAddr - deprecated
+                In: hUniqueTag - A unique ID for use as a tag identifier
+                In: ui32MemFlags - page table flags.
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID
+MMU_MapShadowSparse (MMU_HEAP          * pMMUHeap,
+                                        IMG_DEV_VIRTADDR    MapBaseDevVAddr,
+                                        IMG_UINT32          ui32ChunkSize,
+                                        IMG_UINT32          ui32NumVirtChunks,
+                                        IMG_UINT32          ui32NumPhysChunks,
+                                        IMG_BOOL          * pabMapChunk,
+                                        IMG_CPU_VIRTADDR    CpuVAddr,
+                                        IMG_HANDLE          hOSMemHandle,
+                                        IMG_DEV_VIRTADDR  * pDevVAddr,
+                                        IMG_UINT32          ui32MemFlags,
+                                        IMG_HANDLE          hUniqueTag);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_UnmapPages
+
+       PURPOSE:    unmaps pages and invalidates virtual address.
+                               
+       PARAMETERS:     In:  psMMUHeap - the mmu.
+                   In:  sDevVAddr - the device virtual address.
+                   In:  ui32PageCount - page count.
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID
+MMU_UnmapPages (MMU_HEAP *psMMUHeap,
+             IMG_DEV_VIRTADDR sDevVAddr,
+             IMG_UINT32 ui32PageCount,
+             IMG_HANDLE hUniqueTag);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_MapScatter
+
+       PURPOSE:    Create a mapping for a list of pages to a specified device 
+                               virtual address.
+                               
+       PARAMETERS:     In:  pMMUHeap - the mmu.
+                   In:  DevVAddr - the device virtual address.
+                   In:  psSysAddr - the list of physical addresses of the pages to
+                        map.
+       RETURNS:        None
+******************************************************************************/
+IMG_VOID
+MMU_MapScatter (MMU_HEAP *pMMUHeap,
+                               IMG_DEV_VIRTADDR DevVAddr,
+                               IMG_SYS_PHYADDR *psSysAddr,
+                               IMG_SIZE_T uSize,
+                               IMG_UINT32 ui32MemFlags,
+                               IMG_HANDLE hUniqueTag);
+
+
+/*
+******************************************************************************
+    FUNCTION:   MMU_GetPhysPageAddr
+
+    PURPOSE:    extracts physical address from MMU page tables
+
+    PARAMETERS: In:  pMMUHeap - the mmu
+       PARAMETERS: In:  sDevVPageAddr - the virtual address to extract physical 
+                                       page mapping from
+    RETURNS:    IMG_DEV_PHYADDR
+******************************************************************************/
+IMG_DEV_PHYADDR
+MMU_GetPhysPageAddr(MMU_HEAP *pMMUHeap, IMG_DEV_VIRTADDR sDevVPageAddr);
+
+
+/*
+******************************************************************************
+    FUNCTION:   MMU_GetPDDevPAddr
+
+    PURPOSE:    returns PD given the MMU context (SGX to MMU API)
+
+    PARAMETERS: In:  pMMUContext - the mmu
+    RETURNS:    IMG_DEV_PHYADDR
+******************************************************************************/
+IMG_DEV_PHYADDR
+MMU_GetPDDevPAddr(MMU_CONTEXT *pMMUContext);
+
+
+#ifdef SUPPORT_SGX_MMU_BYPASS
+/*
+******************************************************************************
+    FUNCTION:   EnableHostAccess
+
+    PURPOSE:    Enables Host accesses to device memory, by passing the device 
+                       MMU address translation
+
+    PARAMETERS: In: psMMUContext
+    RETURNS:    None
+******************************************************************************/
+IMG_VOID
+EnableHostAccess (MMU_CONTEXT *psMMUContext);
+
+
+/*
+******************************************************************************
+    FUNCTION:   DisableHostAccess
+
+    PURPOSE:    Disables Host accesses to device memory, by passing the device 
+                       MMU address translation
+
+    PARAMETERS: In: psMMUContext
+    RETURNS:    None
+******************************************************************************/
+IMG_VOID
+DisableHostAccess (MMU_CONTEXT *psMMUContext);
+#endif
+
+/*
+******************************************************************************
+    FUNCTION:   MMU_InvalidateDirectoryCache
+
+    PURPOSE:    Invalidates the page directory cache
+
+    PARAMETERS: In: psDevInfo
+    RETURNS:    None
+******************************************************************************/
+IMG_VOID MMU_InvalidateDirectoryCache(PVRSRV_SGXDEV_INFO *psDevInfo);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_BIFResetPDAlloc
+
+       PURPOSE:    Allocate a dummy Page Directory which causes all virtual
+                               addresses to page fault.
+
+       PARAMETERS: In:  psDevInfo - device info
+       RETURNS:    PVRSRV_OK or error
+******************************************************************************/
+PVRSRV_ERROR MMU_BIFResetPDAlloc(PVRSRV_SGXDEV_INFO *psDevInfo);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_BIFResetPDFree
+
+       PURPOSE:    Free resources allocated in MMU_BIFResetPDAlloc.
+
+       PARAMETERS: In:  psDevInfo - device info
+       RETURNS:
+******************************************************************************/
+IMG_VOID MMU_BIFResetPDFree(PVRSRV_SGXDEV_INFO *psDevInfo);
+
+#if defined(SUPPORT_EXTERNAL_SYSTEM_CACHE)
+/*
+******************************************************************************
+       FUNCTION:   MMU_MapExtSystemCacheRegs
+
+       PURPOSE:    maps external system cache control registers into SGX MMU
+
+       PARAMETERS: In:  psDeviceNode - device node
+       RETURNS:
+******************************************************************************/
+PVRSRV_ERROR MMU_MapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_UnmapExtSystemCacheRegs
+
+       PURPOSE:    unmaps external system cache control registers
+
+       PARAMETERS: In:  psDeviceNode - device node
+       RETURNS:
+******************************************************************************/
+PVRSRV_ERROR MMU_UnmapExtSystemCacheRegs(PVRSRV_DEVICE_NODE *psDeviceNode);
+#endif /* #if defined(SUPPORT_EXTERNAL_SYSTEM_CACHE) */
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_IsHeapShared
+       
+       PURPOSE:    Is this heap shared?
+       PARAMETERS: In: pMMU_Heap
+       RETURNS:    true if heap is shared
+******************************************************************************/
+IMG_BOOL MMU_IsHeapShared(MMU_HEAP* pMMU_Heap);
+
+#if defined(FIX_HW_BRN_31620)
+/*
+******************************************************************************
+       FUNCTION:   MMU_GetCacheFlushRange
+
+       PURPOSE:    Gets device physical address of the mmu context.
+
+       PARAMETERS: In:  pMMUContext - the mmu context
+                   Out:  pui32RangeMask - Bit mask showing which PD cache
+                         lines have changed
+       RETURNS:    None
+******************************************************************************/
+IMG_VOID MMU_GetCacheFlushRange(MMU_CONTEXT *pMMUContext, IMG_UINT32 *pui32RangeMask);
+
+/*
+******************************************************************************
+       FUNCTION:   MMU_GetPDPhysAddr
+
+       PURPOSE:    Gets device physical address of the mmu contexts PD.
+
+       PARAMETERS: In:  pMMUContext - the mmu context
+                   Out:  psDevPAddr - Address of PD
+       RETURNS:    None
+******************************************************************************/
+IMG_VOID MMU_GetPDPhysAddr(MMU_CONTEXT *pMMUContext, IMG_DEV_PHYADDR *psDevPAddr);
+
+#endif
+
+
+IMG_VOID MMU_CheckFaultAddr(PVRSRV_SGXDEV_INFO *psDevInfo, IMG_UINT32 ui32PDDevPAddr, IMG_UINT32 ui32RegVal);
+
+#if defined(PDUMP)
+/*
+******************************************************************************
+       FUNCTION:   MMU_GetPDumpContextID
+
+       PURPOSE:    translates device mem context to unique pdump identifier
+
+       PARAMETERS: In:  hDevMemContext - device memory per-process context
+       RETURNS:        context identifier used internally in pdump
+******************************************************************************/
+IMG_UINT32 MMU_GetPDumpContextID(IMG_HANDLE hDevMemContext);
+#endif /* #ifdef PDUMP */
+
+#endif /* #ifndef _MMU_H_ */