| /**************************************************************************/ /*! |
| @File |
| @Title Temporary Device Memory 2 stuff |
| @Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved |
| @Description Device memory management |
| @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 __DEVICEMEMHEAPCFG_H__ |
| #define __DEVICEMEMHEAPCFG_H__ |
| |
| #include <powervr/mem_types.h> |
| |
| #include "img_types.h" |
| #include "pvrsrv_error.h" |
| |
| |
| |
| /* FIXME: Find a better way of defining _PVRSRV_DEVICE_NODE_ */ |
| struct _PVRSRV_DEVICE_NODE_; |
| /* FIXME: Find a better way of defining _CONNECTION_DATA_ */ |
| struct _CONNECTION_DATA_; |
| |
| |
| /* |
| A "heap config" is a blueprint to be used for initial setting up of |
| heaps when a device memory context is created. |
| |
| We define a data structure to define this, but it's really down to |
| the caller to populate it. This is all expected to be in-kernel. |
| We provide an API that client code can use to enquire about the |
| blueprint, such that it may do the heap setup during the context |
| creation call on behalf of the user */ |
| |
| /* blueprint for a single heap */ |
| typedef struct _DEVMEM_HEAP_BLUEPRINT_ |
| { |
| /* Name of this heap - for debug purposes, and perhaps for lookup |
| by name? */ |
| const IMG_CHAR *pszName; |
| |
| /* Virtual address of the beginning of the heap. This _must_ be a |
| multiple of the data page size for the heap. It is |
| _recommended_ that it be coarser than that - especially, it |
| should begin on a boundary appropriate to the MMU for the |
| device. For Rogue, this is a Page Directory boundary, or 1GB |
| (virtual address a multiple of 0x0040000000). */ |
| IMG_DEV_VIRTADDR sHeapBaseAddr; |
| |
| /* Length of the heap. Given that the END address of the heap has |
| a similar restriction to that of the _beginning_ of the heap. |
| That is the heap length _must_ be a whole number of data pages. |
| Again, the recommendation is that it ends on a 1GB boundary. |
| Again, this is not essential, but we do know that (at the time |
| of writing) the current implementation of mmu_common.c is such |
| that no two heaps may share a page directory, thus the |
| remaining virtual space would be wasted if the length were not |
| a multiple of 1GB */ |
| IMG_DEVMEM_SIZE_T uiHeapLength; |
| |
| /* Data page size. This is the page size that is going to get |
| programmed into the MMU, so it needs to be a valid one for the |
| device. Importantly, the start address and length _must_ be |
| multiples of this page size. Note that the page size is |
| specified as the log 2 relative to 1 byte (e.g. 12 indicates |
| 4kB) */ |
| IMG_UINT32 uiLog2DataPageSize; |
| |
| /* Import alignment. Force imports to this heap to be |
| aligned to at least this value */ |
| IMG_UINT32 uiLog2ImportAlignment; |
| |
| /* Tiled heaps have an optimum byte-stride, this can be derived from |
| the heap alignment and tiling mode. This is abstracted here such that |
| Log2ByteStride = Log2Alignment - Log2TilingStrideFactor */ |
| IMG_UINT32 uiLog2TilingStrideFactor; |
| } DEVMEM_HEAP_BLUEPRINT; |
| |
| /* entire named heap config */ |
| typedef struct _DEVMEM_HEAP_CONFIG_ |
| { |
| /* Name of this heap config - for debug and maybe lookup */ |
| const IMG_CHAR *pszName; |
| |
| /* Number of heaps in this config */ |
| IMG_UINT32 uiNumHeaps; |
| |
| /* Array of individual heap blueprints as defined above */ |
| DEVMEM_HEAP_BLUEPRINT *psHeapBlueprintArray; |
| } DEVMEM_HEAP_CONFIG; |
| |
| |
| extern PVRSRV_ERROR |
| HeapCfgHeapConfigCount(struct _CONNECTION_DATA_ * psConnection, |
| const struct _PVRSRV_DEVICE_NODE_ *psDeviceNode, |
| IMG_UINT32 *puiNumHeapConfigsOut |
| ); |
| |
| extern PVRSRV_ERROR |
| HeapCfgHeapCount(struct _CONNECTION_DATA_ * psConnection, |
| const struct _PVRSRV_DEVICE_NODE_ *psDeviceNode, |
| IMG_UINT32 uiHeapConfigIndex, |
| IMG_UINT32 *puiNumHeapsOut |
| ); |
| |
| extern PVRSRV_ERROR |
| HeapCfgHeapConfigName(struct _CONNECTION_DATA_ * psConnection, |
| const struct _PVRSRV_DEVICE_NODE_ *psDeviceNode, |
| IMG_UINT32 uiHeapConfigIndex, |
| IMG_UINT32 uiHeapConfigNameBufSz, |
| IMG_CHAR *pszHeapConfigNameOut |
| ); |
| |
| extern PVRSRV_ERROR |
| HeapCfgHeapDetails(struct _CONNECTION_DATA_ * psConnection, |
| const struct _PVRSRV_DEVICE_NODE_ *psDeviceNode, |
| IMG_UINT32 uiHeapConfigIndex, |
| IMG_UINT32 uiHeapIndex, |
| IMG_UINT32 uiHeapNameBufSz, |
| IMG_CHAR *pszHeapNameOut, |
| IMG_DEV_VIRTADDR *psDevVAddrBaseOut, |
| IMG_DEVMEM_SIZE_T *puiHeapLengthOut, |
| IMG_UINT32 *puiLog2DataPageSizeOut, |
| IMG_UINT32 *puiLog2ImportAlignmentOut, |
| IMG_UINT32 *puiLog2TilingStrideFactorOut |
| ); |
| |
| #endif |