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