/**************************************************************************/ /*! @File @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. */ /***************************************************************************/ #ifndef __PVRSRV_DEVICE_H__ #define __PVRSRV_DEVICE_H__ #include "img_types.h" #include "physheap.h" #include "pvrsrv_error.h" #include "rgx_fwif_km.h" #include "servicesext.h" #if defined(PVR_DVFS) || defined(SUPPORT_PDVFS) #include "pvr_dvfs.h" #endif typedef struct _PVRSRV_DEVICE_CONFIG_ PVRSRV_DEVICE_CONFIG; /* * All the heaps from which regular device memory allocations can be made in * terms of their locality to the respective device. */ typedef enum { PVRSRV_DEVICE_PHYS_HEAP_GPU_LOCAL = 0, PVRSRV_DEVICE_PHYS_HEAP_CPU_LOCAL = 1, PVRSRV_DEVICE_PHYS_HEAP_FW_LOCAL = 2, PVRSRV_DEVICE_PHYS_HEAP_LAST } PVRSRV_DEVICE_PHYS_HEAP; typedef enum { PVRSRV_DEVICE_LOCAL_MEMORY_ARENA_MAPPABLE = 0, PVRSRV_DEVICE_LOCAL_MEMORY_ARENA_NON_MAPPABLE = 1, PVRSRV_DEVICE_LOCAL_MEMORY_ARENA_LAST } PVRSRV_DEVICE_LOCAL_MEMORY_ARENA; typedef enum _PVRSRV_DEVICE_SNOOP_MODE_ { PVRSRV_DEVICE_SNOOP_NONE = 0, PVRSRV_DEVICE_SNOOP_CPU_ONLY, PVRSRV_DEVICE_SNOOP_DEVICE_ONLY, PVRSRV_DEVICE_SNOOP_CROSS, } PVRSRV_DEVICE_SNOOP_MODE; typedef IMG_UINT32 (*PFN_SYS_DEV_CLK_FREQ_GET)(IMG_HANDLE hSysData); typedef PVRSRV_ERROR (*PFN_SYS_DEV_PRE_POWER)(IMG_HANDLE hSysData, PVRSRV_DEV_POWER_STATE eNewPowerState, PVRSRV_DEV_POWER_STATE eCurrentPowerState, IMG_BOOL bForced); typedef PVRSRV_ERROR (*PFN_SYS_DEV_POST_POWER)(IMG_HANDLE hSysData, PVRSRV_DEV_POWER_STATE eNewPowerState, PVRSRV_DEV_POWER_STATE eCurrentPowerState, IMG_BOOL bForced); typedef void (*PFN_SYS_DEV_INTERRUPT_HANDLED)(PVRSRV_DEVICE_CONFIG *psDevConfig); typedef PVRSRV_ERROR (*PFN_SYS_DEV_CHECK_MEM_ALLOC_SIZE)(IMG_HANDLE hSysData, IMG_UINT64 ui64MemSize); typedef void (*PFN_SYS_DEV_FEAT_DEP_INIT)(PVRSRV_DEVICE_CONFIG *, IMG_UINT64); #if defined(SUPPORT_TRUSTED_DEVICE) #define PVRSRV_DEVICE_FW_CODE_REGION (0) #define PVRSRV_DEVICE_FW_COREMEM_CODE_REGION (1) typedef struct _PVRSRV_TD_FW_PARAMS_ { const void *pvFirmware; IMG_UINT32 ui32FirmwareSize; IMG_DEV_VIRTADDR sFWCodeDevVAddrBase; IMG_DEV_VIRTADDR sFWDataDevVAddrBase; RGXFWIF_DEV_VIRTADDR sFWCorememCodeFWAddr; RGXFWIF_DEV_VIRTADDR sFWInitFWAddr; } PVRSRV_TD_FW_PARAMS; typedef PVRSRV_ERROR (*PFN_TD_SEND_FW_IMAGE)(IMG_HANDLE hSysData, PVRSRV_TD_FW_PARAMS *psTDFWParams); typedef struct _PVRSRV_TD_POWER_PARAMS_ { IMG_DEV_PHYADDR sPCAddr; /* META only used param */ /* MIPS only used fields */ IMG_DEV_PHYADDR sGPURegAddr; IMG_DEV_PHYADDR sBootRemapAddr; IMG_DEV_PHYADDR sCodeRemapAddr; IMG_DEV_PHYADDR sDataRemapAddr; } PVRSRV_TD_POWER_PARAMS; typedef PVRSRV_ERROR (*PFN_TD_SET_POWER_PARAMS)(IMG_HANDLE hSysData, PVRSRV_TD_POWER_PARAMS *psTDPowerParams); typedef PVRSRV_ERROR (*PFN_TD_RGXSTART)(IMG_HANDLE hSysData); typedef PVRSRV_ERROR (*PFN_TD_RGXSTOP)(IMG_HANDLE hSysData); typedef struct _PVRSRV_TD_SECBUF_PARAMS_ { IMG_DEVMEM_SIZE_T uiSize; IMG_DEVMEM_ALIGN_T uiAlign; IMG_CPU_PHYADDR *psSecBufAddr; IMG_UINT64 *pui64SecBufHandle; } PVRSRV_TD_SECBUF_PARAMS; typedef PVRSRV_ERROR (*PFN_TD_SECUREBUF_ALLOC)(IMG_HANDLE hSysData, PVRSRV_TD_SECBUF_PARAMS *psTDSecBufParams); typedef PVRSRV_ERROR (*PFN_TD_SECUREBUF_FREE)(IMG_HANDLE hSysData, IMG_UINT64 ui64SecBufHandle); #endif /* defined(SUPPORT_TRUSTED_DEVICE) */ struct _PVRSRV_DEVICE_CONFIG_ { /*! OS device passed to SysDevInit (linux: 'struct device') */ void *pvOSDevice; /*! *! Service representation of pvOSDevice. Should be set to NULL when the *! config is created in SysDevInit. Set by Services once a device node has *! been created for this config and unset before SysDevDeInit is called. */ struct _PVRSRV_DEVICE_NODE_ *psDevNode; /*! Name of the device */ IMG_CHAR *pszName; /*! Version of the device (optional) */ IMG_CHAR *pszVersion; /*! Register bank address */ IMG_CPU_PHYADDR sRegsCpuPBase; /*! Register bank size */ IMG_UINT32 ui32RegsSize; /*! Device interrupt number */ IMG_UINT32 ui32IRQ; PVRSRV_DEVICE_SNOOP_MODE eCacheSnoopingMode; /*! Device specific data handle */ IMG_HANDLE hDevData; /*! System specific data that gets passed into system callback functions. */ IMG_HANDLE hSysData; IMG_BOOL bHasNonMappableLocalMemory; PHYS_HEAP_CONFIG *pasPhysHeaps; IMG_UINT32 ui32PhysHeapCount; /*! *! ID of the Physical memory heap to use. *! *! The first entry (aui32PhysHeapID[PVRSRV_DEVICE_PHYS_HEAP_GPU_LOCAL]) *! will be used for allocations where the PVRSRV_MEMALLOCFLAG_CPU_LOCAL *! flag is not set. Normally this will be the PhysHeapID of an LMA heap *! but the configuration could specify a UMA heap here (if desired). *! *! The second entry (aui32PhysHeapID[PVRSRV_DEVICE_PHYS_HEAP_CPU_LOCAL]) *! will be used for allocations where the PVRSRV_MEMALLOCFLAG_CPU_LOCAL *! flag is set. Normally this will be the PhysHeapID of a UMA heap but *! the configuration could specify an LMA heap here (if desired). *! *! The third entry (aui32PhysHeapID[PVRSRV_DEVICE_PHYS_HEAP_FW_LOCAL]) *! will be used for allocations where the PVRSRV_MEMALLOCFLAG_FW_LOCAL *! flag is set. *! *! In the event of there being only one Physical Heap, the configuration *! should specify the same heap details in all entries. */ IMG_UINT32 aui32PhysHeapID[PVRSRV_DEVICE_PHYS_HEAP_LAST]; RGXFWIF_BIFTILINGMODE eBIFTilingMode; IMG_UINT32 *pui32BIFTilingHeapConfigs; IMG_UINT32 ui32BIFTilingHeapCount; /*! *! Callbacks to change system device power state at the beginning and end *! of a power state change (optional). */ PFN_SYS_DEV_PRE_POWER pfnPrePowerState; PFN_SYS_DEV_POST_POWER pfnPostPowerState; /*! Callback to obtain the clock frequency from the device (optional). */ PFN_SYS_DEV_CLK_FREQ_GET pfnClockFreqGet; /*! *! Callback to handle memory budgeting. Can be used to reject allocations *! over a certain size (optional). */ PFN_SYS_DEV_CHECK_MEM_ALLOC_SIZE pfnCheckMemAllocSize; #if defined(SUPPORT_TRUSTED_DEVICE) /*! *! Callback to send FW image and FW boot time parameters to the trusted *! device. */ PFN_TD_SEND_FW_IMAGE pfnTDSendFWImage; /*! *! Callback to send parameters needed in a power transition to the trusted *! device. */ PFN_TD_SET_POWER_PARAMS pfnTDSetPowerParams; /*! Callbacks to ping the trusted device to securely run RGXStart/Stop() */ PFN_TD_RGXSTART pfnTDRGXStart; PFN_TD_RGXSTOP pfnTDRGXStop; /*! Callback to request allocation/freeing of secure buffers */ PFN_TD_SECUREBUF_ALLOC pfnTDSecureBufAlloc; PFN_TD_SECUREBUF_FREE pfnTDSecureBufFree; #endif /* defined(SUPPORT_TRUSTED_DEVICE) */ /*! Function that does device feature specific system layer initialisation */ PFN_SYS_DEV_FEAT_DEP_INIT pfnSysDevFeatureDepInit; #if defined(PVR_DVFS) || defined(SUPPORT_PDVFS) PVRSRV_DVFS sDVFS; #endif }; #endif /* __PVRSRV_DEVICE_H__*/