xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/CachePolicy/GmmGen8CachePolicy.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 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 
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmCachePolicy.h"
25*35ffd701SAndroid Build Coastguard Worker 
26*35ffd701SAndroid Build Coastguard Worker //=============================================================================
27*35ffd701SAndroid Build Coastguard Worker //
28*35ffd701SAndroid Build Coastguard Worker // Function: __GmmGen8InitCachePolicy
29*35ffd701SAndroid Build Coastguard Worker //
30*35ffd701SAndroid Build Coastguard Worker // Desc: This function initializes the cache policy
31*35ffd701SAndroid Build Coastguard Worker //
32*35ffd701SAndroid Build Coastguard Worker // Parameters: pCachePolicy  -> Ptr to array to be populated with the
33*35ffd701SAndroid Build Coastguard Worker //             mapping of usages -> cache settings.
34*35ffd701SAndroid Build Coastguard Worker //
35*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
36*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
InitCachePolicy()37*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen8CachePolicy::InitCachePolicy()
38*35ffd701SAndroid Build Coastguard Worker {
39*35ffd701SAndroid Build Coastguard Worker 
40*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pCachePolicy, GMM_ERROR);
41*35ffd701SAndroid Build Coastguard Worker 
42*35ffd701SAndroid Build Coastguard Worker #define DEFINE_CACHE_ELEMENT(usage, llc, ellc, l3, wt, age) DEFINE_CP_ELEMENT(usage, llc, ellc, l3, wt, age, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
43*35ffd701SAndroid Build Coastguard Worker #include "GmmGen8CachePolicy.h"
44*35ffd701SAndroid Build Coastguard Worker 
45*35ffd701SAndroid Build Coastguard Worker     {
46*35ffd701SAndroid Build Coastguard Worker // Gen8 Memory Object Definitions
47*35ffd701SAndroid Build Coastguard Worker #define MO_ELLC 0x0
48*35ffd701SAndroid Build Coastguard Worker #define MO_LLC 0x1
49*35ffd701SAndroid Build Coastguard Worker #define MO_LLC_ELLC 0x2
50*35ffd701SAndroid Build Coastguard Worker #define MO_L3_LLC_ELLC 0x3
51*35ffd701SAndroid Build Coastguard Worker 
52*35ffd701SAndroid Build Coastguard Worker #define MO_USE_PTE 0x0
53*35ffd701SAndroid Build Coastguard Worker #define MO_UC 0x1
54*35ffd701SAndroid Build Coastguard Worker #define MO_WT 0x2
55*35ffd701SAndroid Build Coastguard Worker #define MO_WB 0x3
56*35ffd701SAndroid Build Coastguard Worker 
57*35ffd701SAndroid Build Coastguard Worker         // Define index of cache element
58*35ffd701SAndroid Build Coastguard Worker         uint32_t Usage = 0;
59*35ffd701SAndroid Build Coastguard Worker 
60*35ffd701SAndroid Build Coastguard Worker         // Process Cache Policy and fill in look up table
61*35ffd701SAndroid Build Coastguard Worker         for(; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
62*35ffd701SAndroid Build Coastguard Worker         {
63*35ffd701SAndroid Build Coastguard Worker             bool     CachePolicyError = false;
64*35ffd701SAndroid Build Coastguard Worker             uint64_t PTEValue         = 0;
65*35ffd701SAndroid Build Coastguard Worker 
66*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].LLC && pCachePolicy[Usage].ELLC && pCachePolicy[Usage].L3)
67*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.TargetCache = MO_L3_LLC_ELLC;
68*35ffd701SAndroid Build Coastguard Worker             else if(pCachePolicy[Usage].LLC && pCachePolicy[Usage].ELLC)
69*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.TargetCache = MO_LLC_ELLC;
70*35ffd701SAndroid Build Coastguard Worker             else if(pCachePolicy[Usage].ELLC)
71*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.TargetCache = MO_ELLC;
72*35ffd701SAndroid Build Coastguard Worker             else if(pCachePolicy[Usage].LLC)
73*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.TargetCache = MO_LLC;
74*35ffd701SAndroid Build Coastguard Worker 
75*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].MemoryObjectOverride.Gen8.Age = pCachePolicy[Usage].AGE;
76*35ffd701SAndroid Build Coastguard Worker 
77*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].WT)
78*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.CacheControl = MO_WT;
79*35ffd701SAndroid Build Coastguard Worker             // L3 is not included because WT vs UC vs WB only effects uncore
80*35ffd701SAndroid Build Coastguard Worker             else if(!(pCachePolicy[Usage].LLC || pCachePolicy[Usage].ELLC))
81*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.CacheControl = MO_UC;
82*35ffd701SAndroid Build Coastguard Worker 
83*35ffd701SAndroid Build Coastguard Worker             else
84*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].MemoryObjectOverride.Gen8.CacheControl = MO_WB;
85*35ffd701SAndroid Build Coastguard Worker 
86*35ffd701SAndroid Build Coastguard Worker 
87*35ffd701SAndroid Build Coastguard Worker             if(!GetUsagePTEValue(pCachePolicy[Usage], Usage, &PTEValue))
88*35ffd701SAndroid Build Coastguard Worker             {
89*35ffd701SAndroid Build Coastguard Worker                 CachePolicyError = true;
90*35ffd701SAndroid Build Coastguard Worker             }
91*35ffd701SAndroid Build Coastguard Worker             // On error, the PTE value is set to a UC PAT entry
92*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].PTE.DwordValue     = PTEValue & 0xFFFFFFFF;
93*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].PTE.HighDwordValue = 0;
94*35ffd701SAndroid Build Coastguard Worker 	    pCachePolicy[Usage].Override       = ALWAYS_OVERRIDE;
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker             if(CachePolicyError)
97*35ffd701SAndroid Build Coastguard Worker             {
98*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF("Cache Policy Init Error: Invalid Cache Programming - Element %d", Usage);
99*35ffd701SAndroid Build Coastguard Worker             }
100*35ffd701SAndroid Build Coastguard Worker         }
101*35ffd701SAndroid Build Coastguard Worker     }
102*35ffd701SAndroid Build Coastguard Worker 
103*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
104*35ffd701SAndroid Build Coastguard Worker }
105*35ffd701SAndroid Build Coastguard Worker 
106*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
107*35ffd701SAndroid Build Coastguard Worker /// Returns true if usage PTE entries are set for caching, false otherwise.
108*35ffd701SAndroid Build Coastguard Worker ///
109*35ffd701SAndroid Build Coastguard Worker /// @param[in]      Usage: type of usage
110*35ffd701SAndroid Build Coastguard Worker ///
111*35ffd701SAndroid Build Coastguard Worker /// @return         true if the usage PTE entry is set for cached, false otherwise.
112*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyIsUsagePTECached(GMM_RESOURCE_USAGE_TYPE Usage)113*35ffd701SAndroid Build Coastguard Worker uint8_t GMM_STDCALL GmmLib::GmmGen8CachePolicy::CachePolicyIsUsagePTECached(GMM_RESOURCE_USAGE_TYPE Usage)
114*35ffd701SAndroid Build Coastguard Worker {
115*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(Usage);
116*35ffd701SAndroid Build Coastguard Worker     return 0;
117*35ffd701SAndroid Build Coastguard Worker }
118*35ffd701SAndroid Build Coastguard Worker 
119*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
120*35ffd701SAndroid Build Coastguard Worker ///  Initializes the Gfx PAT tables for AdvCtx and Gfx MMIO/Private PAT
121*35ffd701SAndroid Build Coastguard Worker ///    PAT0 = WB_COHERENT or UC depending on WaGttPat0WB
122*35ffd701SAndroid Build Coastguard Worker ///    PAT1 = UC or WB_COHERENT depending on WaGttPat0WB
123*35ffd701SAndroid Build Coastguard Worker ///    PAT2 = WB_MOCSLESS, with TC = eLLC+LLC
124*35ffd701SAndroid Build Coastguard Worker ///    PAT3 = WB
125*35ffd701SAndroid Build Coastguard Worker ///    PAT4 = WT
126*35ffd701SAndroid Build Coastguard Worker ///    PAT5 = WC
127*35ffd701SAndroid Build Coastguard Worker ///    PAT6 = WC
128*35ffd701SAndroid Build Coastguard Worker ///    PAT7 = WC
129*35ffd701SAndroid Build Coastguard Worker ///  HLD says to set to PAT0/1 to WC, but since we don't have a WC in GPU,
130*35ffd701SAndroid Build Coastguard Worker ///  WC option is same as UC. Hence setting PAT0 or PAT1 to UC.
131*35ffd701SAndroid Build Coastguard Worker ///  Unused PAT's (5,6,7) are set to WC.
132*35ffd701SAndroid Build Coastguard Worker ///
133*35ffd701SAndroid Build Coastguard Worker /// @return        GMM_STATUS
134*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetupPAT()135*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen8CachePolicy::SetupPAT()
136*35ffd701SAndroid Build Coastguard Worker {
137*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status = GMM_SUCCESS;
138*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
139*35ffd701SAndroid Build Coastguard Worker     uint32_t i = 0;
140*35ffd701SAndroid Build Coastguard Worker 
141*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_MEMORY_TYPE GfxMemType = GMM_GFX_UC_WITH_FENCE;
142*35ffd701SAndroid Build Coastguard Worker     // No optional selection on Age or Target Cache because for an SVM-OS Age and
143*35ffd701SAndroid Build Coastguard Worker     // Target Cache would not work [for an SVM-OS the Page Table is shared with IA
144*35ffd701SAndroid Build Coastguard Worker     // and we don't have control of the PAT Idx]. If there is a strong ask from D3D
145*35ffd701SAndroid Build Coastguard Worker     // or the performance analysis team, Age could be added.
146*35ffd701SAndroid Build Coastguard Worker     // Add Class of Service when required.
147*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_TARGET_CACHE GfxTargetCache             = GMM_GFX_TC_ELLC_LLC;
148*35ffd701SAndroid Build Coastguard Worker     uint8_t              Age                        = 1;
149*35ffd701SAndroid Build Coastguard Worker     uint8_t              ServiceClass               = 0;
150*35ffd701SAndroid Build Coastguard Worker     int32_t *            pPrivatePATTableMemoryType = NULL;
151*35ffd701SAndroid Build Coastguard Worker 
152*35ffd701SAndroid Build Coastguard Worker     pPrivatePATTableMemoryType = pGmmLibContext->GetPrivatePATTableMemoryType();
153*35ffd701SAndroid Build Coastguard Worker 
154*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pGmmLibContext->GetSkuTable().FtrIA32eGfxPTEs);
155*35ffd701SAndroid Build Coastguard Worker 
156*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i < GMM_NUM_GFX_PAT_TYPES; i++)
157*35ffd701SAndroid Build Coastguard Worker     {
158*35ffd701SAndroid Build Coastguard Worker         pPrivatePATTableMemoryType[i] = -1;
159*35ffd701SAndroid Build Coastguard Worker     }
160*35ffd701SAndroid Build Coastguard Worker 
161*35ffd701SAndroid Build Coastguard Worker     // Set values for GmmGlobalInfo PrivatePATTable
162*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i < NumPATRegisters; i++)
163*35ffd701SAndroid Build Coastguard Worker     {
164*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT PAT = {0};
165*35ffd701SAndroid Build Coastguard Worker 
166*35ffd701SAndroid Build Coastguard Worker         if(pGmmLibContext->GetWaTable().WaNoMocsEllcOnly)
167*35ffd701SAndroid Build Coastguard Worker         {
168*35ffd701SAndroid Build Coastguard Worker             GfxTargetCache = GMM_GFX_TC_ELLC_ONLY;
169*35ffd701SAndroid Build Coastguard Worker         }
170*35ffd701SAndroid Build Coastguard Worker         else
171*35ffd701SAndroid Build Coastguard Worker         {
172*35ffd701SAndroid Build Coastguard Worker             GfxTargetCache = GMM_GFX_TC_ELLC_LLC;
173*35ffd701SAndroid Build Coastguard Worker         }
174*35ffd701SAndroid Build Coastguard Worker 
175*35ffd701SAndroid Build Coastguard Worker         switch(i)
176*35ffd701SAndroid Build Coastguard Worker         {
177*35ffd701SAndroid Build Coastguard Worker             case PAT0:
178*35ffd701SAndroid Build Coastguard Worker                 if(pGmmLibContext->GetWaTable().WaGttPat0)
179*35ffd701SAndroid Build Coastguard Worker                 {
180*35ffd701SAndroid Build Coastguard Worker                     if(pGmmLibContext->GetWaTable().WaGttPat0WB)
181*35ffd701SAndroid Build Coastguard Worker                     {
182*35ffd701SAndroid Build Coastguard Worker                         GfxMemType = GMM_GFX_WB;
183*35ffd701SAndroid Build Coastguard Worker                         if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
184*35ffd701SAndroid Build Coastguard Worker                         {
185*35ffd701SAndroid Build Coastguard Worker                             PAT.PreGen10.Snoop = 1;
186*35ffd701SAndroid Build Coastguard Worker                         }
187*35ffd701SAndroid Build Coastguard Worker                         pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT0;
188*35ffd701SAndroid Build Coastguard Worker                     }
189*35ffd701SAndroid Build Coastguard Worker                     else
190*35ffd701SAndroid Build Coastguard Worker                     {
191*35ffd701SAndroid Build Coastguard Worker                         GfxMemType                                 = GMM_GFX_UC_WITH_FENCE;
192*35ffd701SAndroid Build Coastguard Worker                         pPrivatePATTableMemoryType[GMM_GFX_PAT_UC] = PAT0;
193*35ffd701SAndroid Build Coastguard Worker                     }
194*35ffd701SAndroid Build Coastguard Worker                 }
195*35ffd701SAndroid Build Coastguard Worker                 else // if GTT is not tied to PAT0 then WaGttPat0WB is NA
196*35ffd701SAndroid Build Coastguard Worker                 {
197*35ffd701SAndroid Build Coastguard Worker                     GfxMemType = GMM_GFX_WB;
198*35ffd701SAndroid Build Coastguard Worker                     if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
199*35ffd701SAndroid Build Coastguard Worker                     {
200*35ffd701SAndroid Build Coastguard Worker                         PAT.PreGen10.Snoop = 1;
201*35ffd701SAndroid Build Coastguard Worker                     }
202*35ffd701SAndroid Build Coastguard Worker                     pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT0;
203*35ffd701SAndroid Build Coastguard Worker                 }
204*35ffd701SAndroid Build Coastguard Worker                 break;
205*35ffd701SAndroid Build Coastguard Worker 
206*35ffd701SAndroid Build Coastguard Worker             case PAT1:
207*35ffd701SAndroid Build Coastguard Worker                 if(pGmmLibContext->GetWaTable().WaGttPat0 && !pGmmLibContext->GetWaTable().WaGttPat0WB)
208*35ffd701SAndroid Build Coastguard Worker 		{
209*35ffd701SAndroid Build Coastguard Worker                     GfxMemType = GMM_GFX_WB;
210*35ffd701SAndroid Build Coastguard Worker                     if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
211*35ffd701SAndroid Build Coastguard Worker                     {
212*35ffd701SAndroid Build Coastguard Worker                         PAT.PreGen10.Snoop = 1;
213*35ffd701SAndroid Build Coastguard Worker                     }
214*35ffd701SAndroid Build Coastguard Worker                     pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT1;
215*35ffd701SAndroid Build Coastguard Worker                 }
216*35ffd701SAndroid Build Coastguard Worker                 else
217*35ffd701SAndroid Build Coastguard Worker                 {
218*35ffd701SAndroid Build Coastguard Worker                     GfxMemType                                 = GMM_GFX_UC_WITH_FENCE;
219*35ffd701SAndroid Build Coastguard Worker                     pPrivatePATTableMemoryType[GMM_GFX_PAT_UC] = PAT1;
220*35ffd701SAndroid Build Coastguard Worker                 }
221*35ffd701SAndroid Build Coastguard Worker                 break;
222*35ffd701SAndroid Build Coastguard Worker 
223*35ffd701SAndroid Build Coastguard Worker             case PAT2:
224*35ffd701SAndroid Build Coastguard Worker                 // This PAT idx shall be used for MOCS'Less resources like Page Tables
225*35ffd701SAndroid Build Coastguard Worker                 // Page Tables have TC hardcoded to eLLC+LLC in Adv Ctxt. Hence making this to have same in Leg Ctxt.
226*35ffd701SAndroid Build Coastguard Worker                 // For BDW-H, due to Perf issue, TC has to be eLLC only for Page Tables when eDRAM is present.
227*35ffd701SAndroid Build Coastguard Worker                 GfxMemType = GMM_GFX_WB;
228*35ffd701SAndroid Build Coastguard Worker 
229*35ffd701SAndroid Build Coastguard Worker 		if(pGmmLibContext->GetWaTable().WaNoMocsEllcOnly)
230*35ffd701SAndroid Build Coastguard Worker                 {
231*35ffd701SAndroid Build Coastguard Worker                     GfxTargetCache = GMM_GFX_TC_ELLC_ONLY;
232*35ffd701SAndroid Build Coastguard Worker                 }
233*35ffd701SAndroid Build Coastguard Worker                 else
234*35ffd701SAndroid Build Coastguard Worker                 {
235*35ffd701SAndroid Build Coastguard Worker                     GfxTargetCache = GMM_GFX_TC_ELLC_LLC;
236*35ffd701SAndroid Build Coastguard Worker                 }
237*35ffd701SAndroid Build Coastguard Worker 
238*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_MOCSLESS] = PAT2;
239*35ffd701SAndroid Build Coastguard Worker                 break;
240*35ffd701SAndroid Build Coastguard Worker 
241*35ffd701SAndroid Build Coastguard Worker             case PAT3:
242*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                 = GMM_GFX_WB;
243*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WB] = PAT3;
244*35ffd701SAndroid Build Coastguard Worker                 break;
245*35ffd701SAndroid Build Coastguard Worker 
246*35ffd701SAndroid Build Coastguard Worker             case PAT4:
247*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                 = GMM_GFX_WT;
248*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WT] = PAT4;
249*35ffd701SAndroid Build Coastguard Worker                 break;
250*35ffd701SAndroid Build Coastguard Worker 
251*35ffd701SAndroid Build Coastguard Worker             case PAT5:
252*35ffd701SAndroid Build Coastguard Worker             case PAT6:
253*35ffd701SAndroid Build Coastguard Worker             case PAT7:
254*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                 = GMM_GFX_WC;
255*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WC] = PAT5;
256*35ffd701SAndroid Build Coastguard Worker                 break;
257*35ffd701SAndroid Build Coastguard Worker 
258*35ffd701SAndroid Build Coastguard Worker             default:
259*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(0);
260*35ffd701SAndroid Build Coastguard Worker                 Status = GMM_ERROR;
261*35ffd701SAndroid Build Coastguard Worker         }
262*35ffd701SAndroid Build Coastguard Worker 
263*35ffd701SAndroid Build Coastguard Worker         PAT.PreGen10.MemoryType  = GfxMemType;
264*35ffd701SAndroid Build Coastguard Worker         PAT.PreGen10.TargetCache = GfxTargetCache;
265*35ffd701SAndroid Build Coastguard Worker         PAT.PreGen10.Age         = Age;
266*35ffd701SAndroid Build Coastguard Worker 
267*35ffd701SAndroid Build Coastguard Worker         SetPrivatePATEntry(i, PAT);
268*35ffd701SAndroid Build Coastguard Worker     }
269*35ffd701SAndroid Build Coastguard Worker 
270*35ffd701SAndroid Build Coastguard Worker #else
271*35ffd701SAndroid Build Coastguard Worker     Status                                          = GMM_ERROR;
272*35ffd701SAndroid Build Coastguard Worker #endif
273*35ffd701SAndroid Build Coastguard Worker     return Status;
274*35ffd701SAndroid Build Coastguard Worker }
275*35ffd701SAndroid Build Coastguard Worker 
276*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
277*35ffd701SAndroid Build Coastguard Worker /// Initializes WA's needed for setting up the Private PATs
278*35ffd701SAndroid Build Coastguard Worker /// WaNoMocsEllcOnly, WaGttPat0, WaGttPat0GttWbOverOsIommuEllcOnly, WaGttPat0WB
279*35ffd701SAndroid Build Coastguard Worker ///
280*35ffd701SAndroid Build Coastguard Worker /// @return        GMM_STATUS
281*35ffd701SAndroid Build Coastguard Worker ///
282*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetPATInitWA()283*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen8CachePolicy::SetPATInitWA()
284*35ffd701SAndroid Build Coastguard Worker {
285*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status   = GMM_SUCCESS;
286*35ffd701SAndroid Build Coastguard Worker     WA_TABLE * pWaTable = &const_cast<WA_TABLE &>(pGmmLibContext->GetWaTable());
287*35ffd701SAndroid Build Coastguard Worker 
288*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
289*35ffd701SAndroid Build Coastguard Worker 
290*35ffd701SAndroid Build Coastguard Worker     pWaTable->WaGttPat0                         = 1;
291*35ffd701SAndroid Build Coastguard Worker     pWaTable->WaGttPat0WB                       = 1;
292*35ffd701SAndroid Build Coastguard Worker     pWaTable->WaGttPat0GttWbOverOsIommuEllcOnly = 1;
293*35ffd701SAndroid Build Coastguard Worker 
294*35ffd701SAndroid Build Coastguard Worker     // Platforms which support OS-IOMMU.
295*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetSkuTable().FtrWddm2Svm)
296*35ffd701SAndroid Build Coastguard Worker     {
297*35ffd701SAndroid Build Coastguard Worker         pWaTable->WaGttPat0GttWbOverOsIommuEllcOnly = 0;
298*35ffd701SAndroid Build Coastguard Worker         pWaTable->WaGttPat0WB                       = 0;
299*35ffd701SAndroid Build Coastguard Worker     }
300*35ffd701SAndroid Build Coastguard Worker 
301*35ffd701SAndroid Build Coastguard Worker #else
302*35ffd701SAndroid Build Coastguard Worker     Status                                          = GMM_ERROR;
303*35ffd701SAndroid Build Coastguard Worker #endif
304*35ffd701SAndroid Build Coastguard Worker 
305*35ffd701SAndroid Build Coastguard Worker     return Status;
306*35ffd701SAndroid Build Coastguard Worker }
307*35ffd701SAndroid Build Coastguard Worker 
308*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
309*35ffd701SAndroid Build Coastguard Worker /// Returns the PAT idx that best matches the cache policy for this usage.
310*35ffd701SAndroid Build Coastguard Worker ///
311*35ffd701SAndroid Build Coastguard Worker /// @param: CachePolicy: cache policy for a usage
312*35ffd701SAndroid Build Coastguard Worker ///
313*35ffd701SAndroid Build Coastguard Worker /// @return        PAT Idx to use in the PTE
314*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
BestMatchingPATIdx(GMM_CACHE_POLICY_ELEMENT CachePolicy)315*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen8CachePolicy::BestMatchingPATIdx(GMM_CACHE_POLICY_ELEMENT CachePolicy)
316*35ffd701SAndroid Build Coastguard Worker {
317*35ffd701SAndroid Build Coastguard Worker     uint32_t             i;
318*35ffd701SAndroid Build Coastguard Worker     uint32_t             PATIdx           = 0;
319*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_MEMORY_TYPE  WantedMemoryType = GMM_GFX_UC_WITH_FENCE, MemoryType;
320*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_TARGET_CACHE WantedTC         = GMM_GFX_TC_ELLC_LLC;
321*35ffd701SAndroid Build Coastguard Worker 
322*35ffd701SAndroid Build Coastguard Worker     WantedMemoryType = GetWantedMemoryType(CachePolicy);
323*35ffd701SAndroid Build Coastguard Worker 
324*35ffd701SAndroid Build Coastguard Worker     if(CachePolicy.LLC && CachePolicy.ELLC)
325*35ffd701SAndroid Build Coastguard Worker     {
326*35ffd701SAndroid Build Coastguard Worker         WantedTC = GMM_GFX_TC_ELLC_LLC;
327*35ffd701SAndroid Build Coastguard Worker     }
328*35ffd701SAndroid Build Coastguard Worker     else if(CachePolicy.LLC)
329*35ffd701SAndroid Build Coastguard Worker     {
330*35ffd701SAndroid Build Coastguard Worker         WantedTC = GMM_GFX_TC_LLC_ONLY;
331*35ffd701SAndroid Build Coastguard Worker     }
332*35ffd701SAndroid Build Coastguard Worker     else if(CachePolicy.ELLC)
333*35ffd701SAndroid Build Coastguard Worker     {
334*35ffd701SAndroid Build Coastguard Worker         WantedTC = GMM_GFX_TC_ELLC_ONLY; // Note: this overrides the MOCS target cache selection.
335*35ffd701SAndroid Build Coastguard Worker     }
336*35ffd701SAndroid Build Coastguard Worker 
337*35ffd701SAndroid Build Coastguard Worker     for(i = 1; i < NumPATRegisters; i++)
338*35ffd701SAndroid Build Coastguard Worker     {
339*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT PAT1 = GetPrivatePATEntry(PATIdx);
340*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT PAT2 = GetPrivatePATEntry(i);
341*35ffd701SAndroid Build Coastguard Worker 
342*35ffd701SAndroid Build Coastguard Worker         if(SelectNewPATIdx(WantedMemoryType, WantedTC,
343*35ffd701SAndroid Build Coastguard Worker                            (GMM_GFX_MEMORY_TYPE)PAT1.PreGen10.MemoryType, (GMM_GFX_TARGET_CACHE)PAT1.PreGen10.TargetCache,
344*35ffd701SAndroid Build Coastguard Worker                            (GMM_GFX_MEMORY_TYPE)PAT2.PreGen10.MemoryType, (GMM_GFX_TARGET_CACHE)PAT2.PreGen10.TargetCache))
345*35ffd701SAndroid Build Coastguard Worker         {
346*35ffd701SAndroid Build Coastguard Worker             PATIdx = i;
347*35ffd701SAndroid Build Coastguard Worker         }
348*35ffd701SAndroid Build Coastguard Worker     }
349*35ffd701SAndroid Build Coastguard Worker 
350*35ffd701SAndroid Build Coastguard Worker     MemoryType = (GMM_GFX_MEMORY_TYPE)GetPrivatePATEntry(PATIdx).PreGen10.MemoryType;
351*35ffd701SAndroid Build Coastguard Worker 
352*35ffd701SAndroid Build Coastguard Worker     if(MemoryType != WantedMemoryType)
353*35ffd701SAndroid Build Coastguard Worker     {
354*35ffd701SAndroid Build Coastguard Worker         // Failed to find a matching PAT entry
355*35ffd701SAndroid Build Coastguard Worker         return GMM_PAT_ERROR;
356*35ffd701SAndroid Build Coastguard Worker     }
357*35ffd701SAndroid Build Coastguard Worker     return PATIdx;
358*35ffd701SAndroid Build Coastguard Worker }
359*35ffd701SAndroid Build Coastguard Worker 
360*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
361*35ffd701SAndroid Build Coastguard Worker /// Sets the GMM Private PAT in the PrivatePATTable for the PATIdx, GMM_PRIVATE_PAT
362*35ffd701SAndroid Build Coastguard Worker /// Entry passed
363*35ffd701SAndroid Build Coastguard Worker ///
364*35ffd701SAndroid Build Coastguard Worker /// @param[in]      PATIdx
365*35ffd701SAndroid Build Coastguard Worker /// @param[in]      GMM_PRIVATE_PAT: PAT Entry
366*35ffd701SAndroid Build Coastguard Worker ///
367*35ffd701SAndroid Build Coastguard Worker /// @return         Pass/ fail
368*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetPrivatePATEntry(uint32_t PATIdx,GMM_PRIVATE_PAT Entry)369*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmGen8CachePolicy::SetPrivatePATEntry(uint32_t PATIdx, GMM_PRIVATE_PAT Entry)
370*35ffd701SAndroid Build Coastguard Worker {
371*35ffd701SAndroid Build Coastguard Worker     if(PATIdx >= NumPATRegisters)
372*35ffd701SAndroid Build Coastguard Worker     {
373*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(false, "CRITICAL ERROR: INVALID PAT IDX");
374*35ffd701SAndroid Build Coastguard Worker         return false;
375*35ffd701SAndroid Build Coastguard Worker     }
376*35ffd701SAndroid Build Coastguard Worker 
377*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->GetPrivatePATTable()[PATIdx] = Entry;
378*35ffd701SAndroid Build Coastguard Worker     return true;
379*35ffd701SAndroid Build Coastguard Worker }
380*35ffd701SAndroid Build Coastguard Worker 
381*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
382*35ffd701SAndroid Build Coastguard Worker /// Gets the GMM Private PAT from the PrivatePATTable for the PATIdx passed
383*35ffd701SAndroid Build Coastguard Worker ///
384*35ffd701SAndroid Build Coastguard Worker /// @param[in]     PATIdx
385*35ffd701SAndroid Build Coastguard Worker ///
386*35ffd701SAndroid Build Coastguard Worker /// @return        GMM_PRIVATE_PAT: Entry
387*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetPrivatePATEntry(uint32_t PATIdx)388*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT GmmLib::GmmGen8CachePolicy::GetPrivatePATEntry(uint32_t PATIdx)
389*35ffd701SAndroid Build Coastguard Worker {
390*35ffd701SAndroid Build Coastguard Worker     GMM_PRIVATE_PAT NullPAT = {0};
391*35ffd701SAndroid Build Coastguard Worker 
392*35ffd701SAndroid Build Coastguard Worker     if(PATIdx >= NumPATRegisters)
393*35ffd701SAndroid Build Coastguard Worker     {
394*35ffd701SAndroid Build Coastguard Worker         GMM_ASSERTDPF(false, "CRITICAL ERROR: INVALID PAT IDX");
395*35ffd701SAndroid Build Coastguard Worker         return NullPAT;
396*35ffd701SAndroid Build Coastguard Worker     }
397*35ffd701SAndroid Build Coastguard Worker     return pGmmLibContext->GetPrivatePATTable()[PATIdx];
398*35ffd701SAndroid Build Coastguard Worker }
399*35ffd701SAndroid Build Coastguard Worker 
400*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
401*35ffd701SAndroid Build Coastguard Worker /// Return true if (MT2, TC2) is a better match for (WantedMT, WantedTC)
402*35ffd701SAndroid Build Coastguard Worker ///       than (MT1, TC1)
403*35ffd701SAndroid Build Coastguard Worker ///
404*35ffd701SAndroid Build Coastguard Worker /// @param[in]         WantedMT: Wanted Memory Type
405*35ffd701SAndroid Build Coastguard Worker /// @param[in]         WantedTC: Wanted Target Cache
406*35ffd701SAndroid Build Coastguard Worker /// @param[in]         MT1: Memory Type for PATIdx1
407*35ffd701SAndroid Build Coastguard Worker /// @param[in]         TC1: Target Cache for PATIdx1
408*35ffd701SAndroid Build Coastguard Worker /// @param[in]         MT2: Memory Type for PATIdx2
409*35ffd701SAndroid Build Coastguard Worker /// @param[in]         TC2: Target Cache for PATIdx2
410*35ffd701SAndroid Build Coastguard Worker ///
411*35ffd701SAndroid Build Coastguard Worker /// @return            Select the new PAT Index True/False
412*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SelectNewPATIdx(GMM_GFX_MEMORY_TYPE WantedMT,GMM_GFX_TARGET_CACHE WantedTC,GMM_GFX_MEMORY_TYPE MT1,GMM_GFX_TARGET_CACHE TC1,GMM_GFX_MEMORY_TYPE MT2,GMM_GFX_TARGET_CACHE TC2)413*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmGen8CachePolicy::SelectNewPATIdx(GMM_GFX_MEMORY_TYPE WantedMT, GMM_GFX_TARGET_CACHE WantedTC,
414*35ffd701SAndroid Build Coastguard Worker                                                  GMM_GFX_MEMORY_TYPE MT1, GMM_GFX_TARGET_CACHE TC1,
415*35ffd701SAndroid Build Coastguard Worker                                                  GMM_GFX_MEMORY_TYPE MT2, GMM_GFX_TARGET_CACHE TC2)
416*35ffd701SAndroid Build Coastguard Worker {
417*35ffd701SAndroid Build Coastguard Worker     bool SelectPAT2 = false;
418*35ffd701SAndroid Build Coastguard Worker 
419*35ffd701SAndroid Build Coastguard Worker     // select on Memory Type
420*35ffd701SAndroid Build Coastguard Worker     if(MT1 != WantedMT)
421*35ffd701SAndroid Build Coastguard Worker     {
422*35ffd701SAndroid Build Coastguard Worker         if(MT2 == WantedMT || MT2 == GMM_GFX_UC_WITH_FENCE)
423*35ffd701SAndroid Build Coastguard Worker         {
424*35ffd701SAndroid Build Coastguard Worker             SelectPAT2 = true;
425*35ffd701SAndroid Build Coastguard Worker         }
426*35ffd701SAndroid Build Coastguard Worker         goto EXIT;
427*35ffd701SAndroid Build Coastguard Worker     }
428*35ffd701SAndroid Build Coastguard Worker 
429*35ffd701SAndroid Build Coastguard Worker     // select on Target Cache
430*35ffd701SAndroid Build Coastguard Worker     if(WantedTC != TC1)
431*35ffd701SAndroid Build Coastguard Worker     {
432*35ffd701SAndroid Build Coastguard Worker         if(WantedMT == MT2 && WantedTC == TC2)
433*35ffd701SAndroid Build Coastguard Worker         {
434*35ffd701SAndroid Build Coastguard Worker             SelectPAT2 = true;
435*35ffd701SAndroid Build Coastguard Worker         }
436*35ffd701SAndroid Build Coastguard Worker         goto EXIT;
437*35ffd701SAndroid Build Coastguard Worker     }
438*35ffd701SAndroid Build Coastguard Worker 
439*35ffd701SAndroid Build Coastguard Worker EXIT:
440*35ffd701SAndroid Build Coastguard Worker     return SelectPAT2;
441*35ffd701SAndroid Build Coastguard Worker }
442*35ffd701SAndroid Build Coastguard Worker 
443*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
444*35ffd701SAndroid Build Coastguard Worker /// Returns PTE value
445*35ffd701SAndroid Build Coastguard Worker ///
446*35ffd701SAndroid Build Coastguard Worker /// @param[in]       CachePolicyUsage: Cache Policy for Usage
447*35ffd701SAndroid Build Coastguard Worker ///
448*35ffd701SAndroid Build Coastguard Worker /// @return          true: success, false: failure
449*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetUsagePTEValue(GMM_CACHE_POLICY_ELEMENT CachePolicyUsage,uint32_t Usage,uint64_t * pPTEDwordValue)450*35ffd701SAndroid Build Coastguard Worker bool GmmLib::GmmGen8CachePolicy::GetUsagePTEValue(GMM_CACHE_POLICY_ELEMENT CachePolicyUsage,
451*35ffd701SAndroid Build Coastguard Worker                                                   uint32_t                 Usage,
452*35ffd701SAndroid Build Coastguard Worker                                                   uint64_t *               pPTEDwordValue)
453*35ffd701SAndroid Build Coastguard Worker {
454*35ffd701SAndroid Build Coastguard Worker     GMM_PTE_CACHE_CONTROL_BITS PTE     = {0};
455*35ffd701SAndroid Build Coastguard Worker     bool                       Success = true;
456*35ffd701SAndroid Build Coastguard Worker     uint32_t                   PATIdx  = 0;
457*35ffd701SAndroid Build Coastguard Worker 
458*35ffd701SAndroid Build Coastguard Worker // Don't setup PTE values in UMD
459*35ffd701SAndroid Build Coastguard Worker #if __GMM_KMD__
460*35ffd701SAndroid Build Coastguard Worker     if((PATIdx = BestMatchingPATIdx(CachePolicyUsage)) == GMM_PAT_ERROR)
461*35ffd701SAndroid Build Coastguard Worker     {
462*35ffd701SAndroid Build Coastguard Worker         // IAe32 PAT table does not necessarily have an entry for WT memory type
463*35ffd701SAndroid Build Coastguard Worker         // => not a cache policy init error if WT is unavailable.
464*35ffd701SAndroid Build Coastguard Worker         Success = CachePolicyUsage.WT ? true : false;
465*35ffd701SAndroid Build Coastguard Worker 
466*35ffd701SAndroid Build Coastguard Worker         // degrade to UC
467*35ffd701SAndroid Build Coastguard Worker         {
468*35ffd701SAndroid Build Coastguard Worker             GMM_CACHE_POLICY_ELEMENT CachePolicyElement = {0};
469*35ffd701SAndroid Build Coastguard Worker 
470*35ffd701SAndroid Build Coastguard Worker             const char *MemTypes[4] = {"UC", "WC", "WT", "WB"}; // matches GMM_GFX_MEMORY_TYPE enum values
471*35ffd701SAndroid Build Coastguard Worker 
472*35ffd701SAndroid Build Coastguard Worker             CachePolicyElement.Initialized = 1;
473*35ffd701SAndroid Build Coastguard Worker 
474*35ffd701SAndroid Build Coastguard Worker             GMM_DPF(GFXDBG_NORMAL,
475*35ffd701SAndroid Build Coastguard Worker                     "Cache Policy Init: Degrading PAT settings to UC (uncached) from %s for Element %d\n",
476*35ffd701SAndroid Build Coastguard Worker                     MemTypes[GetWantedMemoryType(CachePolicyUsage)], Usage);
477*35ffd701SAndroid Build Coastguard Worker 
478*35ffd701SAndroid Build Coastguard Worker             PATIdx = BestMatchingPATIdx(CachePolicyElement);
479*35ffd701SAndroid Build Coastguard Worker             if(PATIdx == GMM_PAT_ERROR)
480*35ffd701SAndroid Build Coastguard Worker             {
481*35ffd701SAndroid Build Coastguard Worker                 Success = false;
482*35ffd701SAndroid Build Coastguard Worker             }
483*35ffd701SAndroid Build Coastguard Worker         }
484*35ffd701SAndroid Build Coastguard Worker     }
485*35ffd701SAndroid Build Coastguard Worker     if(PATIdx != GMM_PAT_ERROR)
486*35ffd701SAndroid Build Coastguard Worker     {
487*35ffd701SAndroid Build Coastguard Worker         PTE.Gen8.PAT = (PATIdx & __BIT(2)) ? 1 : 0;
488*35ffd701SAndroid Build Coastguard Worker         PTE.Gen8.PCD = (PATIdx & __BIT(1)) ? 1 : 0;
489*35ffd701SAndroid Build Coastguard Worker         PTE.Gen8.PWT = (PATIdx & __BIT(0)) ? 1 : 0;
490*35ffd701SAndroid Build Coastguard Worker     }
491*35ffd701SAndroid Build Coastguard Worker     else
492*35ffd701SAndroid Build Coastguard Worker     {
493*35ffd701SAndroid Build Coastguard Worker         PTE.DwordValue = 0x0;
494*35ffd701SAndroid Build Coastguard Worker     }
495*35ffd701SAndroid Build Coastguard Worker #else
496*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(CachePolicyUsage);
497*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(Usage);
498*35ffd701SAndroid Build Coastguard Worker #endif
499*35ffd701SAndroid Build Coastguard Worker     *pPTEDwordValue = PTE.DwordValue;
500*35ffd701SAndroid Build Coastguard Worker     return Success;
501*35ffd701SAndroid Build Coastguard Worker }
502