1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2019 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker
22*35ffd701SAndroid Build Coastguard Worker Description: This file contains the class definitions for GmmPageTablePool
23*35ffd701SAndroid Build Coastguard Worker PageTable, and low-level Tables for user-mode PageTable management,
24*35ffd701SAndroid Build Coastguard Worker that is common for both Linux and Windows.
25*35ffd701SAndroid Build Coastguard Worker
26*35ffd701SAndroid Build Coastguard Worker ======================= end_copyright_notice ==================================*/
27*35ffd701SAndroid Build Coastguard Worker #pragma once
28*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmPageTableMgr.h"
29*35ffd701SAndroid Build Coastguard Worker
30*35ffd701SAndroid Build Coastguard Worker #ifdef __linux__
31*35ffd701SAndroid Build Coastguard Worker #include <pthread.h>
32*35ffd701SAndroid Build Coastguard Worker #include <string.h>
33*35ffd701SAndroid Build Coastguard Worker
34*35ffd701SAndroid Build Coastguard Worker // Internal Linux version of MSDK APIs.
InitializeCriticalSection(pthread_mutex_t * mutex)35*35ffd701SAndroid Build Coastguard Worker static inline void InitializeCriticalSection(pthread_mutex_t *mutex)
36*35ffd701SAndroid Build Coastguard Worker {
37*35ffd701SAndroid Build Coastguard Worker pthread_mutexattr_t Attr;
38*35ffd701SAndroid Build Coastguard Worker pthread_mutexattr_init(&Attr);
39*35ffd701SAndroid Build Coastguard Worker pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
40*35ffd701SAndroid Build Coastguard Worker pthread_mutex_init(mutex, &Attr);
41*35ffd701SAndroid Build Coastguard Worker }
42*35ffd701SAndroid Build Coastguard Worker
DeleteCriticalSection(pthread_mutex_t * mutex)43*35ffd701SAndroid Build Coastguard Worker static inline void DeleteCriticalSection(pthread_mutex_t *mutex)
44*35ffd701SAndroid Build Coastguard Worker {
45*35ffd701SAndroid Build Coastguard Worker pthread_mutex_destroy(mutex);
46*35ffd701SAndroid Build Coastguard Worker }
47*35ffd701SAndroid Build Coastguard Worker
EnterCriticalSection(pthread_mutex_t * mutex)48*35ffd701SAndroid Build Coastguard Worker static inline void EnterCriticalSection(pthread_mutex_t *mutex)
49*35ffd701SAndroid Build Coastguard Worker {
50*35ffd701SAndroid Build Coastguard Worker pthread_mutex_lock(mutex);
51*35ffd701SAndroid Build Coastguard Worker }
52*35ffd701SAndroid Build Coastguard Worker
LeaveCriticalSection(pthread_mutex_t * mutex)53*35ffd701SAndroid Build Coastguard Worker static inline void LeaveCriticalSection(pthread_mutex_t *mutex)
54*35ffd701SAndroid Build Coastguard Worker {
55*35ffd701SAndroid Build Coastguard Worker pthread_mutex_unlock(mutex);
56*35ffd701SAndroid Build Coastguard Worker }
57*35ffd701SAndroid Build Coastguard Worker
58*35ffd701SAndroid Build Coastguard Worker #ifndef _BitScanForwardDefined
_BitScanForward(uint32_t * index,uint32_t mask)59*35ffd701SAndroid Build Coastguard Worker static inline int _BitScanForward(uint32_t *index, uint32_t mask)
60*35ffd701SAndroid Build Coastguard Worker {
61*35ffd701SAndroid Build Coastguard Worker int i;
62*35ffd701SAndroid Build Coastguard Worker
63*35ffd701SAndroid Build Coastguard Worker #ifdef __ANDROID__
64*35ffd701SAndroid Build Coastguard Worker i = ffs(mask);
65*35ffd701SAndroid Build Coastguard Worker #else
66*35ffd701SAndroid Build Coastguard Worker i = ffsl(mask);
67*35ffd701SAndroid Build Coastguard Worker #endif
68*35ffd701SAndroid Build Coastguard Worker
69*35ffd701SAndroid Build Coastguard Worker if(i > 0)
70*35ffd701SAndroid Build Coastguard Worker {
71*35ffd701SAndroid Build Coastguard Worker *index = (uint32_t)(i - 1);
72*35ffd701SAndroid Build Coastguard Worker return i;
73*35ffd701SAndroid Build Coastguard Worker }
74*35ffd701SAndroid Build Coastguard Worker return 0;
75*35ffd701SAndroid Build Coastguard Worker }
76*35ffd701SAndroid Build Coastguard Worker #endif
77*35ffd701SAndroid Build Coastguard Worker #endif
78*35ffd701SAndroid Build Coastguard Worker
79*35ffd701SAndroid Build Coastguard Worker #define GMM_L1_USABLESIZE(TTType, pGmmLibContext) (GMM_AUX_L1_USABLESIZE(pGmmLibContext))
80*35ffd701SAndroid Build Coastguard Worker #define GMM_L1_SIZE(TTType, pGmmLibContext) (GMM_AUX_L1_SIZE(pGmmLibContext))
81*35ffd701SAndroid Build Coastguard Worker #define GMM_L1_SIZE_DWORD(TTType, pGmmLibContext) (GMM_AUX_L1_SIZE_DWORD(pGmmLibContext))
82*35ffd701SAndroid Build Coastguard Worker #define GMM_L2_SIZE(TTType) (GMM_AUX_L2_SIZE)
83*35ffd701SAndroid Build Coastguard Worker #define GMM_L2_SIZE_DWORD(TTType) (GMM_AUX_L2_SIZE_DWORD)
84*35ffd701SAndroid Build Coastguard Worker #define GMM_L3_SIZE(TTType) (GMM_AUX_L3_SIZE)
85*35ffd701SAndroid Build Coastguard Worker #define GMM_L1_ENTRY_IDX(TTType, GfxAddress, pGmmLibContext) (GMM_AUX_L1_ENTRY_IDX((GfxAddress), (pGmmLibContext)))
86*35ffd701SAndroid Build Coastguard Worker #define GMM_L2_ENTRY_IDX(TTType, GfxAddress) (GMM_AUX_L2_ENTRY_IDX(GfxAddress))
87*35ffd701SAndroid Build Coastguard Worker #define GMM_L3_ENTRY_IDX(TTType, GfxAddress) (GMM_AUX_L3_ENTRY_IDX(GfxAddress))
88*35ffd701SAndroid Build Coastguard Worker
89*35ffd701SAndroid Build Coastguard Worker #ifdef GMM_ULT
90*35ffd701SAndroid Build Coastguard Worker #define GMM_L1_ENTRY_IDX_EXPORTED(TTType, GfxAddress, WA64KEx) GMM_AUX_L1_ENTRY_IDX_EXPORTED((GfxAddress), WA64KEx)
91*35ffd701SAndroid Build Coastguard Worker #define GMM_L1_ENTRY_IDX_EXPORTED_2(TTType, GfxAddress, WA64KEx, WA16KEx) (GMM_AUX_L1_ENTRY_IDX_EXPORTED_2((GfxAddress), WA64KEx, WA16KEx))
92*35ffd701SAndroid Build Coastguard Worker #endif
93*35ffd701SAndroid Build Coastguard Worker
94*35ffd701SAndroid Build Coastguard Worker #ifdef __cplusplus
95*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmMemAllocator.hpp"
96*35ffd701SAndroid Build Coastguard Worker
97*35ffd701SAndroid Build Coastguard Worker //HW provides single-set of TR/Aux-TT registers for non-privileged programming
98*35ffd701SAndroid Build Coastguard Worker //Engine-specific offsets are HW-updated with programmed values.
99*35ffd701SAndroid Build Coastguard Worker #define GET_L3ADROFFSET(TRTT, L3AdrOffset, pGmmLibContext) \
100*35ffd701SAndroid Build Coastguard Worker L3AdrOffset = 0x4200;
101*35ffd701SAndroid Build Coastguard Worker
102*35ffd701SAndroid Build Coastguard Worker
103*35ffd701SAndroid Build Coastguard Worker #define ASSIGN_POOLNODE(Pool, NodeIdx, PerTableNodes) { \
104*35ffd701SAndroid Build Coastguard Worker (Pool)->GetNodeUsageAtIndex((NodeIdx) / (32 *(PerTableNodes))) |= __BIT(((NodeIdx) / (PerTableNodes)) % 32); \
105*35ffd701SAndroid Build Coastguard Worker (Pool)->GetNodeBBInfoAtIndex(NodeIdx) = SyncInfo(); \
106*35ffd701SAndroid Build Coastguard Worker (Pool)->GetNumFreeNode() -= (PerTableNodes); \
107*35ffd701SAndroid Build Coastguard Worker }
108*35ffd701SAndroid Build Coastguard Worker
109*35ffd701SAndroid Build Coastguard Worker #define DEASSIGN_POOLNODE(PageTableMgr, UmdContext, Pool, NodeIdx, PerTableNodes) { \
110*35ffd701SAndroid Build Coastguard Worker (Pool)->GetNodeUsageAtIndex((NodeIdx) / (32 * (PerTableNodes))) &= ~__BIT(((NodeIdx) / (PerTableNodes)) % 32 ); \
111*35ffd701SAndroid Build Coastguard Worker (Pool)->GetNumFreeNode() += (PerTableNodes); \
112*35ffd701SAndroid Build Coastguard Worker if((Pool)->GetNumFreeNode() == PAGETABLE_POOL_MAX_NODES) { \
113*35ffd701SAndroid Build Coastguard Worker PageTableMgr->__ReleaseUnusedPool((UmdContext)); \
114*35ffd701SAndroid Build Coastguard Worker } \
115*35ffd701SAndroid Build Coastguard Worker }
116*35ffd701SAndroid Build Coastguard Worker
117*35ffd701SAndroid Build Coastguard Worker namespace GmmLib
118*35ffd701SAndroid Build Coastguard Worker {
119*35ffd701SAndroid Build Coastguard Worker #define PAGETABLE_POOL_MAX_NODES 512 //Max. number of L2/L1 tables pool contains
120*35ffd701SAndroid Build Coastguard Worker #define PAGETABLE_POOL_SIZE_IN_DWORD PAGETABLE_POOL_MAX_NODES / 32
121*35ffd701SAndroid Build Coastguard Worker #define PAGETABLE_POOL_SIZE PAGETABLE_POOL_MAX_NODES * PAGE_SIZE //Pool for L2/L1 table allocation
122*35ffd701SAndroid Build Coastguard Worker #define AUX_L2TABLE_SIZE_IN_POOLNODES 8 //Aux L2 is 32KB
123*35ffd701SAndroid Build Coastguard Worker #define AUX_L1TABLE_SIZE_IN_POOLNODES 2 //Aux L1 is 8KB
124*35ffd701SAndroid Build Coastguard Worker #define AUX_L1TABLE_SIZE_IN_POOLNODES_2(pGmmLibContext) (pGmmLibContext ? ((WA64K(pGmmLibContext) || WA16K(pGmmLibContext)) ? 2 : 1) : 2) //Aux L1 is 8KB / 4K (MTL)
125*35ffd701SAndroid Build Coastguard Worker #define PAGETABLE_POOL_MAX_UNUSED_SIZE GMM_MBYTE(16) //Max. size of unused pool, driver keeps resident
126*35ffd701SAndroid Build Coastguard Worker
127*35ffd701SAndroid Build Coastguard Worker
128*35ffd701SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////////
129*35ffd701SAndroid Build Coastguard Worker /// Contains functions and members for GmmPageTablePool.
130*35ffd701SAndroid Build Coastguard Worker /// PageTablePool is a Linked-list, provides common location for both Aux TT and TR-TT pages
131*35ffd701SAndroid Build Coastguard Worker /// Separate NodePool (linked-list element) kept for each PoolType, for cleaner management in
132*35ffd701SAndroid Build Coastguard Worker /// per-table size
133*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////////
134*35ffd701SAndroid Build Coastguard Worker class GmmPageTablePool
135*35ffd701SAndroid Build Coastguard Worker {
136*35ffd701SAndroid Build Coastguard Worker private:
137*35ffd701SAndroid Build Coastguard Worker //PageTablePool allocation descriptor
138*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_INFO* pGmmResInfo;
139*35ffd701SAndroid Build Coastguard Worker HANDLE PoolHandle;
140*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS PoolGfxAddress;
141*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS CPUAddress; //LMEM-cpuvisible adr
142*35ffd701SAndroid Build Coastguard Worker
143*35ffd701SAndroid Build Coastguard Worker POOL_TYPE PoolType; //Separate Node-pools for TR-L2, TR-L1, Aux-L2, Aux-L1 usages-
144*35ffd701SAndroid Build Coastguard Worker
145*35ffd701SAndroid Build Coastguard Worker //PageTablePool usage descriptors
146*35ffd701SAndroid Build Coastguard Worker int NumFreeNodes; //has value {0 to Pool_Max_nodes}
147*35ffd701SAndroid Build Coastguard Worker uint32_t* NodeUsage; //destined node state (updated during node assignment and removed based on destined state of L1/L2 Table
148*35ffd701SAndroid Build Coastguard Worker //that used the pool node)
149*35ffd701SAndroid Build Coastguard Worker //Aux-Pool node-usage tracked at every eighth/second node(for L2 vs L1)
150*35ffd701SAndroid Build Coastguard Worker //ie 1b per node for TR-table, 1b per 8-nodes for Aux-L2table, 1b per 2-nodes for AuxL1-table
151*35ffd701SAndroid Build Coastguard Worker //array size= POOL_SIZE_IN_DWORD for TR, =POOL_SIZE_IN_DWORD/8 for AuxL2, POOL_SIZE_IN_DWORD/2 for AuxL1
152*35ffd701SAndroid Build Coastguard Worker
153*35ffd701SAndroid Build Coastguard Worker SyncInfo* NodeBBInfo; //BB info for pending Gpu usage of each pool node
154*35ffd701SAndroid Build Coastguard Worker //array of size MaxPoolNodes for TR, =MaxPoolNodes / 8 for Aux, MaxPoolNodes / 2 for AuxL1
155*35ffd701SAndroid Build Coastguard Worker
156*35ffd701SAndroid Build Coastguard Worker SyncInfo PoolBBInfo; //BB info for Gpu usage of the Pool (most recent of pool node BB info)
157*35ffd701SAndroid Build Coastguard Worker
158*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool* NextPool; //Next node-Pool in the LinkedList
159*35ffd701SAndroid Build Coastguard Worker GmmClientContext *pClientContext; ///< ClientContext of the client creating this Object
160*35ffd701SAndroid Build Coastguard Worker public:
GmmPageTablePool()161*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool() :
162*35ffd701SAndroid Build Coastguard Worker pGmmResInfo(NULL),
163*35ffd701SAndroid Build Coastguard Worker PoolHandle(),
164*35ffd701SAndroid Build Coastguard Worker PoolGfxAddress(0x0),
165*35ffd701SAndroid Build Coastguard Worker CPUAddress(0x0),
166*35ffd701SAndroid Build Coastguard Worker PoolType(POOL_TYPE_TRTTL1),
167*35ffd701SAndroid Build Coastguard Worker NumFreeNodes(PAGETABLE_POOL_MAX_NODES),
168*35ffd701SAndroid Build Coastguard Worker NodeUsage(NULL),
169*35ffd701SAndroid Build Coastguard Worker NodeBBInfo(NULL),
170*35ffd701SAndroid Build Coastguard Worker PoolBBInfo(),
171*35ffd701SAndroid Build Coastguard Worker NextPool(NULL),
172*35ffd701SAndroid Build Coastguard Worker pClientContext(NULL)
173*35ffd701SAndroid Build Coastguard Worker {
174*35ffd701SAndroid Build Coastguard Worker
175*35ffd701SAndroid Build Coastguard Worker }
GmmPageTablePool(HANDLE hAlloc,GMM_RESOURCE_INFO * pGmmRes,GMM_GFX_ADDRESS SysMem,POOL_TYPE Type)176*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool(HANDLE hAlloc, GMM_RESOURCE_INFO* pGmmRes, GMM_GFX_ADDRESS SysMem, POOL_TYPE Type) :
177*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool()
178*35ffd701SAndroid Build Coastguard Worker {
179*35ffd701SAndroid Build Coastguard Worker int DwordPoolSize;
180*35ffd701SAndroid Build Coastguard Worker GMM_LIB_CONTEXT *pGmmLibContext;
181*35ffd701SAndroid Build Coastguard Worker PoolHandle = hAlloc;
182*35ffd701SAndroid Build Coastguard Worker pGmmResInfo = pGmmRes;
183*35ffd701SAndroid Build Coastguard Worker PoolGfxAddress = SysMem;
184*35ffd701SAndroid Build Coastguard Worker CPUAddress = PoolGfxAddress;
185*35ffd701SAndroid Build Coastguard Worker NextPool = NULL;
186*35ffd701SAndroid Build Coastguard Worker NumFreeNodes = PAGETABLE_POOL_MAX_NODES;
187*35ffd701SAndroid Build Coastguard Worker PoolType = Type;
188*35ffd701SAndroid Build Coastguard Worker if(pGmmResInfo)
189*35ffd701SAndroid Build Coastguard Worker {
190*35ffd701SAndroid Build Coastguard Worker pClientContext = pGmmResInfo->GetGmmClientContext();
191*35ffd701SAndroid Build Coastguard Worker }
192*35ffd701SAndroid Build Coastguard Worker pGmmLibContext = pClientContext ? pClientContext->GetLibContext() : NULL;
193*35ffd701SAndroid Build Coastguard Worker DwordPoolSize = (Type == POOL_TYPE_AUXTTL1) ? PAGETABLE_POOL_SIZE_IN_DWORD / AUX_L1TABLE_SIZE_IN_POOLNODES_2(pGmmLibContext) : (Type == POOL_TYPE_AUXTTL2) ? PAGETABLE_POOL_SIZE_IN_DWORD / AUX_L2TABLE_SIZE_IN_POOLNODES : PAGETABLE_POOL_SIZE_IN_DWORD;
194*35ffd701SAndroid Build Coastguard Worker NodeUsage = new uint32_t[DwordPoolSize]();
195*35ffd701SAndroid Build Coastguard Worker NodeBBInfo = new SyncInfo[DwordPoolSize * 32]();
196*35ffd701SAndroid Build Coastguard Worker }
GmmPageTablePool(HANDLE hAlloc,GMM_RESOURCE_INFO * pGmmRes,GMM_GFX_ADDRESS GfxAdr,GMM_GFX_ADDRESS CPUAdr,POOL_TYPE Type)197*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool(HANDLE hAlloc, GMM_RESOURCE_INFO* pGmmRes, GMM_GFX_ADDRESS GfxAdr, GMM_GFX_ADDRESS CPUAdr, POOL_TYPE Type) :
198*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool(hAlloc, pGmmRes, GfxAdr, Type)
199*35ffd701SAndroid Build Coastguard Worker {
200*35ffd701SAndroid Build Coastguard Worker CPUAddress = (CPUAdr != GfxAdr) ? CPUAdr : GfxAdr;
201*35ffd701SAndroid Build Coastguard Worker }
~GmmPageTablePool()202*35ffd701SAndroid Build Coastguard Worker ~GmmPageTablePool()
203*35ffd701SAndroid Build Coastguard Worker {
204*35ffd701SAndroid Build Coastguard Worker delete[] NodeUsage;
205*35ffd701SAndroid Build Coastguard Worker delete[] NodeBBInfo;
206*35ffd701SAndroid Build Coastguard Worker }
207*35ffd701SAndroid Build Coastguard Worker
InsertInList(GmmPageTablePool * NewNode)208*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool* InsertInList(GmmPageTablePool* NewNode)
209*35ffd701SAndroid Build Coastguard Worker {
210*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool *Node = this;
211*35ffd701SAndroid Build Coastguard Worker while (Node->NextPool)
212*35ffd701SAndroid Build Coastguard Worker {
213*35ffd701SAndroid Build Coastguard Worker Node = Node->NextPool;
214*35ffd701SAndroid Build Coastguard Worker }
215*35ffd701SAndroid Build Coastguard Worker Node->NextPool = NewNode;
216*35ffd701SAndroid Build Coastguard Worker return Node->NextPool;
217*35ffd701SAndroid Build Coastguard Worker }
218*35ffd701SAndroid Build Coastguard Worker
InsertInListAtBegin(GmmPageTablePool * NewNode)219*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool* InsertInListAtBegin(GmmPageTablePool* NewNode)
220*35ffd701SAndroid Build Coastguard Worker {
221*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool *Node = this;
222*35ffd701SAndroid Build Coastguard Worker NewNode->NextPool = Node;
223*35ffd701SAndroid Build Coastguard Worker return NewNode;
224*35ffd701SAndroid Build Coastguard Worker }
225*35ffd701SAndroid Build Coastguard Worker
GetNextPool()226*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool* &GetNextPool() { return NextPool; }
GetPoolHandle()227*35ffd701SAndroid Build Coastguard Worker HANDLE& GetPoolHandle() { return PoolHandle; }
GetPoolType()228*35ffd701SAndroid Build Coastguard Worker POOL_TYPE& GetPoolType() { return PoolType; }
GetNumFreeNode()229*35ffd701SAndroid Build Coastguard Worker int& GetNumFreeNode() { return NumFreeNodes; }
GetPoolBBInfo()230*35ffd701SAndroid Build Coastguard Worker SyncInfo& GetPoolBBInfo() { return PoolBBInfo; }
GetNodeUsageAtIndex(int j)231*35ffd701SAndroid Build Coastguard Worker uint32_t& GetNodeUsageAtIndex(int j) { return NodeUsage[j]; }
GetNodeBBInfoAtIndex(int j)232*35ffd701SAndroid Build Coastguard Worker SyncInfo& GetNodeBBInfoAtIndex(int j)
233*35ffd701SAndroid Build Coastguard Worker {
234*35ffd701SAndroid Build Coastguard Worker GMM_LIB_CONTEXT *pGmmLibContext = pClientContext ? pClientContext->GetLibContext() : NULL;
235*35ffd701SAndroid Build Coastguard Worker int BBInfoNodeIdx = (PoolType == POOL_TYPE_AUXTTL1) ? j / AUX_L1TABLE_SIZE_IN_POOLNODES_2(pGmmLibContext) : (PoolType == POOL_TYPE_AUXTTL2) ? j / AUX_L2TABLE_SIZE_IN_POOLNODES : j;
236*35ffd701SAndroid Build Coastguard Worker return NodeBBInfo[BBInfoNodeIdx];
237*35ffd701SAndroid Build Coastguard Worker }
GetGfxAddress()238*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GetGfxAddress() { return PoolGfxAddress; }
GetCPUAddress()239*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GetCPUAddress() { return CPUAddress; }
GetGmmResInfo()240*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_INFO* &GetGmmResInfo() { return pGmmResInfo; }
IsPoolInUse(SyncInfo BBInfo)241*35ffd701SAndroid Build Coastguard Worker bool IsPoolInUse(SyncInfo BBInfo) {
242*35ffd701SAndroid Build Coastguard Worker if (NumFreeNodes < PAGETABLE_POOL_MAX_NODES ||
243*35ffd701SAndroid Build Coastguard Worker (PoolBBInfo.BBQueueHandle == BBInfo.BBQueueHandle &&
244*35ffd701SAndroid Build Coastguard Worker PoolBBInfo.BBFence == BBInfo.BBFence + 1)) //Pool will be used by next BB submission, freeing it will cause page fault
245*35ffd701SAndroid Build Coastguard Worker {
246*35ffd701SAndroid Build Coastguard Worker return true;
247*35ffd701SAndroid Build Coastguard Worker }
248*35ffd701SAndroid Build Coastguard Worker return false;
249*35ffd701SAndroid Build Coastguard Worker }
250*35ffd701SAndroid Build Coastguard Worker bool __IsUnusedTRTTPoolOverLimit(GMM_GFX_SIZE_T * OverLimitSize);
251*35ffd701SAndroid Build Coastguard Worker void ClearBBReference(void * BBQHandle);
252*35ffd701SAndroid Build Coastguard Worker GMM_STATUS __DestroyPageTablePool(void * DeviceCallbacks,HANDLE hCsr);
253*35ffd701SAndroid Build Coastguard Worker };
254*35ffd701SAndroid Build Coastguard Worker
255*35ffd701SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////////
256*35ffd701SAndroid Build Coastguard Worker /// Contains functions and members for Table.
257*35ffd701SAndroid Build Coastguard Worker /// Table defines basic building block for tables at different page-table levels
258*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////////
259*35ffd701SAndroid Build Coastguard Worker class Table
260*35ffd701SAndroid Build Coastguard Worker {
261*35ffd701SAndroid Build Coastguard Worker protected:
262*35ffd701SAndroid Build Coastguard Worker GMM_PAGETABLEPool *PoolElem; //L2 Pool ptr different for L2Tables when Pool_nodes <512
263*35ffd701SAndroid Build Coastguard Worker int PoolNodeIdx; //pool node idx used for L2 Table
264*35ffd701SAndroid Build Coastguard Worker SyncInfo BBInfo; //BB Handle/fence using Table
265*35ffd701SAndroid Build Coastguard Worker uint32_t * UsedEntries; //Tracks which L1/L2 entries are being used
266*35ffd701SAndroid Build Coastguard Worker //array size GMM_L1_SIZE_DWORD(TT-type) for LastLevelTable, MidLeveltable(??)
267*35ffd701SAndroid Build Coastguard Worker //array of 1024/32=32 DWs for TR-table, 4096/32 =512 for Aux-Table
268*35ffd701SAndroid Build Coastguard Worker public:
Table()269*35ffd701SAndroid Build Coastguard Worker Table() :
270*35ffd701SAndroid Build Coastguard Worker PoolElem(NULL),
271*35ffd701SAndroid Build Coastguard Worker PoolNodeIdx(),
272*35ffd701SAndroid Build Coastguard Worker BBInfo(),
273*35ffd701SAndroid Build Coastguard Worker UsedEntries(NULL)
274*35ffd701SAndroid Build Coastguard Worker {
275*35ffd701SAndroid Build Coastguard Worker }
GetNodeIdx()276*35ffd701SAndroid Build Coastguard Worker int& GetNodeIdx() { return PoolNodeIdx; }
GetPool()277*35ffd701SAndroid Build Coastguard Worker GmmPageTablePool* &GetPool() { return PoolElem; }
GetCPUAddress()278*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GetCPUAddress() { return (PoolElem->GetCPUAddress() + (PoolNodeIdx * PAGE_SIZE)); }
GetBBInfo()279*35ffd701SAndroid Build Coastguard Worker SyncInfo& GetBBInfo() { return BBInfo; }
GetUsedEntries()280*35ffd701SAndroid Build Coastguard Worker uint32_t* &GetUsedEntries() { return UsedEntries; }
281*35ffd701SAndroid Build Coastguard Worker bool TrackTableUsage(TT_TYPE Type, bool IsL1, GMM_GFX_ADDRESS TileAdr, bool NullMapped,GMM_LIB_CONTEXT* pGmmLibContext);
282*35ffd701SAndroid Build Coastguard Worker bool IsTableNullMapped(TT_TYPE Type, bool IsL1, GMM_GFX_ADDRESS TileAdr,GMM_LIB_CONTEXT *pGmmLibContext);
283*35ffd701SAndroid Build Coastguard Worker void UpdatePoolFence(GMM_UMD_SYNCCONTEXT * UmdContext, bool ClearNode);
284*35ffd701SAndroid Build Coastguard Worker };
285*35ffd701SAndroid Build Coastguard Worker
286*35ffd701SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////////
287*35ffd701SAndroid Build Coastguard Worker /// Contains functions and members for LastLevelTable.
288*35ffd701SAndroid Build Coastguard Worker /// LastLevelTable defines leaf level tables in multi-level pageTable structure
289*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////////
290*35ffd701SAndroid Build Coastguard Worker class LastLevelTable : public Table
291*35ffd701SAndroid Build Coastguard Worker {
292*35ffd701SAndroid Build Coastguard Worker private:
293*35ffd701SAndroid Build Coastguard Worker uint32_t L2eIdx;
294*35ffd701SAndroid Build Coastguard Worker LastLevelTable *pNext;
295*35ffd701SAndroid Build Coastguard Worker
296*35ffd701SAndroid Build Coastguard Worker public:
LastLevelTable()297*35ffd701SAndroid Build Coastguard Worker LastLevelTable() : Table(),
298*35ffd701SAndroid Build Coastguard Worker L2eIdx() //Pass in Aux vs TR table's GMM_L2_SIZE and initialize L2eIdx?
299*35ffd701SAndroid Build Coastguard Worker {
300*35ffd701SAndroid Build Coastguard Worker pNext = NULL;
301*35ffd701SAndroid Build Coastguard Worker }
302*35ffd701SAndroid Build Coastguard Worker
LastLevelTable(GMM_PAGETABLEPool * Elem,int NodeIdx,int DwordL1e,int L2eIndex)303*35ffd701SAndroid Build Coastguard Worker LastLevelTable(GMM_PAGETABLEPool *Elem, int NodeIdx, int DwordL1e, int L2eIndex)
304*35ffd701SAndroid Build Coastguard Worker : LastLevelTable()
305*35ffd701SAndroid Build Coastguard Worker {
306*35ffd701SAndroid Build Coastguard Worker PoolElem = Elem;
307*35ffd701SAndroid Build Coastguard Worker PoolNodeIdx = NodeIdx;
308*35ffd701SAndroid Build Coastguard Worker BBInfo = Elem->GetNodeBBInfoAtIndex(NodeIdx);
309*35ffd701SAndroid Build Coastguard Worker L2eIdx = L2eIndex;
310*35ffd701SAndroid Build Coastguard Worker pNext = NULL;
311*35ffd701SAndroid Build Coastguard Worker UsedEntries = new uint32_t[DwordL1e]();
312*35ffd701SAndroid Build Coastguard Worker }
~LastLevelTable()313*35ffd701SAndroid Build Coastguard Worker ~LastLevelTable()
314*35ffd701SAndroid Build Coastguard Worker {
315*35ffd701SAndroid Build Coastguard Worker delete[] UsedEntries;
316*35ffd701SAndroid Build Coastguard Worker }
317*35ffd701SAndroid Build Coastguard Worker
GetL2eIdx()318*35ffd701SAndroid Build Coastguard Worker int GetL2eIdx() {
319*35ffd701SAndroid Build Coastguard Worker return L2eIdx;
320*35ffd701SAndroid Build Coastguard Worker }
321*35ffd701SAndroid Build Coastguard Worker
Next()322*35ffd701SAndroid Build Coastguard Worker LastLevelTable* &Next() {
323*35ffd701SAndroid Build Coastguard Worker return pNext;
324*35ffd701SAndroid Build Coastguard Worker }
325*35ffd701SAndroid Build Coastguard Worker };
326*35ffd701SAndroid Build Coastguard Worker
327*35ffd701SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////////
328*35ffd701SAndroid Build Coastguard Worker /// Contains functions and members for MidLevelTable.
329*35ffd701SAndroid Build Coastguard Worker /// MidLevelTable defines secondary level tables in multi-level pageTable structure
330*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////////
331*35ffd701SAndroid Build Coastguard Worker class MidLevelTable : public Table
332*35ffd701SAndroid Build Coastguard Worker {
333*35ffd701SAndroid Build Coastguard Worker private:
334*35ffd701SAndroid Build Coastguard Worker LastLevelTable *pTTL1; //linked list of L1 tables
335*35ffd701SAndroid Build Coastguard Worker
336*35ffd701SAndroid Build Coastguard Worker public:
MidLevelTable()337*35ffd701SAndroid Build Coastguard Worker MidLevelTable() :Table()
338*35ffd701SAndroid Build Coastguard Worker {
339*35ffd701SAndroid Build Coastguard Worker pTTL1 = NULL;
340*35ffd701SAndroid Build Coastguard Worker }
MidLevelTable(GMM_PAGETABLEPool * Pool,int NodeIdx,SyncInfo Info)341*35ffd701SAndroid Build Coastguard Worker MidLevelTable(GMM_PAGETABLEPool *Pool, int NodeIdx, SyncInfo Info) : MidLevelTable()
342*35ffd701SAndroid Build Coastguard Worker {
343*35ffd701SAndroid Build Coastguard Worker PoolElem = Pool;
344*35ffd701SAndroid Build Coastguard Worker BBInfo = Info;
345*35ffd701SAndroid Build Coastguard Worker PoolNodeIdx = NodeIdx;
346*35ffd701SAndroid Build Coastguard Worker }
~MidLevelTable()347*35ffd701SAndroid Build Coastguard Worker ~MidLevelTable()
348*35ffd701SAndroid Build Coastguard Worker {
349*35ffd701SAndroid Build Coastguard Worker if (pTTL1)
350*35ffd701SAndroid Build Coastguard Worker {
351*35ffd701SAndroid Build Coastguard Worker LastLevelTable* item = pTTL1;
352*35ffd701SAndroid Build Coastguard Worker
353*35ffd701SAndroid Build Coastguard Worker while (item)
354*35ffd701SAndroid Build Coastguard Worker {
355*35ffd701SAndroid Build Coastguard Worker LastLevelTable* nextItem = item->Next();
356*35ffd701SAndroid Build Coastguard Worker delete item;
357*35ffd701SAndroid Build Coastguard Worker item = nextItem;
358*35ffd701SAndroid Build Coastguard Worker }
359*35ffd701SAndroid Build Coastguard Worker
360*35ffd701SAndroid Build Coastguard Worker pTTL1 = NULL;
361*35ffd701SAndroid Build Coastguard Worker }
362*35ffd701SAndroid Build Coastguard Worker }
363*35ffd701SAndroid Build Coastguard Worker LastLevelTable* GetL1Table(GMM_GFX_SIZE_T L2eIdx, LastLevelTable** Prev = NULL)
364*35ffd701SAndroid Build Coastguard Worker {
365*35ffd701SAndroid Build Coastguard Worker LastLevelTable* pL1Tbl = pTTL1;
366*35ffd701SAndroid Build Coastguard Worker LastLevelTable* PrevL1Tbl = NULL;
367*35ffd701SAndroid Build Coastguard Worker
368*35ffd701SAndroid Build Coastguard Worker while (pL1Tbl)
369*35ffd701SAndroid Build Coastguard Worker {
370*35ffd701SAndroid Build Coastguard Worker if (pL1Tbl->GetL2eIdx() == L2eIdx)
371*35ffd701SAndroid Build Coastguard Worker {
372*35ffd701SAndroid Build Coastguard Worker break;
373*35ffd701SAndroid Build Coastguard Worker }
374*35ffd701SAndroid Build Coastguard Worker PrevL1Tbl = pL1Tbl;
375*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pL1Tbl->Next();
376*35ffd701SAndroid Build Coastguard Worker }
377*35ffd701SAndroid Build Coastguard Worker
378*35ffd701SAndroid Build Coastguard Worker //if requested, save previous node in linked-list
379*35ffd701SAndroid Build Coastguard Worker if (Prev)
380*35ffd701SAndroid Build Coastguard Worker {
381*35ffd701SAndroid Build Coastguard Worker *Prev = PrevL1Tbl;
382*35ffd701SAndroid Build Coastguard Worker }
383*35ffd701SAndroid Build Coastguard Worker return pL1Tbl;
384*35ffd701SAndroid Build Coastguard Worker }
InsertInList(LastLevelTable * pL1Tbl)385*35ffd701SAndroid Build Coastguard Worker void InsertInList(LastLevelTable* pL1Tbl)
386*35ffd701SAndroid Build Coastguard Worker {
387*35ffd701SAndroid Build Coastguard Worker LastLevelTable* Prev = pTTL1;
388*35ffd701SAndroid Build Coastguard Worker
389*35ffd701SAndroid Build Coastguard Worker //Insert at end
390*35ffd701SAndroid Build Coastguard Worker while (Prev && Prev->Next())
391*35ffd701SAndroid Build Coastguard Worker {
392*35ffd701SAndroid Build Coastguard Worker Prev = Prev->Next();
393*35ffd701SAndroid Build Coastguard Worker }
394*35ffd701SAndroid Build Coastguard Worker
395*35ffd701SAndroid Build Coastguard Worker if (Prev)
396*35ffd701SAndroid Build Coastguard Worker {
397*35ffd701SAndroid Build Coastguard Worker Prev->Next() = pL1Tbl;
398*35ffd701SAndroid Build Coastguard Worker }
399*35ffd701SAndroid Build Coastguard Worker else
400*35ffd701SAndroid Build Coastguard Worker {
401*35ffd701SAndroid Build Coastguard Worker pTTL1 = pL1Tbl;
402*35ffd701SAndroid Build Coastguard Worker }
403*35ffd701SAndroid Build Coastguard Worker }
DeleteFromList(LastLevelTable * pL1Tbl,LastLevelTable * PrevL1Tbl)404*35ffd701SAndroid Build Coastguard Worker void DeleteFromList(LastLevelTable* pL1Tbl, LastLevelTable* PrevL1Tbl)
405*35ffd701SAndroid Build Coastguard Worker {
406*35ffd701SAndroid Build Coastguard Worker //Save next L1Table in list, before deleting current one
407*35ffd701SAndroid Build Coastguard Worker if (pL1Tbl)
408*35ffd701SAndroid Build Coastguard Worker {
409*35ffd701SAndroid Build Coastguard Worker if (PrevL1Tbl)
410*35ffd701SAndroid Build Coastguard Worker {
411*35ffd701SAndroid Build Coastguard Worker PrevL1Tbl->Next() = pL1Tbl->Next();
412*35ffd701SAndroid Build Coastguard Worker }
413*35ffd701SAndroid Build Coastguard Worker else
414*35ffd701SAndroid Build Coastguard Worker {
415*35ffd701SAndroid Build Coastguard Worker pTTL1 = pL1Tbl->Next();
416*35ffd701SAndroid Build Coastguard Worker }
417*35ffd701SAndroid Build Coastguard Worker
418*35ffd701SAndroid Build Coastguard Worker delete pL1Tbl;
419*35ffd701SAndroid Build Coastguard Worker }
420*35ffd701SAndroid Build Coastguard Worker }
421*35ffd701SAndroid Build Coastguard Worker };
422*35ffd701SAndroid Build Coastguard Worker
423*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////
424*35ffd701SAndroid Build Coastguard Worker /// Contains functions and members for PageTable.
425*35ffd701SAndroid Build Coastguard Worker /// PageTable defines multi-level pageTable
426*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////
427*35ffd701SAndroid Build Coastguard Worker class PageTable :
428*35ffd701SAndroid Build Coastguard Worker public GmmMemAllocator
429*35ffd701SAndroid Build Coastguard Worker {
430*35ffd701SAndroid Build Coastguard Worker protected:
431*35ffd701SAndroid Build Coastguard Worker const TT_TYPE TTType; //PageTable is AuxTT
432*35ffd701SAndroid Build Coastguard Worker const int NodesPerTable; //Aux L2/L3 has 32KB size, Aux L1 has 4KB -can't use as selector for PageTable is AuxTT
433*35ffd701SAndroid Build Coastguard Worker // 1 node for TR-table, 8 nodes for Aux-Table L2, 2 nodes for Aux-table L1
434*35ffd701SAndroid Build Coastguard Worker //Root Table structure
435*35ffd701SAndroid Build Coastguard Worker struct RootTable
436*35ffd701SAndroid Build Coastguard Worker {
437*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_INFO* pGmmResInfo;
438*35ffd701SAndroid Build Coastguard Worker HANDLE L3Handle;
439*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GfxAddress; //L3 Table Adr CPU equivalent GPU addr
440*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS CPUAddress; //LMEM-cpuvisible adr
441*35ffd701SAndroid Build Coastguard Worker bool NeedRegisterUpdate; //True @ L3 allocation, False when L3AdrRegWrite done
442*35ffd701SAndroid Build Coastguard Worker SyncInfo BBInfo;
RootTableRootTable443*35ffd701SAndroid Build Coastguard Worker RootTable() : pGmmResInfo(NULL), L3Handle(NULL), GfxAddress(0), CPUAddress(0), NeedRegisterUpdate(false), BBInfo() {}
444*35ffd701SAndroid Build Coastguard Worker } TTL3;
445*35ffd701SAndroid Build Coastguard Worker
446*35ffd701SAndroid Build Coastguard Worker MidLevelTable* pTTL2; //array of L2-Tables
447*35ffd701SAndroid Build Coastguard Worker
448*35ffd701SAndroid Build Coastguard Worker public:
449*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
450*35ffd701SAndroid Build Coastguard Worker CRITICAL_SECTION TTLock; //synchronized access of PageTable obj
451*35ffd701SAndroid Build Coastguard Worker #elif defined __linux__
452*35ffd701SAndroid Build Coastguard Worker pthread_mutex_t TTLock;
453*35ffd701SAndroid Build Coastguard Worker #endif
454*35ffd701SAndroid Build Coastguard Worker
455*35ffd701SAndroid Build Coastguard Worker GmmPageTableMgr* PageTableMgr;
456*35ffd701SAndroid Build Coastguard Worker GmmClientContext *pClientContext;
457*35ffd701SAndroid Build Coastguard Worker
PageTable(int Size,int NumL3e,TT_TYPE flag)458*35ffd701SAndroid Build Coastguard Worker PageTable(int Size, int NumL3e, TT_TYPE flag) :
459*35ffd701SAndroid Build Coastguard Worker TTType(flag),
460*35ffd701SAndroid Build Coastguard Worker NodesPerTable(Size / PAGE_SIZE)
461*35ffd701SAndroid Build Coastguard Worker {
462*35ffd701SAndroid Build Coastguard Worker PageTableMgr = NULL;
463*35ffd701SAndroid Build Coastguard Worker pClientContext = NULL;
464*35ffd701SAndroid Build Coastguard Worker InitializeCriticalSection(&TTLock);
465*35ffd701SAndroid Build Coastguard Worker
466*35ffd701SAndroid Build Coastguard Worker pTTL2 = new MidLevelTable[NumL3e];
467*35ffd701SAndroid Build Coastguard Worker }
468*35ffd701SAndroid Build Coastguard Worker
~PageTable()469*35ffd701SAndroid Build Coastguard Worker ~PageTable()
470*35ffd701SAndroid Build Coastguard Worker {
471*35ffd701SAndroid Build Coastguard Worker delete[] pTTL2;
472*35ffd701SAndroid Build Coastguard Worker
473*35ffd701SAndroid Build Coastguard Worker DeleteCriticalSection(&TTLock);
474*35ffd701SAndroid Build Coastguard Worker }
475*35ffd701SAndroid Build Coastguard Worker
GetGmmLibContext()476*35ffd701SAndroid Build Coastguard Worker inline GMM_LIB_CONTEXT* GetGmmLibContext()
477*35ffd701SAndroid Build Coastguard Worker {
478*35ffd701SAndroid Build Coastguard Worker return pClientContext->GetLibContext();
479*35ffd701SAndroid Build Coastguard Worker }
480*35ffd701SAndroid Build Coastguard Worker
GetL3Address()481*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GetL3Address() { return TTL3.GfxAddress; }
GetRegisterStatus()482*35ffd701SAndroid Build Coastguard Worker bool &GetRegisterStatus() { return TTL3.NeedRegisterUpdate; }
483*35ffd701SAndroid Build Coastguard Worker GMM_STATUS AllocateL3Table(uint32_t L3TableSize, uint32_t L3AddrAlignment);
484*35ffd701SAndroid Build Coastguard Worker GMM_STATUS DestroyL3Table();
485*35ffd701SAndroid Build Coastguard Worker void AllocateL1L2Table(GMM_GFX_ADDRESS TileAddr, GMM_GFX_ADDRESS * L1TableAdr, GMM_GFX_ADDRESS * L2TableAdr);
486*35ffd701SAndroid Build Coastguard Worker void AllocateDummyTables(GmmLib::Table **L2Table, GmmLib::Table **L1Table);
487*35ffd701SAndroid Build Coastguard Worker void GetL1L2TableAddr(GMM_GFX_ADDRESS TileAddr, GMM_GFX_ADDRESS * L1TableAdr, GMM_GFX_ADDRESS* L2TableAdr);
488*35ffd701SAndroid Build Coastguard Worker uint8_t GetMappingType(GMM_GFX_ADDRESS GfxVA, GMM_GFX_SIZE_T Size, GMM_GFX_ADDRESS& LastAddr);
GetL3Handle()489*35ffd701SAndroid Build Coastguard Worker HANDLE GetL3Handle() { return TTL3.L3Handle; }
490*35ffd701SAndroid Build Coastguard Worker };
491*35ffd701SAndroid Build Coastguard Worker
492*35ffd701SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////////////
493*35ffd701SAndroid Build Coastguard Worker /// Contains functions and members for AuxTable.
494*35ffd701SAndroid Build Coastguard Worker /// AuxTable defines PageTable for translating VA->AuxVA, ie defines page-walk to get address
495*35ffd701SAndroid Build Coastguard Worker /// of CCS-cacheline containing auxiliary data (compression tag, etc) for some resource
496*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////////////
497*35ffd701SAndroid Build Coastguard Worker class AuxTable : public PageTable
498*35ffd701SAndroid Build Coastguard Worker {
499*35ffd701SAndroid Build Coastguard Worker public:
500*35ffd701SAndroid Build Coastguard Worker const int L1Size;
501*35ffd701SAndroid Build Coastguard Worker Table* NullL2Table;
502*35ffd701SAndroid Build Coastguard Worker Table* NullL1Table;
503*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS NullCCSTile;
AuxTable(GmmClientContext * pClientContextIn)504*35ffd701SAndroid Build Coastguard Worker AuxTable(GmmClientContext *pClientContextIn)
505*35ffd701SAndroid Build Coastguard Worker : PageTable(8 * PAGE_SIZE, GMM_AUX_L3_SIZE, TT_TYPE::AUXTT), L1Size((WA16K(pClientContextIn->GetLibContext()) || WA64K(pClientContextIn->GetLibContext())) ? (2 * PAGE_SIZE) : PAGE_SIZE)
506*35ffd701SAndroid Build Coastguard Worker {
507*35ffd701SAndroid Build Coastguard Worker NullL2Table = nullptr;
508*35ffd701SAndroid Build Coastguard Worker NullL1Table = nullptr;
509*35ffd701SAndroid Build Coastguard Worker NullCCSTile = 0;
510*35ffd701SAndroid Build Coastguard Worker }
AuxTable()511*35ffd701SAndroid Build Coastguard Worker AuxTable()
512*35ffd701SAndroid Build Coastguard Worker : PageTable(8 * PAGE_SIZE, GMM_AUX_L3_SIZE, TT_TYPE::AUXTT), L1Size(2 * PAGE_SIZE)
513*35ffd701SAndroid Build Coastguard Worker {
514*35ffd701SAndroid Build Coastguard Worker NullL2Table = nullptr;
515*35ffd701SAndroid Build Coastguard Worker NullL1Table = nullptr;
516*35ffd701SAndroid Build Coastguard Worker NullCCSTile = 0;
517*35ffd701SAndroid Build Coastguard Worker }
518*35ffd701SAndroid Build Coastguard Worker GMM_STATUS InvalidateTable(GMM_UMD_SYNCCONTEXT * UmdContext, GMM_GFX_ADDRESS BaseAdr, GMM_GFX_SIZE_T Size, uint8_t DoNotWait);
519*35ffd701SAndroid Build Coastguard Worker
520*35ffd701SAndroid Build Coastguard Worker GMM_STATUS MapValidEntry(GMM_UMD_SYNCCONTEXT *UmdContext, GMM_GFX_ADDRESS BaseAdr, GMM_GFX_SIZE_T BaseSize,
521*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_INFO* BaseResInfo, GMM_GFX_ADDRESS AuxVA, GMM_RESOURCE_INFO* AuxResInfo, uint64_t PartialData, uint8_t DoNotWait);
522*35ffd701SAndroid Build Coastguard Worker
523*35ffd701SAndroid Build Coastguard Worker GMM_STATUS MapNullCCS(GMM_UMD_SYNCCONTEXT *UmdContext, GMM_GFX_ADDRESS BaseAdr, GMM_GFX_SIZE_T Size, uint64_t PartialL1e, uint8_t DoNotWait);
524*35ffd701SAndroid Build Coastguard Worker
525*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL1e CreateAuxL1Data(GMM_RESOURCE_INFO* BaseResInfo);
526*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GMM_INLINE __GetCCSCacheline(GMM_RESOURCE_INFO* BaseResInfo, GMM_GFX_ADDRESS BaseAdr, GMM_RESOURCE_INFO* AuxResInfo,
527*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS AuxVA, GMM_GFX_SIZE_T AdrOffset);
528*35ffd701SAndroid Build Coastguard Worker
529*35ffd701SAndroid Build Coastguard Worker };
530*35ffd701SAndroid Build Coastguard Worker
531*35ffd701SAndroid Build Coastguard Worker typedef struct _GMM_DEVICE_ALLOC {
532*35ffd701SAndroid Build Coastguard Worker uint32_t Size;
533*35ffd701SAndroid Build Coastguard Worker uint32_t Alignment;
534*35ffd701SAndroid Build Coastguard Worker HANDLE Handle;
535*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GfxVA;
536*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS CPUVA;
537*35ffd701SAndroid Build Coastguard Worker void * Priv;
538*35ffd701SAndroid Build Coastguard Worker HANDLE hCsr;
539*35ffd701SAndroid Build Coastguard Worker } GMM_DEVICE_ALLOC;
540*35ffd701SAndroid Build Coastguard Worker
541*35ffd701SAndroid Build Coastguard Worker typedef struct _GMM_DEVICE_DEALLOC {
542*35ffd701SAndroid Build Coastguard Worker HANDLE Handle;
543*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GfxVA;
544*35ffd701SAndroid Build Coastguard Worker void * Priv;
545*35ffd701SAndroid Build Coastguard Worker HANDLE hCsr;
546*35ffd701SAndroid Build Coastguard Worker } GMM_DEVICE_DEALLOC;
547*35ffd701SAndroid Build Coastguard Worker
548*35ffd701SAndroid Build Coastguard Worker GMM_STATUS __GmmDeviceAlloc(GmmClientContext *pClientContext,
549*35ffd701SAndroid Build Coastguard Worker GMM_DEVICE_CALLBACKS_INT *pDeviceCbInt,
550*35ffd701SAndroid Build Coastguard Worker GMM_DEVICE_ALLOC *pAlloc);
551*35ffd701SAndroid Build Coastguard Worker
552*35ffd701SAndroid Build Coastguard Worker GMM_STATUS __GmmDeviceDealloc(GMM_CLIENT ClientType,
553*35ffd701SAndroid Build Coastguard Worker GMM_DEVICE_CALLBACKS_INT *DeviceCb,
554*35ffd701SAndroid Build Coastguard Worker GMM_DEVICE_DEALLOC *pDealloc,
555*35ffd701SAndroid Build Coastguard Worker GmmClientContext *pClientContext);
556*35ffd701SAndroid Build Coastguard Worker }
557*35ffd701SAndroid Build Coastguard Worker #endif // #ifdef __cplusplus
558*35ffd701SAndroid Build Coastguard Worker
559