xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/CachePolicy/GmmXe_LPGCachePolicy.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2022 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 #include "External/Common/CachePolicy/GmmCachePolicyXe_LPG.h"
26*35ffd701SAndroid Build Coastguard Worker //=============================================================================
27*35ffd701SAndroid Build Coastguard Worker //
28*35ffd701SAndroid Build Coastguard Worker // Function: __:GmmXe_LPGInitCachePolicy
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 //
37*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
InitCachePolicy()38*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmXe_LPGCachePolicy::InitCachePolicy()
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, l3, l3_scc, go, uclookup, l1cc, l2cc, l4cc, coherency) DEFINE_CP_ELEMENT(usage, 0, 0, l3, 0, 0, 0, 0, l3_scc, 0, 0, 0, 0, 0, 0, go, uclookup, l1cc, l2cc, l4cc, coherency, l3, 0, 0)
43*35ffd701SAndroid Build Coastguard Worker 
44*35ffd701SAndroid Build Coastguard Worker #include "GmmXe_LPGCachePolicy.h"
45*35ffd701SAndroid Build Coastguard Worker 
46*35ffd701SAndroid Build Coastguard Worker #define L3_UNCACHEABLE (0x1)
47*35ffd701SAndroid Build Coastguard Worker #define L3_WB_CACHEABLE (0x3)
48*35ffd701SAndroid Build Coastguard Worker 
49*35ffd701SAndroid Build Coastguard Worker #define DISABLE_SKIP_CACHING_CONTROL (0x0)
50*35ffd701SAndroid Build Coastguard Worker #define ENABLE_SKIP_CACHING_CONTROL (0x1)
51*35ffd701SAndroid Build Coastguard Worker 
52*35ffd701SAndroid Build Coastguard Worker #define ONE_WAY_COHERENT (0x2)
53*35ffd701SAndroid Build Coastguard Worker 
54*35ffd701SAndroid Build Coastguard Worker 
55*35ffd701SAndroid Build Coastguard Worker     SetUpMOCSTable();
56*35ffd701SAndroid Build Coastguard Worker     SetupPAT();
57*35ffd701SAndroid Build Coastguard Worker 
58*35ffd701SAndroid Build Coastguard Worker     // Define index of cache element
59*35ffd701SAndroid Build Coastguard Worker     uint32_t Usage           = 0;
60*35ffd701SAndroid Build Coastguard Worker     uint32_t ReservedMocsIdx = 10; /* Rsvd MOCS section 10-12 */
61*35ffd701SAndroid Build Coastguard Worker 
62*35ffd701SAndroid Build Coastguard Worker #if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL))
63*35ffd701SAndroid Build Coastguard Worker     void *pKmdGmmContext = NULL;
64*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
65*35ffd701SAndroid Build Coastguard Worker     pKmdGmmContext = pGmmLibContext->GetGmmKmdContext();
66*35ffd701SAndroid Build Coastguard Worker #endif
67*35ffd701SAndroid Build Coastguard Worker     OverrideCachePolicy(pKmdGmmContext);
68*35ffd701SAndroid Build Coastguard Worker #endif
69*35ffd701SAndroid Build Coastguard Worker     // Process the cache policy and fill in the look up table
70*35ffd701SAndroid Build Coastguard Worker     for(; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
71*35ffd701SAndroid Build Coastguard Worker     {
72*35ffd701SAndroid Build Coastguard Worker         bool                         CachePolicyError = false;
73*35ffd701SAndroid Build Coastguard Worker         int32_t                      CPTblIdx = -1, PATIdx = -1, CoherentPATIdx = -1;
74*35ffd701SAndroid Build Coastguard Worker         uint32_t                     i, j, k;
75*35ffd701SAndroid Build Coastguard Worker         GMM_CACHE_POLICY_TBL_ELEMENT UsageEle     = {0};
76*35ffd701SAndroid Build Coastguard Worker         uint32_t                     StartMocsIdx = 0;
77*35ffd701SAndroid Build Coastguard Worker         GMM_L4_CACHING_POLICY        PATCachePolicy;
78*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT              UsagePATElement = {0};
79*35ffd701SAndroid Build Coastguard Worker         GMM_PTE_CACHE_CONTROL_BITS   PTE             = {0};
80*35ffd701SAndroid Build Coastguard Worker 
81*35ffd701SAndroid Build Coastguard Worker         // MOCS data
82*35ffd701SAndroid Build Coastguard Worker         {
83*35ffd701SAndroid Build Coastguard Worker             //L3
84*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.Reserved = 0; // Reserved bits zeroe'd, this is so we
85*35ffd701SAndroid Build Coastguard Worker                                       // we can compare the unioned L3.UshortValue.
86*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.ESC          = DISABLE_SKIP_CACHING_CONTROL;
87*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.SCC          = 0;
88*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.Cacheability = pCachePolicy[Usage].L3 ? L3_WB_CACHEABLE : L3_UNCACHEABLE;
89*35ffd701SAndroid Build Coastguard Worker 
90*35ffd701SAndroid Build Coastguard Worker 
91*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].L3 == 0)
92*35ffd701SAndroid Build Coastguard Worker             {
93*35ffd701SAndroid Build Coastguard Worker                 UsageEle.L3.GlobalGo = pCachePolicy[Usage].GlbGo;
94*35ffd701SAndroid Build Coastguard Worker             }
95*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.UCLookup = pCachePolicy[Usage].UcLookup;
96*35ffd701SAndroid Build Coastguard Worker             __GMM_ASSERT((pCachePolicy[Usage].UcLookup) || (pCachePolicy[Usage].L3 == 0 && pCachePolicy[Usage].UcLookup == 0));
97*35ffd701SAndroid Build Coastguard Worker 
98*35ffd701SAndroid Build Coastguard Worker 
99*35ffd701SAndroid Build Coastguard Worker             // L4 Data
100*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.Xe_LPG.L4CC = (pCachePolicy[Usage].L4CC - 1) % 4; // coverting indicator values to actual regiser values 0->3(GMM_CP_NON_COHERENT_UC), 2->1(GMM_CP_NON_COHERENT_WT) 1->0(GMM_CP_NON_COHERENT_WB)
101*35ffd701SAndroid Build Coastguard Worker 
102*35ffd701SAndroid Build Coastguard Worker             /* Valid MOCS Index starts from 1 */
103*35ffd701SAndroid Build Coastguard Worker             for(j = 1; j <= CurrentMaxMocsIndex; j++)
104*35ffd701SAndroid Build Coastguard Worker             {
105*35ffd701SAndroid Build Coastguard Worker                 GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmLibContext->GetCachePolicyTlbElement()[j];
106*35ffd701SAndroid Build Coastguard Worker                 if((TblEle->L3.UshortValue == UsageEle.L3.UshortValue) &&
107*35ffd701SAndroid Build Coastguard Worker                    (TblEle->LeCC.Xe_LPG.L4CC == UsageEle.LeCC.Xe_LPG.L4CC))
108*35ffd701SAndroid Build Coastguard Worker                 {
109*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx = j;
110*35ffd701SAndroid Build Coastguard Worker                     break;
111*35ffd701SAndroid Build Coastguard Worker                 }
112*35ffd701SAndroid Build Coastguard Worker             }
113*35ffd701SAndroid Build Coastguard Worker             if(CPTblIdx == -1)
114*35ffd701SAndroid Build Coastguard Worker             {
115*35ffd701SAndroid Build Coastguard Worker #if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL))
116*35ffd701SAndroid Build Coastguard Worker                 // If the Cache Policy setting is overriden through regkey
117*35ffd701SAndroid Build Coastguard Worker                 if((pCachePolicy[Usage].IsOverridenByRegkey) && (ReservedMocsIdx < 13)) /* Reserved MOCS 10-12 */
118*35ffd701SAndroid Build Coastguard Worker                 {
119*35ffd701SAndroid Build Coastguard Worker                     /*Use the Reserved Section to add new MOCS settings,*/
120*35ffd701SAndroid Build Coastguard Worker                     GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &(pGmmLibContext->GetCachePolicyTlbElement()[ReservedMocsIdx++]);
121*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx                             = ReservedMocsIdx;
122*35ffd701SAndroid Build Coastguard Worker                     TblEle->L3.UshortValue               = UsageEle.L3.UshortValue;
123*35ffd701SAndroid Build Coastguard Worker                     TblEle->LeCC.Xe_LPG.DwordValue       = UsageEle.LeCC.Xe_LPG.DwordValue;
124*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(false, "CRITICAL: Cache Policy Usage value for L3/L4 specified by Client is not defined in Fixed MOCS Table and added to reserved MOCS section !!");
125*35ffd701SAndroid Build Coastguard Worker                 }
126*35ffd701SAndroid Build Coastguard Worker                 else
127*35ffd701SAndroid Build Coastguard Worker #endif
128*35ffd701SAndroid Build Coastguard Worker                 {
129*35ffd701SAndroid Build Coastguard Worker // Log Error using regkey to indicate the above error
130*35ffd701SAndroid Build Coastguard Worker #if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL) && __GMM_KMD__)
131*35ffd701SAndroid Build Coastguard Worker                     REGISTRY_OVERRIDE_WRITE(pKmdGmmContext, Usage, UnSupportedMOCSEntryL3Value, UsageEle.L3.UshortValue);
132*35ffd701SAndroid Build Coastguard Worker #endif
133*35ffd701SAndroid Build Coastguard Worker                     CachePolicyError = true;
134*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(false, "CRITICAL ERROR: Cache Policy Usage value for L3 specified by Client is not defined in Fixed MOCS Table!");
135*35ffd701SAndroid Build Coastguard Worker                     // Set cache policy index to default MOCS.
136*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx = 0;
137*35ffd701SAndroid Build Coastguard Worker                 }
138*35ffd701SAndroid Build Coastguard Worker             }
139*35ffd701SAndroid Build Coastguard Worker         }
140*35ffd701SAndroid Build Coastguard Worker 
141*35ffd701SAndroid Build Coastguard Worker         // PAT data
142*35ffd701SAndroid Build Coastguard Worker         {
143*35ffd701SAndroid Build Coastguard Worker             UsagePATElement.Xe_LPG.Reserved = 0;
144*35ffd701SAndroid Build Coastguard Worker 
145*35ffd701SAndroid Build Coastguard Worker             UsagePATElement.Xe_LPG.L4CC = (pCachePolicy[Usage].L4CC - 1) % 4; // coverting indicator values to actual regiser values 0->3(GMM_CP_NON_COHERENT_UC), 2->1(GMM_CP_NON_COHERENT_WT) 1->0(GMM_CP_NON_COHERENT_WB)
146*35ffd701SAndroid Build Coastguard Worker 
147*35ffd701SAndroid Build Coastguard Worker 
148*35ffd701SAndroid Build Coastguard Worker             UsagePATElement.Xe_LPG.Coherency = pCachePolicy[Usage].Coherency ? (pCachePolicy[Usage].Coherency + 1) : GMM_GFX_NON_COHERENT_NO_SNOOP; // pCachePolicy[Usage].Coherency -> UsagePATElement.Xe_LPG.Coherency : 0 -> GMM_GFX_NON_COHERENT_NO_SNOOP, 1 -> GMM_GFX_COHERENT_ONE_WAY_IA_SNOOP(2), 2 -> GMM_GFX_COHERENT_TWO_WAY_IA_GPU_SNOOP(3)
149*35ffd701SAndroid Build Coastguard Worker 
150*35ffd701SAndroid Build Coastguard Worker             if((UsagePATElement.Xe_LPG.L4CC >= GMM_CP_NON_COHERENT_WT) && (UsagePATElement.Xe_LPG.Coherency >= GMM_GFX_COHERENT_ONE_WAY_IA_SNOOP))
151*35ffd701SAndroid Build Coastguard Worker             {
152*35ffd701SAndroid Build Coastguard Worker                 // restrictions
153*35ffd701SAndroid Build Coastguard Worker                 // __GMM_ASSERT(FALSE);  // disable assert till there is more clarity on Snoop + UC combination support in PAT register
154*35ffd701SAndroid Build Coastguard Worker 
155*35ffd701SAndroid Build Coastguard Worker                 // unsupported combination of coherency and L4cachepolicy
156*35ffd701SAndroid Build Coastguard Worker                 // Promote caching to _WB and support snoop
157*35ffd701SAndroid Build Coastguard Worker                 UsagePATElement.Xe_LPG.L4CC = GMM_CP_COHERENT_WB;
158*35ffd701SAndroid Build Coastguard Worker             }
159*35ffd701SAndroid Build Coastguard Worker             // try to find a match in static PAT table
160*35ffd701SAndroid Build Coastguard Worker             for(i = 0; i <= CurrentMaxPATIndex; i++)
161*35ffd701SAndroid Build Coastguard Worker             {
162*35ffd701SAndroid Build Coastguard Worker                 GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(i);
163*35ffd701SAndroid Build Coastguard Worker                 if(UsagePATElement.Xe_LPG.L4CC == PAT.Xe_LPG.L4CC &&
164*35ffd701SAndroid Build Coastguard Worker                    UsagePATElement.Xe_LPG.Coherency == PAT.Xe_LPG.Coherency)
165*35ffd701SAndroid Build Coastguard Worker                 {
166*35ffd701SAndroid Build Coastguard Worker                     PATIdx = i;
167*35ffd701SAndroid Build Coastguard Worker                     break;
168*35ffd701SAndroid Build Coastguard Worker                 }
169*35ffd701SAndroid Build Coastguard Worker             }
170*35ffd701SAndroid Build Coastguard Worker 
171*35ffd701SAndroid Build Coastguard Worker             if(PATIdx == -1)
172*35ffd701SAndroid Build Coastguard Worker             {
173*35ffd701SAndroid Build Coastguard Worker // Didn't find the caching settings in one of the already programmed PAT table entries.
174*35ffd701SAndroid Build Coastguard Worker // Need to add a new lookup table entry.
175*35ffd701SAndroid Build Coastguard Worker #if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL))
176*35ffd701SAndroid Build Coastguard Worker                 // If the Cache Policy setting is overriden through regkey,
177*35ffd701SAndroid Build Coastguard Worker                 if(pCachePolicy[Usage].IsOverridenByRegkey)
178*35ffd701SAndroid Build Coastguard Worker                 {
179*35ffd701SAndroid Build Coastguard Worker                     if(CurrentMaxPATIndex < NumPATRegisters)
180*35ffd701SAndroid Build Coastguard Worker                     {
181*35ffd701SAndroid Build Coastguard Worker                         SetPrivatePATEntry(++CurrentMaxPATIndex, UsagePATElement); // updates private PAT table
182*35ffd701SAndroid Build Coastguard Worker                         PATIdx = CurrentMaxPATIndex;
183*35ffd701SAndroid Build Coastguard Worker                     }
184*35ffd701SAndroid Build Coastguard Worker                     else
185*35ffd701SAndroid Build Coastguard Worker                     {
186*35ffd701SAndroid Build Coastguard Worker                         GMM_ASSERTDPF(
187*35ffd701SAndroid Build Coastguard Worker                         "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
188*35ffd701SAndroid Build Coastguard Worker                         "(we only support NumPATRegisters = %d)",
189*35ffd701SAndroid Build Coastguard Worker                         NumPATRegisters - 1);
190*35ffd701SAndroid Build Coastguard Worker                         CachePolicyError = true;
191*35ffd701SAndroid Build Coastguard Worker                         // add rterror here <ToDo>
192*35ffd701SAndroid Build Coastguard Worker                         PATIdx = PAT2; //default to uncached PAT index 2: GMM_CP_NON_COHERENT_UC
193*35ffd701SAndroid Build Coastguard Worker                     }
194*35ffd701SAndroid Build Coastguard Worker                 }
195*35ffd701SAndroid Build Coastguard Worker #else
196*35ffd701SAndroid Build Coastguard Worker                 {
197*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(
198*35ffd701SAndroid Build Coastguard Worker                     "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
199*35ffd701SAndroid Build Coastguard Worker                     "(we only support NumPATRegisters = %d)",
200*35ffd701SAndroid Build Coastguard Worker                     CurrentMaxPATIndex);
201*35ffd701SAndroid Build Coastguard Worker                     CachePolicyError = true;
202*35ffd701SAndroid Build Coastguard Worker                     // add rterror here <ToDo>
203*35ffd701SAndroid Build Coastguard Worker                     PATIdx = PAT2; // default to uncached PAT index 2: GMM_CP_NON_COHERENT_UC
204*35ffd701SAndroid Build Coastguard Worker                                    // Log Error using regkey to indicate the above error
205*35ffd701SAndroid Build Coastguard Worker #if(_WIN32 && (_DEBUG || _RELEASE_INTERNAL) && __GMM_KMD__)
206*35ffd701SAndroid Build Coastguard Worker                     REGISTRY_OVERRIDE_WRITE(pKmdGmmContext, Usage, NewPATCachingPolicy, UsagePATElement.Xe_LPG.L4CC);
207*35ffd701SAndroid Build Coastguard Worker                     REGISTRY_OVERRIDE_WRITE(pKmdGmmContext, Usage, NewPATCoherency, UsagePATElement.Xe_LPG.Coherency);
208*35ffd701SAndroid Build Coastguard Worker #endif
209*35ffd701SAndroid Build Coastguard Worker                 }
210*35ffd701SAndroid Build Coastguard Worker #endif
211*35ffd701SAndroid Build Coastguard Worker             }
212*35ffd701SAndroid Build Coastguard Worker 
213*35ffd701SAndroid Build Coastguard Worker 
214*35ffd701SAndroid Build Coastguard Worker             // Find PATIndex matching coherency value of 2 in static PAT table (1 way coherent)
215*35ffd701SAndroid Build Coastguard Worker             for(k = 0; k <= CurrentMaxPATIndex; k++)
216*35ffd701SAndroid Build Coastguard Worker             {
217*35ffd701SAndroid Build Coastguard Worker                 GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(k);
218*35ffd701SAndroid Build Coastguard Worker                 if(UsagePATElement.Xe_LPG.L4CC == PAT.Xe_LPG.L4CC &&
219*35ffd701SAndroid Build Coastguard Worker                    (ONE_WAY_COHERENT == PAT.Xe_LPG.Coherency))
220*35ffd701SAndroid Build Coastguard Worker                 {
221*35ffd701SAndroid Build Coastguard Worker                     CoherentPATIdx = k;
222*35ffd701SAndroid Build Coastguard Worker                     break;
223*35ffd701SAndroid Build Coastguard Worker                 }
224*35ffd701SAndroid Build Coastguard Worker             }
225*35ffd701SAndroid Build Coastguard Worker             if(CoherentPATIdx == -1)
226*35ffd701SAndroid Build Coastguard Worker             {
227*35ffd701SAndroid Build Coastguard Worker                 // redo PAT idnex mathcing with just coherency value,
228*35ffd701SAndroid Build Coastguard Worker                 // ignore L4 cache setting since MTL is MOCS centric and only the coherency value comes from PAT anyways, caching policy is bound to come from MOCS on MTL
229*35ffd701SAndroid Build Coastguard Worker                 for(k = 0; k <= CurrentMaxPATIndex; k++)
230*35ffd701SAndroid Build Coastguard Worker                 {
231*35ffd701SAndroid Build Coastguard Worker                     GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(k);
232*35ffd701SAndroid Build Coastguard Worker                     if(ONE_WAY_COHERENT == PAT.Xe_LPG.Coherency)
233*35ffd701SAndroid Build Coastguard Worker                     {
234*35ffd701SAndroid Build Coastguard Worker                         CoherentPATIdx = k;
235*35ffd701SAndroid Build Coastguard Worker                         break;
236*35ffd701SAndroid Build Coastguard Worker                     }
237*35ffd701SAndroid Build Coastguard Worker                 }
238*35ffd701SAndroid Build Coastguard Worker             }
239*35ffd701SAndroid Build Coastguard Worker 
240*35ffd701SAndroid Build Coastguard Worker             if(CoherentPATIdx == -1) // no match, switch to PATIndex
241*35ffd701SAndroid Build Coastguard Worker             {
242*35ffd701SAndroid Build Coastguard Worker                 CachePolicyError = true;
243*35ffd701SAndroid Build Coastguard Worker                 CoherentPATIdx   = PATIdx;
244*35ffd701SAndroid Build Coastguard Worker             }
245*35ffd701SAndroid Build Coastguard Worker         }
246*35ffd701SAndroid Build Coastguard Worker 
247*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].PATIndex                          = PATIdx;
248*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].CoherentPATIndex                  = GET_COHERENT_PATINDEX_LOWER_BITS(CoherentPATIdx);
249*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].CoherentPATIndexHigherBit         = GET_COHERENT_PATINDEX_HIGHER_BIT(CoherentPATIdx);
250*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].PTE.DwordValue                    = GMM_GET_PTE_BITS_FROM_PAT_IDX(PATIdx) & 0xFFFFFFFF;
251*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].PTE.HighDwordValue                = GMM_GET_PTE_BITS_FROM_PAT_IDX(PATIdx) >> 32;
252*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].MemoryObjectOverride.XE_LPG.Index = CPTblIdx;
253*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].Override                          = ALWAYS_OVERRIDE;
254*35ffd701SAndroid Build Coastguard Worker 
255*35ffd701SAndroid Build Coastguard Worker         if(CachePolicyError)
256*35ffd701SAndroid Build Coastguard Worker         {
257*35ffd701SAndroid Build Coastguard Worker             GMM_ASSERTDPF(false, "Cache Policy Init Error: Invalid Cache Programming ");
258*35ffd701SAndroid Build Coastguard Worker             // add rterror here <ToDo>
259*35ffd701SAndroid Build Coastguard Worker         }
260*35ffd701SAndroid Build Coastguard Worker     }
261*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
262*35ffd701SAndroid Build Coastguard Worker }
263*35ffd701SAndroid Build Coastguard Worker 
264*35ffd701SAndroid Build Coastguard Worker //=============================================================================
265*35ffd701SAndroid Build Coastguard Worker //
266*35ffd701SAndroid Build Coastguard Worker // Function: __:SetL1CachePolicy
267*35ffd701SAndroid Build Coastguard Worker //
268*35ffd701SAndroid Build Coastguard Worker // Desc: This function converting indicator values to actual register values and store into pCachePolicy to return to UMD's.
269*35ffd701SAndroid Build Coastguard Worker // Gmm not using this values. UMD's queries for this values.
270*35ffd701SAndroid Build Coastguard Worker //
271*35ffd701SAndroid Build Coastguard Worker // Parameters: Usage
272*35ffd701SAndroid Build Coastguard Worker //
273*35ffd701SAndroid Build Coastguard Worker // Return: VOID
274*35ffd701SAndroid Build Coastguard Worker //
275*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetL1CachePolicy(uint32_t Usage)276*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGCachePolicy::SetL1CachePolicy(uint32_t Usage)
277*35ffd701SAndroid Build Coastguard Worker {
278*35ffd701SAndroid Build Coastguard Worker 
279*35ffd701SAndroid Build Coastguard Worker // As per HW, L1 cache control(L1CC) values  (0: WBP write bypass mode, 1: 0 uncached, 2: WB Write back, 3:WT write-through, 4: WS Write-Streaming).
280*35ffd701SAndroid Build Coastguard Worker #define L1_WBP_CACHEABLE (0x0)
281*35ffd701SAndroid Build Coastguard Worker #define L1_UNCACHEABLE   (0x1)
282*35ffd701SAndroid Build Coastguard Worker #define L1_WB_CACHEABLE  (0x2)
283*35ffd701SAndroid Build Coastguard Worker #define L1_WT_CACHEABLE  (0x3)
284*35ffd701SAndroid Build Coastguard Worker #define L1_WS_CACHEABLE  (0x4)
285*35ffd701SAndroid Build Coastguard Worker 
286*35ffd701SAndroid Build Coastguard Worker     switch (pCachePolicy[Usage].L1CC)
287*35ffd701SAndroid Build Coastguard Worker     {
288*35ffd701SAndroid Build Coastguard Worker     case GMM_UC:
289*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].L1CC = L1_UNCACHEABLE;
290*35ffd701SAndroid Build Coastguard Worker         break;
291*35ffd701SAndroid Build Coastguard Worker     case GMM_WB:
292*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].L1CC = L1_WB_CACHEABLE;
293*35ffd701SAndroid Build Coastguard Worker         break;
294*35ffd701SAndroid Build Coastguard Worker     case GMM_WT:
295*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].L1CC = L1_WT_CACHEABLE;
296*35ffd701SAndroid Build Coastguard Worker         break;
297*35ffd701SAndroid Build Coastguard Worker     case GMM_WBP:
298*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].L1CC = L1_WBP_CACHEABLE;
299*35ffd701SAndroid Build Coastguard Worker         break;
300*35ffd701SAndroid Build Coastguard Worker     case GMM_WS:
301*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].L1CC = L1_WS_CACHEABLE;
302*35ffd701SAndroid Build Coastguard Worker         break;
303*35ffd701SAndroid Build Coastguard Worker     default:
304*35ffd701SAndroid Build Coastguard Worker         pCachePolicy[Usage].L1CC = L1_UNCACHEABLE;
305*35ffd701SAndroid Build Coastguard Worker     }
306*35ffd701SAndroid Build Coastguard Worker 
307*35ffd701SAndroid Build Coastguard Worker #undef L1_WBP_CACHEABLE
308*35ffd701SAndroid Build Coastguard Worker #undef L1_UNCACHEABLE
309*35ffd701SAndroid Build Coastguard Worker #undef L1_WB_CACHEABLE
310*35ffd701SAndroid Build Coastguard Worker #undef L1_WT_CACHEABLE
311*35ffd701SAndroid Build Coastguard Worker #undef L1_WS_CACHEABLE
312*35ffd701SAndroid Build Coastguard Worker }
313*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
314*35ffd701SAndroid Build Coastguard Worker ///      A simple getter function returning the PAT (cache policy) for a given
315*35ffd701SAndroid Build Coastguard Worker ///      use Usage of the named resource pResInfo.
316*35ffd701SAndroid Build Coastguard Worker ///      Typically used to populate PPGTT/GGTT.
317*35ffd701SAndroid Build Coastguard Worker ///
318*35ffd701SAndroid Build Coastguard Worker /// @param[in]     pResInfo: Resource info for resource, can be NULL.
319*35ffd701SAndroid Build Coastguard Worker /// @param[in]     Usage: Current usage for resource.
320*35ffd701SAndroid Build Coastguard Worker /// @param[Optional] Not Applicable for MTL
321*35ffd701SAndroid Build Coastguard Worker /// @param[in]     Applicable for MTL
322*35ffd701SAndroid Build Coastguard Worker /// @return        PATIndex
323*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetPATIndex(GMM_RESOURCE_INFO * pResInfo,GMM_RESOURCE_USAGE_TYPE Usage,bool * pCompressionEnable,bool IsCpuCacheable)324*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmXe_LPGCachePolicy::CachePolicyGetPATIndex(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage, bool *pCompressionEnable, bool IsCpuCacheable)
325*35ffd701SAndroid Build Coastguard Worker {
326*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pGmmLibContext->GetCachePolicyElement(Usage).Initialized);
327*35ffd701SAndroid Build Coastguard Worker     GMM_UNREFERENCED_PARAMETER(pCompressionEnable);
328*35ffd701SAndroid Build Coastguard Worker 
329*35ffd701SAndroid Build Coastguard Worker     // Prevent wrong Usage for XAdapter resources. UMD does not call GetMemoryObject on shader resources but,
330*35ffd701SAndroid Build Coastguard Worker     // when they add it someone could call it without knowing the restriction.
331*35ffd701SAndroid Build Coastguard Worker     if(pResInfo &&
332*35ffd701SAndroid Build Coastguard Worker        pResInfo->GetResFlags().Info.XAdapter &&
333*35ffd701SAndroid Build Coastguard Worker        Usage != GMM_RESOURCE_USAGE_XADAPTER_SHARED_RESOURCE)
334*35ffd701SAndroid Build Coastguard Worker     {
335*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(false);
336*35ffd701SAndroid Build Coastguard Worker     }
337*35ffd701SAndroid Build Coastguard Worker 
338*35ffd701SAndroid Build Coastguard Worker     if(IsCpuCacheable)
339*35ffd701SAndroid Build Coastguard Worker     {
340*35ffd701SAndroid Build Coastguard Worker         return (uint32_t)(GET_COHERENT_PATINDEX_VALUE(pGmmLibContext, Usage));
341*35ffd701SAndroid Build Coastguard Worker     }
342*35ffd701SAndroid Build Coastguard Worker     else
343*35ffd701SAndroid Build Coastguard Worker     {
344*35ffd701SAndroid Build Coastguard Worker         return pGmmLibContext->GetCachePolicyElement(Usage).PATIndex;
345*35ffd701SAndroid Build Coastguard Worker     }
346*35ffd701SAndroid Build Coastguard Worker }
347*35ffd701SAndroid Build Coastguard Worker 
348*35ffd701SAndroid Build Coastguard Worker //=============================================================================
349*35ffd701SAndroid Build Coastguard Worker //
350*35ffd701SAndroid Build Coastguard Worker // Function: SetUpMOCSTable
351*35ffd701SAndroid Build Coastguard Worker //
352*35ffd701SAndroid Build Coastguard Worker // Desc:
353*35ffd701SAndroid Build Coastguard Worker //
354*35ffd701SAndroid Build Coastguard Worker // Parameters:
355*35ffd701SAndroid Build Coastguard Worker //
356*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
357*35ffd701SAndroid Build Coastguard Worker //
358*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetUpMOCSTable()359*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe_LPGCachePolicy::SetUpMOCSTable()
360*35ffd701SAndroid Build Coastguard Worker {
361*35ffd701SAndroid Build Coastguard Worker     GMM_CACHE_POLICY_TBL_ELEMENT *pCachePolicyTlbElement = &(pGmmLibContext->GetCachePolicyTlbElement()[0]);
362*35ffd701SAndroid Build Coastguard Worker     CurrentMaxL1HdcMocsIndex                             = 0;
363*35ffd701SAndroid Build Coastguard Worker     CurrentMaxSpecialMocsIndex                           = 0;
364*35ffd701SAndroid Build Coastguard Worker 
365*35ffd701SAndroid Build Coastguard Worker #define L3_UC (0x1)
366*35ffd701SAndroid Build Coastguard Worker #define L3_WB (0x3)
367*35ffd701SAndroid Build Coastguard Worker 
368*35ffd701SAndroid Build Coastguard Worker #define L4_WB (0x0)
369*35ffd701SAndroid Build Coastguard Worker #define L4_WT (0x1)
370*35ffd701SAndroid Build Coastguard Worker #define L4_UC (0x3)
371*35ffd701SAndroid Build Coastguard Worker 
372*35ffd701SAndroid Build Coastguard Worker #define GMM_DEFINE_MOCS(Index, L3_LookUp, L3_Go, L3_CC, L4Caching, ignorePAT)      \
373*35ffd701SAndroid Build Coastguard Worker     {                                                                              \
374*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.Cacheability      = L3_CC;                \
375*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.GlobalGo          = L3_Go;                \
376*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].L3.UCLookup          = L3_LookUp;            \
377*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.Xe_LPG.L4CC     = L4Caching;            \
378*35ffd701SAndroid Build Coastguard Worker         pCachePolicyTlbElement[Index].LeCC.Xe_LPG.igPAT    = ignorePAT;            \
379*35ffd701SAndroid Build Coastguard Worker     }
380*35ffd701SAndroid Build Coastguard Worker     // clang-format off
381*35ffd701SAndroid Build Coastguard Worker 
382*35ffd701SAndroid Build Coastguard Worker     //Default MOCS Table
383*35ffd701SAndroid Build Coastguard Worker     for(int index = 0; index < GMM_MAX_NUMBER_MOCS_INDEXES; index++)
384*35ffd701SAndroid Build Coastguard Worker     {     //             Index    LookUp  Go      L3CC        L4CC   ignorePAT
385*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_MOCS( index  , 1     , 0     , L3_UC     , L4_UC     , 0)
386*35ffd701SAndroid Build Coastguard Worker     }
387*35ffd701SAndroid Build Coastguard Worker     // Fixed MOCS Table
388*35ffd701SAndroid Build Coastguard Worker     //             Index      LookUp  Go      L3CC       L4CC   ignorePAT
389*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 0      , 1     , 0     , L3_WB    , L4_WB , 1)
390*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 1      , 1     , 0     , L3_WB    , L4_WB , 1)
391*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 2      , 1     , 0     , L3_UC    , L4_WB , 1)
392*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 3      , 1     , 0     , L3_UC    , L4_UC , 1)
393*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 4      , 1     , 1     , L3_UC    , L4_WB , 1)
394*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 5      , 1     , 1     , L3_UC    , L4_UC , 1)
395*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 6      , 0     , 0     , L3_UC    , L4_WB , 1)
396*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 7      , 0     , 0     , L3_UC    , L4_UC , 1)
397*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 8      , 0     , 1     , L3_UC    , L4_WB , 1)
398*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 9      , 0     , 1     , L3_UC    , L4_UC , 1)
399*35ffd701SAndroid Build Coastguard Worker     //Reserved 10-13
400*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 14     , 1     , 0     , L3_WB    , L4_WT , 1) /* Note Update GMM_CC_DISP_MOCS_INDEX*/
401*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_MOCS( 15     , 0     , 1     , L3_UC    , L4_WB , 1) /* Note Update GMM_NON_CC_DISP_MOCS_INDEX */
402*35ffd701SAndroid Build Coastguard Worker 
403*35ffd701SAndroid Build Coastguard Worker     CurrentMaxMocsIndex         = 15;
404*35ffd701SAndroid Build Coastguard Worker     CurrentMaxL1HdcMocsIndex    = 0;
405*35ffd701SAndroid Build Coastguard Worker     CurrentMaxSpecialMocsIndex  = 0;
406*35ffd701SAndroid Build Coastguard Worker 
407*35ffd701SAndroid Build Coastguard Worker // clang-format on
408*35ffd701SAndroid Build Coastguard Worker #undef GMM_DEFINE_MOCS
409*35ffd701SAndroid Build Coastguard Worker #undef L4_WB
410*35ffd701SAndroid Build Coastguard Worker #undef L4_WT
411*35ffd701SAndroid Build Coastguard Worker #undef L4_UC
412*35ffd701SAndroid Build Coastguard Worker #undef L3_UC
413*35ffd701SAndroid Build Coastguard Worker #undef L3_WB
414*35ffd701SAndroid Build Coastguard Worker }
415*35ffd701SAndroid Build Coastguard Worker 
416*35ffd701SAndroid Build Coastguard Worker //=============================================================================
417*35ffd701SAndroid Build Coastguard Worker //
418*35ffd701SAndroid Build Coastguard Worker // Function: SetupPAT
419*35ffd701SAndroid Build Coastguard Worker //
420*35ffd701SAndroid Build Coastguard Worker // Desc:
421*35ffd701SAndroid Build Coastguard Worker //
422*35ffd701SAndroid Build Coastguard Worker // Parameters:
423*35ffd701SAndroid Build Coastguard Worker //
424*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
425*35ffd701SAndroid Build Coastguard Worker //
426*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetupPAT()427*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmXe_LPGCachePolicy::SetupPAT()
428*35ffd701SAndroid Build Coastguard Worker {
429*35ffd701SAndroid Build Coastguard Worker     GMM_PRIVATE_PAT *pPATTlbElement = &(pGmmLibContext->GetPrivatePATTable()[0]);
430*35ffd701SAndroid Build Coastguard Worker 
431*35ffd701SAndroid Build Coastguard Worker #define L4_WB (0x0)
432*35ffd701SAndroid Build Coastguard Worker #define L4_WT (0x1)
433*35ffd701SAndroid Build Coastguard Worker #define L4_UC (0x3)
434*35ffd701SAndroid Build Coastguard Worker 
435*35ffd701SAndroid Build Coastguard Worker #define GMM_DEFINE_PAT_ELEMENT(indx, L4Caching, Coh)       \
436*35ffd701SAndroid Build Coastguard Worker     {                                                      \
437*35ffd701SAndroid Build Coastguard Worker         pPATTlbElement[indx].Xe_LPG.Coherency = Coh;       \
438*35ffd701SAndroid Build Coastguard Worker         pPATTlbElement[indx].Xe_LPG.L4CC      = L4Caching; \
439*35ffd701SAndroid Build Coastguard Worker         pPATTlbElement[indx].Xe_LPG.Reserved  = 0;         \
440*35ffd701SAndroid Build Coastguard Worker     }
441*35ffd701SAndroid Build Coastguard Worker 
442*35ffd701SAndroid Build Coastguard Worker     // clang-format off
443*35ffd701SAndroid Build Coastguard Worker 
444*35ffd701SAndroid Build Coastguard Worker     // Default PAT Table
445*35ffd701SAndroid Build Coastguard Worker     for (uint32_t i = 0; i < NumPATRegisters; i++)
446*35ffd701SAndroid Build Coastguard Worker     {   //                      Index      CachingPolicy       Coherency
447*35ffd701SAndroid Build Coastguard Worker         GMM_DEFINE_PAT_ELEMENT( i,          L4_UC              , 0 );
448*35ffd701SAndroid Build Coastguard Worker     }
449*35ffd701SAndroid Build Coastguard Worker 
450*35ffd701SAndroid Build Coastguard Worker     // Fixed PAT Table
451*35ffd701SAndroid Build Coastguard Worker     //                      Index   CachingPolicy   Coherency
452*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 0      , L4_WB              , 0)    // PATRegValue = 0x0
453*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 1      , L4_WT              , 0)    // PATRegValue = 0x4
454*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 2      , L4_UC              , 0)    // PATRegValue = 0xC
455*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 3      , L4_WB              , 2)    // PATRegValue = 0x2
456*35ffd701SAndroid Build Coastguard Worker     GMM_DEFINE_PAT_ELEMENT( 4      , L4_WB              , 3)    // PATRegValue = 0x3
457*35ffd701SAndroid Build Coastguard Worker 
458*35ffd701SAndroid Build Coastguard Worker     CurrentMaxPATIndex = 4;
459*35ffd701SAndroid Build Coastguard Worker 
460*35ffd701SAndroid Build Coastguard Worker // clang-format on
461*35ffd701SAndroid Build Coastguard Worker #undef GMM_DEFINE_PAT
462*35ffd701SAndroid Build Coastguard Worker #undef L4_WB
463*35ffd701SAndroid Build Coastguard Worker #undef L4_WT
464*35ffd701SAndroid Build Coastguard Worker #undef L4_UC
465*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
466*35ffd701SAndroid Build Coastguard Worker }
467*35ffd701SAndroid Build Coastguard Worker 
GetSurfaceStateL1CachePolicy(GMM_RESOURCE_USAGE_TYPE Usage)468*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmXe_LPGCachePolicy::GetSurfaceStateL1CachePolicy(GMM_RESOURCE_USAGE_TYPE Usage)
469*35ffd701SAndroid Build Coastguard Worker {
470*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pCachePolicy[Usage].Initialized);
471*35ffd701SAndroid Build Coastguard Worker 
472*35ffd701SAndroid Build Coastguard Worker     return pCachePolicy[Usage].L1CC;
473*35ffd701SAndroid Build Coastguard Worker }
474*35ffd701SAndroid Build Coastguard Worker 
475*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
476*35ffd701SAndroid Build Coastguard Worker ///      A simple getter function returning the MOCS (cache policy) for a given
477*35ffd701SAndroid Build Coastguard Worker ///      use Usage of the named resource pResInfo.
478*35ffd701SAndroid Build Coastguard Worker ///      Typically used to populate a SURFACE_STATE for a GPU task.
479*35ffd701SAndroid Build Coastguard Worker ///
480*35ffd701SAndroid Build Coastguard Worker /// @param[in]     pResInfo: Resource info for resource, can be NULL.
481*35ffd701SAndroid Build Coastguard Worker /// @param[in]     Usage: Current usage for resource.
482*35ffd701SAndroid Build Coastguard Worker ///
483*35ffd701SAndroid Build Coastguard Worker /// @return        MEMORY_OBJECT_CONTROL_STATE: Gen adjusted MOCS structure (cache
484*35ffd701SAndroid Build Coastguard Worker ///                                             policy) for the given buffer use.
485*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetMemoryObject(GMM_RESOURCE_INFO * pResInfo,GMM_RESOURCE_USAGE_TYPE Usage)486*35ffd701SAndroid Build Coastguard Worker MEMORY_OBJECT_CONTROL_STATE GMM_STDCALL GmmLib::GmmXe_LPGCachePolicy::CachePolicyGetMemoryObject(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage)
487*35ffd701SAndroid Build Coastguard Worker {
488*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pCachePolicy[Usage].Initialized);
489*35ffd701SAndroid Build Coastguard Worker 
490*35ffd701SAndroid Build Coastguard Worker     // Prevent wrong Usage for XAdapter resources. UMD does not call GetMemoryObject on shader resources but,
491*35ffd701SAndroid Build Coastguard Worker     // when they add it someone could call it without knowing the restriction.
492*35ffd701SAndroid Build Coastguard Worker     if (pResInfo &&
493*35ffd701SAndroid Build Coastguard Worker         pResInfo->GetResFlags().Info.XAdapter &&
494*35ffd701SAndroid Build Coastguard Worker          (Usage != GMM_RESOURCE_USAGE_XADAPTER_SHARED_RESOURCE))
495*35ffd701SAndroid Build Coastguard Worker     {
496*35ffd701SAndroid Build Coastguard Worker         __GMM_ASSERT(false);
497*35ffd701SAndroid Build Coastguard Worker     }
498*35ffd701SAndroid Build Coastguard Worker 
499*35ffd701SAndroid Build Coastguard Worker     if (!pResInfo ||
500*35ffd701SAndroid Build Coastguard Worker         (pCachePolicy[Usage].Override & pCachePolicy[Usage].IDCode) ||
501*35ffd701SAndroid Build Coastguard Worker         (pCachePolicy[Usage].Override == ALWAYS_OVERRIDE))
502*35ffd701SAndroid Build Coastguard Worker     {
503*35ffd701SAndroid Build Coastguard Worker         return pCachePolicy[Usage].MemoryObjectOverride;
504*35ffd701SAndroid Build Coastguard Worker     }
505*35ffd701SAndroid Build Coastguard Worker     else
506*35ffd701SAndroid Build Coastguard Worker     {
507*35ffd701SAndroid Build Coastguard Worker         return pCachePolicy[Usage].MemoryObjectNoOverride;
508*35ffd701SAndroid Build Coastguard Worker     }
509*35ffd701SAndroid Build Coastguard Worker }
510*35ffd701SAndroid Build Coastguard Worker 
511