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: AUX-Table management functions
23*35ffd701SAndroid Build Coastguard Worker (contains functions to assign memory to
24*35ffd701SAndroid Build Coastguard Worker AUX-Tables with valid entries,
25*35ffd701SAndroid Build Coastguard Worker and update their entries on request)
26*35ffd701SAndroid Build Coastguard Worker
27*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
28*35ffd701SAndroid Build Coastguard Worker
29*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
30*35ffd701SAndroid Build Coastguard Worker #include "../TranslationTable/GmmUmdTranslationTable.h"
31*35ffd701SAndroid Build Coastguard Worker
32*35ffd701SAndroid Build Coastguard Worker #if !defined(__GMM_KMD__)
33*35ffd701SAndroid Build Coastguard Worker
34*35ffd701SAndroid Build Coastguard Worker //=============================================================================
35*35ffd701SAndroid Build Coastguard Worker //
36*35ffd701SAndroid Build Coastguard Worker // Function: MapNullCCS
37*35ffd701SAndroid Build Coastguard Worker //
38*35ffd701SAndroid Build Coastguard Worker // Desc: Maps given resource, with dummy null-ccs chain, on Aux Table
39*35ffd701SAndroid Build Coastguard Worker //
40*35ffd701SAndroid Build Coastguard Worker // Caller: UpdateAuxTable (map op for null-tiles)
41*35ffd701SAndroid Build Coastguard Worker //
42*35ffd701SAndroid Build Coastguard Worker // Parameters:
43*35ffd701SAndroid Build Coastguard Worker // UmdContext: Caller-thread specific info (regarding BB for TR-Aux udpate, cmdQ to use etc)
44*35ffd701SAndroid Build Coastguard Worker // BaseAdr: Start adr of main surface
45*35ffd701SAndroid Build Coastguard Worker // Size: Main-surface size in bytes
46*35ffd701SAndroid Build Coastguard Worker // PartialL1e: Aux-metadata other than AuxVA
47*35ffd701SAndroid Build Coastguard Worker // DoNotWait: 1 for CPU update, 0 for async(Gpu) update
48*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
MapNullCCS(GMM_UMD_SYNCCONTEXT * UmdContext,GMM_GFX_ADDRESS BaseAdr,GMM_GFX_SIZE_T Size,uint64_t PartialL1e,uint8_t DoNotWait)49*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::AuxTable::MapNullCCS(GMM_UMD_SYNCCONTEXT *UmdContext, GMM_GFX_ADDRESS BaseAdr, GMM_GFX_SIZE_T Size, uint64_t PartialL1e, uint8_t DoNotWait)
50*35ffd701SAndroid Build Coastguard Worker {
51*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
52*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L1TableSize = ((GMM_GFX_SIZE_T)GMM_L1_SIZE(AUXTT, GetGmmLibContext())) * (WA16K(GetGmmLibContext()) ? GMM_KBYTE(16) : GMM_KBYTE(64)); // TGL and above : L1TableSize = 256x64K OR 16x1M
53*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS Addr = 0;
54*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L3GfxAddress = 0;
55*35ffd701SAndroid Build Coastguard Worker GMM_CLIENT ClientType;
56*35ffd701SAndroid Build Coastguard Worker
57*35ffd701SAndroid Build Coastguard Worker GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
58*35ffd701SAndroid Build Coastguard Worker
59*35ffd701SAndroid Build Coastguard Worker EnterCriticalSection(&TTLock);
60*35ffd701SAndroid Build Coastguard Worker
61*35ffd701SAndroid Build Coastguard Worker DoNotWait |= (!UmdContext || !UmdContext->pCommandQueueHandle);
62*35ffd701SAndroid Build Coastguard Worker
63*35ffd701SAndroid Build Coastguard Worker if(TTL3.L3Handle)
64*35ffd701SAndroid Build Coastguard Worker {
65*35ffd701SAndroid Build Coastguard Worker L3GfxAddress = TTL3.GfxAddress;
66*35ffd701SAndroid Build Coastguard Worker }
67*35ffd701SAndroid Build Coastguard Worker else
68*35ffd701SAndroid Build Coastguard Worker {
69*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
70*35ffd701SAndroid Build Coastguard Worker return GMM_ERROR;
71*35ffd701SAndroid Build Coastguard Worker }
72*35ffd701SAndroid Build Coastguard Worker
73*35ffd701SAndroid Build Coastguard Worker if(!DoNotWait)
74*35ffd701SAndroid Build Coastguard Worker {
75*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfPrologTranslationTable(
76*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle);
77*35ffd701SAndroid Build Coastguard Worker }
78*35ffd701SAndroid Build Coastguard Worker
79*35ffd701SAndroid Build Coastguard Worker // For each L1 table
80*35ffd701SAndroid Build Coastguard Worker for(Addr = GFX_ALIGN_FLOOR(BaseAdr, L1TableSize); // Start at begining of L1 table
81*35ffd701SAndroid Build Coastguard Worker Addr < BaseAdr + Size;
82*35ffd701SAndroid Build Coastguard Worker Addr += L1TableSize) // Increment by 1 L1 table
83*35ffd701SAndroid Build Coastguard Worker {
84*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L1GfxAddress, L2GfxAddress;
85*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L1CPUAddress, L2CPUAddress;
86*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS StartAddress = 0;
87*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS EndAddress = 0;
88*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TileAddr = 0;
89*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L2eIdx = 0;
90*35ffd701SAndroid Build Coastguard Worker
91*35ffd701SAndroid Build Coastguard Worker StartAddress = Addr < BaseAdr ? BaseAdr : Addr;
92*35ffd701SAndroid Build Coastguard Worker EndAddress = Addr + L1TableSize;
93*35ffd701SAndroid Build Coastguard Worker if(EndAddress > BaseAdr + Size)
94*35ffd701SAndroid Build Coastguard Worker {
95*35ffd701SAndroid Build Coastguard Worker EndAddress = BaseAdr + Size;
96*35ffd701SAndroid Build Coastguard Worker }
97*35ffd701SAndroid Build Coastguard Worker
98*35ffd701SAndroid Build Coastguard Worker GetL1L2TableAddr(StartAddress,
99*35ffd701SAndroid Build Coastguard Worker &L1GfxAddress,
100*35ffd701SAndroid Build Coastguard Worker &L2GfxAddress);
101*35ffd701SAndroid Build Coastguard Worker
102*35ffd701SAndroid Build Coastguard Worker // If tables are not there, then they are already invalidated as part of
103*35ffd701SAndroid Build Coastguard Worker // AUX-TT initialization or other APIs.
104*35ffd701SAndroid Build Coastguard Worker if(L2GfxAddress == GMM_NO_TABLE ||
105*35ffd701SAndroid Build Coastguard Worker L1GfxAddress == GMM_NO_TABLE)
106*35ffd701SAndroid Build Coastguard Worker {
107*35ffd701SAndroid Build Coastguard Worker //Clear Valid-bit for L3Entry or L2Entry
108*35ffd701SAndroid Build Coastguard Worker uint64_t Data = 0;
109*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TableGfxAddress = (L2GfxAddress == GMM_NO_TABLE) ? L3GfxAddress : L2GfxAddress;
110*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TableCPUAddress = (L2GfxAddress == GMM_NO_TABLE) ? TTL3.CPUAddress : pTTL2[GMM_L3_ENTRY_IDX(AUXTT, StartAddress)].GetCPUAddress();
111*35ffd701SAndroid Build Coastguard Worker uint32_t TableEntryIdx = (L2GfxAddress == GMM_NO_TABLE) ? static_cast<uint32_t>(GMM_L3_ENTRY_IDX(AUXTT, StartAddress)) : static_cast<uint32_t>(GMM_L2_ENTRY_IDX(AUXTT, StartAddress));
112*35ffd701SAndroid Build Coastguard Worker L2CPUAddress = (L2GfxAddress == GMM_NO_TABLE) ? 0 : TableCPUAddress;
113*35ffd701SAndroid Build Coastguard Worker
114*35ffd701SAndroid Build Coastguard Worker if(!NullL1Table || !NullL2Table)
115*35ffd701SAndroid Build Coastguard Worker {
116*35ffd701SAndroid Build Coastguard Worker AllocateDummyTables(&NullL2Table, &NullL1Table);
117*35ffd701SAndroid Build Coastguard Worker if(!NullL1Table || !NullL2Table)
118*35ffd701SAndroid Build Coastguard Worker {
119*35ffd701SAndroid Build Coastguard Worker //report error
120*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
121*35ffd701SAndroid Build Coastguard Worker return GMM_OUT_OF_MEMORY;
122*35ffd701SAndroid Build Coastguard Worker }
123*35ffd701SAndroid Build Coastguard Worker else
124*35ffd701SAndroid Build Coastguard Worker {
125*35ffd701SAndroid Build Coastguard Worker //Initialize dummy table entries (one-time)
126*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TableAddr = NullL2Table->GetCPUAddress();
127*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
128*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
129*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2((NullL1Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL1Table->GetNodeIdx()), L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext()))) // populate L2e.L1GfxAddr
130*35ffd701SAndroid Build Coastguard Worker for(int i = 0; i < GMM_AUX_L2_SIZE; i++)
131*35ffd701SAndroid Build Coastguard Worker {
132*35ffd701SAndroid Build Coastguard Worker //initialize L2e ie clear Valid bit for all entries
133*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)TableAddr)[i].Value = L2e.Value;
134*35ffd701SAndroid Build Coastguard Worker }
135*35ffd701SAndroid Build Coastguard Worker
136*35ffd701SAndroid Build Coastguard Worker TableAddr = NullL1Table->GetCPUAddress();
137*35ffd701SAndroid Build Coastguard Worker
138*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL1e L1e = {0};
139*35ffd701SAndroid Build Coastguard Worker L1e.Valid = 1;
140*35ffd701SAndroid Build Coastguard Worker if(!WA64K(GetGmmLibContext()))
141*35ffd701SAndroid Build Coastguard Worker {
142*35ffd701SAndroid Build Coastguard Worker L1e.GfxAddress = (NullCCSTile >> 12); /*********** 4kb-aligned CCS adr *****/
143*35ffd701SAndroid Build Coastguard Worker }
144*35ffd701SAndroid Build Coastguard Worker else
145*35ffd701SAndroid Build Coastguard Worker {
146*35ffd701SAndroid Build Coastguard Worker L1e.Reserved4 = (NullCCSTile >> 8); /*********** 4 lsbs of 256B-aligned CCS adr *****/
147*35ffd701SAndroid Build Coastguard Worker L1e.GfxAddress = (NullCCSTile >> 12); /*********** 4kb-aligned CCS adr *****/
148*35ffd701SAndroid Build Coastguard Worker }
149*35ffd701SAndroid Build Coastguard Worker
150*35ffd701SAndroid Build Coastguard Worker for(int i = 0; i < GMM_AUX_L1_SIZE(GetGmmLibContext()); i++)
151*35ffd701SAndroid Build Coastguard Worker {
152*35ffd701SAndroid Build Coastguard Worker //initialize L1e with null ccs tile
153*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL1e *)TableAddr)[i].Value = L1e.Value;
154*35ffd701SAndroid Build Coastguard Worker }
155*35ffd701SAndroid Build Coastguard Worker }
156*35ffd701SAndroid Build Coastguard Worker }
157*35ffd701SAndroid Build Coastguard Worker
158*35ffd701SAndroid Build Coastguard Worker if(L2GfxAddress == GMM_NO_TABLE)
159*35ffd701SAndroid Build Coastguard Worker {
160*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL3e L3e = {0};
161*35ffd701SAndroid Build Coastguard Worker L3e.Valid = 1;
162*35ffd701SAndroid Build Coastguard Worker L3e.L2GfxAddr = (NullL2Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL2Table->GetNodeIdx()) >> 15;
163*35ffd701SAndroid Build Coastguard Worker Data = L3e.Value;
164*35ffd701SAndroid Build Coastguard Worker }
165*35ffd701SAndroid Build Coastguard Worker else
166*35ffd701SAndroid Build Coastguard Worker {
167*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
168*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
169*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2((NullL1Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL1Table->GetNodeIdx()), L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
170*35ffd701SAndroid Build Coastguard Worker Data = L2e.Value;
171*35ffd701SAndroid Build Coastguard Worker }
172*35ffd701SAndroid Build Coastguard Worker
173*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
174*35ffd701SAndroid Build Coastguard Worker {
175*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
176*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)TableCPUAddress)[TableEntryIdx].Value = Data;
177*35ffd701SAndroid Build Coastguard Worker }
178*35ffd701SAndroid Build Coastguard Worker else
179*35ffd701SAndroid Build Coastguard Worker {
180*35ffd701SAndroid Build Coastguard Worker if(L2GfxAddress != GMM_NO_TABLE)
181*35ffd701SAndroid Build Coastguard Worker {
182*35ffd701SAndroid Build Coastguard Worker pTTL2[GMM_L3_ENTRY_IDX(AUXTT, StartAddress)].UpdatePoolFence(UmdContext, false);
183*35ffd701SAndroid Build Coastguard Worker }
184*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
185*35ffd701SAndroid Build Coastguard Worker TableGfxAddress + TableEntryIdx * GMM_AUX_L2e_SIZE,
186*35ffd701SAndroid Build Coastguard Worker Data);
187*35ffd701SAndroid Build Coastguard Worker }
188*35ffd701SAndroid Build Coastguard Worker continue;
189*35ffd701SAndroid Build Coastguard Worker }
190*35ffd701SAndroid Build Coastguard Worker else
191*35ffd701SAndroid Build Coastguard Worker {
192*35ffd701SAndroid Build Coastguard Worker uint32_t L3eIdx = static_cast<uint32_t>(GMM_L3_ENTRY_IDX(AUXTT, StartAddress));
193*35ffd701SAndroid Build Coastguard Worker L2CPUAddress = pTTL2[L3eIdx].GetCPUAddress();
194*35ffd701SAndroid Build Coastguard Worker
195*35ffd701SAndroid Build Coastguard Worker L2eIdx = GMM_L2_ENTRY_IDX(AUXTT, StartAddress);
196*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
197*35ffd701SAndroid Build Coastguard Worker {
198*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
199*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].Valid = 1; //set Valid bit
200*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].L2GfxAddr = L2GfxAddress >> 15;
201*35ffd701SAndroid Build Coastguard Worker
202*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx].Valid = 1; //set Valid bit
203*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2(L1GfxAddress, ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx], (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
204*35ffd701SAndroid Build Coastguard Worker }
205*35ffd701SAndroid Build Coastguard Worker else
206*35ffd701SAndroid Build Coastguard Worker {
207*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL3e L3e = {0};
208*35ffd701SAndroid Build Coastguard Worker L3e.Valid = 1;
209*35ffd701SAndroid Build Coastguard Worker L3e.L2GfxAddr = L2GfxAddress >> 15;
210*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(
211*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
212*35ffd701SAndroid Build Coastguard Worker L3GfxAddress + (L3eIdx * GMM_AUX_L3e_SIZE),
213*35ffd701SAndroid Build Coastguard Worker L3e.Value);
214*35ffd701SAndroid Build Coastguard Worker
215*35ffd701SAndroid Build Coastguard Worker pTTL2[L3eIdx].UpdatePoolFence(UmdContext, false);
216*35ffd701SAndroid Build Coastguard Worker
217*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
218*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
219*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2(L1GfxAddress, L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
220*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(
221*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
222*35ffd701SAndroid Build Coastguard Worker L2GfxAddress + (L2eIdx * GMM_AUX_L2e_SIZE),
223*35ffd701SAndroid Build Coastguard Worker L2e.Value);
224*35ffd701SAndroid Build Coastguard Worker }
225*35ffd701SAndroid Build Coastguard Worker }
226*35ffd701SAndroid Build Coastguard Worker
227*35ffd701SAndroid Build Coastguard Worker // For each 64KB or 16KB of main surface (entry) in L1 table
228*35ffd701SAndroid Build Coastguard Worker for(TileAddr = StartAddress;
229*35ffd701SAndroid Build Coastguard Worker TileAddr < EndAddress;
230*35ffd701SAndroid Build Coastguard Worker TileAddr += (WA16K(GetGmmLibContext()) ? GMM_KBYTE(16) : WA64K(GetGmmLibContext()) ? GMM_KBYTE(64) : GMM_MBYTE(1)))
231*35ffd701SAndroid Build Coastguard Worker {
232*35ffd701SAndroid Build Coastguard Worker uint64_t Data = PartialL1e | NullCCSTile | __BIT(0);
233*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L1eIdx = GMM_L1_ENTRY_IDX(AUXTT, TileAddr, GetGmmLibContext());
234*35ffd701SAndroid Build Coastguard Worker GmmLib::LastLevelTable *pL1Tbl = NULL;
235*35ffd701SAndroid Build Coastguard Worker
236*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pTTL2[GMM_AUX_L3_ENTRY_IDX(TileAddr)].GetL1Table(L2eIdx, NULL);
237*35ffd701SAndroid Build Coastguard Worker L1CPUAddress = pL1Tbl->GetCPUAddress();
238*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
239*35ffd701SAndroid Build Coastguard Worker {
240*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
241*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL1e *)L1CPUAddress)[L1eIdx].Value = Data;
242*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "##### Null-Map | Table Entry: TileAddress[0x%llX] L2eIdx[%d] :: L1eIdx[%d] L1Addr[0x%llX] L1Value[00x%llX]\n", TileAddr, L2eIdx, L1eIdx, &((GMM_AUXTTL1e *)L1CPUAddress)[L1eIdx], Data);
243*35ffd701SAndroid Build Coastguard Worker }
244*35ffd701SAndroid Build Coastguard Worker else
245*35ffd701SAndroid Build Coastguard Worker {
246*35ffd701SAndroid Build Coastguard Worker pL1Tbl->UpdatePoolFence(UmdContext, false);
247*35ffd701SAndroid Build Coastguard Worker
248*35ffd701SAndroid Build Coastguard Worker /* PageTableMgr->TTCb.pfWriteL1Entries(
249*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
250*35ffd701SAndroid Build Coastguard Worker 2,
251*35ffd701SAndroid Build Coastguard Worker L1GfxAddress + (L1eIdx * GMM_AUX_L1e_SIZE),
252*35ffd701SAndroid Build Coastguard Worker (uint32_t*)(&Data));*/ //**********REQUIRE UMD CHANGE TO UPDATE 64-bit ENTRY - both DWORDs must be updated atomically*******/
253*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(
254*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
255*35ffd701SAndroid Build Coastguard Worker L1GfxAddress + (L1eIdx * GMM_AUX_L1e_SIZE),
256*35ffd701SAndroid Build Coastguard Worker Data);
257*35ffd701SAndroid Build Coastguard Worker }
258*35ffd701SAndroid Build Coastguard Worker
259*35ffd701SAndroid Build Coastguard Worker if(pL1Tbl->TrackTableUsage(AUXTT, true, TileAddr, true, GetGmmLibContext()))
260*35ffd701SAndroid Build Coastguard Worker { // L1 Table is not being used anymore
261*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
262*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_PAGETABLEPool *PoolElem = NULL;
263*35ffd701SAndroid Build Coastguard Worker GmmLib::LastLevelTable * pL1Tbl = NULL, *Prev = NULL;
264*35ffd701SAndroid Build Coastguard Worker
265*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pTTL2[GMM_L3_ENTRY_IDX(AUXTT, TileAddr)].GetL1Table(L2eIdx, &Prev);
266*35ffd701SAndroid Build Coastguard Worker // Map L2-entry to Null-L1Table
267*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
268*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2((NullL1Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL1Table->GetNodeIdx()), L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext()))) // populate L2e.L1GfxAddress/Le2.Reserved2
269*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
270*35ffd701SAndroid Build Coastguard Worker {
271*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
272*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx].Value = L2e.Value;
273*35ffd701SAndroid Build Coastguard Worker }
274*35ffd701SAndroid Build Coastguard Worker else
275*35ffd701SAndroid Build Coastguard Worker {
276*35ffd701SAndroid Build Coastguard Worker pTTL2[GMM_L3_ENTRY_IDX(AUXTT, TileAddr)].UpdatePoolFence(UmdContext, false);
277*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
278*35ffd701SAndroid Build Coastguard Worker L2GfxAddress + L2eIdx * GMM_AUX_L2e_SIZE,
279*35ffd701SAndroid Build Coastguard Worker L2e.Value);
280*35ffd701SAndroid Build Coastguard Worker }
281*35ffd701SAndroid Build Coastguard Worker //Update usage for PoolNode assigned to L1Table, and free L1Tbl
282*35ffd701SAndroid Build Coastguard Worker if(pL1Tbl)
283*35ffd701SAndroid Build Coastguard Worker {
284*35ffd701SAndroid Build Coastguard Worker PoolElem = pL1Tbl->GetPool();
285*35ffd701SAndroid Build Coastguard Worker if(PoolElem)
286*35ffd701SAndroid Build Coastguard Worker {
287*35ffd701SAndroid Build Coastguard Worker if(pL1Tbl->GetBBInfo().BBQueueHandle)
288*35ffd701SAndroid Build Coastguard Worker {
289*35ffd701SAndroid Build Coastguard Worker PoolElem->GetNodeBBInfoAtIndex(pL1Tbl->GetNodeIdx()) = pL1Tbl->GetBBInfo();
290*35ffd701SAndroid Build Coastguard Worker }
291*35ffd701SAndroid Build Coastguard Worker DEASSIGN_POOLNODE(PageTableMgr, UmdContext, PoolElem, pL1Tbl->GetNodeIdx(), AUX_L1TABLE_SIZE_IN_POOLNODES_2(GetGmmLibContext()))
292*35ffd701SAndroid Build Coastguard Worker }
293*35ffd701SAndroid Build Coastguard Worker pTTL2[GMM_L3_ENTRY_IDX(AUXTT, TileAddr)].DeleteFromList(pL1Tbl, Prev);
294*35ffd701SAndroid Build Coastguard Worker }
295*35ffd701SAndroid Build Coastguard Worker
296*35ffd701SAndroid Build Coastguard Worker // The L1 table is unused -- meaning everything else in this table is
297*35ffd701SAndroid Build Coastguard Worker // already invalid. So, break early.
298*35ffd701SAndroid Build Coastguard Worker break;
299*35ffd701SAndroid Build Coastguard Worker }
300*35ffd701SAndroid Build Coastguard Worker }
301*35ffd701SAndroid Build Coastguard Worker }
302*35ffd701SAndroid Build Coastguard Worker
303*35ffd701SAndroid Build Coastguard Worker if(!DoNotWait)
304*35ffd701SAndroid Build Coastguard Worker {
305*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfEpilogTranslationTable(
306*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
307*35ffd701SAndroid Build Coastguard Worker 1); // ForceFlush
308*35ffd701SAndroid Build Coastguard Worker }
309*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
310*35ffd701SAndroid Build Coastguard Worker
311*35ffd701SAndroid Build Coastguard Worker return Status;
312*35ffd701SAndroid Build Coastguard Worker }
313*35ffd701SAndroid Build Coastguard Worker
314*35ffd701SAndroid Build Coastguard Worker //=============================================================================
315*35ffd701SAndroid Build Coastguard Worker //
316*35ffd701SAndroid Build Coastguard Worker // Function: InvalidateTable (InvalidateMappings)
317*35ffd701SAndroid Build Coastguard Worker //
318*35ffd701SAndroid Build Coastguard Worker // Desc: Unmaps given resource from Aux Table; and marks affected entries as invalid
319*35ffd701SAndroid Build Coastguard Worker //
320*35ffd701SAndroid Build Coastguard Worker // Caller: UpdateAuxTable (unmap op)
321*35ffd701SAndroid Build Coastguard Worker //
322*35ffd701SAndroid Build Coastguard Worker // Parameters:
323*35ffd701SAndroid Build Coastguard Worker // UmdContext: Caller-thread specific info (regarding BB for Aux udpate, cmdQ to use etc)
324*35ffd701SAndroid Build Coastguard Worker // BaseAdr: Start adr of main surface
325*35ffd701SAndroid Build Coastguard Worker // Size: Main-surface size in bytes? (or take GmmResInfo?)
326*35ffd701SAndroid Build Coastguard Worker // DoNotWait: 1 for CPU update, 0 for async(Gpu) update
327*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
InvalidateTable(GMM_UMD_SYNCCONTEXT * UmdContext,GMM_GFX_ADDRESS BaseAdr,GMM_GFX_SIZE_T Size,uint8_t DoNotWait)328*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::AuxTable::InvalidateTable(GMM_UMD_SYNCCONTEXT *UmdContext, GMM_GFX_ADDRESS BaseAdr, GMM_GFX_SIZE_T Size, uint8_t DoNotWait)
329*35ffd701SAndroid Build Coastguard Worker {
330*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
331*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L1TableSize = ((GMM_GFX_SIZE_T)GMM_L1_SIZE(AUXTT, GetGmmLibContext())) * (WA16K(GetGmmLibContext()) ? GMM_KBYTE(16) : GMM_KBYTE(64)); //Each AuxTable entry maps 16K main-surface
332*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS Addr = 0;
333*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L3GfxAddress = 0;
334*35ffd701SAndroid Build Coastguard Worker uint8_t isTRVA = 0;
335*35ffd701SAndroid Build Coastguard Worker
336*35ffd701SAndroid Build Coastguard Worker GMM_CLIENT ClientType;
337*35ffd701SAndroid Build Coastguard Worker
338*35ffd701SAndroid Build Coastguard Worker GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
339*35ffd701SAndroid Build Coastguard Worker
340*35ffd701SAndroid Build Coastguard Worker //NullCCSTile isn't initialized, disable TRVA path
341*35ffd701SAndroid Build Coastguard Worker isTRVA = (NullCCSTile ? isTRVA : 0);
342*35ffd701SAndroid Build Coastguard Worker
343*35ffd701SAndroid Build Coastguard Worker EnterCriticalSection(&TTLock);
344*35ffd701SAndroid Build Coastguard Worker
345*35ffd701SAndroid Build Coastguard Worker DoNotWait |= (!UmdContext || !UmdContext->pCommandQueueHandle);
346*35ffd701SAndroid Build Coastguard Worker
347*35ffd701SAndroid Build Coastguard Worker if(TTL3.L3Handle)
348*35ffd701SAndroid Build Coastguard Worker {
349*35ffd701SAndroid Build Coastguard Worker L3GfxAddress = TTL3.GfxAddress;
350*35ffd701SAndroid Build Coastguard Worker }
351*35ffd701SAndroid Build Coastguard Worker else
352*35ffd701SAndroid Build Coastguard Worker {
353*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
354*35ffd701SAndroid Build Coastguard Worker return GMM_ERROR;
355*35ffd701SAndroid Build Coastguard Worker }
356*35ffd701SAndroid Build Coastguard Worker
357*35ffd701SAndroid Build Coastguard Worker if(!DoNotWait)
358*35ffd701SAndroid Build Coastguard Worker {
359*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfPrologTranslationTable(
360*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle);
361*35ffd701SAndroid Build Coastguard Worker }
362*35ffd701SAndroid Build Coastguard Worker
363*35ffd701SAndroid Build Coastguard Worker // For each L1 table
364*35ffd701SAndroid Build Coastguard Worker for(Addr = GFX_ALIGN_FLOOR(BaseAdr, L1TableSize); // Start at begining of L1 table
365*35ffd701SAndroid Build Coastguard Worker Addr < BaseAdr + Size;
366*35ffd701SAndroid Build Coastguard Worker Addr += L1TableSize) // Increment by 1 L1 table
367*35ffd701SAndroid Build Coastguard Worker {
368*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L1GfxAddress, L2GfxAddress;
369*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L1CPUAddress, L2CPUAddress;
370*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS StartAddress = 0;
371*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS EndAddress = 0;
372*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TileAddr = 0;
373*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L2eIdx = 0;
374*35ffd701SAndroid Build Coastguard Worker
375*35ffd701SAndroid Build Coastguard Worker StartAddress = Addr < BaseAdr ? BaseAdr : Addr;
376*35ffd701SAndroid Build Coastguard Worker EndAddress = Addr + L1TableSize;
377*35ffd701SAndroid Build Coastguard Worker if(EndAddress > BaseAdr + Size)
378*35ffd701SAndroid Build Coastguard Worker {
379*35ffd701SAndroid Build Coastguard Worker EndAddress = BaseAdr + Size;
380*35ffd701SAndroid Build Coastguard Worker }
381*35ffd701SAndroid Build Coastguard Worker
382*35ffd701SAndroid Build Coastguard Worker GetL1L2TableAddr(StartAddress,
383*35ffd701SAndroid Build Coastguard Worker &L1GfxAddress,
384*35ffd701SAndroid Build Coastguard Worker &L2GfxAddress);
385*35ffd701SAndroid Build Coastguard Worker
386*35ffd701SAndroid Build Coastguard Worker // If tables are not there, then they are already invalidated as part of
387*35ffd701SAndroid Build Coastguard Worker // AUX-TT initialization or other APIs.
388*35ffd701SAndroid Build Coastguard Worker if(L2GfxAddress == GMM_NO_TABLE ||
389*35ffd701SAndroid Build Coastguard Worker L1GfxAddress == GMM_NO_TABLE)
390*35ffd701SAndroid Build Coastguard Worker {
391*35ffd701SAndroid Build Coastguard Worker //Clear Valid-bit for L3Entry or L2Entry
392*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0}; //AUXTT L3e is identical to L2e, reuse.
393*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TableGfxAddress = (L2GfxAddress == GMM_NO_TABLE) ? L3GfxAddress : L2GfxAddress;
394*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS TableCPUAddress = (L2GfxAddress == GMM_NO_TABLE) ? TTL3.CPUAddress : pTTL2[GMM_L3_ENTRY_IDX(AUXTT, StartAddress)].GetCPUAddress();
395*35ffd701SAndroid Build Coastguard Worker uint32_t TableEntryIdx = (L2GfxAddress == GMM_NO_TABLE) ? static_cast<uint32_t>(GMM_L3_ENTRY_IDX(AUXTT, StartAddress)) : static_cast<uint32_t>(GMM_L2_ENTRY_IDX(AUXTT, StartAddress));
396*35ffd701SAndroid Build Coastguard Worker L2CPUAddress = (L2GfxAddress == GMM_NO_TABLE) ? 0 : TableCPUAddress;
397*35ffd701SAndroid Build Coastguard Worker
398*35ffd701SAndroid Build Coastguard Worker if(isTRVA && NullL2Table && NullL1Table)
399*35ffd701SAndroid Build Coastguard Worker {
400*35ffd701SAndroid Build Coastguard Worker //invalidate if request spans entire stretch ie TileAdr aligns L1TableSize*GMM_L2_SIZE
401*35ffd701SAndroid Build Coastguard Worker uint64_t Data = 0;
402*35ffd701SAndroid Build Coastguard Worker if(L2GfxAddress == GMM_NO_TABLE)
403*35ffd701SAndroid Build Coastguard Worker {
404*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL3e L3e = {0};
405*35ffd701SAndroid Build Coastguard Worker L3e.Valid = 1;
406*35ffd701SAndroid Build Coastguard Worker L3e.L2GfxAddr = (NullL2Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL2Table->GetNodeIdx()) >> 15;
407*35ffd701SAndroid Build Coastguard Worker Data = L3e.Value;
408*35ffd701SAndroid Build Coastguard Worker }
409*35ffd701SAndroid Build Coastguard Worker else
410*35ffd701SAndroid Build Coastguard Worker {
411*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
412*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
413*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2((NullL1Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL1Table->GetNodeIdx()), L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
414*35ffd701SAndroid Build Coastguard Worker Data = L2e.Value;
415*35ffd701SAndroid Build Coastguard Worker }
416*35ffd701SAndroid Build Coastguard Worker L2e.Value = Data;
417*35ffd701SAndroid Build Coastguard Worker }
418*35ffd701SAndroid Build Coastguard Worker else
419*35ffd701SAndroid Build Coastguard Worker {
420*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 0;
421*35ffd701SAndroid Build Coastguard Worker }
422*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
423*35ffd701SAndroid Build Coastguard Worker {
424*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
425*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)TableCPUAddress)[TableEntryIdx].Value = L2e.Value;
426*35ffd701SAndroid Build Coastguard Worker }
427*35ffd701SAndroid Build Coastguard Worker else
428*35ffd701SAndroid Build Coastguard Worker {
429*35ffd701SAndroid Build Coastguard Worker if(L2GfxAddress != GMM_NO_TABLE)
430*35ffd701SAndroid Build Coastguard Worker {
431*35ffd701SAndroid Build Coastguard Worker pTTL2[GMM_L3_ENTRY_IDX(AUXTT, StartAddress)].UpdatePoolFence(UmdContext, false);
432*35ffd701SAndroid Build Coastguard Worker }
433*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
434*35ffd701SAndroid Build Coastguard Worker TableGfxAddress + TableEntryIdx * GMM_AUX_L2e_SIZE,
435*35ffd701SAndroid Build Coastguard Worker L2e.Value);
436*35ffd701SAndroid Build Coastguard Worker }
437*35ffd701SAndroid Build Coastguard Worker continue;
438*35ffd701SAndroid Build Coastguard Worker }
439*35ffd701SAndroid Build Coastguard Worker else
440*35ffd701SAndroid Build Coastguard Worker {
441*35ffd701SAndroid Build Coastguard Worker uint32_t L3eIdx = static_cast<uint32_t>(GMM_L3_ENTRY_IDX(AUXTT, StartAddress));
442*35ffd701SAndroid Build Coastguard Worker L2CPUAddress = pTTL2[L3eIdx].GetCPUAddress();
443*35ffd701SAndroid Build Coastguard Worker
444*35ffd701SAndroid Build Coastguard Worker L2eIdx = GMM_L2_ENTRY_IDX(AUXTT, StartAddress);
445*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
446*35ffd701SAndroid Build Coastguard Worker {
447*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
448*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].Valid = 1; //set Valid bit
449*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].L2GfxAddr = L2GfxAddress >> 15;
450*35ffd701SAndroid Build Coastguard Worker
451*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx].Valid = 1; //set Valid bit
452*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2(L1GfxAddress, ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx], (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
453*35ffd701SAndroid Build Coastguard Worker }
454*35ffd701SAndroid Build Coastguard Worker else
455*35ffd701SAndroid Build Coastguard Worker {
456*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL3e L3e = {0};
457*35ffd701SAndroid Build Coastguard Worker L3e.Valid = 1;
458*35ffd701SAndroid Build Coastguard Worker L3e.L2GfxAddr = L2GfxAddress >> 15;
459*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(
460*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
461*35ffd701SAndroid Build Coastguard Worker L3GfxAddress + (L3eIdx * GMM_AUX_L3e_SIZE),
462*35ffd701SAndroid Build Coastguard Worker L3e.Value);
463*35ffd701SAndroid Build Coastguard Worker
464*35ffd701SAndroid Build Coastguard Worker pTTL2[L3eIdx].UpdatePoolFence(UmdContext, false);
465*35ffd701SAndroid Build Coastguard Worker
466*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
467*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
468*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2(L1GfxAddress, L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
469*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(
470*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
471*35ffd701SAndroid Build Coastguard Worker L2GfxAddress + (L2eIdx * GMM_AUX_L2e_SIZE),
472*35ffd701SAndroid Build Coastguard Worker L2e.Value);
473*35ffd701SAndroid Build Coastguard Worker }
474*35ffd701SAndroid Build Coastguard Worker }
475*35ffd701SAndroid Build Coastguard Worker
476*35ffd701SAndroid Build Coastguard Worker // For each 64KB or 16KB or 1MB of main surface (entry) in L1 table
477*35ffd701SAndroid Build Coastguard Worker for(TileAddr = StartAddress;
478*35ffd701SAndroid Build Coastguard Worker TileAddr < EndAddress;
479*35ffd701SAndroid Build Coastguard Worker TileAddr += (WA16K(GetGmmLibContext()) ? GMM_KBYTE(16) : WA64K(GetGmmLibContext()) ? GMM_KBYTE(64) : GMM_MBYTE(1)))
480*35ffd701SAndroid Build Coastguard Worker {
481*35ffd701SAndroid Build Coastguard Worker //Invalidation of requested range irrespective of TRVA
482*35ffd701SAndroid Build Coastguard Worker uint64_t Data = GMM_INVALID_AUX_ENTRY;
483*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L1eIdx = GMM_L1_ENTRY_IDX(AUXTT, TileAddr, GetGmmLibContext());
484*35ffd701SAndroid Build Coastguard Worker GmmLib::LastLevelTable *pL1Tbl = NULL;
485*35ffd701SAndroid Build Coastguard Worker
486*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pTTL2[GMM_AUX_L3_ENTRY_IDX(TileAddr)].GetL1Table(L2eIdx, NULL);
487*35ffd701SAndroid Build Coastguard Worker L1CPUAddress = pL1Tbl->GetCPUAddress();
488*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
489*35ffd701SAndroid Build Coastguard Worker {
490*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
491*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL1e *)L1CPUAddress)[L1eIdx].Value = Data;
492*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "~~UnMap | Table Entry: L2addressBase[0x%llX] :: L2Valid[%d] :: L2eidx[%d] L1addressBase[0x%llX] :: L1eidx[%d] L1Valid[%d] :: DerivedCCS[0x%llX] ", (GMM_AUXTTL2e *)L2CPUAddress, ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx].Valid, L2eIdx, GMM_L1TABLE_ADDR_FROM_AUX_L2e_L1GFXADDR(((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx], true), L1eIdx, ((GMM_AUXTTL1e *)L1CPUAddress)[L1eIdx].Valid, (((GMM_AUXTTL1e *)L1CPUAddress)[L1eIdx].GfxAddress << 12));
493*35ffd701SAndroid Build Coastguard Worker
494*35ffd701SAndroid Build Coastguard Worker }
495*35ffd701SAndroid Build Coastguard Worker else
496*35ffd701SAndroid Build Coastguard Worker {
497*35ffd701SAndroid Build Coastguard Worker pL1Tbl->UpdatePoolFence(UmdContext, false);
498*35ffd701SAndroid Build Coastguard Worker
499*35ffd701SAndroid Build Coastguard Worker /* PageTableMgr->TTCb.pfWriteL1Entries(
500*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
501*35ffd701SAndroid Build Coastguard Worker 2,
502*35ffd701SAndroid Build Coastguard Worker (uint32_t*)(&Data));*/
503*35ffd701SAndroid Build Coastguard Worker //**********REQUIRE UMD CHANGE TO UPDATE 64-bit ENTRY - both DWORDs must be updated atomically*******/
504*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(
505*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
506*35ffd701SAndroid Build Coastguard Worker L1GfxAddress + (L1eIdx * GMM_AUX_L1e_SIZE),
507*35ffd701SAndroid Build Coastguard Worker Data);
508*35ffd701SAndroid Build Coastguard Worker }
509*35ffd701SAndroid Build Coastguard Worker
510*35ffd701SAndroid Build Coastguard Worker if(pL1Tbl->TrackTableUsage(AUXTT, true, TileAddr, true, GetGmmLibContext()))
511*35ffd701SAndroid Build Coastguard Worker { // L1 Table is not being used anymore
512*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
513*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_PAGETABLEPool *PoolElem = NULL;
514*35ffd701SAndroid Build Coastguard Worker GmmLib::LastLevelTable * pL1Tbl = NULL, *Prev = NULL;
515*35ffd701SAndroid Build Coastguard Worker
516*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pTTL2[GMM_L3_ENTRY_IDX(AUXTT, TileAddr)].GetL1Table(L2eIdx, &Prev);
517*35ffd701SAndroid Build Coastguard Worker
518*35ffd701SAndroid Build Coastguard Worker if(isTRVA && NullL1Table &&
519*35ffd701SAndroid Build Coastguard Worker ((TileAddr > GFX_ALIGN_FLOOR(BaseAdr, L1TableSize) && TileAddr < GFX_ALIGN_NP2(BaseAdr, L1TableSize)) ||
520*35ffd701SAndroid Build Coastguard Worker (TileAddr > GFX_ALIGN_FLOOR(BaseAdr + Size, L1TableSize) && TileAddr < GFX_ALIGN_NP2(BaseAdr + Size, L1TableSize))))
521*35ffd701SAndroid Build Coastguard Worker {
522*35ffd701SAndroid Build Coastguard Worker //Invalidation affects entries out of requested range, null-map for TR
523*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
524*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2((NullL1Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL1Table->GetNodeIdx()), L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
525*35ffd701SAndroid Build Coastguard Worker }
526*35ffd701SAndroid Build Coastguard Worker else
527*35ffd701SAndroid Build Coastguard Worker {
528*35ffd701SAndroid Build Coastguard Worker // Clear valid bit of L2 entry
529*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 0;
530*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx].Valid = 0;
531*35ffd701SAndroid Build Coastguard Worker }
532*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
533*35ffd701SAndroid Build Coastguard Worker {
534*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
535*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2CPUAddress)[L2eIdx].Value = L2e.Value;
536*35ffd701SAndroid Build Coastguard Worker }
537*35ffd701SAndroid Build Coastguard Worker else
538*35ffd701SAndroid Build Coastguard Worker {
539*35ffd701SAndroid Build Coastguard Worker pTTL2[GMM_L3_ENTRY_IDX(AUXTT, TileAddr)].UpdatePoolFence(UmdContext, false);
540*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
541*35ffd701SAndroid Build Coastguard Worker L2GfxAddress + L2eIdx * GMM_AUX_L2e_SIZE,
542*35ffd701SAndroid Build Coastguard Worker L2e.Value);
543*35ffd701SAndroid Build Coastguard Worker }
544*35ffd701SAndroid Build Coastguard Worker //Update usage for PoolNode assigned to L1Table, and free L1Tbl
545*35ffd701SAndroid Build Coastguard Worker if(pL1Tbl)
546*35ffd701SAndroid Build Coastguard Worker {
547*35ffd701SAndroid Build Coastguard Worker PoolElem = pL1Tbl->GetPool();
548*35ffd701SAndroid Build Coastguard Worker if(PoolElem)
549*35ffd701SAndroid Build Coastguard Worker {
550*35ffd701SAndroid Build Coastguard Worker if(pL1Tbl->GetBBInfo().BBQueueHandle)
551*35ffd701SAndroid Build Coastguard Worker {
552*35ffd701SAndroid Build Coastguard Worker PoolElem->GetNodeBBInfoAtIndex(pL1Tbl->GetNodeIdx()) = pL1Tbl->GetBBInfo();
553*35ffd701SAndroid Build Coastguard Worker }
554*35ffd701SAndroid Build Coastguard Worker DEASSIGN_POOLNODE(PageTableMgr, UmdContext, PoolElem, pL1Tbl->GetNodeIdx(), AUX_L1TABLE_SIZE_IN_POOLNODES_2(GetGmmLibContext()))
555*35ffd701SAndroid Build Coastguard Worker }
556*35ffd701SAndroid Build Coastguard Worker pTTL2[GMM_L3_ENTRY_IDX(AUXTT, TileAddr)].DeleteFromList(pL1Tbl, Prev);
557*35ffd701SAndroid Build Coastguard Worker }
558*35ffd701SAndroid Build Coastguard Worker
559*35ffd701SAndroid Build Coastguard Worker // The L1 table is unused -- meaning everything else in this table is
560*35ffd701SAndroid Build Coastguard Worker // already invalid. So, break early.
561*35ffd701SAndroid Build Coastguard Worker break;
562*35ffd701SAndroid Build Coastguard Worker }
563*35ffd701SAndroid Build Coastguard Worker }
564*35ffd701SAndroid Build Coastguard Worker }
565*35ffd701SAndroid Build Coastguard Worker
566*35ffd701SAndroid Build Coastguard Worker if(!DoNotWait)
567*35ffd701SAndroid Build Coastguard Worker {
568*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfEpilogTranslationTable(
569*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
570*35ffd701SAndroid Build Coastguard Worker 1); // ForceFlush
571*35ffd701SAndroid Build Coastguard Worker }
572*35ffd701SAndroid Build Coastguard Worker
573*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
574*35ffd701SAndroid Build Coastguard Worker
575*35ffd701SAndroid Build Coastguard Worker return Status;
576*35ffd701SAndroid Build Coastguard Worker }
577*35ffd701SAndroid Build Coastguard Worker
578*35ffd701SAndroid Build Coastguard Worker //=============================================================================
579*35ffd701SAndroid Build Coastguard Worker //
580*35ffd701SAndroid Build Coastguard Worker // Function: MapValidEntry
581*35ffd701SAndroid Build Coastguard Worker //
582*35ffd701SAndroid Build Coastguard Worker // Desc: Maps given main-surface, on Aux-Table, to get the exact CCS cacheline tied to
583*35ffd701SAndroid Build Coastguard Worker // different 4x4K pages of main-surface
584*35ffd701SAndroid Build Coastguard Worker //
585*35ffd701SAndroid Build Coastguard Worker // Caller: UpdateAuxTable (map op)
586*35ffd701SAndroid Build Coastguard Worker //
587*35ffd701SAndroid Build Coastguard Worker // Parameters:
588*35ffd701SAndroid Build Coastguard Worker // UmdContext: ptr to thread-data
589*35ffd701SAndroid Build Coastguard Worker // BaseAdr: Start adr of main-surface
590*35ffd701SAndroid Build Coastguard Worker // BaseSize: main-surface Size in bytes
591*35ffd701SAndroid Build Coastguard Worker // BaseResInfo: main surface ResInfo
592*35ffd701SAndroid Build Coastguard Worker // AuxVA: Start adr of Aux-surface
593*35ffd701SAndroid Build Coastguard Worker // AuxResInfo: Aux surface ResInfo
594*35ffd701SAndroid Build Coastguard Worker // PartialData: Aux L1 partial data (ie w/o address)
595*35ffd701SAndroid Build Coastguard Worker // DoNotWait: true for CPU update, false for async(Gpu) update
596*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
MapValidEntry(GMM_UMD_SYNCCONTEXT * UmdContext,GMM_GFX_ADDRESS BaseAdr,GMM_GFX_SIZE_T BaseSize,GMM_RESOURCE_INFO * BaseResInfo,GMM_GFX_ADDRESS AuxVA,GMM_RESOURCE_INFO * AuxResInfo,uint64_t PartialData,uint8_t DoNotWait)597*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::AuxTable::MapValidEntry(GMM_UMD_SYNCCONTEXT *UmdContext, GMM_GFX_ADDRESS BaseAdr, GMM_GFX_SIZE_T BaseSize,
598*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_INFO *BaseResInfo, GMM_GFX_ADDRESS AuxVA, GMM_RESOURCE_INFO *AuxResInfo, uint64_t PartialData, uint8_t DoNotWait)
599*35ffd701SAndroid Build Coastguard Worker {
600*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
601*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS Addr = 0, L3TableAdr = GMM_NO_TABLE;
602*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L1TableSize = GMM_AUX_L1_SIZE(GetGmmLibContext()) * (WA16K(GetGmmLibContext()) ? GMM_KBYTE(16) : GMM_KBYTE(64)); // L1TableSize maps to 16MB address space for TGL and above: 256x64k | 16x1MB
603*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T CCS$Adr = AuxVA;
604*35ffd701SAndroid Build Coastguard Worker uint8_t isTRVA =0 ;
605*35ffd701SAndroid Build Coastguard Worker
606*35ffd701SAndroid Build Coastguard Worker GMM_CLIENT ClientType;
607*35ffd701SAndroid Build Coastguard Worker
608*35ffd701SAndroid Build Coastguard Worker GET_GMM_CLIENT_TYPE(pClientContext, ClientType);
609*35ffd701SAndroid Build Coastguard Worker
610*35ffd701SAndroid Build Coastguard Worker //NullCCSTile isn't initialized, disable TRVA path
611*35ffd701SAndroid Build Coastguard Worker isTRVA = (NullCCSTile ? isTRVA : 0);
612*35ffd701SAndroid Build Coastguard Worker
613*35ffd701SAndroid Build Coastguard Worker EnterCriticalSection(&TTLock);
614*35ffd701SAndroid Build Coastguard Worker if(!TTL3.L3Handle || (!DoNotWait && !UmdContext))
615*35ffd701SAndroid Build Coastguard Worker {
616*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
617*35ffd701SAndroid Build Coastguard Worker }
618*35ffd701SAndroid Build Coastguard Worker else
619*35ffd701SAndroid Build Coastguard Worker {
620*35ffd701SAndroid Build Coastguard Worker L3TableAdr = TTL3.GfxAddress;
621*35ffd701SAndroid Build Coastguard Worker
622*35ffd701SAndroid Build Coastguard Worker if(!DoNotWait)
623*35ffd701SAndroid Build Coastguard Worker {
624*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfPrologTranslationTable(UmdContext->pCommandQueueHandle);
625*35ffd701SAndroid Build Coastguard Worker }
626*35ffd701SAndroid Build Coastguard Worker
627*35ffd701SAndroid Build Coastguard Worker // GMM_DPF(GFXDBG_CRITICAL, "Mapping surface: GPUVA=0x%016llX Size=0x%08X Aux_GPUVA=0x%016llX\n", BaseAdr, BaseSize, AuxVA);
628*35ffd701SAndroid Build Coastguard Worker for(Addr = GFX_ALIGN_FLOOR(BaseAdr, L1TableSize); Addr < BaseAdr + BaseSize; Addr += L1TableSize)
629*35ffd701SAndroid Build Coastguard Worker {
630*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS StartAdr, EndAdr, TileAdr;
631*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L1TableAdr = GMM_NO_TABLE, L2TableAdr = GMM_NO_TABLE;
632*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS L1TableCPUAdr = GMM_NO_TABLE, L2TableCPUAdr = GMM_NO_TABLE;
633*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L2eIdx = 0;
634*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L3eIdx = 0;
635*35ffd701SAndroid Build Coastguard Worker bool AllocateL1 = false, AllocateL2 = false;
636*35ffd701SAndroid Build Coastguard Worker
637*35ffd701SAndroid Build Coastguard Worker EndAdr = Addr + L1TableSize;
638*35ffd701SAndroid Build Coastguard Worker EndAdr = EndAdr > BaseAdr + BaseSize ? BaseAdr + BaseSize : EndAdr;
639*35ffd701SAndroid Build Coastguard Worker StartAdr = Addr < BaseAdr ? BaseAdr : Addr;
640*35ffd701SAndroid Build Coastguard Worker
641*35ffd701SAndroid Build Coastguard Worker L2eIdx = GMM_L2_ENTRY_IDX(AUXTT, StartAdr);
642*35ffd701SAndroid Build Coastguard Worker L3eIdx = GMM_L3_ENTRY_IDX(AUXTT, StartAdr);
643*35ffd701SAndroid Build Coastguard Worker
644*35ffd701SAndroid Build Coastguard Worker //Allocate L2/L1 Table -- get L2 Table Adr for <StartAdr,EndAdr>
645*35ffd701SAndroid Build Coastguard Worker GetL1L2TableAddr(Addr, &L1TableAdr, &L2TableAdr);
646*35ffd701SAndroid Build Coastguard Worker if(L2TableAdr == GMM_NO_TABLE || L1TableAdr == GMM_NO_TABLE)
647*35ffd701SAndroid Build Coastguard Worker {
648*35ffd701SAndroid Build Coastguard Worker AllocateL1 = GMM_NO_TABLE == L1TableAdr;
649*35ffd701SAndroid Build Coastguard Worker AllocateL2 = GMM_NO_TABLE == L2TableAdr;
650*35ffd701SAndroid Build Coastguard Worker AllocateL1L2Table(Addr, &L1TableAdr, &L2TableAdr);
651*35ffd701SAndroid Build Coastguard Worker
652*35ffd701SAndroid Build Coastguard Worker if(L2TableAdr == GMM_NO_TABLE || L1TableAdr == GMM_NO_TABLE)
653*35ffd701SAndroid Build Coastguard Worker {
654*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
655*35ffd701SAndroid Build Coastguard Worker return GMM_OUT_OF_MEMORY;
656*35ffd701SAndroid Build Coastguard Worker }
657*35ffd701SAndroid Build Coastguard Worker
658*35ffd701SAndroid Build Coastguard Worker if(AllocateL2)
659*35ffd701SAndroid Build Coastguard Worker {
660*35ffd701SAndroid Build Coastguard Worker uint32_t i = 0;
661*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e InvalidEntry;
662*35ffd701SAndroid Build Coastguard Worker InvalidEntry.Value = 0;
663*35ffd701SAndroid Build Coastguard Worker if(isTRVA && NullL1Table)
664*35ffd701SAndroid Build Coastguard Worker {
665*35ffd701SAndroid Build Coastguard Worker InvalidEntry.Valid = 1;
666*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2((NullL1Table->GetPool()->GetGfxAddress() + PAGE_SIZE * NullL1Table->GetNodeIdx()), InvalidEntry, (!WA16K(GetGmmLibContext()) && !WA64K(GetGmmLibContext())))
667*35ffd701SAndroid Build Coastguard Worker }
668*35ffd701SAndroid Build Coastguard Worker
669*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
670*35ffd701SAndroid Build Coastguard Worker {
671*35ffd701SAndroid Build Coastguard Worker L2TableCPUAdr = pTTL2[L3eIdx].GetCPUAddress();
672*35ffd701SAndroid Build Coastguard Worker
673*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].Value = 0;
674*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].L2GfxAddr = L2TableAdr >> 15;
675*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].Valid = 1;
676*35ffd701SAndroid Build Coastguard Worker for(i = 0; i < GMM_AUX_L2_SIZE; i++)
677*35ffd701SAndroid Build Coastguard Worker {
678*35ffd701SAndroid Build Coastguard Worker //initialize L2e ie clear Valid bit for all entries
679*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2TableCPUAdr)[i].Value = InvalidEntry.Value;
680*35ffd701SAndroid Build Coastguard Worker }
681*35ffd701SAndroid Build Coastguard Worker }
682*35ffd701SAndroid Build Coastguard Worker else
683*35ffd701SAndroid Build Coastguard Worker {
684*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL3e L3e = {0};
685*35ffd701SAndroid Build Coastguard Worker L3e.Valid = 1;
686*35ffd701SAndroid Build Coastguard Worker L3e.L2GfxAddr = L2TableAdr >> 15;
687*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
688*35ffd701SAndroid Build Coastguard Worker L3TableAdr + L3eIdx * GMM_AUX_L3e_SIZE,
689*35ffd701SAndroid Build Coastguard Worker L3e.Value);
690*35ffd701SAndroid Build Coastguard Worker
691*35ffd701SAndroid Build Coastguard Worker //initialize L2e ie clear valid bit for all entries
692*35ffd701SAndroid Build Coastguard Worker for(i = 0; i < GMM_AUX_L2_SIZE; i++)
693*35ffd701SAndroid Build Coastguard Worker {
694*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
695*35ffd701SAndroid Build Coastguard Worker L2TableAdr + i * GMM_AUX_L2e_SIZE,
696*35ffd701SAndroid Build Coastguard Worker InvalidEntry.Value);
697*35ffd701SAndroid Build Coastguard Worker }
698*35ffd701SAndroid Build Coastguard Worker }
699*35ffd701SAndroid Build Coastguard Worker }
700*35ffd701SAndroid Build Coastguard Worker
701*35ffd701SAndroid Build Coastguard Worker if(AllocateL1)
702*35ffd701SAndroid Build Coastguard Worker {
703*35ffd701SAndroid Build Coastguard Worker uint64_t InvalidEntry = (!isTRVA) ? GMM_INVALID_AUX_ENTRY : (NullCCSTile | __BIT(0));
704*35ffd701SAndroid Build Coastguard Worker uint32_t i = 0;
705*35ffd701SAndroid Build Coastguard Worker
706*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
707*35ffd701SAndroid Build Coastguard Worker {
708*35ffd701SAndroid Build Coastguard Worker GmmLib::LastLevelTable *pL1Tbl = NULL;
709*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pTTL2[L3eIdx].GetL1Table(L2eIdx, NULL);
710*35ffd701SAndroid Build Coastguard Worker L2TableCPUAdr = pTTL2[L3eIdx].GetCPUAddress();
711*35ffd701SAndroid Build Coastguard Worker L1TableCPUAdr = pL1Tbl->GetCPUAddress();
712*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
713*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2TableCPUAdr)[L2eIdx].Value = 0;
714*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2(L1TableAdr, ((GMM_AUXTTL2e *)L2TableCPUAdr)[L2eIdx], (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext()))) // populate L2e.L1GfxAddr
715*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL2e *)L2TableCPUAdr)[L2eIdx]
716*35ffd701SAndroid Build Coastguard Worker .Valid = 1;
717*35ffd701SAndroid Build Coastguard Worker for(i = 0; i < (uint32_t)GMM_AUX_L1_SIZE(GetGmmLibContext()); i++)
718*35ffd701SAndroid Build Coastguard Worker {
719*35ffd701SAndroid Build Coastguard Worker //initialize L1e ie mark all entries with Null tile value
720*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL1e *)L1TableCPUAdr)[i].Value = InvalidEntry;
721*35ffd701SAndroid Build Coastguard Worker }
722*35ffd701SAndroid Build Coastguard Worker }
723*35ffd701SAndroid Build Coastguard Worker else
724*35ffd701SAndroid Build Coastguard Worker {
725*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL2e L2e = {0};
726*35ffd701SAndroid Build Coastguard Worker L2e.Valid = 1;
727*35ffd701SAndroid Build Coastguard Worker GMM_TO_AUX_L2e_L1GFXADDR_2(L1TableAdr, L2e, (!WA64K(GetGmmLibContext()) && !WA16K(GetGmmLibContext())))
728*35ffd701SAndroid Build Coastguard Worker pTTL2[L3eIdx]
729*35ffd701SAndroid Build Coastguard Worker .UpdatePoolFence(UmdContext, false);
730*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
731*35ffd701SAndroid Build Coastguard Worker L2TableAdr + L2eIdx * GMM_AUX_L2e_SIZE,
732*35ffd701SAndroid Build Coastguard Worker L2e.Value);
733*35ffd701SAndroid Build Coastguard Worker
734*35ffd701SAndroid Build Coastguard Worker //initialize all L1e with invalid entries
735*35ffd701SAndroid Build Coastguard Worker for(i = 0; i < (uint32_t)GMM_AUX_L1_SIZE(GetGmmLibContext()); i++)
736*35ffd701SAndroid Build Coastguard Worker {
737*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
738*35ffd701SAndroid Build Coastguard Worker L1TableAdr + i * sizeof(uint64_t),
739*35ffd701SAndroid Build Coastguard Worker InvalidEntry);
740*35ffd701SAndroid Build Coastguard Worker }
741*35ffd701SAndroid Build Coastguard Worker }
742*35ffd701SAndroid Build Coastguard Worker }
743*35ffd701SAndroid Build Coastguard Worker }
744*35ffd701SAndroid Build Coastguard Worker
745*35ffd701SAndroid Build Coastguard Worker //GMM_DPF(GFXDBG_NORMAL, "Mapping surface: GPUVA=0x%016llx Size=0x%08x Aux_GPUVA=0x%016llx", StartAdr, BaseSize, CCS$Adr);
746*35ffd701SAndroid Build Coastguard Worker for(TileAdr = StartAdr; TileAdr < EndAdr; TileAdr += (WA16K(GetGmmLibContext()) ? GMM_KBYTE(16) : WA64K(GetGmmLibContext()) ? GMM_KBYTE(64) : GMM_MBYTE(1)),
747*35ffd701SAndroid Build Coastguard Worker CCS$Adr += (pClientContext->GetLibContext()->GetSkuTable().FtrLinearCCS ?
748*35ffd701SAndroid Build Coastguard Worker (WA16K(pClientContext->GetLibContext()) ? GMM_BYTES(64) : WA64K(pClientContext->GetLibContext()) ? GMM_BYTES(256) : GMM_KBYTE(4)) :
749*35ffd701SAndroid Build Coastguard Worker 0))
750*35ffd701SAndroid Build Coastguard Worker {
751*35ffd701SAndroid Build Coastguard Worker GMM_GFX_SIZE_T L1eIdx = GMM_L1_ENTRY_IDX(AUXTT, TileAdr, GetGmmLibContext());
752*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL1e L1e = {0};
753*35ffd701SAndroid Build Coastguard Worker L1e.Value = PartialData;
754*35ffd701SAndroid Build Coastguard Worker L1e.Valid = 1;
755*35ffd701SAndroid Build Coastguard Worker
756*35ffd701SAndroid Build Coastguard Worker if(L1eIdx == 15 || L1eIdx == 14)
757*35ffd701SAndroid Build Coastguard Worker {
758*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "\n****** switching over L1*******\n");
759*35ffd701SAndroid Build Coastguard Worker }
760*35ffd701SAndroid Build Coastguard Worker
761*35ffd701SAndroid Build Coastguard Worker CCS$Adr = (pClientContext->GetLibContext()->GetSkuTable().FtrLinearCCS ? CCS$Adr :
762*35ffd701SAndroid Build Coastguard Worker __GetCCSCacheline(BaseResInfo, BaseAdr, AuxResInfo, AuxVA, TileAdr - BaseAdr));
763*35ffd701SAndroid Build Coastguard Worker
764*35ffd701SAndroid Build Coastguard Worker if(WA16K(GetGmmLibContext()))
765*35ffd701SAndroid Build Coastguard Worker {
766*35ffd701SAndroid Build Coastguard Worker L1e.Reserved2 = CCS$Adr >> 6; /*********** 2 lsbs of 64B-aligned CCS adr *****/
767*35ffd701SAndroid Build Coastguard Worker L1e.Reserved4 = CCS$Adr >> 8; /*********** 256B-aligned CCS adr *****/
768*35ffd701SAndroid Build Coastguard Worker L1e.GfxAddress = CCS$Adr >> 12; /*********** 4KB-aligned CCS adr *****/
769*35ffd701SAndroid Build Coastguard Worker }
770*35ffd701SAndroid Build Coastguard Worker else if(WA64K(GetGmmLibContext()))
771*35ffd701SAndroid Build Coastguard Worker {
772*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((CCS$Adr & 0xFF) == 0x0);
773*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(GFX_IS_ALIGNED(CCS$Adr, GMM_BYTES(256)));
774*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(GFX_IS_ALIGNED(TileAdr, GMM_KBYTE(64)));
775*35ffd701SAndroid Build Coastguard Worker L1e.Reserved4 = CCS$Adr >> 8; /*********** 4 lsbs of 256B-aligned CCS adr *****/
776*35ffd701SAndroid Build Coastguard Worker L1e.GfxAddress = CCS$Adr >> 12; /*********** 4KB-aligned CCS adr *****/
777*35ffd701SAndroid Build Coastguard Worker }
778*35ffd701SAndroid Build Coastguard Worker else // 1MB aligned address
779*35ffd701SAndroid Build Coastguard Worker {
780*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT((CCS$Adr & 0xFF) == 0x0);
781*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(GFX_IS_ALIGNED(CCS$Adr, GMM_KBYTE(4)));
782*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(GFX_IS_ALIGNED(TileAdr, GMM_MBYTE(1)));
783*35ffd701SAndroid Build Coastguard Worker L1e.GfxAddress = CCS$Adr >> 12; /*********** 4KB-aligned CCS adr *****/
784*35ffd701SAndroid Build Coastguard Worker }
785*35ffd701SAndroid Build Coastguard Worker
786*35ffd701SAndroid Build Coastguard Worker
787*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "--------------------------------MAP AuxTT Map Address: TileAddr[0x%llX], Size[0x%x], CCSAddr[0x%llX], L3eIdx[%d], L2eIdx[%d], L1eIdx[%d], \n L1CCSAddres[0x%llX] \n", TileAdr, BaseSize, CCS$Adr, L3eIdx, L2eIdx, L1eIdx, L1e.GfxAddress);
788*35ffd701SAndroid Build Coastguard Worker
789*35ffd701SAndroid Build Coastguard Worker GmmLib::LastLevelTable *pL1Tbl = NULL;
790*35ffd701SAndroid Build Coastguard Worker
791*35ffd701SAndroid Build Coastguard Worker pL1Tbl = pTTL2[L3eIdx].GetL1Table(L2eIdx, NULL);
792*35ffd701SAndroid Build Coastguard Worker L1TableCPUAdr = pL1Tbl->GetCPUAddress();
793*35ffd701SAndroid Build Coastguard Worker if(DoNotWait)
794*35ffd701SAndroid Build Coastguard Worker {
795*35ffd701SAndroid Build Coastguard Worker //Sync update on CPU
796*35ffd701SAndroid Build Coastguard Worker ((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].Value = L1e.Value;
797*35ffd701SAndroid Build Coastguard Worker
798*35ffd701SAndroid Build Coastguard Worker }
799*35ffd701SAndroid Build Coastguard Worker else
800*35ffd701SAndroid Build Coastguard Worker {
801*35ffd701SAndroid Build Coastguard Worker pL1Tbl->UpdatePoolFence(UmdContext, false);
802*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfWriteL2L3Entry(UmdContext->pCommandQueueHandle,
803*35ffd701SAndroid Build Coastguard Worker L1TableAdr + L1eIdx * GMM_AUX_L1e_SIZE,
804*35ffd701SAndroid Build Coastguard Worker L1e.Value);
805*35ffd701SAndroid Build Coastguard Worker }
806*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "Map | L3 Table Entry: L3AddressBase[0x%llX] :: L3.L2GfxAddr[0x%llX] :: L3Valid[0x%llX] \n", (GMM_AUXTTL3e *)(TTL3.CPUAddress), ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].L2GfxAddr, ((GMM_AUXTTL3e *)(TTL3.CPUAddress))[L3eIdx].Valid);
807*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "Map | L2 Table Entry: L2addressBase[0x%llX] :: L2.L1GfxAddr[0x%llX] :: L2Valid[0x%llX] \n", ((GMM_AUXTTL2e *)pTTL2[L3eIdx].GetCPUAddress()), ((GMM_AUXTTL2e *)pTTL2[L3eIdx].GetCPUAddress())[L2eIdx].L1GfxAddr, ((GMM_AUXTTL2e *)pTTL2[L3eIdx].GetCPUAddress())[L2eIdx].Valid);
808*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "Map | L1 Table Entry: L1addressBase[0x%llX] :: L1.CCSAddr[0x%llX] :: L1ValueReserved4[0x%llX] ::L1ValueReserved2[0x%llX] :: L1Valid[0x%llX] :: DerivedCCS[0x%llX] \n\n", ((GMM_AUXTTL1e *)L1TableCPUAdr), ((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].GfxAddress, ((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].Reserved4, ((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].Reserved2, ((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].Valid, (((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].GfxAddress << 12));
809*35ffd701SAndroid Build Coastguard Worker GMM_DPF(GFXDBG_NORMAL, "**Map | Table Entry: L2addressBase[0x%llX] :: L2Valid[%d] :: L2eidx[%d] L1addressBase[0x%llX] :: L1eidx[%d] L1Valid[0x%llX] :: DerivedCCS[0x%llX]", ((GMM_AUXTTL2e *)pTTL2[L3eIdx].GetCPUAddress()), ((GMM_AUXTTL2e *)pTTL2[L3eIdx].GetCPUAddress())[L2eIdx].Valid, L2eIdx, GMM_L1TABLE_ADDR_FROM_AUX_L2e_L1GFXADDR(((GMM_AUXTTL2e *)pTTL2[L3eIdx].GetCPUAddress())[L2eIdx], true), L1eIdx, ((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].Valid, (((GMM_AUXTTL1e *)L1TableCPUAdr)[L1eIdx].GfxAddress << 12));
810*35ffd701SAndroid Build Coastguard Worker
811*35ffd701SAndroid Build Coastguard Worker // Since we are mapping a non-null entry, no need to check whether
812*35ffd701SAndroid Build Coastguard Worker // L1 table is unused.
813*35ffd701SAndroid Build Coastguard Worker pL1Tbl->TrackTableUsage(AUXTT, true, TileAdr, false, GetGmmLibContext());
814*35ffd701SAndroid Build Coastguard Worker }
815*35ffd701SAndroid Build Coastguard Worker }
816*35ffd701SAndroid Build Coastguard Worker if(!DoNotWait)
817*35ffd701SAndroid Build Coastguard Worker {
818*35ffd701SAndroid Build Coastguard Worker PageTableMgr->TTCb.pfEpilogTranslationTable(
819*35ffd701SAndroid Build Coastguard Worker UmdContext->pCommandQueueHandle,
820*35ffd701SAndroid Build Coastguard Worker 1);
821*35ffd701SAndroid Build Coastguard Worker }
822*35ffd701SAndroid Build Coastguard Worker }
823*35ffd701SAndroid Build Coastguard Worker
824*35ffd701SAndroid Build Coastguard Worker LeaveCriticalSection(&TTLock);
825*35ffd701SAndroid Build Coastguard Worker
826*35ffd701SAndroid Build Coastguard Worker return Status;
827*35ffd701SAndroid Build Coastguard Worker }
828*35ffd701SAndroid Build Coastguard Worker
CreateAuxL1Data(GMM_RESOURCE_INFO * BaseResInfo)829*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL1e GmmLib::AuxTable::CreateAuxL1Data(GMM_RESOURCE_INFO *BaseResInfo)
830*35ffd701SAndroid Build Coastguard Worker {
831*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_FORMAT Format;
832*35ffd701SAndroid Build Coastguard Worker Format = BaseResInfo->GetResourceFormat();
833*35ffd701SAndroid Build Coastguard Worker Format = ((Format > GMM_FORMAT_INVALID) && (Format < GMM_RESOURCE_FORMATS)) ? Format : GMM_FORMAT_INVALID;
834*35ffd701SAndroid Build Coastguard Worker
835*35ffd701SAndroid Build Coastguard Worker GMM_FORMAT_ENTRY FormatInfo = pClientContext->GetLibContext()->GetPlatformInfo().FormatTable[Format];
836*35ffd701SAndroid Build Coastguard Worker GMM_AUXTTL1e L1ePartial = {0};
837*35ffd701SAndroid Build Coastguard Worker #define GMM_REGISTRY_UMD_PATH "SOFTWARE\\Intel\\IGFX\\GMM\\"
838*35ffd701SAndroid Build Coastguard Worker #define GMM_E2EC_OVERRIDEDEPTH16BPPTO12 "ForceYUV16To12BPP"
839*35ffd701SAndroid Build Coastguard Worker
840*35ffd701SAndroid Build Coastguard Worker L1ePartial.Mode = BaseResInfo->GetResFlags().Info.RenderCompressed ? 0x1 : 0x0; //MC on VCS supports all compression modes,
841*35ffd701SAndroid Build Coastguard Worker //MC on Render pipe only 128B compr (until B-step)
842*35ffd701SAndroid Build Coastguard Worker //Recognize which .MC surfaces needs Render pipe access
843*35ffd701SAndroid Build Coastguard Worker if(pClientContext->GetLibContext()->GetWaTable().WaLimit128BMediaCompr)
844*35ffd701SAndroid Build Coastguard Worker {
845*35ffd701SAndroid Build Coastguard Worker L1ePartial.Mode = 0x1; //Limit media compression to 128B (same as RC) on gen12LP A0
846*35ffd701SAndroid Build Coastguard Worker }
847*35ffd701SAndroid Build Coastguard Worker
848*35ffd701SAndroid Build Coastguard Worker //L1ePartial.Lossy = 0; // when to set it
849*35ffd701SAndroid Build Coastguard Worker L1ePartial.TileMode = BaseResInfo->GetResFlags().Info.TiledYs ? 0 : 1;
850*35ffd701SAndroid Build Coastguard Worker
851*35ffd701SAndroid Build Coastguard Worker L1ePartial.Format = FormatInfo.CompressionFormat.AuxL1eFormat;
852*35ffd701SAndroid Build Coastguard Worker L1ePartial.LumaChroma = GmmIsPlanar(Format);
853*35ffd701SAndroid Build Coastguard Worker
854*35ffd701SAndroid Build Coastguard Worker if(pClientContext->GetLibContext()->GetWaTable().WaUntypedBufferCompression && BaseResInfo->GetResourceType() == RESOURCE_BUFFER)
855*35ffd701SAndroid Build Coastguard Worker {
856*35ffd701SAndroid Build Coastguard Worker //Gen12LP WA to support untyped raw buffer compression on HDC ie MLC(machine-learning compression)
857*35ffd701SAndroid Build Coastguard Worker L1ePartial.TileMode = 0;
858*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x6;
859*35ffd701SAndroid Build Coastguard Worker L1ePartial.Format = GMM_E2ECOMP_FORMAT_RGBAFLOAT16;
860*35ffd701SAndroid Build Coastguard Worker }
861*35ffd701SAndroid Build Coastguard Worker
862*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(L1ePartial.Format > GMM_E2ECOMP_MIN_FORMAT && //Are we going to reuse 0x00 for uncompressed indication? CCS contains that info, but only known by HW
863*35ffd701SAndroid Build Coastguard Worker L1ePartial.Format <= GMM_E2ECOMP_MAX_FORMAT); //Could SW use it as surface-wide uncompressed state indicator? If so, remove teh assert (Need to make sure, all format encodings are correct)
864*35ffd701SAndroid Build Coastguard Worker
865*35ffd701SAndroid Build Coastguard Worker if(BaseResInfo->GetResFlags().Info.RenderCompressed)
866*35ffd701SAndroid Build Coastguard Worker {
867*35ffd701SAndroid Build Coastguard Worker if(BaseResInfo->GetResourceType() != RESOURCE_BUFFER)
868*35ffd701SAndroid Build Coastguard Worker {
869*35ffd701SAndroid Build Coastguard Worker switch(FormatInfo.Element.BitsPer)
870*35ffd701SAndroid Build Coastguard Worker {
871*35ffd701SAndroid Build Coastguard Worker case 8:
872*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x4;
873*35ffd701SAndroid Build Coastguard Worker break;
874*35ffd701SAndroid Build Coastguard Worker case 16:
875*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x0;
876*35ffd701SAndroid Build Coastguard Worker break;
877*35ffd701SAndroid Build Coastguard Worker case 32:
878*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x5;
879*35ffd701SAndroid Build Coastguard Worker break;
880*35ffd701SAndroid Build Coastguard Worker case 64:
881*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x6;
882*35ffd701SAndroid Build Coastguard Worker break;
883*35ffd701SAndroid Build Coastguard Worker case 128:
884*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x7;
885*35ffd701SAndroid Build Coastguard Worker break;
886*35ffd701SAndroid Build Coastguard Worker default:
887*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x3;
888*35ffd701SAndroid Build Coastguard Worker }
889*35ffd701SAndroid Build Coastguard Worker }
890*35ffd701SAndroid Build Coastguard Worker }
891*35ffd701SAndroid Build Coastguard Worker else
892*35ffd701SAndroid Build Coastguard Worker {
893*35ffd701SAndroid Build Coastguard Worker switch(Format)
894*35ffd701SAndroid Build Coastguard Worker {
895*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P012:
896*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y412:
897*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y212: //which format encoding for Y212, Y412, P012?
898*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x2;
899*35ffd701SAndroid Build Coastguard Worker break;
900*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P010:
901*35ffd701SAndroid Build Coastguard Worker //case GMM_FORMAT_Y410:
902*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y210: //which format encoding for Y210?
903*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x1;
904*35ffd701SAndroid Build Coastguard Worker break;
905*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_P016: //per HAS, separate encoding than P010, but a comment says to use P010 in AuxTable?
906*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y416:
907*35ffd701SAndroid Build Coastguard Worker case GMM_FORMAT_Y216:
908*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x0;
909*35ffd701SAndroid Build Coastguard Worker break;
910*35ffd701SAndroid Build Coastguard Worker default:
911*35ffd701SAndroid Build Coastguard Worker L1ePartial.Depth = 0x3; //For MC, bpp got from format encoding
912*35ffd701SAndroid Build Coastguard Worker }
913*35ffd701SAndroid Build Coastguard Worker
914*35ffd701SAndroid Build Coastguard Worker if(L1ePartial.Format == GMM_E2ECOMP_FORMAT_R10G10B10A2_UNORM)
915*35ffd701SAndroid Build Coastguard Worker {
916*35ffd701SAndroid Build Coastguard Worker L1ePartial.Format = GMM_E2ECOMP_FORMAT_RGB10b;
917*35ffd701SAndroid Build Coastguard Worker }
918*35ffd701SAndroid Build Coastguard Worker }
919*35ffd701SAndroid Build Coastguard Worker
920*35ffd701SAndroid Build Coastguard Worker return L1ePartial;
921*35ffd701SAndroid Build Coastguard Worker }
922*35ffd701SAndroid Build Coastguard Worker
__GetCCSCacheline(GMM_RESOURCE_INFO * BaseResInfo,GMM_GFX_ADDRESS BaseAdr,GMM_RESOURCE_INFO * AuxResInfo,GMM_GFX_ADDRESS AuxVA,GMM_GFX_SIZE_T AdrOffset)923*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS GMM_INLINE GmmLib::AuxTable::__GetCCSCacheline(GMM_RESOURCE_INFO *BaseResInfo, GMM_GFX_ADDRESS BaseAdr,
924*35ffd701SAndroid Build Coastguard Worker GMM_RESOURCE_INFO *AuxResInfo, GMM_GFX_ADDRESS AuxVA, GMM_GFX_SIZE_T AdrOffset)
925*35ffd701SAndroid Build Coastguard Worker {
926*35ffd701SAndroid Build Coastguard Worker GMM_GFX_ADDRESS CCSChunkAdr = 0xFFFFFFF0;
927*35ffd701SAndroid Build Coastguard Worker uint32_t x = 0, y = 0;
928*35ffd701SAndroid Build Coastguard Worker uint32_t i = 0, j = 0;
929*35ffd701SAndroid Build Coastguard Worker uint32_t CCSXTile = 0, CCSYTile = 0;
930*35ffd701SAndroid Build Coastguard Worker GMM_UNREFERENCED_PARAMETER(BaseAdr);
931*35ffd701SAndroid Build Coastguard Worker
932*35ffd701SAndroid Build Coastguard Worker bool BaseIsYF = BaseResInfo->GetResFlags().Info.TiledYf ? true : false;
933*35ffd701SAndroid Build Coastguard Worker uint32_t BasePitchInTiles = BaseResInfo->GetRenderPitchTiles();
934*35ffd701SAndroid Build Coastguard Worker
935*35ffd701SAndroid Build Coastguard Worker //Find YF/YS TileId <x,y> for given main surface 16K-chunk
936*35ffd701SAndroid Build Coastguard Worker //and CCS$Id <i,j> corresponding to main's <x,y>
937*35ffd701SAndroid Build Coastguard Worker AdrOffset >>= 14; //AdrOffset must be 16K-aligned chunk, since mapping unit is 4 YF pages
938*35ffd701SAndroid Build Coastguard Worker if(BaseIsYF)
939*35ffd701SAndroid Build Coastguard Worker {
940*35ffd701SAndroid Build Coastguard Worker uint32_t PitchIn4YF = BasePitchInTiles / 4; //Base Pitch is physically padded to 4x1 YF width
941*35ffd701SAndroid Build Coastguard Worker
942*35ffd701SAndroid Build Coastguard Worker if (PitchIn4YF != 0)
943*35ffd701SAndroid Build Coastguard Worker {
944*35ffd701SAndroid Build Coastguard Worker i = static_cast<uint32_t>(AdrOffset % PitchIn4YF);
945*35ffd701SAndroid Build Coastguard Worker j = static_cast<uint32_t>(AdrOffset / PitchIn4YF);
946*35ffd701SAndroid Build Coastguard Worker }
947*35ffd701SAndroid Build Coastguard Worker else
948*35ffd701SAndroid Build Coastguard Worker {
949*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(PitchIn4YF != 0);
950*35ffd701SAndroid Build Coastguard Worker return 0;
951*35ffd701SAndroid Build Coastguard Worker }
952*35ffd701SAndroid Build Coastguard Worker }
953*35ffd701SAndroid Build Coastguard Worker else if(BasePitchInTiles != 0) //TileYs
954*35ffd701SAndroid Build Coastguard Worker {
955*35ffd701SAndroid Build Coastguard Worker x = static_cast<uint32_t>(AdrOffset >> 2); //YS-tile count
956*35ffd701SAndroid Build Coastguard Worker y = x / BasePitchInTiles; //YS- tile id <x,y>
957*35ffd701SAndroid Build Coastguard Worker x = x % BasePitchInTiles;
958*35ffd701SAndroid Build Coastguard Worker i = 2 * x;
959*35ffd701SAndroid Build Coastguard Worker j = 2 * y;
960*35ffd701SAndroid Build Coastguard Worker switch(AdrOffset % 4) //YS : XYXY [XYXY YF] ie 2x2 16K-units in Y-major
961*35ffd701SAndroid Build Coastguard Worker {
962*35ffd701SAndroid Build Coastguard Worker case 0:
963*35ffd701SAndroid Build Coastguard Worker break;
964*35ffd701SAndroid Build Coastguard Worker case 1:
965*35ffd701SAndroid Build Coastguard Worker j++;
966*35ffd701SAndroid Build Coastguard Worker break;
967*35ffd701SAndroid Build Coastguard Worker case 2:
968*35ffd701SAndroid Build Coastguard Worker i++;
969*35ffd701SAndroid Build Coastguard Worker break;
970*35ffd701SAndroid Build Coastguard Worker case 3:
971*35ffd701SAndroid Build Coastguard Worker i++;
972*35ffd701SAndroid Build Coastguard Worker j++;
973*35ffd701SAndroid Build Coastguard Worker break;
974*35ffd701SAndroid Build Coastguard Worker }
975*35ffd701SAndroid Build Coastguard Worker }
976*35ffd701SAndroid Build Coastguard Worker
977*35ffd701SAndroid Build Coastguard Worker //Compute CCS$ address for <i,j>
978*35ffd701SAndroid Build Coastguard Worker CCSXTile = (i >= 8) ? i / 8 : 0; //8x8 CLs make one CCS Tile; get TileOffset
979*35ffd701SAndroid Build Coastguard Worker CCSYTile = (j >= 8) ? j / 8 : 0;
980*35ffd701SAndroid Build Coastguard Worker i %= 8;
981*35ffd701SAndroid Build Coastguard Worker j %= 8;
982*35ffd701SAndroid Build Coastguard Worker
983*35ffd701SAndroid Build Coastguard Worker uint32_t AuxPitchInTiles = AuxResInfo ? AuxResInfo->GetRenderPitchTiles() : BaseResInfo->GetRenderAuxPitchTiles();
984*35ffd701SAndroid Build Coastguard Worker CCSChunkAdr = AuxVA + ((CCSXTile + CCSYTile * AuxPitchInTiles) * GMM_KBYTE(4)) + (8 * GMM_BYTES(64) * i) + (GMM_BYTES(64) * j);
985*35ffd701SAndroid Build Coastguard Worker
986*35ffd701SAndroid Build Coastguard Worker return CCSChunkAdr;
987*35ffd701SAndroid Build Coastguard Worker }
988*35ffd701SAndroid Build Coastguard Worker
989*35ffd701SAndroid Build Coastguard Worker #endif /*!__GMM_KMD__*/
990