xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/CachePolicy/GmmGen12dGPUCachePolicy.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2020 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 
24*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
25*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmCachePolicy.h"
26*35ffd701SAndroid Build Coastguard Worker #include "External/Common/CachePolicy/GmmCachePolicyGen10.h"
27*35ffd701SAndroid Build Coastguard Worker #include "External/Common/CachePolicy/GmmCachePolicyGen11.h"
28*35ffd701SAndroid Build Coastguard Worker #include "External/Common/CachePolicy/GmmCachePolicyGen12.h"
29*35ffd701SAndroid Build Coastguard Worker #include "External/Common/CachePolicy/GmmCachePolicyGen12dGPU.h"
30*35ffd701SAndroid Build Coastguard Worker 
31*35ffd701SAndroid Build Coastguard Worker //=============================================================================
32*35ffd701SAndroid Build Coastguard Worker //
33*35ffd701SAndroid Build Coastguard Worker // Function: IsSpecialMOCSUsage
34*35ffd701SAndroid Build Coastguard Worker //
35*35ffd701SAndroid Build Coastguard Worker // Desc: This function returns special(hw-reserved) MocsIdx based on usage
36*35ffd701SAndroid Build Coastguard Worker //
37*35ffd701SAndroid Build Coastguard Worker // Parameters: usage  -> Resource usage type
38*35ffd701SAndroid Build Coastguard Worker //             UpdateMOCS  -> True if MOCS Table must be updated, ow false
39*35ffd701SAndroid Build Coastguard Worker //
40*35ffd701SAndroid Build Coastguard Worker // Return: int32_t
41*35ffd701SAndroid Build Coastguard Worker //
42*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
IsSpecialMOCSUsage(GMM_RESOURCE_USAGE_TYPE Usage,bool & UpdateMOCS)43*35ffd701SAndroid Build Coastguard Worker int32_t GmmLib::GmmGen12dGPUCachePolicy::IsSpecialMOCSUsage(GMM_RESOURCE_USAGE_TYPE Usage, bool &UpdateMOCS)
44*35ffd701SAndroid Build Coastguard Worker {
45*35ffd701SAndroid Build Coastguard Worker     int32_t MocsIdx = -1;
46*35ffd701SAndroid Build Coastguard Worker     UpdateMOCS      = true;
47*35ffd701SAndroid Build Coastguard Worker 
48*35ffd701SAndroid Build Coastguard Worker     switch(Usage)
49*35ffd701SAndroid Build Coastguard Worker     {
50*35ffd701SAndroid Build Coastguard Worker         case GMM_RESOURCE_USAGE_CCS:
51*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(pCachePolicy[Usage].L3 == 0 &&      //Architecturally, CCS isn't L3-cacheable.
52*35ffd701SAndroid Build Coastguard Worker                          pCachePolicy[Usage].UcLookup == 0);  // On DG1/XE_HP_SDV/DG2, CCS Resource is never cached in L3, so LookUp is N/A
53*35ffd701SAndroid Build Coastguard Worker             MocsIdx = 60;
54*35ffd701SAndroid Build Coastguard Worker             break;
55*35ffd701SAndroid Build Coastguard Worker         case GMM_RESOURCE_USAGE_MOCS_62:
56*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT(pCachePolicy[Usage].L3 == 0 &&
57*35ffd701SAndroid Build Coastguard Worker                          pCachePolicy[Usage].UcLookup == 0); //Architecturally, TR/Aux-TT node isn't L3-cacheable.
58*35ffd701SAndroid Build Coastguard Worker             MocsIdx = 62;
59*35ffd701SAndroid Build Coastguard Worker             break;
60*35ffd701SAndroid Build Coastguard Worker         case GMM_RESOURCE_USAGE_L3_EVICTION:
61*35ffd701SAndroid Build Coastguard Worker             MocsIdx = 63;
62*35ffd701SAndroid Build Coastguard Worker             break;
63*35ffd701SAndroid Build Coastguard Worker         case GMM_RESOURCE_USAGE_L3_EVICTION_SPECIAL:
64*35ffd701SAndroid Build Coastguard Worker         case GMM_RESOURCE_USAGE_CCS_MEDIA_WRITABLE:
65*35ffd701SAndroid Build Coastguard Worker             MocsIdx = 61;
66*35ffd701SAndroid Build Coastguard Worker             break;
67*35ffd701SAndroid Build Coastguard Worker         default:
68*35ffd701SAndroid Build Coastguard Worker             UpdateMOCS = false;
69*35ffd701SAndroid Build Coastguard Worker             break;
70*35ffd701SAndroid Build Coastguard Worker     }
71*35ffd701SAndroid Build Coastguard Worker 
72*35ffd701SAndroid Build Coastguard Worker     return MocsIdx;
73*35ffd701SAndroid Build Coastguard Worker }
74*35ffd701SAndroid Build Coastguard Worker 
75*35ffd701SAndroid Build Coastguard Worker //=============================================================================
76*35ffd701SAndroid Build Coastguard Worker //
77*35ffd701SAndroid Build Coastguard Worker // Function: __GmmGen12dGPUInitCachePolicy
78*35ffd701SAndroid Build Coastguard Worker //
79*35ffd701SAndroid Build Coastguard Worker // Desc: This function initializes the cache policy
80*35ffd701SAndroid Build Coastguard Worker //
81*35ffd701SAndroid Build Coastguard Worker // Parameters: pCachePolicy  -> Ptr to array to be populated with the
82*35ffd701SAndroid Build Coastguard Worker //             mapping of usages -> cache settings.
83*35ffd701SAndroid Build Coastguard Worker //
84*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
85*35ffd701SAndroid Build Coastguard Worker //
86*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
InitCachePolicy()87*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen12dGPUCachePolicy::InitCachePolicy()
88*35ffd701SAndroid Build Coastguard Worker {
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pCachePolicy, GMM_ERROR);
91*35ffd701SAndroid Build Coastguard Worker 
92*35ffd701SAndroid Build Coastguard Worker #define DEFINE_CACHE_ELEMENT(usage, l3, l3_scc, hdcl1, go, uclookup, l1cc) DEFINE_CP_ELEMENT(usage, 0, 0, l3, 0, 0, 0, 0, l3_scc, 0, 0, 0, hdcl1, 0, 0, go, uclookup, l1cc, 0, 0, 0, 0, 0, 0)
93*35ffd701SAndroid Build Coastguard Worker 
94*35ffd701SAndroid Build Coastguard Worker #include "GmmGen12dGPUCachePolicy.h"
95*35ffd701SAndroid Build Coastguard Worker 
96*35ffd701SAndroid Build Coastguard Worker #define L3_UNCACHEABLE (0x1)
97*35ffd701SAndroid Build Coastguard Worker #define L3_WB_CACHEABLE (0x3)
98*35ffd701SAndroid Build Coastguard Worker #define L3_PAT_UNCACHEABLE (0x0)
99*35ffd701SAndroid Build Coastguard Worker 
100*35ffd701SAndroid Build Coastguard Worker #define DISABLE_SKIP_CACHING_CONTROL (0x0)
101*35ffd701SAndroid Build Coastguard Worker #define ENABLE_SKIP_CACHING_CONTROL (0x1)
102*35ffd701SAndroid Build Coastguard Worker 
103*35ffd701SAndroid Build Coastguard Worker #define DISABLE_SELF_SNOOP_OVERRIDE (0x0)
104*35ffd701SAndroid Build Coastguard Worker #define CLASS_SERVICE_ZERO (0x0)
105*35ffd701SAndroid Build Coastguard Worker #define GMM_GEN12_MAX_NUMBER_MOCS_INDEXES (60) // On TGL last four (#60-#63) are reserved by h/w, few? are sw configurable though (#60)
106*35ffd701SAndroid Build Coastguard Worker     {
107*35ffd701SAndroid Build Coastguard Worker         SetUpMOCSTable();
108*35ffd701SAndroid Build Coastguard Worker     }
109*35ffd701SAndroid Build Coastguard Worker 
110*35ffd701SAndroid Build Coastguard Worker     if(GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_PVC)
111*35ffd701SAndroid Build Coastguard Worker     {
112*35ffd701SAndroid Build Coastguard Worker         SetupPAT();
113*35ffd701SAndroid Build Coastguard Worker     }
114*35ffd701SAndroid Build Coastguard Worker 
115*35ffd701SAndroid Build Coastguard Worker     {
116*35ffd701SAndroid Build Coastguard Worker         // Define index of cache element
117*35ffd701SAndroid Build Coastguard Worker         uint32_t Usage = 0;
118*35ffd701SAndroid Build Coastguard Worker 
119*35ffd701SAndroid Build Coastguard Worker #if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL))
120*35ffd701SAndroid Build Coastguard Worker         void *pKmdGmmContext = NULL;
121*35ffd701SAndroid Build Coastguard Worker 
122*35ffd701SAndroid Build Coastguard Worker 	OverrideCachePolicy(pKmdGmmContext);
123*35ffd701SAndroid Build Coastguard Worker #endif
124*35ffd701SAndroid Build Coastguard Worker 
125*35ffd701SAndroid Build Coastguard Worker         // Process the cache policy and fill in the look up table
126*35ffd701SAndroid Build Coastguard Worker         for(; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
127*35ffd701SAndroid Build Coastguard Worker         {
128*35ffd701SAndroid Build Coastguard Worker             bool                         CachePolicyError = false;
129*35ffd701SAndroid Build Coastguard Worker             bool                         SpecialMOCS      = false;
130*35ffd701SAndroid Build Coastguard Worker             int32_t                      CPTblIdx = -1, PATIdx = -1;
131*35ffd701SAndroid Build Coastguard Worker             uint32_t                     j = 0, i = 0;
132*35ffd701SAndroid Build Coastguard Worker             uint64_t                     PTEValue        = 0;
133*35ffd701SAndroid Build Coastguard Worker             GMM_CACHE_POLICY_TBL_ELEMENT UsageEle        = {0};
134*35ffd701SAndroid Build Coastguard Worker             uint32_t                     StartMocsIdx    = 0;
135*35ffd701SAndroid Build Coastguard Worker             GMM_PRIVATE_PAT              UsagePATElement = {0};
136*35ffd701SAndroid Build Coastguard Worker 
137*35ffd701SAndroid Build Coastguard Worker 
138*35ffd701SAndroid Build Coastguard Worker             switch(GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform))
139*35ffd701SAndroid Build Coastguard Worker             {
140*35ffd701SAndroid Build Coastguard Worker 	        case IGFX_DG1:
141*35ffd701SAndroid Build Coastguard Worker                 case IGFX_XE_HP_SDV:
142*35ffd701SAndroid Build Coastguard Worker 	        case IGFX_PVC:
143*35ffd701SAndroid Build Coastguard Worker                     StartMocsIdx = 1; // Index 0 is reserved for Error
144*35ffd701SAndroid Build Coastguard Worker                     break;
145*35ffd701SAndroid Build Coastguard Worker                 case IGFX_DG2:
146*35ffd701SAndroid Build Coastguard Worker 		    // DG2 provides 2 wires for MOCS Registers, gives 4(2^2) indexes to program.
147*35ffd701SAndroid Build Coastguard Worker                     StartMocsIdx = 0;
148*35ffd701SAndroid Build Coastguard Worker                     break;
149*35ffd701SAndroid Build Coastguard Worker                 default:
150*35ffd701SAndroid Build Coastguard Worker                     StartMocsIdx = 1;
151*35ffd701SAndroid Build Coastguard Worker                     break;
152*35ffd701SAndroid Build Coastguard Worker             }
153*35ffd701SAndroid Build Coastguard Worker 
154*35ffd701SAndroid Build Coastguard Worker             // No Special MOCS handling for next platform
155*35ffd701SAndroid Build Coastguard Worker             if(GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) < IGFX_DG2)
156*35ffd701SAndroid Build Coastguard Worker             {
157*35ffd701SAndroid Build Coastguard Worker                 CPTblIdx = IsSpecialMOCSUsage((GMM_RESOURCE_USAGE_TYPE)Usage, SpecialMOCS);
158*35ffd701SAndroid Build Coastguard Worker             }
159*35ffd701SAndroid Build Coastguard Worker 
160*35ffd701SAndroid Build Coastguard Worker             // Applicable upto Xe_HP only
161*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].HDCL1 &&
162*35ffd701SAndroid Build Coastguard Worker                (GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) <= IGFX_XE_HP_SDV))
163*35ffd701SAndroid Build Coastguard Worker             {
164*35ffd701SAndroid Build Coastguard Worker                 UsageEle.HDCL1 = 1;
165*35ffd701SAndroid Build Coastguard Worker             }
166*35ffd701SAndroid Build Coastguard Worker 
167*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.Reserved = 0; // Reserved bits zeroe'd, this is so we
168*35ffd701SAndroid Build Coastguard Worker                                       // we can compare the unioned L3.UshortValue.
169*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.ESC          = DISABLE_SKIP_CACHING_CONTROL;
170*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.SCC          = 0;
171*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.Cacheability = pCachePolicy[Usage].L3 ? L3_WB_CACHEABLE : L3_UNCACHEABLE;
172*35ffd701SAndroid Build Coastguard Worker 
173*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].L3_SCC)
174*35ffd701SAndroid Build Coastguard Worker             {
175*35ffd701SAndroid Build Coastguard Worker                 UsageEle.L3.ESC = ENABLE_SKIP_CACHING_CONTROL;
176*35ffd701SAndroid Build Coastguard Worker                 UsageEle.L3.SCC = (uint16_t)pCachePolicy[Usage].L3_SCC;
177*35ffd701SAndroid Build Coastguard Worker             }
178*35ffd701SAndroid Build Coastguard Worker 
179*35ffd701SAndroid Build Coastguard Worker 	    if(GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_PVC)
180*35ffd701SAndroid Build Coastguard Worker             {
181*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].GlbGo    = 0;
182*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].UcLookup = 0;
183*35ffd701SAndroid Build Coastguard Worker             }
184*35ffd701SAndroid Build Coastguard Worker             // Go/Lookup
185*35ffd701SAndroid Build Coastguard Worker             // N/A for SpecialMOCS
186*35ffd701SAndroid Build Coastguard Worker             // N/A for DG1, RKL, PVC
187*35ffd701SAndroid Build Coastguard Worker             // Applicable for IGFX_XE_HP_SDV and DG2 only
188*35ffd701SAndroid Build Coastguard Worker             if(!SpecialMOCS &&
189*35ffd701SAndroid Build Coastguard Worker                (FROMPRODUCT(XE_HP_SDV)) &&
190*35ffd701SAndroid Build Coastguard Worker                (GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) != IGFX_PVC))
191*35ffd701SAndroid Build Coastguard Worker             {
192*35ffd701SAndroid Build Coastguard Worker                 if(pCachePolicy[Usage].L3 == 0)
193*35ffd701SAndroid Build Coastguard Worker                 {
194*35ffd701SAndroid Build Coastguard Worker                     UsageEle.L3.GlobalGo = pCachePolicy[Usage].GlbGo;
195*35ffd701SAndroid Build Coastguard Worker                 }
196*35ffd701SAndroid Build Coastguard Worker                 UsageEle.L3.UCLookup = pCachePolicy[Usage].UcLookup;
197*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT((pCachePolicy[Usage].UcLookup) || (pCachePolicy[Usage].L3 == 0 && pCachePolicy[Usage].UcLookup == 0));
198*35ffd701SAndroid Build Coastguard Worker             }
199*35ffd701SAndroid Build Coastguard Worker 
200*35ffd701SAndroid Build Coastguard Worker 
201*35ffd701SAndroid Build Coastguard Worker             //Special-case MOCS handling for MOCS Table Index 60-63
202*35ffd701SAndroid Build Coastguard Worker             if(CPTblIdx >= GMM_GEN12_MAX_NUMBER_MOCS_INDEXES)
203*35ffd701SAndroid Build Coastguard Worker             {
204*35ffd701SAndroid Build Coastguard Worker                 GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmLibContext->GetCachePolicyTlbElement()[CPTblIdx];
205*35ffd701SAndroid Build Coastguard Worker 
206*35ffd701SAndroid Build Coastguard Worker                 if(SpecialMOCS &&
207*35ffd701SAndroid Build Coastguard Worker                    !(TblEle->L3.UshortValue == UsageEle.L3.UshortValue))
208*35ffd701SAndroid Build Coastguard Worker                 {
209*35ffd701SAndroid Build Coastguard Worker                     //Assert if being overwritten!
210*35ffd701SAndroid Build Coastguard Worker                     __GMM_ASSERT(TblEle->L3.UshortValue == 0);
211*35ffd701SAndroid Build Coastguard Worker 
212*35ffd701SAndroid Build Coastguard Worker                 }
213*35ffd701SAndroid Build Coastguard Worker             }
214*35ffd701SAndroid Build Coastguard Worker             //For HDC L1 caching, MOCS Table index 48-59 should be used
215*35ffd701SAndroid Build Coastguard Worker             else if(UsageEle.HDCL1)
216*35ffd701SAndroid Build Coastguard Worker             {
217*35ffd701SAndroid Build Coastguard Worker                 for(j = GMM_GEN10_HDCL1_MOCS_INDEX_START; j <= CurrentMaxL1HdcMocsIndex; j++)
218*35ffd701SAndroid Build Coastguard Worker                 {
219*35ffd701SAndroid Build Coastguard Worker                     GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmLibContext->GetCachePolicyTlbElement()[j];
220*35ffd701SAndroid Build Coastguard Worker 		    if(TblEle->L3.UshortValue == UsageEle.L3.UshortValue &&
221*35ffd701SAndroid Build Coastguard Worker                        TblEle->HDCL1 == UsageEle.HDCL1)
222*35ffd701SAndroid Build Coastguard Worker                     {
223*35ffd701SAndroid Build Coastguard Worker                         CPTblIdx = j;
224*35ffd701SAndroid Build Coastguard Worker                         break;
225*35ffd701SAndroid Build Coastguard Worker                     }
226*35ffd701SAndroid Build Coastguard Worker                 }
227*35ffd701SAndroid Build Coastguard Worker             }
228*35ffd701SAndroid Build Coastguard Worker             else
229*35ffd701SAndroid Build Coastguard Worker             {
230*35ffd701SAndroid Build Coastguard Worker                 for(j = StartMocsIdx; j <= CurrentMaxMocsIndex; j++)
231*35ffd701SAndroid Build Coastguard Worker                 {
232*35ffd701SAndroid Build Coastguard Worker                     if(pCachePolicy[Usage].L3 == 0 &&
233*35ffd701SAndroid Build Coastguard Worker                        pCachePolicy[Usage].GlbGo == 0 &&
234*35ffd701SAndroid Build Coastguard Worker                        pCachePolicy[Usage].UcLookup == 0)
235*35ffd701SAndroid Build Coastguard Worker                     {
236*35ffd701SAndroid Build Coastguard Worker                         CPTblIdx = StartMocsIdx;
237*35ffd701SAndroid Build Coastguard Worker                         break;
238*35ffd701SAndroid Build Coastguard Worker                     }
239*35ffd701SAndroid Build Coastguard Worker                     else
240*35ffd701SAndroid Build Coastguard Worker                     {
241*35ffd701SAndroid Build Coastguard Worker                         GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmLibContext->GetCachePolicyTlbElement()[j];
242*35ffd701SAndroid Build Coastguard Worker 
243*35ffd701SAndroid Build Coastguard Worker                         if(TblEle->L3.UshortValue == UsageEle.L3.UshortValue)
244*35ffd701SAndroid Build Coastguard Worker                         {
245*35ffd701SAndroid Build Coastguard Worker                             CPTblIdx = j;
246*35ffd701SAndroid Build Coastguard Worker                             break;
247*35ffd701SAndroid Build Coastguard Worker                         }
248*35ffd701SAndroid Build Coastguard Worker                     }
249*35ffd701SAndroid Build Coastguard Worker                 }
250*35ffd701SAndroid Build Coastguard Worker             }
251*35ffd701SAndroid Build Coastguard Worker 
252*35ffd701SAndroid Build Coastguard Worker             // Didn't find the caching settings in one of the already programmed lookup table entries.
253*35ffd701SAndroid Build Coastguard Worker             // Need to add a new lookup table entry.
254*35ffd701SAndroid Build Coastguard Worker             if(CPTblIdx == -1)
255*35ffd701SAndroid Build Coastguard Worker             {
256*35ffd701SAndroid Build Coastguard Worker 
257*35ffd701SAndroid Build Coastguard Worker                 {
258*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(false, "CRITICAL ERROR: Cache Policy Usage value specified by Client is not defined in Fixed MOCS Table!");
259*35ffd701SAndroid Build Coastguard Worker 
260*35ffd701SAndroid Build Coastguard Worker                     CachePolicyError = true;
261*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(
262*35ffd701SAndroid Build Coastguard Worker                     "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
263*35ffd701SAndroid Build Coastguard Worker                     "(we only support GMM_GEN_MAX_NUMBER_MOCS_INDEXES = %d)",
264*35ffd701SAndroid Build Coastguard Worker                     CurrentMaxMocsIndex);
265*35ffd701SAndroid Build Coastguard Worker 
266*35ffd701SAndroid Build Coastguard Worker                     // Set cache policy index to uncached.
267*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx = StartMocsIdx;
268*35ffd701SAndroid Build Coastguard Worker                 }
269*35ffd701SAndroid Build Coastguard Worker             }
270*35ffd701SAndroid Build Coastguard Worker 
271*35ffd701SAndroid Build Coastguard Worker             // PTE entries do not control caching on SKL+ (for legacy context)
272*35ffd701SAndroid Build Coastguard Worker             if(!GetUsagePTEValue(pCachePolicy[Usage], Usage, &PTEValue))
273*35ffd701SAndroid Build Coastguard Worker             {
274*35ffd701SAndroid Build Coastguard Worker                 CachePolicyError = true;
275*35ffd701SAndroid Build Coastguard Worker             }
276*35ffd701SAndroid Build Coastguard Worker 
277*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].PTE.DwordValue     = PTEValue & 0xFFFFFFFF;
278*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].PTE.HighDwordValue = 0;
279*35ffd701SAndroid Build Coastguard Worker 
280*35ffd701SAndroid Build Coastguard Worker 	    pCachePolicy[Usage].MemoryObjectOverride.Gen12.Index = CPTblIdx;
281*35ffd701SAndroid Build Coastguard Worker 
282*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].Override = ALWAYS_OVERRIDE;
283*35ffd701SAndroid Build Coastguard Worker 
284*35ffd701SAndroid Build Coastguard Worker             if(CachePolicyError)
285*35ffd701SAndroid Build Coastguard Worker             {
286*35ffd701SAndroid Build Coastguard Worker                 GMM_ASSERTDPF("Cache Policy Init Error: Invalid Cache Programming - Element %d", Usage);
287*35ffd701SAndroid Build Coastguard Worker             }
288*35ffd701SAndroid Build Coastguard Worker 
289*35ffd701SAndroid Build Coastguard Worker             if(GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_PVC)
290*35ffd701SAndroid Build Coastguard Worker             {
291*35ffd701SAndroid Build Coastguard Worker                 // PAT data
292*35ffd701SAndroid Build Coastguard Worker                 {
293*35ffd701SAndroid Build Coastguard Worker                     UsagePATElement.Xe_HPC.Reserved = 0;
294*35ffd701SAndroid Build Coastguard Worker 
295*35ffd701SAndroid Build Coastguard Worker                     UsagePATElement.Xe_HPC.MemoryType = pCachePolicy[Usage].L3 ? L3_WB_CACHEABLE : L3_PAT_UNCACHEABLE;
296*35ffd701SAndroid Build Coastguard Worker 
297*35ffd701SAndroid Build Coastguard Worker                     // try to find a match in static PAT table
298*35ffd701SAndroid Build Coastguard Worker                     for(i = 0; i <= CurrentMaxPATIndex; i++)
299*35ffd701SAndroid Build Coastguard Worker                     {
300*35ffd701SAndroid Build Coastguard Worker                         GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(i);
301*35ffd701SAndroid Build Coastguard Worker                         if(UsagePATElement.Xe_HPC.MemoryType == PAT.Xe_HPC.MemoryType)
302*35ffd701SAndroid Build Coastguard Worker                         {
303*35ffd701SAndroid Build Coastguard Worker                             PATIdx = i;
304*35ffd701SAndroid Build Coastguard Worker                             break;
305*35ffd701SAndroid Build Coastguard Worker                         }
306*35ffd701SAndroid Build Coastguard Worker                     }
307*35ffd701SAndroid Build Coastguard Worker 
308*35ffd701SAndroid Build Coastguard Worker                     if(PATIdx == -1)
309*35ffd701SAndroid Build Coastguard Worker                     {
310*35ffd701SAndroid Build Coastguard Worker                          GMM_ASSERTDPF(
311*35ffd701SAndroid Build Coastguard Worker                          "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
312*35ffd701SAndroid Build Coastguard Worker                          "(we only support NumPATRegisters = %d)",
313*35ffd701SAndroid Build Coastguard Worker                          CurrentMaxPATIndex);
314*35ffd701SAndroid Build Coastguard Worker                          CachePolicyError = true;
315*35ffd701SAndroid Build Coastguard Worker                          // add rterror here <ToDo>
316*35ffd701SAndroid Build Coastguard Worker                           PATIdx = PAT0; // default to uncached PAT index 0: GMM_CP_NON_COHERENT_UC
317*35ffd701SAndroid Build Coastguard Worker                                            // Log Error using regkey to indicate the above error
318*35ffd701SAndroid Build Coastguard Worker 
319*35ffd701SAndroid Build Coastguard Worker                     }
320*35ffd701SAndroid Build Coastguard Worker                 }
321*35ffd701SAndroid Build Coastguard Worker 
322*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].PATIndex           = PATIdx;
323*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].PTE.DwordValue     = GMM_GET_PTE_BITS_FROM_PAT_IDX(PATIdx) & 0xFFFFFFFF;
324*35ffd701SAndroid Build Coastguard Worker                 pCachePolicy[Usage].PTE.HighDwordValue = GMM_GET_PTE_BITS_FROM_PAT_IDX(PATIdx) >> 32;
325*35ffd701SAndroid Build Coastguard Worker             }
326*35ffd701SAndroid Build Coastguard Worker         }
327*35ffd701SAndroid Build Coastguard Worker     }
328*35ffd701SAndroid Build Coastguard Worker 
329*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
330*35ffd701SAndroid Build Coastguard Worker }
331*35ffd701SAndroid Build Coastguard Worker 
332*35ffd701SAndroid Build Coastguard Worker #pragma optimize("", on)
333*35ffd701SAndroid Build Coastguard Worker //=============================================================================
334*35ffd701SAndroid Build Coastguard Worker //
335*35ffd701SAndroid Build Coastguard Worker // Function: SetUpMOCSTable
336*35ffd701SAndroid Build Coastguard Worker //
337*35ffd701SAndroid Build Coastguard Worker // Desc: For Gen12dGPU, Define new Fixed MOCS table
338*35ffd701SAndroid Build Coastguard Worker //
339*35ffd701SAndroid Build Coastguard Worker // Parameters:
340*35ffd701SAndroid Build Coastguard Worker //
341*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
342*35ffd701SAndroid Build Coastguard Worker //
343*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetUpMOCSTable()344*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmGen12dGPUCachePolicy::SetUpMOCSTable()
345*35ffd701SAndroid Build Coastguard Worker {
346*35ffd701SAndroid Build Coastguard Worker     GMM_CACHE_POLICY_TBL_ELEMENT *pCachePolicyTlbElement = &(pGmmLibContext->GetCachePolicyTlbElement()[0]);
347*35ffd701SAndroid Build Coastguard Worker     CurrentMaxL1HdcMocsIndex                             = 0;
348*35ffd701SAndroid Build Coastguard Worker     CurrentMaxSpecialMocsIndex                           = 0;
349*35ffd701SAndroid Build Coastguard Worker 
350*35ffd701SAndroid Build Coastguard Worker #define GMM_DEFINE_MOCS(Index, L3_ESC, L3_SCC, L3_CC, L3_Go, L3_LookUp, _HDCL1)        \
351*35ffd701SAndroid Build Coastguard Worker     {                                                                                  \
352*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.ESC            = L3_ESC;                      \
353*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.SCC            = L3_SCC;                      \
354*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.Cacheability   = L3_CC;                       \
355*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.GlobalGo       = L3_Go;                       \
356*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.UCLookup       = L3_LookUp;                   \
357*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.Cacheability = 1;                           \
358*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.TargetCache  = 0;                           \
359*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.LRUM         = 0;                           \
360*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.AOM          = 0;                           \
361*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.ESC          = 0;                           \
362*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.SCC          = 0;                           \
363*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.PFM          = 0;                           \
364*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.SCF          = 0;                           \
365*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.CoS          = CLASS_SERVICE_ZERO;          \
366*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.SelfSnoop    = DISABLE_SELF_SNOOP_OVERRIDE; \
367*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].HDCL1             = _HDCL1;                      \
368*35ffd701SAndroid Build Coastguard Worker     }
369*35ffd701SAndroid Build Coastguard Worker 
370*35ffd701SAndroid Build Coastguard Worker     // clang-format off
371*35ffd701SAndroid Build Coastguard Worker 
372*35ffd701SAndroid Build Coastguard Worker     if (GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_DG1)
373*35ffd701SAndroid Build Coastguard Worker     {
374*35ffd701SAndroid Build Coastguard Worker         //Default MOCS Table
375*35ffd701SAndroid Build Coastguard Worker         for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
376*35ffd701SAndroid Build Coastguard Worker         {     //             Index     ESC    SCC    L3CC    Go      LookUp    HDCL1
377*35ffd701SAndroid Build Coastguard Worker              GMM_DEFINE_MOCS( index  , 0     , 0     , 3     , 0     , 0       , 0 )
378*35ffd701SAndroid Build Coastguard Worker         }
379*35ffd701SAndroid Build Coastguard Worker         // Fixed MOCS Table
380*35ffd701SAndroid Build Coastguard Worker         //              Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
381*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 0      , 0     , 0     , 1     , 0     , 0       , 0 )
382*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 1      , 0     , 0     , 1     , 0     , 0       , 0 )
383*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 2      , 0     , 0     , 0     , 0     , 0       , 0 )
384*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 3      , 0     , 0     , 0     , 0     , 0       , 0 )
385*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 4      , 0     , 0     , 0     , 0     , 0       , 0 )
386*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 5      , 0     , 0     , 3     , 0     , 0       , 0 )
387*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 6      , 1     , 1     , 3     , 0     , 0       , 0 )
388*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 7      , 1     , 3     , 3     , 0     , 0       , 0 )
389*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 8      , 1     , 7     , 3     , 0     , 0       , 0 )
390*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 48     , 0     , 0     , 3     , 0     , 0       , 1 )
391*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 49     , 0     , 0     , 1     , 0     , 0       , 1 )
392*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 60     , 0     , 0     , 1     , 0     , 0       , 0 )
393*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 61     , 0     , 0     , 1     , 0     , 0       , 0 )
394*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 62     , 0     , 0     , 1     , 0     , 0       , 0 )
395*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 63     , 0     , 0     , 1     , 0     , 0       , 0 )
396*35ffd701SAndroid Build Coastguard Worker 
397*35ffd701SAndroid Build Coastguard Worker         CurrentMaxMocsIndex         = 8;
398*35ffd701SAndroid Build Coastguard Worker         CurrentMaxL1HdcMocsIndex    = 49;
399*35ffd701SAndroid Build Coastguard Worker         CurrentMaxSpecialMocsIndex  = 63;
400*35ffd701SAndroid Build Coastguard Worker 
401*35ffd701SAndroid Build Coastguard Worker     }
402*35ffd701SAndroid Build Coastguard Worker     else if (GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_XE_HP_SDV)
403*35ffd701SAndroid Build Coastguard Worker      {
404*35ffd701SAndroid Build Coastguard Worker         //Default MOCS Table
405*35ffd701SAndroid Build Coastguard Worker         for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
406*35ffd701SAndroid Build Coastguard Worker         {     //             Index     ESC    SCC    L3CC    Go      LookUp    HDCL1
407*35ffd701SAndroid Build Coastguard Worker              GMM_DEFINE_MOCS( index  , 0     , 0     , 3     , 0     , 1       , 0 )
408*35ffd701SAndroid Build Coastguard Worker         }
409*35ffd701SAndroid Build Coastguard Worker         // Fixed MOCS Table
410*35ffd701SAndroid Build Coastguard Worker         //              Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
411*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 1      , 0     , 0     , 1     , 0     , 1       , 0 )
412*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 2      , 0     , 0     , 1     , 1     , 1       , 0 )
413*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 3      , 0     , 0     , 1     , 1     , 0       , 0 )
414*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 4      , 0     , 0     , 1     , 0     , 0       , 0 )
415*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 5      , 0     , 0     , 3     , 0     , 1       , 0 )
416*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 48     , 0     , 0     , 3     , 0     , 1       , 1 )
417*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 49     , 0     , 0     , 1     , 0     , 1       , 1 )
418*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 60     , 0     , 0     , 1     , 0     , 0       , 0 )
419*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 61     , 0     , 0     , 1     , 0     , 0       , 0 )
420*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 62     , 0     , 0     , 1     , 0     , 0       , 0 )
421*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 63     , 0     , 0     , 1     , 0     , 0       , 0 )
422*35ffd701SAndroid Build Coastguard Worker 
423*35ffd701SAndroid Build Coastguard Worker         CurrentMaxMocsIndex         = 5;
424*35ffd701SAndroid Build Coastguard Worker         CurrentMaxL1HdcMocsIndex    = 49;
425*35ffd701SAndroid Build Coastguard Worker         CurrentMaxSpecialMocsIndex  = 63;
426*35ffd701SAndroid Build Coastguard Worker 
427*35ffd701SAndroid Build Coastguard Worker     }
428*35ffd701SAndroid Build Coastguard Worker     else if ((GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_DG2))
429*35ffd701SAndroid Build Coastguard Worker      {
430*35ffd701SAndroid Build Coastguard Worker         //Default MOCS Table
431*35ffd701SAndroid Build Coastguard Worker         for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
432*35ffd701SAndroid Build Coastguard Worker         {     //             Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
433*35ffd701SAndroid Build Coastguard Worker              GMM_DEFINE_MOCS( index  , 0     , 0     , 3     , 0     , 1       , 0 )
434*35ffd701SAndroid Build Coastguard Worker         }
435*35ffd701SAndroid Build Coastguard Worker          // Fixed MOCS Table
436*35ffd701SAndroid Build Coastguard Worker         //              Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
437*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 0      , 0     , 0     , 1     , 0     , 1       , 0 )
438*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 1      , 0     , 0     , 1     , 1     , 1       , 0 )
439*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 2      , 0     , 0     , 1     , 1     , 0       , 0 )
440*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 3      , 0     , 0     , 3     , 0     , 1       , 0 )
441*35ffd701SAndroid Build Coastguard Worker 
442*35ffd701SAndroid Build Coastguard Worker         CurrentMaxMocsIndex         = 3;
443*35ffd701SAndroid Build Coastguard Worker     }
444*35ffd701SAndroid Build Coastguard Worker     else if (GFX_GET_CURRENT_PRODUCT(pGmmLibContext->GetPlatformInfo().Platform) == IGFX_PVC)
445*35ffd701SAndroid Build Coastguard Worker      {
446*35ffd701SAndroid Build Coastguard Worker          //Default MOCS Table
447*35ffd701SAndroid Build Coastguard Worker         for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
448*35ffd701SAndroid Build Coastguard Worker         {     //             Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
449*35ffd701SAndroid Build Coastguard Worker              GMM_DEFINE_MOCS( index  , 0     , 0     , 3     , 0     , 0       , 0 )
450*35ffd701SAndroid Build Coastguard Worker         }
451*35ffd701SAndroid Build Coastguard Worker          // Fixed MOCS Table
452*35ffd701SAndroid Build Coastguard Worker         //              Index     ESC	  SCC	  L3CC    Go      LookUp    HDCL1
453*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 1      , 0     , 0     , 1     , 0     , 0       , 0 )
454*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( 2      , 0     , 0     , 3     , 0     , 0       , 0 )
455*35ffd701SAndroid Build Coastguard Worker 
456*35ffd701SAndroid Build Coastguard Worker         CurrentMaxMocsIndex         = 2;
457*35ffd701SAndroid Build Coastguard Worker      }
458*35ffd701SAndroid Build Coastguard Worker // clang-format on
459*35ffd701SAndroid Build Coastguard Worker 
460*35ffd701SAndroid Build Coastguard Worker 
461*35ffd701SAndroid Build Coastguard Worker #undef GMM_DEFINE_MOCS
462*35ffd701SAndroid Build Coastguard Worker }
463*35ffd701SAndroid Build Coastguard Worker 
464*35ffd701SAndroid Build Coastguard Worker //=============================================================================
465*35ffd701SAndroid Build Coastguard Worker //
466*35ffd701SAndroid Build Coastguard Worker // Function: SetupPAT
467*35ffd701SAndroid Build Coastguard Worker //
468*35ffd701SAndroid Build Coastguard Worker // Desc:
469*35ffd701SAndroid Build Coastguard Worker //
470*35ffd701SAndroid Build Coastguard Worker // Parameters:
471*35ffd701SAndroid Build Coastguard Worker //
472*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
473*35ffd701SAndroid Build Coastguard Worker //
474*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetupPAT()475*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen12dGPUCachePolicy::SetupPAT()
476*35ffd701SAndroid Build Coastguard Worker {
477*35ffd701SAndroid Build Coastguard Worker     GMM_PRIVATE_PAT *pPATTlbElement = &(pGmmLibContext->GetPrivatePATTable()[0]);
478*35ffd701SAndroid Build Coastguard Worker 
479*35ffd701SAndroid Build Coastguard Worker #define L3_UC (0x0)
480*35ffd701SAndroid Build Coastguard Worker #define L3_WC (0x1)
481*35ffd701SAndroid Build Coastguard Worker #define L3_WT (0x2)
482*35ffd701SAndroid Build Coastguard Worker #define L3_WB (0x3)
483*35ffd701SAndroid Build Coastguard Worker 
484*35ffd701SAndroid Build Coastguard Worker #define GMM_DEFINE_PAT_ELEMENT(indx, CLOS, L3Caching)       \
485*35ffd701SAndroid Build Coastguard Worker     {                                                       \
486*35ffd701SAndroid Build Coastguard Worker         pPATTlbElement[indx].Xe_HPC.MemoryType = L3Caching; \
487*35ffd701SAndroid Build Coastguard Worker         pPATTlbElement[indx].Xe_HPC.L3CLOS     = CLOS;      \
488*35ffd701SAndroid Build Coastguard Worker         pPATTlbElement[indx].Xe_HPC.Reserved   = 0;         \
489*35ffd701SAndroid Build Coastguard Worker     }
490*35ffd701SAndroid Build Coastguard Worker 
491*35ffd701SAndroid Build Coastguard Worker     // clang-format off
492*35ffd701SAndroid Build Coastguard Worker 
493*35ffd701SAndroid Build Coastguard Worker     // Default PAT Table
494*35ffd701SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < NumPATRegisters; i++)
495*35ffd701SAndroid Build Coastguard Worker     {   //                      Index      CLOS       CachingPolicy
496*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_PAT_ELEMENT( i,          0              , L3_UC );
497*35ffd701SAndroid Build Coastguard Worker     }
498*35ffd701SAndroid Build Coastguard Worker 
499*35ffd701SAndroid Build Coastguard Worker     // Fixed PAT Table
500*35ffd701SAndroid Build Coastguard Worker     // Group: CLOS0
501*35ffd701SAndroid Build Coastguard Worker     //                      Index CLOS          CachingPolicy
502*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 0    , 0              , L3_UC )    // PATRegValue = 0x0
503*35ffd701SAndroid Build Coastguard Worker      GMM_DEFINE_PAT_ELEMENT( 1    , 0              , L3_WC )    // PATRegValue = 0x1
504*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 2    , 0              , L3_WT )    // PATRegValue = 0x2
505*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 3    , 0              , L3_WB )    // PATRegValue = 0x3
506*35ffd701SAndroid Build Coastguard Worker     //Group: CLOS1
507*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 4    , 1              , L3_WT )    // PATRegValue = 0x6
508*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 5    , 1              , L3_WB )    // PATRegValue = 0x7
509*35ffd701SAndroid Build Coastguard Worker     //Group: CLOS2
510*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 6    , 2              , L3_WT )    // PATRegValue = 0xA
511*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 7    , 2              , L3_WB )    // PATRegValue = 0xB
512*35ffd701SAndroid Build Coastguard Worker 
513*35ffd701SAndroid Build Coastguard Worker     CurrentMaxPATIndex = 7;
514*35ffd701SAndroid Build Coastguard Worker 
515*35ffd701SAndroid Build Coastguard Worker // clang-format on
516*35ffd701SAndroid Build Coastguard Worker #undef GMM_DEFINE_PAT_ELEMENT
517*35ffd701SAndroid Build Coastguard Worker #undef L3_UC
518*35ffd701SAndroid Build Coastguard Worker #undef L3_WC
519*35ffd701SAndroid Build Coastguard Worker #undef L3_WT
520*35ffd701SAndroid Build Coastguard Worker #undef L3_WB
521*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
522*35ffd701SAndroid Build Coastguard Worker }
523*35ffd701SAndroid Build Coastguard Worker 
524*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
525*35ffd701SAndroid Build Coastguard Worker ///      A simple getter function returning the PAT (cache policy) for a given
526*35ffd701SAndroid Build Coastguard Worker ///      use Usage of the named resource pResInfo.
527*35ffd701SAndroid Build Coastguard Worker ///      Typically used to populate PPGTT/GGTT.
528*35ffd701SAndroid Build Coastguard Worker ///
529*35ffd701SAndroid Build Coastguard Worker /// @param[in]     pResInfo: Resource info for resource, can be NULL.
530*35ffd701SAndroid Build Coastguard Worker /// @param[in]     Usage: Current usage for resource.
531*35ffd701SAndroid Build Coastguard Worker ///
532*35ffd701SAndroid Build Coastguard Worker /// @return        PATIndex
533*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetPATIndex(GMM_RESOURCE_INFO * pResInfo,GMM_RESOURCE_USAGE_TYPE Usage,bool * pCompressionEnable,bool IsCpuCacheable)534*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmGen12dGPUCachePolicy::CachePolicyGetPATIndex(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage, bool *pCompressionEnable, bool IsCpuCacheable)
535*35ffd701SAndroid Build Coastguard Worker {
536*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pGmmLibContext->GetCachePolicyElement(Usage).Initialized);
537*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(pCompressionEnable);
538*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(IsCpuCacheable);
539*35ffd701SAndroid Build Coastguard Worker 
540*35ffd701SAndroid Build Coastguard Worker     // Prevent wrong Usage for XAdapter resources. UMD does not call GetMemoryObject on shader resources but,
541*35ffd701SAndroid Build Coastguard Worker     // when they add it someone could call it without knowing the restriction.
542*35ffd701SAndroid Build Coastguard Worker     if(pResInfo &&
543*35ffd701SAndroid Build Coastguard Worker        pResInfo->GetResFlags().Info.XAdapter &&
544*35ffd701SAndroid Build Coastguard Worker        Usage != GMM_RESOURCE_USAGE_XADAPTER_SHARED_RESOURCE)
545*35ffd701SAndroid Build Coastguard Worker     {
546*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(false);
547*35ffd701SAndroid Build Coastguard Worker     }
548*35ffd701SAndroid Build Coastguard Worker 
549*35ffd701SAndroid Build Coastguard Worker     return pGmmLibContext->GetCachePolicyElement(Usage).PATIndex;
550*35ffd701SAndroid Build Coastguard Worker }
551