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