xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/TranslationTable/GmmPageTableMgr.cpp (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: UMD-TT manager (manages both TR-TT and AUX-TT in user mode space)
23*35ffd701SAndroid Build Coastguard Worker 
24*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
25*35ffd701SAndroid Build Coastguard Worker 
26*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
27*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmPageTableMgr.h"
28*35ffd701SAndroid Build Coastguard Worker #include "../TranslationTable/GmmUmdTranslationTable.h"
29*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmClientContext.h"
30*35ffd701SAndroid Build Coastguard Worker 
31*35ffd701SAndroid Build Coastguard Worker #if defined(__linux__)
32*35ffd701SAndroid Build Coastguard Worker #include "Internal/Linux/GmmResourceInfoLinInt.h"
33*35ffd701SAndroid Build Coastguard Worker #endif
34*35ffd701SAndroid Build Coastguard Worker 
35*35ffd701SAndroid Build Coastguard Worker #define ENTER_CRITICAL_SECTION           \
36*35ffd701SAndroid Build Coastguard Worker     if(AuxTTObj)                         \
37*35ffd701SAndroid Build Coastguard Worker     {                                    \
38*35ffd701SAndroid Build Coastguard Worker         EnterCriticalSection(&PoolLock); \
39*35ffd701SAndroid Build Coastguard Worker     }
40*35ffd701SAndroid Build Coastguard Worker 
41*35ffd701SAndroid Build Coastguard Worker #define EXIT_CRITICAL_SECTION            \
42*35ffd701SAndroid Build Coastguard Worker     if(AuxTTObj)                         \
43*35ffd701SAndroid Build Coastguard Worker     {                                    \
44*35ffd701SAndroid Build Coastguard Worker         LeaveCriticalSection(&PoolLock); \
45*35ffd701SAndroid Build Coastguard Worker     }
46*35ffd701SAndroid Build Coastguard Worker extern GMM_MA_LIB_CONTEXT *pGmmMALibContext;
47*35ffd701SAndroid Build Coastguard Worker #if defined(__linux__)
__GmmDeviceAlloc(GmmClientContext * pClientContext,GMM_DEVICE_CALLBACKS_INT * pDeviceCbInt,GMM_DEVICE_ALLOC * pAlloc)48*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::__GmmDeviceAlloc(GmmClientContext *        pClientContext,
49*35ffd701SAndroid Build Coastguard Worker                                     GMM_DEVICE_CALLBACKS_INT *pDeviceCbInt,
50*35ffd701SAndroid Build Coastguard Worker                                     GMM_DEVICE_ALLOC *        pAlloc)
51*35ffd701SAndroid Build Coastguard Worker {
52*35ffd701SAndroid Build Coastguard Worker     GMM_CLIENT       ClientType;
53*35ffd701SAndroid Build Coastguard Worker     GMM_DDI_ALLOCATE Alloc = {0};
54*35ffd701SAndroid Build Coastguard Worker     int              err;
55*35ffd701SAndroid Build Coastguard Worker 
56*35ffd701SAndroid Build Coastguard Worker     GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
57*35ffd701SAndroid Build Coastguard Worker 
58*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(GmmCheckForNullDevCbPfn(ClientType, pDeviceCbInt, GMM_DEV_CB_ALLOC), GMM_INVALIDPARAM);
59*35ffd701SAndroid Build Coastguard Worker 
60*35ffd701SAndroid Build Coastguard Worker     if(GmmCheckForNullDevCbPfn(ClientType, pDeviceCbInt, GMM_DEV_CB_ALLOC))
61*35ffd701SAndroid Build Coastguard Worker     {
62*35ffd701SAndroid Build Coastguard Worker         Alloc.size      = pAlloc->Size;
63*35ffd701SAndroid Build Coastguard Worker         Alloc.alignment = pAlloc->Alignment;
64*35ffd701SAndroid Build Coastguard Worker 
65*35ffd701SAndroid Build Coastguard Worker         err = GmmDeviceCallback(ClientType, pDeviceCbInt, &Alloc);
66*35ffd701SAndroid Build Coastguard Worker         if(err)
67*35ffd701SAndroid Build Coastguard Worker         {
68*35ffd701SAndroid Build Coastguard Worker             return GMM_OUT_OF_MEMORY;
69*35ffd701SAndroid Build Coastguard Worker         }
70*35ffd701SAndroid Build Coastguard Worker 
71*35ffd701SAndroid Build Coastguard Worker         pAlloc->GfxVA  = Alloc.gfxAddr;
72*35ffd701SAndroid Build Coastguard Worker         pAlloc->CPUVA  = (GMM_GFX_ADDRESS) Alloc.cpuAddr;
73*35ffd701SAndroid Build Coastguard Worker         pAlloc->Handle = (HANDLE)Alloc.bo;
74*35ffd701SAndroid Build Coastguard Worker     }
75*35ffd701SAndroid Build Coastguard Worker 
76*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
77*35ffd701SAndroid Build Coastguard Worker }
78*35ffd701SAndroid Build Coastguard Worker 
__GmmDeviceDealloc(GMM_CLIENT ClientType,GMM_DEVICE_CALLBACKS_INT * DeviceCb,GMM_DEVICE_DEALLOC * pDealloc,GmmClientContext * pClientContext)79*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::__GmmDeviceDealloc(GMM_CLIENT                ClientType,
80*35ffd701SAndroid Build Coastguard Worker                                       GMM_DEVICE_CALLBACKS_INT *DeviceCb,
81*35ffd701SAndroid Build Coastguard Worker                                       GMM_DEVICE_DEALLOC *      pDealloc,
82*35ffd701SAndroid Build Coastguard Worker                                       GmmClientContext *        pClientContext)
83*35ffd701SAndroid Build Coastguard Worker 
84*35ffd701SAndroid Build Coastguard Worker {
85*35ffd701SAndroid Build Coastguard Worker     GMM_DDI_DEALLOCATE DeAlloc = {0};
86*35ffd701SAndroid Build Coastguard Worker     int                err     = 0;
87*35ffd701SAndroid Build Coastguard Worker 
88*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(GmmCheckForNullDevCbPfn(ClientType, DeviceCb, GMM_DEV_CB_DEALLOC), GMM_INVALIDPARAM);
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker     if(GmmCheckForNullDevCbPfn(ClientType, DeviceCb, GMM_DEV_CB_DEALLOC))
91*35ffd701SAndroid Build Coastguard Worker     {
92*35ffd701SAndroid Build Coastguard Worker         DeAlloc.bo = pDealloc->Handle;
93*35ffd701SAndroid Build Coastguard Worker 
94*35ffd701SAndroid Build Coastguard Worker         err = GmmDeviceCallback(ClientType, DeviceCb, &DeAlloc);
95*35ffd701SAndroid Build Coastguard Worker     }
96*35ffd701SAndroid Build Coastguard Worker 
97*35ffd701SAndroid Build Coastguard Worker     return (err == 0) ? GMM_SUCCESS : GMM_ERROR;
98*35ffd701SAndroid Build Coastguard Worker }
99*35ffd701SAndroid Build Coastguard Worker #endif
100*35ffd701SAndroid Build Coastguard Worker 
101*35ffd701SAndroid Build Coastguard Worker //=============================================================================
102*35ffd701SAndroid Build Coastguard Worker //
103*35ffd701SAndroid Build Coastguard Worker // Function: __AllocateNodePool
104*35ffd701SAndroid Build Coastguard Worker //
105*35ffd701SAndroid Build Coastguard Worker // Desc: Allocates (always resident SVM) memory for new Pool node, and updates PageTableMgr object
106*35ffd701SAndroid Build Coastguard Worker //
107*35ffd701SAndroid Build Coastguard Worker // Parameters:
108*35ffd701SAndroid Build Coastguard Worker //      AddrAlignment: Pool allocation address alignment
109*35ffd701SAndroid Build Coastguard Worker //
110*35ffd701SAndroid Build Coastguard Worker // Returns:
111*35ffd701SAndroid Build Coastguard Worker //      S_OK on success,
112*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
__AllocateNodePool(uint32_t AddrAlignment,GmmLib::POOL_TYPE Type)113*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_PAGETABLEPool *GmmLib::GmmPageTableMgr::__AllocateNodePool(uint32_t AddrAlignment, GmmLib::POOL_TYPE Type)
114*35ffd701SAndroid Build Coastguard Worker {
115*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS         Status      = GMM_SUCCESS;
116*35ffd701SAndroid Build Coastguard Worker     GMM_RESOURCE_INFO *pGmmResInfo = NULL;
117*35ffd701SAndroid Build Coastguard Worker     GMM_PAGETABLEPool *pTTPool     = NULL;
118*35ffd701SAndroid Build Coastguard Worker     HANDLE             PoolHnd     = 0;
119*35ffd701SAndroid Build Coastguard Worker     GMM_CLIENT         ClientType;
120*35ffd701SAndroid Build Coastguard Worker     GMM_DEVICE_ALLOC   Alloc = {0};
121*35ffd701SAndroid Build Coastguard Worker 
122*35ffd701SAndroid Build Coastguard Worker     ENTER_CRITICAL_SECTION
123*35ffd701SAndroid Build Coastguard Worker 
124*35ffd701SAndroid Build Coastguard Worker     //Allocate pool, sized PAGETABLE_POOL_MAX_NODES pages, assignable to TR/Aux L1/L2 tables
125*35ffd701SAndroid Build Coastguard Worker     //SVM allocation, always resident
126*35ffd701SAndroid Build Coastguard Worker     Alloc.Size      = PAGETABLE_POOL_SIZE;
127*35ffd701SAndroid Build Coastguard Worker     Alloc.Alignment = AddrAlignment;
128*35ffd701SAndroid Build Coastguard Worker     Alloc.hCsr      = hCsr;
129*35ffd701SAndroid Build Coastguard Worker 
130*35ffd701SAndroid Build Coastguard Worker     Status = __GmmDeviceAlloc(pClientContext, &DeviceCbInt, &Alloc);
131*35ffd701SAndroid Build Coastguard Worker 
132*35ffd701SAndroid Build Coastguard Worker     if(Status != GMM_SUCCESS)
133*35ffd701SAndroid Build Coastguard Worker     {
134*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0);
135*35ffd701SAndroid Build Coastguard Worker         EXIT_CRITICAL_SECTION
136*35ffd701SAndroid Build Coastguard Worker         return NULL;
137*35ffd701SAndroid Build Coastguard Worker     }
138*35ffd701SAndroid Build Coastguard Worker 
139*35ffd701SAndroid Build Coastguard Worker     PoolHnd     = Alloc.Handle;
140*35ffd701SAndroid Build Coastguard Worker     pGmmResInfo = (GMM_RESOURCE_INFO *)Alloc.Priv;
141*35ffd701SAndroid Build Coastguard Worker 
142*35ffd701SAndroid Build Coastguard Worker     pTTPool = new GMM_PAGETABLEPool(PoolHnd, pGmmResInfo, Alloc.GfxVA, Alloc.CPUVA, Type);
143*35ffd701SAndroid Build Coastguard Worker 
144*35ffd701SAndroid Build Coastguard Worker 
145*35ffd701SAndroid Build Coastguard Worker     if(pTTPool)
146*35ffd701SAndroid Build Coastguard Worker     {
147*35ffd701SAndroid Build Coastguard Worker         if(pPool)
148*35ffd701SAndroid Build Coastguard Worker         {
149*35ffd701SAndroid Build Coastguard Worker             NumNodePoolElements++;
150*35ffd701SAndroid Build Coastguard Worker             if(Type == POOL_TYPE_TRTTL2) // TRTT-L2 not 1st node in Pool LinkedList, place it at beginning
151*35ffd701SAndroid Build Coastguard Worker             {
152*35ffd701SAndroid Build Coastguard Worker                 pPool = pPool->InsertInListAtBegin(pTTPool);
153*35ffd701SAndroid Build Coastguard Worker             }
154*35ffd701SAndroid Build Coastguard Worker             else
155*35ffd701SAndroid Build Coastguard Worker             {
156*35ffd701SAndroid Build Coastguard Worker                 pTTPool = pPool->InsertInList(pTTPool);
157*35ffd701SAndroid Build Coastguard Worker             }
158*35ffd701SAndroid Build Coastguard Worker         }
159*35ffd701SAndroid Build Coastguard Worker         else
160*35ffd701SAndroid Build Coastguard Worker         {
161*35ffd701SAndroid Build Coastguard Worker             NumNodePoolElements = 1;
162*35ffd701SAndroid Build Coastguard Worker             pPool               = pTTPool;
163*35ffd701SAndroid Build Coastguard Worker         }
164*35ffd701SAndroid Build Coastguard Worker     }
165*35ffd701SAndroid Build Coastguard Worker     else
166*35ffd701SAndroid Build Coastguard Worker     {
167*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(0);
168*35ffd701SAndroid Build Coastguard Worker         Status = GMM_OUT_OF_MEMORY;
169*35ffd701SAndroid Build Coastguard Worker     }
170*35ffd701SAndroid Build Coastguard Worker 
171*35ffd701SAndroid Build Coastguard Worker     EXIT_CRITICAL_SECTION
172*35ffd701SAndroid Build Coastguard Worker     return (Status == GMM_SUCCESS) ? pTTPool : NULL;
173*35ffd701SAndroid Build Coastguard Worker }
174*35ffd701SAndroid Build Coastguard Worker 
175*35ffd701SAndroid Build Coastguard Worker //=============================================================================
176*35ffd701SAndroid Build Coastguard Worker //
177*35ffd701SAndroid Build Coastguard Worker // Function: __ReleaseUnusedPool
178*35ffd701SAndroid Build Coastguard Worker //
179*35ffd701SAndroid Build Coastguard Worker // Desc: Frees up unused PageTablePools once residency limit is hit
180*35ffd701SAndroid Build Coastguard Worker //
181*35ffd701SAndroid Build Coastguard Worker // Parameters:
182*35ffd701SAndroid Build Coastguard Worker //      UmdContext: pointer to caller thread's context (containing BBHandle/Fence info)
183*35ffd701SAndroid Build Coastguard Worker //
184*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
__ReleaseUnusedPool(GMM_UMD_SYNCCONTEXT * UmdContext)185*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmPageTableMgr::__ReleaseUnusedPool(GMM_UMD_SYNCCONTEXT *UmdContext)
186*35ffd701SAndroid Build Coastguard Worker {
187*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS                 Status         = GMM_SUCCESS;
188*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T             PoolSizeToFree = {0};
189*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_SIZE_T             FreedSize      = {0};
190*35ffd701SAndroid Build Coastguard Worker     GmmLib::GMM_PAGETABLEPool *Pool = NULL, *PrevPool = NULL;
191*35ffd701SAndroid Build Coastguard Worker     uint32_t                   i = 0;
192*35ffd701SAndroid Build Coastguard Worker     GMM_CLIENT                 ClientType;
193*35ffd701SAndroid Build Coastguard Worker     GMM_DEVICE_DEALLOC         Dealloc;
194*35ffd701SAndroid Build Coastguard Worker 
195*35ffd701SAndroid Build Coastguard Worker     GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
196*35ffd701SAndroid Build Coastguard Worker 
197*35ffd701SAndroid Build Coastguard Worker     ENTER_CRITICAL_SECTION
198*35ffd701SAndroid Build Coastguard Worker     if(pPool->__IsUnusedTRTTPoolOverLimit(&PoolSizeToFree))
199*35ffd701SAndroid Build Coastguard Worker     {
200*35ffd701SAndroid Build Coastguard Worker         for(i = 0; i < NumNodePoolElements && FreedSize < PoolSizeToFree; i++)
201*35ffd701SAndroid Build Coastguard Worker         {
202*35ffd701SAndroid Build Coastguard Worker             Pool = (PrevPool) ? PrevPool->GetNextPool() : pPool;
203*35ffd701SAndroid Build Coastguard Worker 
204*35ffd701SAndroid Build Coastguard Worker             if(Pool->IsPoolInUse(UmdContext ? SyncInfo(UmdContext->BBFenceObj, UmdContext->BBLastFence) : SyncInfo()))
205*35ffd701SAndroid Build Coastguard Worker             {
206*35ffd701SAndroid Build Coastguard Worker                 PrevPool = Pool;
207*35ffd701SAndroid Build Coastguard Worker                 continue;
208*35ffd701SAndroid Build Coastguard Worker             }
209*35ffd701SAndroid Build Coastguard Worker 
210*35ffd701SAndroid Build Coastguard Worker             if(GmmCheckForNullDevCbPfn(ClientType, &DeviceCbInt, GMM_DEV_CB_WAIT_FROM_CPU))
211*35ffd701SAndroid Build Coastguard Worker             {
212*35ffd701SAndroid Build Coastguard Worker                 GMM_DDI_WAITFORSYNCHRONIZATIONOBJECTFROMCPU Wait = {0};
213*35ffd701SAndroid Build Coastguard Worker                 Wait.bo                                          = Pool->GetPoolHandle();
214*35ffd701SAndroid Build Coastguard Worker                 GmmDeviceCallback(ClientType, &DeviceCbInt, &Wait);
215*35ffd701SAndroid Build Coastguard Worker             }
216*35ffd701SAndroid Build Coastguard Worker 
217*35ffd701SAndroid Build Coastguard Worker             Dealloc.Handle = Pool->GetPoolHandle();
218*35ffd701SAndroid Build Coastguard Worker             Dealloc.GfxVA  = Pool->GetGfxAddress();
219*35ffd701SAndroid Build Coastguard Worker             Dealloc.Priv   = Pool->GetGmmResInfo();
220*35ffd701SAndroid Build Coastguard Worker             Dealloc.hCsr   = hCsr;
221*35ffd701SAndroid Build Coastguard Worker 
222*35ffd701SAndroid Build Coastguard Worker             Status = __GmmDeviceDealloc(ClientType, &DeviceCbInt, &Dealloc, pClientContext);
223*35ffd701SAndroid Build Coastguard Worker 
224*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(GMM_SUCCESS == Status);
225*35ffd701SAndroid Build Coastguard Worker 
226*35ffd701SAndroid Build Coastguard Worker             if(PrevPool)
227*35ffd701SAndroid Build Coastguard Worker             {
228*35ffd701SAndroid Build Coastguard Worker                 PrevPool->GetNextPool() = Pool->GetNextPool();
229*35ffd701SAndroid Build Coastguard Worker             }
230*35ffd701SAndroid Build Coastguard Worker             else
231*35ffd701SAndroid Build Coastguard Worker             {
232*35ffd701SAndroid Build Coastguard Worker                 pPool = Pool->GetNextPool();
233*35ffd701SAndroid Build Coastguard Worker             }
234*35ffd701SAndroid Build Coastguard Worker             delete Pool;
235*35ffd701SAndroid Build Coastguard Worker             FreedSize += PAGETABLE_POOL_SIZE;
236*35ffd701SAndroid Build Coastguard Worker         }
237*35ffd701SAndroid Build Coastguard Worker     }
238*35ffd701SAndroid Build Coastguard Worker     EXIT_CRITICAL_SECTION
239*35ffd701SAndroid Build Coastguard Worker }
240*35ffd701SAndroid Build Coastguard Worker 
241*35ffd701SAndroid Build Coastguard Worker //=============================================================================
242*35ffd701SAndroid Build Coastguard Worker //
243*35ffd701SAndroid Build Coastguard Worker // Function: __GetFreePoolNode
244*35ffd701SAndroid Build Coastguard Worker //
245*35ffd701SAndroid Build Coastguard Worker // Desc: Finds free node within existing PageTablePool(s), if no such node found,
246*35ffd701SAndroid Build Coastguard Worker //       allocates new PageTablePool. Caller should update Pool Node usage
247*35ffd701SAndroid Build Coastguard Worker //
248*35ffd701SAndroid Build Coastguard Worker // Parameters:
249*35ffd701SAndroid Build Coastguard Worker //      FreePoolNodeIdx: pointer to return Pool's free Node index
250*35ffd701SAndroid Build Coastguard Worker //      PoolType: AuxTT_L1/L2 pool
251*35ffd701SAndroid Build Coastguard Worker //
252*35ffd701SAndroid Build Coastguard Worker // Returns:
253*35ffd701SAndroid Build Coastguard Worker //     PageTablePool element and FreePoolNodeIdx that should be used for L2/L1 assignment
254*35ffd701SAndroid Build Coastguard Worker //     NULL, if no free node exists and new pool allocation failed
255*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
__GetFreePoolNode(uint32_t * FreePoolNodeIdx,POOL_TYPE PoolType)256*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_PAGETABLEPool *GmmLib::GmmPageTableMgr::__GetFreePoolNode(uint32_t *FreePoolNodeIdx, POOL_TYPE PoolType)
257*35ffd701SAndroid Build Coastguard Worker {
258*35ffd701SAndroid Build Coastguard Worker     uint32_t PoolNode = -1, i = 0, j = 0, DWdivisor = 1, IdxMultiplier = 1;
259*35ffd701SAndroid Build Coastguard Worker     bool     PoolNodeFound = false, TRTTPool = false;
260*35ffd701SAndroid Build Coastguard Worker 
261*35ffd701SAndroid Build Coastguard Worker     ENTER_CRITICAL_SECTION
262*35ffd701SAndroid Build Coastguard Worker     GmmLib::GMM_PAGETABLEPool *Pool = pPool;
263*35ffd701SAndroid Build Coastguard Worker 
264*35ffd701SAndroid Build Coastguard Worker     Pool = (PoolType == POOL_TYPE_TRTTL2) ? Pool : //1st pool reserved for TRTT-L2, since TRTT-L2 pruning not supported yet,
265*35ffd701SAndroid Build Coastguard Worker            (Pool ? Pool->GetNextPool() : NULL);    //other pools can be TR-L1/Aux-L1/Aux-L2 (and support dynamic pruning)
266*35ffd701SAndroid Build Coastguard Worker     TRTTPool      = (PoolType == POOL_TYPE_TRTTL2 || PoolType == POOL_TYPE_TRTTL1) ? true : false;
267*35ffd701SAndroid Build Coastguard Worker     DWdivisor     = TRTTPool ? 8 * sizeof(uint32_t) : (PoolType == POOL_TYPE_AUXTTL2) ? 8 * sizeof(uint32_t) * AUX_L2TABLE_SIZE_IN_POOLNODES : 8 * sizeof(uint32_t) * AUX_L1TABLE_SIZE_IN_POOLNODES_2(GetLibContext());
268*35ffd701SAndroid Build Coastguard Worker     IdxMultiplier = TRTTPool ? 1 : (PoolType == POOL_TYPE_AUXTTL2) ? AUX_L2TABLE_SIZE_IN_POOLNODES : AUX_L1TABLE_SIZE_IN_POOLNODES_2(GetLibContext());
269*35ffd701SAndroid Build Coastguard Worker     //Scan existing PageTablePools for free pool node
270*35ffd701SAndroid Build Coastguard Worker     for(i = (PoolType == POOL_TYPE_TRTTL2) ? 0 : 1; Pool && i < NumNodePoolElements; i++)
271*35ffd701SAndroid Build Coastguard Worker     {
272*35ffd701SAndroid Build Coastguard Worker         if(Pool->GetNumFreeNode() > 0 && Pool->GetPoolType() == PoolType)
273*35ffd701SAndroid Build Coastguard Worker         {
274*35ffd701SAndroid Build Coastguard Worker             PoolNodeFound    = true;
275*35ffd701SAndroid Build Coastguard Worker             *FreePoolNodeIdx = 0;
276*35ffd701SAndroid Build Coastguard Worker             for(; j < PAGETABLE_POOL_MAX_NODES / DWdivisor; j++)
277*35ffd701SAndroid Build Coastguard Worker             {
278*35ffd701SAndroid Build Coastguard Worker                 if(_BitScanForward((uint32_t *)&PoolNode, (uint32_t) ~(Pool->GetNodeUsageAtIndex(j)))) // Get LSB that has value 0
279*35ffd701SAndroid Build Coastguard Worker                 {
280*35ffd701SAndroid Build Coastguard Worker                     *FreePoolNodeIdx += PoolNode * IdxMultiplier;
281*35ffd701SAndroid Build Coastguard Worker                     PoolNodeFound = true;
282*35ffd701SAndroid Build Coastguard Worker                     break;
283*35ffd701SAndroid Build Coastguard Worker                 }
284*35ffd701SAndroid Build Coastguard Worker                 PoolNodeFound = false;
285*35ffd701SAndroid Build Coastguard Worker                 *FreePoolNodeIdx += DWdivisor; //DWORD size in bits
286*35ffd701SAndroid Build Coastguard Worker             }
287*35ffd701SAndroid Build Coastguard Worker         }
288*35ffd701SAndroid Build Coastguard Worker         if(PoolNodeFound)
289*35ffd701SAndroid Build Coastguard Worker         {
290*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(Pool->GetPoolType() == PoolType);
291*35ffd701SAndroid Build Coastguard Worker             EXIT_CRITICAL_SECTION
292*35ffd701SAndroid Build Coastguard Worker             return Pool;
293*35ffd701SAndroid Build Coastguard Worker         }
294*35ffd701SAndroid Build Coastguard Worker         Pool = Pool->GetNextPool();
295*35ffd701SAndroid Build Coastguard Worker     }
296*35ffd701SAndroid Build Coastguard Worker 
297*35ffd701SAndroid Build Coastguard Worker     //No free pool node, allocate new
298*35ffd701SAndroid Build Coastguard Worker     if(!PoolNodeFound)
299*35ffd701SAndroid Build Coastguard Worker     {
300*35ffd701SAndroid Build Coastguard Worker         GMM_PAGETABLEPool *Pool = NULL;
301*35ffd701SAndroid Build Coastguard Worker         if(Pool = __AllocateNodePool(IdxMultiplier * PAGE_SIZE, PoolType))
302*35ffd701SAndroid Build Coastguard Worker         {
303*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(Pool->GetPoolType() == PoolType);
304*35ffd701SAndroid Build Coastguard Worker 
305*35ffd701SAndroid Build Coastguard Worker             *FreePoolNodeIdx = 0;
306*35ffd701SAndroid Build Coastguard Worker             EXIT_CRITICAL_SECTION
307*35ffd701SAndroid Build Coastguard Worker             return Pool;
308*35ffd701SAndroid Build Coastguard Worker         }
309*35ffd701SAndroid Build Coastguard Worker     }
310*35ffd701SAndroid Build Coastguard Worker 
311*35ffd701SAndroid Build Coastguard Worker     EXIT_CRITICAL_SECTION
312*35ffd701SAndroid Build Coastguard Worker     return NULL;
313*35ffd701SAndroid Build Coastguard Worker }
314*35ffd701SAndroid Build Coastguard Worker 
315*35ffd701SAndroid Build Coastguard Worker 
316*35ffd701SAndroid Build Coastguard Worker 
317*35ffd701SAndroid Build Coastguard Worker /**********************************************************************************
318*35ffd701SAndroid Build Coastguard Worker ** Class GmmPageTableMgr functions **
319*35ffd701SAndroid Build Coastguard Worker ***********************************************************************************/
320*35ffd701SAndroid Build Coastguard Worker 
321*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
322*35ffd701SAndroid Build Coastguard Worker /// Instantiates GmmPageTableMgr, allocating memory for root-tables, copies provided
323*35ffd701SAndroid Build Coastguard Worker /// device-callback function pointers
324*35ffd701SAndroid Build Coastguard Worker ///
325*35ffd701SAndroid Build Coastguard Worker /// @param[in]  DeviceCb: pointer sharing device-callback function pointers
326*35ffd701SAndroid Build Coastguard Worker /// @param[in]  TTFlags: Flags specifying which PageTables are required by client
327*35ffd701SAndroid Build Coastguard Worker /// @return     GmmPageTableMgr*
328*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmPageTableMgr(GMM_DEVICE_CALLBACKS_INT * DeviceCB,uint32_t TTFlags,GmmClientContext * pClientContextIn)329*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmPageTableMgr::GmmPageTableMgr(GMM_DEVICE_CALLBACKS_INT *DeviceCB, uint32_t TTFlags, GmmClientContext *pClientContextIn)
330*35ffd701SAndroid Build Coastguard Worker     : GmmPageTableMgr()
331*35ffd701SAndroid Build Coastguard Worker {
332*35ffd701SAndroid Build Coastguard Worker     GMM_PAGETABLE_MGR *ptr    = NULL;
333*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS         status = GMM_SUCCESS;
334*35ffd701SAndroid Build Coastguard Worker     GMM_CLIENT         ClientType;
335*35ffd701SAndroid Build Coastguard Worker 
336*35ffd701SAndroid Build Coastguard Worker     if(pClientContextIn)
337*35ffd701SAndroid Build Coastguard Worker     {
338*35ffd701SAndroid Build Coastguard Worker         ClientType = pClientContextIn->GetClientType();
339*35ffd701SAndroid Build Coastguard Worker     }
340*35ffd701SAndroid Build Coastguard Worker     else
341*35ffd701SAndroid Build Coastguard Worker     {
342*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
343*35ffd701SAndroid Build Coastguard Worker     }
344*35ffd701SAndroid Build Coastguard Worker 
345*35ffd701SAndroid Build Coastguard Worker     // this is needed if there is an error case and destructor gets called on ptr
346*35ffd701SAndroid Build Coastguard Worker     this->pClientContext = pClientContextIn;
347*35ffd701SAndroid Build Coastguard Worker 
348*35ffd701SAndroid Build Coastguard Worker     // Currently coping the code below to GMMOldAPi.cpp for backward compatible.
349*35ffd701SAndroid Build Coastguard Worker     // Any changes here should be copied there.
350*35ffd701SAndroid Build Coastguard Worker     //Initialize PageTableMgr further, only if PageTable creation succeeded
351*35ffd701SAndroid Build Coastguard Worker     try
352*35ffd701SAndroid Build Coastguard Worker     {
353*35ffd701SAndroid Build Coastguard Worker         ptr                 = new GmmPageTableMgr();
354*35ffd701SAndroid Build Coastguard Worker         ptr->pClientContext = pClientContextIn;
355*35ffd701SAndroid Build Coastguard Worker         memcpy(&ptr->DeviceCbInt, DeviceCB, sizeof(GMM_DEVICE_CALLBACKS_INT));
356*35ffd701SAndroid Build Coastguard Worker 
357*35ffd701SAndroid Build Coastguard Worker         if(pClientContextIn->GetSkuTable().FtrE2ECompression &&
358*35ffd701SAndroid Build Coastguard Worker            !pClientContextIn->GetSkuTable().FtrFlatPhysCCS)
359*35ffd701SAndroid Build Coastguard Worker         {
360*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(TTFlags & AUXTT); //Aux-TT is mandatory
361*35ffd701SAndroid Build Coastguard Worker             ptr->AuxTTObj = new AuxTable(pClientContext);
362*35ffd701SAndroid Build Coastguard Worker             if(!ptr->AuxTTObj)
363*35ffd701SAndroid Build Coastguard Worker             {
364*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
365*35ffd701SAndroid Build Coastguard Worker             }
366*35ffd701SAndroid Build Coastguard Worker             ptr->AuxTTObj->PageTableMgr   = ptr;
367*35ffd701SAndroid Build Coastguard Worker             ptr->AuxTTObj->pClientContext = pClientContextIn;
368*35ffd701SAndroid Build Coastguard Worker             status                        = ptr->AuxTTObj->AllocateL3Table(8 * PAGE_SIZE, 8 * PAGE_SIZE);
369*35ffd701SAndroid Build Coastguard Worker 
370*35ffd701SAndroid Build Coastguard Worker             if(status != GMM_SUCCESS)
371*35ffd701SAndroid Build Coastguard Worker             {
372*35ffd701SAndroid Build Coastguard Worker                 InitializeCriticalSection(&(ptr->PoolLock));
373*35ffd701SAndroid Build Coastguard Worker                 goto ERROR_CASE;
374*35ffd701SAndroid Build Coastguard Worker             }
375*35ffd701SAndroid Build Coastguard Worker         }
376*35ffd701SAndroid Build Coastguard Worker     }
377*35ffd701SAndroid Build Coastguard Worker 
378*35ffd701SAndroid Build Coastguard Worker     catch(...)
379*35ffd701SAndroid Build Coastguard Worker     {
380*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(false);
381*35ffd701SAndroid Build Coastguard Worker         if(ptr && (AuxTTObj))
382*35ffd701SAndroid Build Coastguard Worker         {
383*35ffd701SAndroid Build Coastguard Worker             InitializeCriticalSection(&(ptr->PoolLock));
384*35ffd701SAndroid Build Coastguard Worker         }
385*35ffd701SAndroid Build Coastguard Worker         goto ERROR_CASE;
386*35ffd701SAndroid Build Coastguard Worker     }
387*35ffd701SAndroid Build Coastguard Worker 
388*35ffd701SAndroid Build Coastguard Worker     if(status == GMM_SUCCESS && !(AuxTTObj))
389*35ffd701SAndroid Build Coastguard Worker     {
390*35ffd701SAndroid Build Coastguard Worker         if(ptr->AuxTTObj)
391*35ffd701SAndroid Build Coastguard Worker         {
392*35ffd701SAndroid Build Coastguard Worker             ptr->AuxTTObj->PageTableMgr = this;
393*35ffd701SAndroid Build Coastguard Worker         }
394*35ffd701SAndroid Build Coastguard Worker         *this = *ptr;
395*35ffd701SAndroid Build Coastguard Worker         //Don't initialize PoolLock until any of AuxTable object created
396*35ffd701SAndroid Build Coastguard Worker         if(ptr->AuxTTObj )
397*35ffd701SAndroid Build Coastguard Worker         {
398*35ffd701SAndroid Build Coastguard Worker             InitializeCriticalSection(&PoolLock);
399*35ffd701SAndroid Build Coastguard Worker 
400*35ffd701SAndroid Build Coastguard Worker         }
401*35ffd701SAndroid Build Coastguard Worker         //Delete temporary ptr, but don't release allocated PageTable Obj.
402*35ffd701SAndroid Build Coastguard Worker         ptr->AuxTTObj = NULL;
403*35ffd701SAndroid Build Coastguard Worker     }
404*35ffd701SAndroid Build Coastguard Worker 
405*35ffd701SAndroid Build Coastguard Worker ERROR_CASE:
406*35ffd701SAndroid Build Coastguard Worker     delete ptr;
407*35ffd701SAndroid Build Coastguard Worker     ptr = NULL;
408*35ffd701SAndroid Build Coastguard Worker }
409*35ffd701SAndroid Build Coastguard Worker 
410*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
411*35ffd701SAndroid Build Coastguard Worker /// Returns Root-table address for Aux-table
412*35ffd701SAndroid Build Coastguard Worker ///
413*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_GFX_ADDRESS if Aux-Table was created; NULL otherwise
414*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetAuxL3TableAddr()415*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GmmLib::GmmPageTableMgr::GetAuxL3TableAddr()
416*35ffd701SAndroid Build Coastguard Worker {
417*35ffd701SAndroid Build Coastguard Worker     return AuxTTObj ? AuxTTObj->GetL3Address() : 0ULL;
418*35ffd701SAndroid Build Coastguard Worker }
419*35ffd701SAndroid Build Coastguard Worker 
420*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
421*35ffd701SAndroid Build Coastguard Worker /// Queues commands to initialize Aux-Table registers in the HW context image
422*35ffd701SAndroid Build Coastguard Worker ///
423*35ffd701SAndroid Build Coastguard Worker /// @param[in]  initialBBHandle: pointer to BatchBuffer for queuing commands
424*35ffd701SAndroid Build Coastguard Worker /// @param[in]  engType: specifes engine on which the context would run
425*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_SUCCESS if queuing succeeded; GMM_ERROR otherwise
426*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
InitContextAuxTableRegister(HANDLE CmdQHandle,GMM_ENGINE_TYPE engType)427*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmPageTableMgr::InitContextAuxTableRegister(HANDLE CmdQHandle, GMM_ENGINE_TYPE engType)
428*35ffd701SAndroid Build Coastguard Worker {
429*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_ADDRESS MaskedL3GfxAddress = 0ULL;
430*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(engType);
431*35ffd701SAndroid Build Coastguard Worker 
432*35ffd701SAndroid Build Coastguard Worker     //Check FtrE2ECompression = 1
433*35ffd701SAndroid Build Coastguard Worker     if(GetLibContext()->GetSkuTable().FtrE2ECompression && AuxTTObj != NULL)
434*35ffd701SAndroid Build Coastguard Worker     {
435*35ffd701SAndroid Build Coastguard Worker         EnterCriticalSection(&AuxTTObj->TTLock);
436*35ffd701SAndroid Build Coastguard Worker         if(CmdQHandle)
437*35ffd701SAndroid Build Coastguard Worker         {
438*35ffd701SAndroid Build Coastguard Worker             //engType = ENGINE_TYPE_RCS;            //use correct offset based on engType (once per-eng offsets known)
439*35ffd701SAndroid Build Coastguard Worker             uint64_t RegOffset = 0, L3AdrReg = 0;
440*35ffd701SAndroid Build Coastguard Worker             GET_L3ADROFFSET(0, L3AdrReg, GetLibContext());
441*35ffd701SAndroid Build Coastguard Worker 
442*35ffd701SAndroid Build Coastguard Worker             RegOffset = (L3AdrReg + sizeof(uint32_t));
443*35ffd701SAndroid Build Coastguard Worker             RegOffset = L3AdrReg | (RegOffset << 0x20);
444*35ffd701SAndroid Build Coastguard Worker 
445*35ffd701SAndroid Build Coastguard Worker             MaskedL3GfxAddress = AuxTTObj->GetL3Address();
446*35ffd701SAndroid Build Coastguard Worker 
447*35ffd701SAndroid Build Coastguard Worker             //TTCb.pfPrologTranslationTable(CmdQHandle);   //MI_FLUSH, TLBInv not required since its called during context-init
448*35ffd701SAndroid Build Coastguard Worker 
449*35ffd701SAndroid Build Coastguard Worker             TTCb.pfWriteL3Adr(CmdQHandle, MaskedL3GfxAddress, RegOffset);
450*35ffd701SAndroid Build Coastguard Worker 
451*35ffd701SAndroid Build Coastguard Worker             GMM_DPF(GFXDBG_NORMAL, "AuxTT Map Address: GPUVA=0x%016llX\n", MaskedL3GfxAddress);
452*35ffd701SAndroid Build Coastguard Worker 
453*35ffd701SAndroid Build Coastguard Worker             //TTCb.pfEpilogTranslationTable(CmdQHandle, 0);
454*35ffd701SAndroid Build Coastguard Worker 
455*35ffd701SAndroid Build Coastguard Worker             AuxTTObj->GetRegisterStatus() = 0;
456*35ffd701SAndroid Build Coastguard Worker         }
457*35ffd701SAndroid Build Coastguard Worker         else
458*35ffd701SAndroid Build Coastguard Worker         {
459*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(false);
460*35ffd701SAndroid Build Coastguard Worker             LeaveCriticalSection(&AuxTTObj->TTLock);
461*35ffd701SAndroid Build Coastguard Worker             return GMM_INVALIDPARAM;
462*35ffd701SAndroid Build Coastguard Worker         }
463*35ffd701SAndroid Build Coastguard Worker         LeaveCriticalSection(&AuxTTObj->TTLock);
464*35ffd701SAndroid Build Coastguard Worker     }
465*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
466*35ffd701SAndroid Build Coastguard Worker }
467*35ffd701SAndroid Build Coastguard Worker 
468*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
469*35ffd701SAndroid Build Coastguard Worker /// Updates the Aux-PageTables, for given base resource, with appropriate mappings
470*35ffd701SAndroid Build Coastguard Worker ///
471*35ffd701SAndroid Build Coastguard Worker /// @param[in]  Details of AuxTable update request
472*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS
473*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
UpdateAuxTable(const GMM_DDI_UPDATEAUXTABLE * UpdateReq)474*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmPageTableMgr::UpdateAuxTable(const GMM_DDI_UPDATEAUXTABLE *UpdateReq)
475*35ffd701SAndroid Build Coastguard Worker {
476*35ffd701SAndroid Build Coastguard Worker     if(GetAuxL3TableAddr() == 0ULL)
477*35ffd701SAndroid Build Coastguard Worker     {
478*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid AuxTable update request, AuxTable is not initialized");
479*35ffd701SAndroid Build Coastguard Worker         return GMM_INVALIDPARAM;
480*35ffd701SAndroid Build Coastguard Worker     }
481*35ffd701SAndroid Build Coastguard Worker 
482*35ffd701SAndroid Build Coastguard Worker     if(!((UpdateReq->BaseResInfo->GetResFlags().Info.RenderCompressed ||
483*35ffd701SAndroid Build Coastguard Worker           UpdateReq->BaseResInfo->GetResFlags().Info.MediaCompressed) &&
484*35ffd701SAndroid Build Coastguard Worker          ((!UpdateReq->AuxResInfo && UpdateReq->BaseResInfo->GetResFlags().Gpu.UnifiedAuxSurface) ||
485*35ffd701SAndroid Build Coastguard Worker           (UpdateReq->AuxResInfo && UpdateReq->AuxResInfo->GetResFlags().Gpu.CCS))))
486*35ffd701SAndroid Build Coastguard Worker     /*(UpdateReq->BaseResInfo->GetResFlags().Gpu.TiledResource ||
487*35ffd701SAndroid Build Coastguard Worker         UpdateReq->BaseResInfo->GetResFlags().Gpu.Depth) */
488*35ffd701SAndroid Build Coastguard Worker     //Allow Separate Aux for Depth/TR/MSAA/others?
489*35ffd701SAndroid Build Coastguard Worker     {
490*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(0, "Invalid AuxTable update request");
491*35ffd701SAndroid Build Coastguard Worker         return GMM_INVALIDPARAM;
492*35ffd701SAndroid Build Coastguard Worker     }
493*35ffd701SAndroid Build Coastguard Worker 
494*35ffd701SAndroid Build Coastguard Worker     if(UpdateReq->Map && !(!UpdateReq->BaseResInfo->GetResFlags().Gpu.TiledResource || (UpdateReq->BaseResInfo->GetResFlags().Gpu.TiledResource && UpdateReq->UmdContext && UpdateReq->UmdContext->pCommandQueueHandle)))
495*35ffd701SAndroid Build Coastguard Worker     {
496*35ffd701SAndroid Build Coastguard Worker         //GMM_DPF_CRITICAL("TiledResources must Gpu-update AuxTable, proceeding with CPU-update...");
497*35ffd701SAndroid Build Coastguard Worker 
498*35ffd701SAndroid Build Coastguard Worker         //Allowing CPU-update if requested so..
499*35ffd701SAndroid Build Coastguard Worker         if(!UpdateReq->DoNotWait)
500*35ffd701SAndroid Build Coastguard Worker         {
501*35ffd701SAndroid Build Coastguard Worker             return GMM_INVALIDPARAM;
502*35ffd701SAndroid Build Coastguard Worker         }
503*35ffd701SAndroid Build Coastguard Worker     }
504*35ffd701SAndroid Build Coastguard Worker 
505*35ffd701SAndroid Build Coastguard Worker     ENTER_CRITICAL_SECTION
506*35ffd701SAndroid Build Coastguard Worker 
507*35ffd701SAndroid Build Coastguard Worker     if(UpdateReq->Map)
508*35ffd701SAndroid Build Coastguard Worker     {
509*35ffd701SAndroid Build Coastguard Worker         //Get AuxL1e data (other than CCS-adr) from main surface
510*35ffd701SAndroid Build Coastguard Worker         uint64_t   PartialL1e = AuxTTObj->CreateAuxL1Data(UpdateReq->BaseResInfo).Value;
511*35ffd701SAndroid Build Coastguard Worker         GMM_STATUS Status     = GMM_SUCCESS;
512*35ffd701SAndroid Build Coastguard Worker 
513*35ffd701SAndroid Build Coastguard Worker         if(UpdateReq->BaseResInfo->GetResFlags().Gpu.TiledResource)
514*35ffd701SAndroid Build Coastguard Worker         {
515*35ffd701SAndroid Build Coastguard Worker             //Aux-TT is sparsely updated, for TRs, upon change in mapping state ie
516*35ffd701SAndroid Build Coastguard Worker             // null->non-null must be mapped
517*35ffd701SAndroid Build Coastguard Worker             // non-null->null        invalidated on AuxTT
518*35ffd701SAndroid Build Coastguard Worker             uint8_t CpuUpdate = UpdateReq->DoNotWait || !(UpdateReq->UmdContext && UpdateReq->UmdContext->pCommandQueueHandle);
519*35ffd701SAndroid Build Coastguard Worker 
520*35ffd701SAndroid Build Coastguard Worker             GMM_GFX_ADDRESS AuxVA = UpdateReq->AuxSurfVA;
521*35ffd701SAndroid Build Coastguard Worker             if(UpdateReq->BaseResInfo->GetResFlags().Gpu.UnifiedAuxSurface)
522*35ffd701SAndroid Build Coastguard Worker             {
523*35ffd701SAndroid Build Coastguard Worker                 GMM_UNIFIED_AUX_TYPE AuxType = GMM_AUX_CCS;
524*35ffd701SAndroid Build Coastguard Worker                 AuxType                      = (UpdateReq->BaseResInfo->GetResFlags().Gpu.Depth && UpdateReq->BaseResInfo->GetResFlags().Gpu.CCS) ? GMM_AUX_ZCS : AuxType;
525*35ffd701SAndroid Build Coastguard Worker                 AuxVA                        = UpdateReq->BaseGpuVA + GmmResGetAuxSurfaceOffset64(UpdateReq->BaseResInfo, AuxType);
526*35ffd701SAndroid Build Coastguard Worker             }
527*35ffd701SAndroid Build Coastguard Worker 
528*35ffd701SAndroid Build Coastguard Worker         }
529*35ffd701SAndroid Build Coastguard Worker         else
530*35ffd701SAndroid Build Coastguard Worker         {
531*35ffd701SAndroid Build Coastguard Worker             GMM_GFX_ADDRESS AuxVA      = {0};
532*35ffd701SAndroid Build Coastguard Worker             GMM_GFX_ADDRESS UVAuxVA    = {0};
533*35ffd701SAndroid Build Coastguard Worker             GMM_GFX_SIZE_T  YPlaneSize = 0;
534*35ffd701SAndroid Build Coastguard Worker             uint32_t        MaxPlanes  = 1;
535*35ffd701SAndroid Build Coastguard Worker 
536*35ffd701SAndroid Build Coastguard Worker             if(!UpdateReq->AuxResInfo && UpdateReq->BaseResInfo->GetResFlags().Gpu.UnifiedAuxSurface)
537*35ffd701SAndroid Build Coastguard Worker             {
538*35ffd701SAndroid Build Coastguard Worker                 GMM_UNIFIED_AUX_TYPE AuxType = GMM_AUX_CCS;
539*35ffd701SAndroid Build Coastguard Worker                 AuxType                      = (UpdateReq->BaseResInfo->GetResFlags().Gpu.Depth &&
540*35ffd701SAndroid Build Coastguard Worker                            UpdateReq->BaseResInfo->GetResFlags().Gpu.CCS) ?
541*35ffd701SAndroid Build Coastguard Worker                           GMM_AUX_ZCS :
542*35ffd701SAndroid Build Coastguard Worker                           AuxType;
543*35ffd701SAndroid Build Coastguard Worker 
544*35ffd701SAndroid Build Coastguard Worker                 AuxVA = UpdateReq->BaseGpuVA + GmmResGetAuxSurfaceOffset64(UpdateReq->BaseResInfo, AuxType);
545*35ffd701SAndroid Build Coastguard Worker 
546*35ffd701SAndroid Build Coastguard Worker                 //For UV Packed, Gen12 e2e compr supported formats have 2 planes per surface
547*35ffd701SAndroid Build Coastguard Worker                 //Each has distinct Aux surface, Y-plane/UV-plane must be mapped to respective Y/UV Aux surface
548*35ffd701SAndroid Build Coastguard Worker                 if(GmmIsPlanar(UpdateReq->BaseResInfo->GetResourceFormat()))
549*35ffd701SAndroid Build Coastguard Worker                 {
550*35ffd701SAndroid Build Coastguard Worker                     GMM_REQ_OFFSET_INFO ReqInfo = {0};
551*35ffd701SAndroid Build Coastguard Worker                     ReqInfo.Plane               = GMM_PLANE_U;
552*35ffd701SAndroid Build Coastguard Worker                     ReqInfo.ReqRender           = 1;
553*35ffd701SAndroid Build Coastguard Worker 
554*35ffd701SAndroid Build Coastguard Worker                     MaxPlanes = 2;
555*35ffd701SAndroid Build Coastguard Worker                     UpdateReq->BaseResInfo->GetOffset(ReqInfo);
556*35ffd701SAndroid Build Coastguard Worker                     YPlaneSize = ReqInfo.Render.Offset64;
557*35ffd701SAndroid Build Coastguard Worker 
558*35ffd701SAndroid Build Coastguard Worker                     UVAuxVA = UpdateReq->BaseGpuVA + GmmResGetAuxSurfaceOffset64(UpdateReq->BaseResInfo, GMM_AUX_UV_CCS);
559*35ffd701SAndroid Build Coastguard Worker                 }
560*35ffd701SAndroid Build Coastguard Worker             }
561*35ffd701SAndroid Build Coastguard Worker 
562*35ffd701SAndroid Build Coastguard Worker             //Per-plane Aux-TT map called with per-plane base/Aux address/size
563*35ffd701SAndroid Build Coastguard Worker             for(uint32_t i = 0; i < MaxPlanes; i++)
564*35ffd701SAndroid Build Coastguard Worker             {
565*35ffd701SAndroid Build Coastguard Worker                 GMM_GFX_SIZE_T SurfSize = (MaxPlanes > 1 && UpdateReq->BaseResInfo->GetArraySize() > 1) ?
566*35ffd701SAndroid Build Coastguard Worker                                           (UpdateReq->BaseResInfo->GetQPitchPlanar(GMM_NO_PLANE) * UpdateReq->BaseResInfo->GetRenderPitch()) :
567*35ffd701SAndroid Build Coastguard Worker                                           UpdateReq->BaseResInfo->GetSizeMainSurface();
568*35ffd701SAndroid Build Coastguard Worker                 GMM_GFX_SIZE_T MapSize = (i == 0) ? ((MaxPlanes > 1) ? YPlaneSize : SurfSize) : SurfSize - YPlaneSize;
569*35ffd701SAndroid Build Coastguard Worker 
570*35ffd701SAndroid Build Coastguard Worker                 GMM_GFX_ADDRESS BaseSurfVA = (UpdateReq->AuxResInfo || i == 0) ? UpdateReq->BaseGpuVA :
571*35ffd701SAndroid Build Coastguard Worker                                                                                  UpdateReq->BaseGpuVA + YPlaneSize;
572*35ffd701SAndroid Build Coastguard Worker                 GMM_GFX_ADDRESS AuxSurfVA = (UpdateReq->AuxResInfo) ? UpdateReq->AuxSurfVA : (i > 0 ? UVAuxVA : AuxVA);
573*35ffd701SAndroid Build Coastguard Worker 
574*35ffd701SAndroid Build Coastguard Worker                 //Luma plane reset LumaChroma bit
575*35ffd701SAndroid Build Coastguard Worker                 ((GMM_AUXTTL1e *)&PartialL1e)->LumaChroma = (i == 0) ? 0 : 1;
576*35ffd701SAndroid Build Coastguard Worker                 uint32_t ArrayEle                         = GFX_MAX(((MaxPlanes > 1) ?
577*35ffd701SAndroid Build Coastguard Worker                                              UpdateReq->BaseResInfo->GetArraySize() :
578*35ffd701SAndroid Build Coastguard Worker                                              1),
579*35ffd701SAndroid Build Coastguard Worker                                             1);
580*35ffd701SAndroid Build Coastguard Worker 
581*35ffd701SAndroid Build Coastguard Worker                 for(uint32_t j = 0; j < ArrayEle; j++)
582*35ffd701SAndroid Build Coastguard Worker                 {
583*35ffd701SAndroid Build Coastguard Worker                     BaseSurfVA += ((j > 0) ? (UpdateReq->BaseResInfo->GetQPitchPlanar(GMM_PLANE_Y) * UpdateReq->BaseResInfo->GetRenderPitch()) : 0);
584*35ffd701SAndroid Build Coastguard Worker                     AuxSurfVA += (UpdateReq->AuxResInfo ?
585*35ffd701SAndroid Build Coastguard Worker                                   ((j > 0) ? (UpdateReq->AuxResInfo->GetQPitchPlanar(GMM_PLANE_Y) * UpdateReq->BaseResInfo->GetRenderPitch()) : 0) :
586*35ffd701SAndroid Build Coastguard Worker                                   ((j > 0) ? UpdateReq->BaseResInfo->GetAuxQPitch() : 0));
587*35ffd701SAndroid Build Coastguard Worker 
588*35ffd701SAndroid Build Coastguard Worker                     //(Flat mapping): Remove main/aux resInfo from params
589*35ffd701SAndroid Build Coastguard Worker                     Status = AuxTTObj->MapValidEntry(UpdateReq->UmdContext, BaseSurfVA, MapSize, UpdateReq->BaseResInfo,
590*35ffd701SAndroid Build Coastguard Worker                                                      AuxSurfVA, UpdateReq->AuxResInfo, PartialL1e, 1);
591*35ffd701SAndroid Build Coastguard Worker                     if(Status != GMM_SUCCESS)
592*35ffd701SAndroid Build Coastguard Worker                     {
593*35ffd701SAndroid Build Coastguard Worker                         GMM_ASSERTDPF(0, "Insufficient memory, free resources and try again");
594*35ffd701SAndroid Build Coastguard Worker                         EXIT_CRITICAL_SECTION
595*35ffd701SAndroid Build Coastguard Worker                         return Status;
596*35ffd701SAndroid Build Coastguard Worker                     }
597*35ffd701SAndroid Build Coastguard Worker                 }
598*35ffd701SAndroid Build Coastguard Worker             }
599*35ffd701SAndroid Build Coastguard Worker         }
600*35ffd701SAndroid Build Coastguard Worker     }
601*35ffd701SAndroid Build Coastguard Worker     else
602*35ffd701SAndroid Build Coastguard Worker     {
603*35ffd701SAndroid Build Coastguard Worker         //Invalidate all mappings for given main surface
604*35ffd701SAndroid Build Coastguard Worker         AuxTTObj->InvalidateTable(UpdateReq->UmdContext, UpdateReq->BaseGpuVA, UpdateReq->BaseResInfo->GetSizeMainSurface(), UpdateReq->DoNotWait);
605*35ffd701SAndroid Build Coastguard Worker     }
606*35ffd701SAndroid Build Coastguard Worker 
607*35ffd701SAndroid Build Coastguard Worker     EXIT_CRITICAL_SECTION
608*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
609*35ffd701SAndroid Build Coastguard Worker }
610*35ffd701SAndroid Build Coastguard Worker 
611*35ffd701SAndroid Build Coastguard Worker #if defined(__linux__) && !_WIN32
612*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
613*35ffd701SAndroid Build Coastguard Worker /// Gets size of PageTable buffer object (BOs) list
614*35ffd701SAndroid Build Coastguard Worker ///
615*35ffd701SAndroid Build Coastguard Worker /// @param[in]  TTFlags: Flags specifying PageTable-type for which BO-count required
616*35ffd701SAndroid Build Coastguard Worker /// @return     non-zero if BO list is created. Zero otherwise.
617*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetNumOfPageTableBOs(uint8_t TTFlags)618*35ffd701SAndroid Build Coastguard Worker int GmmLib::GmmPageTableMgr::GetNumOfPageTableBOs(uint8_t TTFlags)
619*35ffd701SAndroid Build Coastguard Worker {
620*35ffd701SAndroid Build Coastguard Worker     int NumBO = 0;
621*35ffd701SAndroid Build Coastguard Worker 
622*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(TTFlags & AUXTT, 0);
623*35ffd701SAndroid Build Coastguard Worker 
624*35ffd701SAndroid Build Coastguard Worker     ENTER_CRITICAL_SECTION
625*35ffd701SAndroid Build Coastguard Worker 
626*35ffd701SAndroid Build Coastguard Worker     if(AuxTTObj && AuxTTObj->GetL3Handle())
627*35ffd701SAndroid Build Coastguard Worker         NumBO++;
628*35ffd701SAndroid Build Coastguard Worker 
629*35ffd701SAndroid Build Coastguard Worker     NumBO += NumNodePoolElements;
630*35ffd701SAndroid Build Coastguard Worker 
631*35ffd701SAndroid Build Coastguard Worker     EXIT_CRITICAL_SECTION
632*35ffd701SAndroid Build Coastguard Worker 
633*35ffd701SAndroid Build Coastguard Worker     return NumBO;
634*35ffd701SAndroid Build Coastguard Worker }
635*35ffd701SAndroid Build Coastguard Worker 
636*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
637*35ffd701SAndroid Build Coastguard Worker /// Gets size of PageTable buffer object (BOs) list
638*35ffd701SAndroid Build Coastguard Worker ///
639*35ffd701SAndroid Build Coastguard Worker /// @param[in]       TTFlags: Flags specifying PageTable-type for which BO-count required
640*35ffd701SAndroid Build Coastguard Worker /// @param[in][out]  BOList: pointer to memory where PageTable BO*(s) must be sent
641*35ffd701SAndroid Build Coastguard Worker /// @return     non-zero if BO list is created. Zero otherwise.
642*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetPageTableBOList(uint8_t TTFlags,void * BOList)643*35ffd701SAndroid Build Coastguard Worker int GmmLib::GmmPageTableMgr::GetPageTableBOList(uint8_t TTFlags, void *BOList)
644*35ffd701SAndroid Build Coastguard Worker {
645*35ffd701SAndroid Build Coastguard Worker     int                        NumBO   = GetNumOfPageTableBOs(TTFlags);
646*35ffd701SAndroid Build Coastguard Worker     HANDLE *                   Handles = (HANDLE *)BOList;
647*35ffd701SAndroid Build Coastguard Worker     GmmLib::GMM_PAGETABLEPool *Pool;
648*35ffd701SAndroid Build Coastguard Worker 
649*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(TTFlags & AUXTT, 0);
650*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(BOList, 0);
651*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(NumBO, 0);
652*35ffd701SAndroid Build Coastguard Worker 
653*35ffd701SAndroid Build Coastguard Worker     ENTER_CRITICAL_SECTION
654*35ffd701SAndroid Build Coastguard Worker 
655*35ffd701SAndroid Build Coastguard Worker     if(AuxTTObj && AuxTTObj->GetL3Handle())
656*35ffd701SAndroid Build Coastguard Worker         Handles[0] = AuxTTObj->GetL3Handle();
657*35ffd701SAndroid Build Coastguard Worker 
658*35ffd701SAndroid Build Coastguard Worker     Pool = pPool;
659*35ffd701SAndroid Build Coastguard Worker 
660*35ffd701SAndroid Build Coastguard Worker     for(int i = 0; i < NumNodePoolElements; i++)
661*35ffd701SAndroid Build Coastguard Worker     {
662*35ffd701SAndroid Build Coastguard Worker         if(Pool)
663*35ffd701SAndroid Build Coastguard Worker         {
664*35ffd701SAndroid Build Coastguard Worker             Handles[i + 1] = Pool->GetPoolHandle();
665*35ffd701SAndroid Build Coastguard Worker             Pool           = Pool->GetNextPool();
666*35ffd701SAndroid Build Coastguard Worker         }
667*35ffd701SAndroid Build Coastguard Worker     }
668*35ffd701SAndroid Build Coastguard Worker 
669*35ffd701SAndroid Build Coastguard Worker     EXIT_CRITICAL_SECTION
670*35ffd701SAndroid Build Coastguard Worker 
671*35ffd701SAndroid Build Coastguard Worker     return NumBO;
672*35ffd701SAndroid Build Coastguard Worker }
673*35ffd701SAndroid Build Coastguard Worker #endif
674*35ffd701SAndroid Build Coastguard Worker 
675*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
676*35ffd701SAndroid Build Coastguard Worker /// Releases GmmPageTableMgr, deleting root-tables and existing page-table pools
677*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
~GmmPageTableMgr()678*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmPageTableMgr::~GmmPageTableMgr()
679*35ffd701SAndroid Build Coastguard Worker {
680*35ffd701SAndroid Build Coastguard Worker     GMM_CLIENT ClientType;
681*35ffd701SAndroid Build Coastguard Worker 
682*35ffd701SAndroid Build Coastguard Worker     GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
683*35ffd701SAndroid Build Coastguard Worker 
684*35ffd701SAndroid Build Coastguard Worker 
685*35ffd701SAndroid Build Coastguard Worker 
686*35ffd701SAndroid Build Coastguard Worker     if(pPool)
687*35ffd701SAndroid Build Coastguard Worker     {
688*35ffd701SAndroid Build Coastguard Worker         ENTER_CRITICAL_SECTION
689*35ffd701SAndroid Build Coastguard Worker         pPool->__DestroyPageTablePool(&DeviceCbInt, hCsr);
690*35ffd701SAndroid Build Coastguard Worker         NumNodePoolElements = 0;
691*35ffd701SAndroid Build Coastguard Worker         EXIT_CRITICAL_SECTION
692*35ffd701SAndroid Build Coastguard Worker     }
693*35ffd701SAndroid Build Coastguard Worker 
694*35ffd701SAndroid Build Coastguard Worker     if(AuxTTObj)
695*35ffd701SAndroid Build Coastguard Worker     {
696*35ffd701SAndroid Build Coastguard Worker         DeleteCriticalSection(&PoolLock);
697*35ffd701SAndroid Build Coastguard Worker 
698*35ffd701SAndroid Build Coastguard Worker         if(AuxTTObj)
699*35ffd701SAndroid Build Coastguard Worker         {
700*35ffd701SAndroid Build Coastguard Worker             if(AuxTTObj->NullL1Table)
701*35ffd701SAndroid Build Coastguard Worker             {
702*35ffd701SAndroid Build Coastguard Worker                 delete AuxTTObj->NullL1Table;
703*35ffd701SAndroid Build Coastguard Worker             }
704*35ffd701SAndroid Build Coastguard Worker             if(AuxTTObj->NullL2Table)
705*35ffd701SAndroid Build Coastguard Worker             {
706*35ffd701SAndroid Build Coastguard Worker                 delete AuxTTObj->NullL2Table;
707*35ffd701SAndroid Build Coastguard Worker             }
708*35ffd701SAndroid Build Coastguard Worker             AuxTTObj->DestroyL3Table();
709*35ffd701SAndroid Build Coastguard Worker             delete AuxTTObj;
710*35ffd701SAndroid Build Coastguard Worker             AuxTTObj = NULL;
711*35ffd701SAndroid Build Coastguard Worker         }
712*35ffd701SAndroid Build Coastguard Worker     }
713*35ffd701SAndroid Build Coastguard Worker }
714*35ffd701SAndroid Build Coastguard Worker 
715*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
716*35ffd701SAndroid Build Coastguard Worker /// Instantiates and zeroes out GmmPageTableMgr
717*35ffd701SAndroid Build Coastguard Worker ///
718*35ffd701SAndroid Build Coastguard Worker /// @return     GmmPageTableMgr*
719*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmPageTableMgr()720*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmPageTableMgr::GmmPageTableMgr()
721*35ffd701SAndroid Build Coastguard Worker {
722*35ffd701SAndroid Build Coastguard Worker     this->AuxTTObj            = NULL;
723*35ffd701SAndroid Build Coastguard Worker     this->pPool               = NULL;
724*35ffd701SAndroid Build Coastguard Worker     this->NumNodePoolElements = 0;
725*35ffd701SAndroid Build Coastguard Worker     this->pClientContext      = NULL;
726*35ffd701SAndroid Build Coastguard Worker     this->hCsr                = NULL;
727*35ffd701SAndroid Build Coastguard Worker 
728*35ffd701SAndroid Build Coastguard Worker     memset(&DeviceCb, 0, sizeof(GMM_DEVICE_CALLBACKS));
729*35ffd701SAndroid Build Coastguard Worker     memset(&DeviceCbInt, 0, sizeof(GMM_DEVICE_CALLBACKS_INT));
730*35ffd701SAndroid Build Coastguard Worker }
731*35ffd701SAndroid Build Coastguard Worker 
732*35ffd701SAndroid Build Coastguard Worker 
733