xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/TranslationTable/GmmAuxTable.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2019 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker 
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker 
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker 
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker 
22*35ffd701SAndroid Build Coastguard Worker Description: 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