xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/TranslationTable/GmmUmdTranslationTable.h (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
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