1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2024 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
4*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
5*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
6*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
7*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
8*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
9*35ffd701SAndroid Build Coastguard Worker
10*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
11*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
12*35ffd701SAndroid Build Coastguard Worker
13*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
17*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
19*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
20*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
21*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
22*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmCachePolicy.h"
23*35ffd701SAndroid Build Coastguard Worker #include "External/Common/CachePolicy/GmmCachePolicyXe2_LPG.h"
24*35ffd701SAndroid Build Coastguard Worker //=============================================================================
25*35ffd701SAndroid Build Coastguard Worker //
26*35ffd701SAndroid Build Coastguard Worker // Function: GmmXe2_LPGCachePolicy::InitCachePolicy()
27*35ffd701SAndroid Build Coastguard Worker //
28*35ffd701SAndroid Build Coastguard Worker // Desc: This function initializes the Xe2 cache policy
29*35ffd701SAndroid Build Coastguard Worker //
30*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
31*35ffd701SAndroid Build Coastguard Worker //
32*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
InitCachePolicy()33*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmXe2_LPGCachePolicy::InitCachePolicy()
34*35ffd701SAndroid Build Coastguard Worker {
35*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERTPTR(pCachePolicy, GMM_ERROR);
36*35ffd701SAndroid Build Coastguard Worker
37*35ffd701SAndroid Build Coastguard Worker #define DEFINE_CACHE_ELEMENT(usage, l3_cc, l3_clos, l1cc, l2cc, l4cc, coherency, igPAT, segov) DEFINE_CP_ELEMENT(usage, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, segov, 0, 0, l1cc, l2cc, l4cc, coherency, l3_cc, l3_clos, igPAT)
38*35ffd701SAndroid Build Coastguard Worker
39*35ffd701SAndroid Build Coastguard Worker #include "GmmXe2_LPGCachePolicy.h"
40*35ffd701SAndroid Build Coastguard Worker
41*35ffd701SAndroid Build Coastguard Worker SetUpMOCSTable();
42*35ffd701SAndroid Build Coastguard Worker SetupPAT();
43*35ffd701SAndroid Build Coastguard Worker
44*35ffd701SAndroid Build Coastguard Worker // Define index of cache element
45*35ffd701SAndroid Build Coastguard Worker uint32_t Usage = 0;
46*35ffd701SAndroid Build Coastguard Worker uint32_t ReservedPATIdx = 13; /* Rsvd PAT section 13-19 */
47*35ffd701SAndroid Build Coastguard Worker
48*35ffd701SAndroid Build Coastguard Worker #if (_WIN32 && (_DEBUG || _RELEASE_INTERNAL))
49*35ffd701SAndroid Build Coastguard Worker void *pKmdGmmContext = NULL;
50*35ffd701SAndroid Build Coastguard Worker #if (defined(__GMM_KMD__))
51*35ffd701SAndroid Build Coastguard Worker pKmdGmmContext = pGmmLibContext->GetGmmKmdContext();
52*35ffd701SAndroid Build Coastguard Worker #endif
53*35ffd701SAndroid Build Coastguard Worker OverrideCachePolicy(pKmdGmmContext);
54*35ffd701SAndroid Build Coastguard Worker #endif
55*35ffd701SAndroid Build Coastguard Worker // Process the cache policy and fill in the look up table
56*35ffd701SAndroid Build Coastguard Worker for (; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
57*35ffd701SAndroid Build Coastguard Worker {
58*35ffd701SAndroid Build Coastguard Worker bool CachePolicyError = false;
59*35ffd701SAndroid Build Coastguard Worker int32_t PATIdx = -1, CPTblIdx = -1, PATIdxCompressed = -1, CoherentPATIdx = -1;
60*35ffd701SAndroid Build Coastguard Worker uint32_t i, j;
61*35ffd701SAndroid Build Coastguard Worker GMM_XE2_PRIVATE_PAT UsagePATElement = {0};
62*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT UsageEle = {0};
63*35ffd701SAndroid Build Coastguard Worker GMM_PTE_CACHE_CONTROL_BITS PTE = {0};
64*35ffd701SAndroid Build Coastguard Worker
65*35ffd701SAndroid Build Coastguard Worker // MOCS data
66*35ffd701SAndroid Build Coastguard Worker {
67*35ffd701SAndroid Build Coastguard Worker
68*35ffd701SAndroid Build Coastguard Worker // Get L3 ,L4 and Convert GMM indicative values to actual regiser values.
69*35ffd701SAndroid Build Coastguard Worker GetL3L4(&UsageEle, &UsagePATElement, Usage);
70*35ffd701SAndroid Build Coastguard Worker // Convert L1 GMM indicative values to actual regiser values and store into pCachePolicy to return to UMD's.
71*35ffd701SAndroid Build Coastguard Worker SetL1CachePolicy(Usage);
72*35ffd701SAndroid Build Coastguard Worker
73*35ffd701SAndroid Build Coastguard Worker if ((!pGmmLibContext->GetSkuTable().FtrL3TransientDataFlush) && (UsageEle.L3.PhysicalL3.L3CC == GMM_GFX_PHY_L3_MT_WB_XD))
74*35ffd701SAndroid Build Coastguard Worker {
75*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.PhysicalL3.L3CC = GMM_GFX_PHY_L3_MT_WB; // No Transient Flush Support
76*35ffd701SAndroid Build Coastguard Worker }
77*35ffd701SAndroid Build Coastguard Worker
78*35ffd701SAndroid Build Coastguard Worker /* If MOCS is not needed fall back to Defer to PAT i.e MOCS#0 */
79*35ffd701SAndroid Build Coastguard Worker if (false == UsageEle.L3.PhysicalL3.igPAT)
80*35ffd701SAndroid Build Coastguard Worker {
81*35ffd701SAndroid Build Coastguard Worker /* Set cache policy index to defered to PAT i.e. MOCS Index 0 */
82*35ffd701SAndroid Build Coastguard Worker CPTblIdx = 0;
83*35ffd701SAndroid Build Coastguard Worker }
84*35ffd701SAndroid Build Coastguard Worker else
85*35ffd701SAndroid Build Coastguard Worker {
86*35ffd701SAndroid Build Coastguard Worker /* MOCS Index 1-3 are valid */
87*35ffd701SAndroid Build Coastguard Worker for (j = 1; j <= CurrentMaxMocsIndex; j++)
88*35ffd701SAndroid Build Coastguard Worker {
89*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pGmmLibContext->GetCachePolicyTlbElement()[j];
90*35ffd701SAndroid Build Coastguard Worker if (UsageEle.L3.PhysicalL3.L4CC == TblEle->L3.PhysicalL3.L4CC &&
91*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.PhysicalL3.L3CC == TblEle->L3.PhysicalL3.L3CC &&
92*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.PhysicalL3.L3CLOS == TblEle->L3.PhysicalL3.L3CLOS &&
93*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.PhysicalL3.igPAT == true)
94*35ffd701SAndroid Build Coastguard Worker {
95*35ffd701SAndroid Build Coastguard Worker CPTblIdx = j;
96*35ffd701SAndroid Build Coastguard Worker break;
97*35ffd701SAndroid Build Coastguard Worker }
98*35ffd701SAndroid Build Coastguard Worker }
99*35ffd701SAndroid Build Coastguard Worker }
100*35ffd701SAndroid Build Coastguard Worker
101*35ffd701SAndroid Build Coastguard Worker if (CPTblIdx == -1)
102*35ffd701SAndroid Build Coastguard Worker {
103*35ffd701SAndroid Build Coastguard Worker
104*35ffd701SAndroid Build Coastguard Worker {
105*35ffd701SAndroid Build Coastguard Worker /* Invalid MOCS setting Fail the GMM Initialzation */
106*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");
107*35ffd701SAndroid Build Coastguard Worker CachePolicyError = true;
108*35ffd701SAndroid Build Coastguard Worker
109*35ffd701SAndroid Build Coastguard Worker }
110*35ffd701SAndroid Build Coastguard Worker }
111*35ffd701SAndroid Build Coastguard Worker }
112*35ffd701SAndroid Build Coastguard Worker
113*35ffd701SAndroid Build Coastguard Worker /*
114*35ffd701SAndroid Build Coastguard Worker Validate Caching restrictions as below
115*35ffd701SAndroid Build Coastguard Worker 1. MemoryType WB-XD must be used in Non-Coherent and allowed only for displayable surfaces
116*35ffd701SAndroid Build Coastguard Worker 2. Coherent mode(1-way/2-way) must be Memory Type WB
117*35ffd701SAndroid Build Coastguard Worker 3. No 2-way coherency on dGPU
118*35ffd701SAndroid Build Coastguard Worker 4. Memory Type WT is available only for L4 in Non Coherent Mode
119*35ffd701SAndroid Build Coastguard Worker 5. Memory Type UC must be used in Non-Coherent Mode
120*35ffd701SAndroid Build Coastguard Worker */
121*35ffd701SAndroid Build Coastguard Worker
122*35ffd701SAndroid Build Coastguard Worker // PAT data
123*35ffd701SAndroid Build Coastguard Worker {
124*35ffd701SAndroid Build Coastguard Worker if (!pGmmLibContext->GetSkuTable().FtrL3TransientDataFlush && (UsagePATElement.Xe2.L3CC == GMM_GFX_PHY_L3_MT_WB_XD))
125*35ffd701SAndroid Build Coastguard Worker {
126*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CC = GMM_GFX_PHY_L3_MT_WB; // No Transient Flush Support
127*35ffd701SAndroid Build Coastguard Worker }
128*35ffd701SAndroid Build Coastguard Worker
129*35ffd701SAndroid Build Coastguard Worker /* Find a PATIndex from the PAT table for uncompressed case*/
130*35ffd701SAndroid Build Coastguard Worker if ((UsagePATElement.Xe2.L4CC == GMM_GFX_PHY_L4_MT_WT) && (UsagePATElement.Xe2.L3CC == GMM_GFX_PHY_L3_MT_WB_XD))
131*35ffd701SAndroid Build Coastguard Worker {
132*35ffd701SAndroid Build Coastguard Worker
133*35ffd701SAndroid Build Coastguard Worker // With L3:XD, L4:WT, NC combination
134*35ffd701SAndroid Build Coastguard Worker if (pGmmLibContext->GetSkuTable().FtrDiscrete)
135*35ffd701SAndroid Build Coastguard Worker {
136*35ffd701SAndroid Build Coastguard Worker // On BMG, L4 is a pass through, demote L4 to UC, keep L3 at XD
137*35ffd701SAndroid Build Coastguard Worker PATIdx = PAT6;
138*35ffd701SAndroid Build Coastguard Worker }
139*35ffd701SAndroid Build Coastguard Worker else
140*35ffd701SAndroid Build Coastguard Worker {
141*35ffd701SAndroid Build Coastguard Worker // On LNL, L3:XD is not needed
142*35ffd701SAndroid Build Coastguard Worker PATIdx = PAT13;
143*35ffd701SAndroid Build Coastguard Worker }
144*35ffd701SAndroid Build Coastguard Worker }
145*35ffd701SAndroid Build Coastguard Worker else
146*35ffd701SAndroid Build Coastguard Worker {
147*35ffd701SAndroid Build Coastguard Worker for (i = 0; i <= CurrentMaxPATIndex; i++)
148*35ffd701SAndroid Build Coastguard Worker {
149*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(i);
150*35ffd701SAndroid Build Coastguard Worker if (UsagePATElement.Xe2.L4CC == PAT.Xe2.L4CC &&
151*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.Coherency == PAT.Xe2.Coherency &&
152*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CC == PAT.Xe2.L3CC &&
153*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CLOS == PAT.Xe2.L3CLOS &&
154*35ffd701SAndroid Build Coastguard Worker false == PAT.Xe2.LosslessCompressionEn)
155*35ffd701SAndroid Build Coastguard Worker {
156*35ffd701SAndroid Build Coastguard Worker PATIdx = i;
157*35ffd701SAndroid Build Coastguard Worker break;
158*35ffd701SAndroid Build Coastguard Worker }
159*35ffd701SAndroid Build Coastguard Worker }
160*35ffd701SAndroid Build Coastguard Worker }
161*35ffd701SAndroid Build Coastguard Worker
162*35ffd701SAndroid Build Coastguard Worker /* Find a PATIndex from the PAT table for compressed case*/
163*35ffd701SAndroid Build Coastguard Worker for (i = 0; i <= CurrentMaxPATIndex; i++)
164*35ffd701SAndroid Build Coastguard Worker {
165*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(i);
166*35ffd701SAndroid Build Coastguard Worker if (UsagePATElement.Xe2.L4CC == PAT.Xe2.L4CC &&
167*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.Coherency == PAT.Xe2.Coherency &&
168*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CC == PAT.Xe2.L3CC &&
169*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CLOS == PAT.Xe2.L3CLOS &&
170*35ffd701SAndroid Build Coastguard Worker true == PAT.Xe2.LosslessCompressionEn)
171*35ffd701SAndroid Build Coastguard Worker {
172*35ffd701SAndroid Build Coastguard Worker PATIdxCompressed = i;
173*35ffd701SAndroid Build Coastguard Worker break;
174*35ffd701SAndroid Build Coastguard Worker }
175*35ffd701SAndroid Build Coastguard Worker }
176*35ffd701SAndroid Build Coastguard Worker
177*35ffd701SAndroid Build Coastguard Worker if (PATIdx == -1)
178*35ffd701SAndroid Build Coastguard Worker {
179*35ffd701SAndroid Build Coastguard Worker // Didn't find the caching settings in one of the already programmed PAT table entries.
180*35ffd701SAndroid Build Coastguard Worker // Need to add a new lookup table entry.
181*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(
182*35ffd701SAndroid Build Coastguard Worker "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
183*35ffd701SAndroid Build Coastguard Worker "(we only support NumPATRegisters = %d)",
184*35ffd701SAndroid Build Coastguard Worker CurrentMaxPATIndex);
185*35ffd701SAndroid Build Coastguard Worker CachePolicyError = true;
186*35ffd701SAndroid Build Coastguard Worker
187*35ffd701SAndroid Build Coastguard Worker PATIdx = GMM_PAT_ERROR;
188*35ffd701SAndroid Build Coastguard Worker }
189*35ffd701SAndroid Build Coastguard Worker
190*35ffd701SAndroid Build Coastguard Worker /* Find a PATIndex for a coherent uncompressed case, if usage is 2-way or 1-way already, take that, otherwise search for oneway*/
191*35ffd701SAndroid Build Coastguard Worker if ((UsagePATElement.Xe2.Coherency == GMM_GFX_PHY_COHERENT_ONE_WAY_IA_SNOOP) ||
192*35ffd701SAndroid Build Coastguard Worker (UsagePATElement.Xe2.Coherency == GMM_GFX_PHY_COHERENT_TWO_WAY_IA_GPU_SNOOP))
193*35ffd701SAndroid Build Coastguard Worker {
194*35ffd701SAndroid Build Coastguard Worker //Already coherent
195*35ffd701SAndroid Build Coastguard Worker CoherentPATIdx = PATIdx;
196*35ffd701SAndroid Build Coastguard Worker }
197*35ffd701SAndroid Build Coastguard Worker else
198*35ffd701SAndroid Build Coastguard Worker {
199*35ffd701SAndroid Build Coastguard Worker // search for equivalent one way coherent index
200*35ffd701SAndroid Build Coastguard Worker for (i = 0; i <= CurrentMaxPATIndex; i++)
201*35ffd701SAndroid Build Coastguard Worker {
202*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(i);
203*35ffd701SAndroid Build Coastguard Worker if (UsagePATElement.Xe2.L4CC == PAT.Xe2.L4CC &&
204*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CC == PAT.Xe2.L3CC &&
205*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CLOS == PAT.Xe2.L3CLOS &&
206*35ffd701SAndroid Build Coastguard Worker GMM_GFX_PHY_COHERENT_ONE_WAY_IA_SNOOP == PAT.Xe2.Coherency)
207*35ffd701SAndroid Build Coastguard Worker {
208*35ffd701SAndroid Build Coastguard Worker if ((false == PAT.Xe2.LosslessCompressionEn) && (CoherentPATIdx == -1))
209*35ffd701SAndroid Build Coastguard Worker {
210*35ffd701SAndroid Build Coastguard Worker CoherentPATIdx = i;
211*35ffd701SAndroid Build Coastguard Worker }
212*35ffd701SAndroid Build Coastguard Worker if (CoherentPATIdx != -1)
213*35ffd701SAndroid Build Coastguard Worker {
214*35ffd701SAndroid Build Coastguard Worker break;
215*35ffd701SAndroid Build Coastguard Worker }
216*35ffd701SAndroid Build Coastguard Worker }
217*35ffd701SAndroid Build Coastguard Worker }
218*35ffd701SAndroid Build Coastguard Worker if (CoherentPATIdx == -1)
219*35ffd701SAndroid Build Coastguard Worker {
220*35ffd701SAndroid Build Coastguard Worker //redo matching based on L3:UC, L4:UC, we should find one
221*35ffd701SAndroid Build Coastguard Worker for (i = 0; i <= CurrentMaxPATIndex; i++)
222*35ffd701SAndroid Build Coastguard Worker {
223*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT PAT = GetPrivatePATEntry(i);
224*35ffd701SAndroid Build Coastguard Worker if (GMM_GFX_PHY_L4_MT_UC == PAT.Xe2.L4CC &&
225*35ffd701SAndroid Build Coastguard Worker GMM_GFX_PHY_L3_MT_UC == PAT.Xe2.L3CC &&
226*35ffd701SAndroid Build Coastguard Worker UsagePATElement.Xe2.L3CLOS == PAT.Xe2.L3CLOS &&
227*35ffd701SAndroid Build Coastguard Worker GMM_GFX_PHY_COHERENT_ONE_WAY_IA_SNOOP == PAT.Xe2.Coherency)
228*35ffd701SAndroid Build Coastguard Worker {
229*35ffd701SAndroid Build Coastguard Worker if ((false == PAT.Xe2.LosslessCompressionEn) && (CoherentPATIdx == -1))
230*35ffd701SAndroid Build Coastguard Worker {
231*35ffd701SAndroid Build Coastguard Worker CoherentPATIdx = i;
232*35ffd701SAndroid Build Coastguard Worker }
233*35ffd701SAndroid Build Coastguard Worker
234*35ffd701SAndroid Build Coastguard Worker if (CoherentPATIdx != -1)
235*35ffd701SAndroid Build Coastguard Worker {
236*35ffd701SAndroid Build Coastguard Worker break;
237*35ffd701SAndroid Build Coastguard Worker }
238*35ffd701SAndroid Build Coastguard Worker }
239*35ffd701SAndroid Build Coastguard Worker }
240*35ffd701SAndroid Build Coastguard Worker }
241*35ffd701SAndroid Build Coastguard Worker }
242*35ffd701SAndroid Build Coastguard Worker }
243*35ffd701SAndroid Build Coastguard Worker
244*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].PATIndex = PATIdx;
245*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].CoherentPATIndex = GET_COHERENT_PATINDEX_LOWER_BITS(CoherentPATIdx); // Coherent uncompressed lower bits
246*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].CoherentPATIndexHigherBit = GET_COHERENT_PATINDEX_HIGHER_BIT(CoherentPATIdx); // Coherent uncompressed higher bits
247*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].PATIndexCompressed = PATIdxCompressed;
248*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].PTE.DwordValue = GMM_GET_PTE_BITS_FROM_PAT_IDX(PATIdx) & 0xFFFFFFFF;
249*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].PTE.HighDwordValue = GMM_GET_PTE_BITS_FROM_PAT_IDX(PATIdx) >> 32;
250*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].MemoryObjectOverride.XE_HP.Index = CPTblIdx;
251*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].MemoryObjectOverride.XE_HP.EncryptedData = 0;
252*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].Override = ALWAYS_OVERRIDE;
253*35ffd701SAndroid Build Coastguard Worker
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
259*35ffd701SAndroid Build Coastguard Worker return GMM_INVALIDPARAM;
260*35ffd701SAndroid Build Coastguard Worker }
261*35ffd701SAndroid Build Coastguard Worker }
262*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
263*35ffd701SAndroid Build Coastguard Worker }
264*35ffd701SAndroid Build Coastguard Worker
265*35ffd701SAndroid Build Coastguard Worker //=============================================================================
266*35ffd701SAndroid Build Coastguard Worker //
267*35ffd701SAndroid Build Coastguard Worker // Function: __:GetL3L4
268*35ffd701SAndroid Build Coastguard Worker //
269*35ffd701SAndroid Build Coastguard Worker // Desc: This function // converting GMM indicative values to actual register values
270*35ffd701SAndroid Build Coastguard Worker //
271*35ffd701SAndroid Build Coastguard Worker // Parameters:
272*35ffd701SAndroid Build Coastguard Worker //
273*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
274*35ffd701SAndroid Build Coastguard Worker //
275*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
276*35ffd701SAndroid Build Coastguard Worker
GetL3L4(GMM_CACHE_POLICY_TBL_ELEMENT * pUsageEle,GMM_XE2_PRIVATE_PAT * pUsagePATElement,uint32_t Usage)277*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe2_LPGCachePolicy::GetL3L4(GMM_CACHE_POLICY_TBL_ELEMENT *pUsageEle, GMM_XE2_PRIVATE_PAT *pUsagePATElement, uint32_t Usage)
278*35ffd701SAndroid Build Coastguard Worker {
279*35ffd701SAndroid Build Coastguard Worker
280*35ffd701SAndroid Build Coastguard Worker //MOCS
281*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.Reserved0 = pUsageEle->L3.PhysicalL3.Reserved = 0;
282*35ffd701SAndroid Build Coastguard Worker //L3CLOS
283*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L3CLOS = 0;
284*35ffd701SAndroid Build Coastguard Worker //IgPAT
285*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.igPAT = pCachePolicy[Usage].IgnorePAT;
286*35ffd701SAndroid Build Coastguard Worker
287*35ffd701SAndroid Build Coastguard Worker
288*35ffd701SAndroid Build Coastguard Worker //PAT
289*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.Reserved1 = 0;
290*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.Reserved2 = 0;
291*35ffd701SAndroid Build Coastguard Worker
292*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L3CLOS = 0;
293*35ffd701SAndroid Build Coastguard Worker switch (pCachePolicy[Usage].L3CC)
294*35ffd701SAndroid Build Coastguard Worker {
295*35ffd701SAndroid Build Coastguard Worker case GMM_UC:
296*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L3CC = GMM_GFX_PHY_L3_MT_UC;
297*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L3CC = GMM_GFX_PHY_L3_MT_UC;
298*35ffd701SAndroid Build Coastguard Worker break;
299*35ffd701SAndroid Build Coastguard Worker case GMM_WB:
300*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L3CC = GMM_GFX_PHY_L3_MT_WB;
301*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L3CC = GMM_GFX_PHY_L3_MT_WB;
302*35ffd701SAndroid Build Coastguard Worker break;
303*35ffd701SAndroid Build Coastguard Worker case GMM_WBTD:
304*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L3CC = GMM_GFX_PHY_L3_MT_WB_XD; // Transient:Display on Xe2
305*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L3CC = GMM_GFX_PHY_L3_MT_WB_XD;
306*35ffd701SAndroid Build Coastguard Worker break;
307*35ffd701SAndroid Build Coastguard Worker default:
308*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L3CC = GMM_GFX_PHY_L3_MT_UC;
309*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L3CC = GMM_GFX_PHY_L3_MT_UC;
310*35ffd701SAndroid Build Coastguard Worker }
311*35ffd701SAndroid Build Coastguard Worker
312*35ffd701SAndroid Build Coastguard Worker switch (pCachePolicy[Usage].L4CC)
313*35ffd701SAndroid Build Coastguard Worker {
314*35ffd701SAndroid Build Coastguard Worker case GMM_UC:
315*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L4CC = GMM_GFX_PHY_L4_MT_UC;
316*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L4CC = GMM_GFX_PHY_L4_MT_UC;
317*35ffd701SAndroid Build Coastguard Worker break;
318*35ffd701SAndroid Build Coastguard Worker case GMM_WB:
319*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L4CC = GMM_GFX_PHY_L4_MT_WB;
320*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L4CC = GMM_GFX_PHY_L4_MT_WB;
321*35ffd701SAndroid Build Coastguard Worker break;
322*35ffd701SAndroid Build Coastguard Worker case GMM_WT:
323*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L4CC = GMM_GFX_PHY_L4_MT_WT;
324*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L4CC = GMM_GFX_PHY_L4_MT_WT;
325*35ffd701SAndroid Build Coastguard Worker break;
326*35ffd701SAndroid Build Coastguard Worker default:
327*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L4CC = GMM_GFX_PHY_L4_MT_UC;
328*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L4CC = GMM_GFX_PHY_L4_MT_UC;
329*35ffd701SAndroid Build Coastguard Worker }
330*35ffd701SAndroid Build Coastguard Worker
331*35ffd701SAndroid Build Coastguard Worker switch (pCachePolicy[Usage].Coherency)
332*35ffd701SAndroid Build Coastguard Worker {
333*35ffd701SAndroid Build Coastguard Worker case GMM_NON_COHERENT_NO_SNOOP:
334*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.Coherency = GMM_GFX_NON_COHERENT_NO_SNOOP;
335*35ffd701SAndroid Build Coastguard Worker break;
336*35ffd701SAndroid Build Coastguard Worker case GMM_COHERENT_ONE_WAY_IA_SNOOP:
337*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.Coherency = GMM_GFX_COHERENT_ONE_WAY_IA_SNOOP;
338*35ffd701SAndroid Build Coastguard Worker break;
339*35ffd701SAndroid Build Coastguard Worker case GMM_COHERENT_TWO_WAY_IA_GPU_SNOOP:
340*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.Coherency = GMM_GFX_COHERENT_TWO_WAY_IA_GPU_SNOOP;
341*35ffd701SAndroid Build Coastguard Worker break;
342*35ffd701SAndroid Build Coastguard Worker default:
343*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.Coherency = GMM_GFX_NON_COHERENT_NO_SNOOP;
344*35ffd701SAndroid Build Coastguard Worker break;
345*35ffd701SAndroid Build Coastguard Worker }
346*35ffd701SAndroid Build Coastguard Worker
347*35ffd701SAndroid Build Coastguard Worker if (pGmmLibContext->GetWaTable().Wa_14018443005 &&
348*35ffd701SAndroid Build Coastguard Worker (pCachePolicy[Usage].L3CC == GMM_UC) &&
349*35ffd701SAndroid Build Coastguard Worker (ISWA_1401844305USAGE(Usage)) &&
350*35ffd701SAndroid Build Coastguard Worker (pGmmLibContext->GetClientType() != GMM_KMD_VISTA) &&
351*35ffd701SAndroid Build Coastguard Worker (pGmmLibContext->GetClientType() != GMM_OCL_VISTA))
352*35ffd701SAndroid Build Coastguard Worker {
353*35ffd701SAndroid Build Coastguard Worker pUsageEle->L3.PhysicalL3.L3CC = GMM_GFX_PHY_L3_MT_WB;
354*35ffd701SAndroid Build Coastguard Worker pUsagePATElement->Xe2.L3CC = GMM_GFX_PHY_L3_MT_WB;
355*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].L3CC = GMM_WB;
356*35ffd701SAndroid Build Coastguard Worker }
357*35ffd701SAndroid Build Coastguard Worker }
358*35ffd701SAndroid Build Coastguard Worker
359*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
360*35ffd701SAndroid Build Coastguard Worker /// A simple getter function returning the PAT (cache policy) for a given
361*35ffd701SAndroid Build Coastguard Worker /// use Usage of the named resource pResInfo.
362*35ffd701SAndroid Build Coastguard Worker /// Typically used to populate PPGTT/GGTT.
363*35ffd701SAndroid Build Coastguard Worker ///
364*35ffd701SAndroid Build Coastguard Worker /// @param[in] pResInfo: Resource info for resource, can be NULL.
365*35ffd701SAndroid Build Coastguard Worker /// @param[in] Usage: Current usage for resource.
366*35ffd701SAndroid Build Coastguard Worker /// @param[in] pCompressionEnabl: for Xe2 compression parameter
367*35ffd701SAndroid Build Coastguard Worker /// @param[in] IsCpuCacheable: Indicates Cacheability
368*35ffd701SAndroid Build Coastguard Worker /// @return PATIndex
369*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetPATIndex(GMM_RESOURCE_INFO * pResInfo,GMM_RESOURCE_USAGE_TYPE Usage,bool * pCompressionEnable,bool IsCpuCacheable)370*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmXe2_LPGCachePolicy::CachePolicyGetPATIndex(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage, bool *pCompressionEnable, bool IsCpuCacheable)
371*35ffd701SAndroid Build Coastguard Worker {
372*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pGmmLibContext->GetCachePolicyElement(Usage).Initialized);
373*35ffd701SAndroid Build Coastguard Worker
374*35ffd701SAndroid Build Coastguard Worker uint32_t PATIndex = pGmmLibContext->GetCachePolicyElement(Usage).PATIndex;
375*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_ELEMENT TempElement = pGmmLibContext->GetCachePolicyElement(Usage);
376*35ffd701SAndroid Build Coastguard Worker uint32_t TempCoherentPATIndex = 0;
377*35ffd701SAndroid Build Coastguard Worker
378*35ffd701SAndroid Build Coastguard Worker // This is to check if PATIndexCompressed, CoherentPATIndex are valid
379*35ffd701SAndroid Build Coastguard Worker // Increment by 1 to have the rollover and value resets to 0 if the PAT in not valid.
380*35ffd701SAndroid Build Coastguard Worker TempElement.PATIndexCompressed += 1;
381*35ffd701SAndroid Build Coastguard Worker TempCoherentPATIndex = (uint32_t)GET_COHERENT_PATINDEX_VALUE(pGmmLibContext, Usage);
382*35ffd701SAndroid Build Coastguard Worker
383*35ffd701SAndroid Build Coastguard Worker // Higher bit of CoherentPATIndex would tell us if its a valid or not.0--> valid, 1-->invalid
384*35ffd701SAndroid Build Coastguard Worker uint32_t CoherentPATIndex = (uint32_t)((GET_COHERENT_PATINDEX_HIGHER_BIT(TempCoherentPATIndex) == 1) ? GMM_PAT_ERROR : GET_COHERENT_PATINDEX_VALUE(pGmmLibContext, Usage));
385*35ffd701SAndroid Build Coastguard Worker //For PATIndexCompressed, rollover value would be 0 if its invalid
386*35ffd701SAndroid Build Coastguard Worker uint32_t PATIndexCompressed = (uint32_t)(TempElement.PATIndexCompressed == 0 ? GMM_PAT_ERROR : pGmmLibContext->GetCachePolicyElement(Usage).PATIndexCompressed);
387*35ffd701SAndroid Build Coastguard Worker uint32_t ReturnPATIndex = GMM_PAT_ERROR;
388*35ffd701SAndroid Build Coastguard Worker bool CompressionEnable = (pCompressionEnable) ? *pCompressionEnable : false;
389*35ffd701SAndroid Build Coastguard Worker
390*35ffd701SAndroid Build Coastguard Worker // Prevent wrong Usage for XAdapter resources. UMD does not call GetMemoryObject on shader resources but,
391*35ffd701SAndroid Build Coastguard Worker // when they add it someone could call it without knowing the restriction.
392*35ffd701SAndroid Build Coastguard Worker if (pResInfo &&
393*35ffd701SAndroid Build Coastguard Worker pResInfo->GetResFlags().Info.XAdapter &&
394*35ffd701SAndroid Build Coastguard Worker (Usage != GMM_RESOURCE_USAGE_XADAPTER_SHARED_RESOURCE))
395*35ffd701SAndroid Build Coastguard Worker {
396*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
397*35ffd701SAndroid Build Coastguard Worker }
398*35ffd701SAndroid Build Coastguard Worker
399*35ffd701SAndroid Build Coastguard Worker #if (defined __linux__ || defined(WDDM_LINUX))
400*35ffd701SAndroid Build Coastguard Worker IsCpuCacheable = false;
401*35ffd701SAndroid Build Coastguard Worker #endif
402*35ffd701SAndroid Build Coastguard Worker // requested compressed and coherent
403*35ffd701SAndroid Build Coastguard Worker if (CompressionEnable && IsCpuCacheable)
404*35ffd701SAndroid Build Coastguard Worker {
405*35ffd701SAndroid Build Coastguard Worker // return coherent uncompressed
406*35ffd701SAndroid Build Coastguard Worker ReturnPATIndex = CoherentPATIndex;
407*35ffd701SAndroid Build Coastguard Worker CompressionEnable = false;
408*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(false, "Coherent Compressed is not supported on Xe2. However, respecting the coherency and returning CoherentPATIndex");
409*35ffd701SAndroid Build Coastguard Worker }
410*35ffd701SAndroid Build Coastguard Worker // requested compressed only
411*35ffd701SAndroid Build Coastguard Worker else if (CompressionEnable)
412*35ffd701SAndroid Build Coastguard Worker {
413*35ffd701SAndroid Build Coastguard Worker
414*35ffd701SAndroid Build Coastguard Worker if (GMM_PAT_ERROR != PATIndexCompressed)
415*35ffd701SAndroid Build Coastguard Worker {
416*35ffd701SAndroid Build Coastguard Worker // return compresed, may or may not coherent which depends on orinigal usage
417*35ffd701SAndroid Build Coastguard Worker ReturnPATIndex = PATIndexCompressed;
418*35ffd701SAndroid Build Coastguard Worker CompressionEnable = true;
419*35ffd701SAndroid Build Coastguard Worker }
420*35ffd701SAndroid Build Coastguard Worker else
421*35ffd701SAndroid Build Coastguard Worker {
422*35ffd701SAndroid Build Coastguard Worker // return original index
423*35ffd701SAndroid Build Coastguard Worker ReturnPATIndex = PATIndex;
424*35ffd701SAndroid Build Coastguard Worker CompressionEnable = false;
425*35ffd701SAndroid Build Coastguard Worker }
426*35ffd701SAndroid Build Coastguard Worker }
427*35ffd701SAndroid Build Coastguard Worker // requested coherent only
428*35ffd701SAndroid Build Coastguard Worker else if (IsCpuCacheable)
429*35ffd701SAndroid Build Coastguard Worker {
430*35ffd701SAndroid Build Coastguard Worker //return coherent uncompressed
431*35ffd701SAndroid Build Coastguard Worker ReturnPATIndex = CoherentPATIndex;
432*35ffd701SAndroid Build Coastguard Worker CompressionEnable = false;
433*35ffd701SAndroid Build Coastguard Worker }
434*35ffd701SAndroid Build Coastguard Worker /* Requested UnCompressed PAT */
435*35ffd701SAndroid Build Coastguard Worker else
436*35ffd701SAndroid Build Coastguard Worker {
437*35ffd701SAndroid Build Coastguard Worker if (GMM_PAT_ERROR != PATIndex)
438*35ffd701SAndroid Build Coastguard Worker {
439*35ffd701SAndroid Build Coastguard Worker ReturnPATIndex = PATIndex;
440*35ffd701SAndroid Build Coastguard Worker CompressionEnable = false;
441*35ffd701SAndroid Build Coastguard Worker }
442*35ffd701SAndroid Build Coastguard Worker }
443*35ffd701SAndroid Build Coastguard Worker
444*35ffd701SAndroid Build Coastguard Worker /* No valid PAT Index found */
445*35ffd701SAndroid Build Coastguard Worker if (GMM_PAT_ERROR == ReturnPATIndex)
446*35ffd701SAndroid Build Coastguard Worker {
447*35ffd701SAndroid Build Coastguard Worker ReturnPATIndex = GMM_XE2_DEFAULT_PAT_INDEX; //default to uncached PAT index 2: GMM_CP_NON_COHERENT_UC
448*35ffd701SAndroid Build Coastguard Worker CompressionEnable = false;
449*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
450*35ffd701SAndroid Build Coastguard Worker }
451*35ffd701SAndroid Build Coastguard Worker
452*35ffd701SAndroid Build Coastguard Worker if (pCompressionEnable)
453*35ffd701SAndroid Build Coastguard Worker {
454*35ffd701SAndroid Build Coastguard Worker *pCompressionEnable = CompressionEnable;
455*35ffd701SAndroid Build Coastguard Worker }
456*35ffd701SAndroid Build Coastguard Worker
457*35ffd701SAndroid Build Coastguard Worker return ReturnPATIndex;
458*35ffd701SAndroid Build Coastguard Worker }
459*35ffd701SAndroid Build Coastguard Worker
460*35ffd701SAndroid Build Coastguard Worker //=============================================================================
461*35ffd701SAndroid Build Coastguard Worker //
462*35ffd701SAndroid Build Coastguard Worker // Function: SetUpMOCSTable
463*35ffd701SAndroid Build Coastguard Worker //
464*35ffd701SAndroid Build Coastguard Worker // Desc:
465*35ffd701SAndroid Build Coastguard Worker //
466*35ffd701SAndroid Build Coastguard Worker // Parameters:
467*35ffd701SAndroid Build Coastguard Worker //
468*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
469*35ffd701SAndroid Build Coastguard Worker //
470*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetUpMOCSTable()471*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmXe2_LPGCachePolicy::SetUpMOCSTable()
472*35ffd701SAndroid Build Coastguard Worker {
473*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT *pCachePolicyTlbElement = &(pGmmLibContext->GetCachePolicyTlbElement()[0]);
474*35ffd701SAndroid Build Coastguard Worker
475*35ffd701SAndroid Build Coastguard Worker #define L4_WB (0x0)
476*35ffd701SAndroid Build Coastguard Worker #define L4_WT (0x1)
477*35ffd701SAndroid Build Coastguard Worker #define L4_UC (0x3)
478*35ffd701SAndroid Build Coastguard Worker
479*35ffd701SAndroid Build Coastguard Worker #define L3_WB (0x0)
480*35ffd701SAndroid Build Coastguard Worker #define L3_XD (pGmmLibContext->GetSkuTable().FtrL3TransientDataFlush ? 0x1 : 0x0)
481*35ffd701SAndroid Build Coastguard Worker #define L3_UC (0x3)
482*35ffd701SAndroid Build Coastguard Worker
483*35ffd701SAndroid Build Coastguard Worker #define GMM_DEFINE_MOCS(indx, L4Caching, L3Caching, L3ClassOfService, ignorePAT) \
484*35ffd701SAndroid Build Coastguard Worker { \
485*35ffd701SAndroid Build Coastguard Worker pCachePolicyTlbElement[indx].L3.PhysicalL3.L4CC = L4Caching; \
486*35ffd701SAndroid Build Coastguard Worker pCachePolicyTlbElement[indx].L3.PhysicalL3.Reserved0 = 0; \
487*35ffd701SAndroid Build Coastguard Worker pCachePolicyTlbElement[indx].L3.PhysicalL3.L3CC = L3Caching; \
488*35ffd701SAndroid Build Coastguard Worker pCachePolicyTlbElement[indx].L3.PhysicalL3.L3CLOS = L3ClassOfService; \
489*35ffd701SAndroid Build Coastguard Worker pCachePolicyTlbElement[indx].L3.PhysicalL3.igPAT = ignorePAT; \
490*35ffd701SAndroid Build Coastguard Worker }
491*35ffd701SAndroid Build Coastguard Worker
492*35ffd701SAndroid Build Coastguard Worker // clang-format off
493*35ffd701SAndroid Build Coastguard Worker // Default MOCS Table
494*35ffd701SAndroid Build Coastguard Worker for(uint32_t j = 0; j < GMM_XE2_NUM_MOCS_ENTRIES; j++)
495*35ffd701SAndroid Build Coastguard Worker { // Index CachingPolicy L3Caching L3ClassOfService ignorePAT
496*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_MOCS( j, L4_UC, L3_UC, 0 , 0 )
497*35ffd701SAndroid Build Coastguard Worker }
498*35ffd701SAndroid Build Coastguard Worker
499*35ffd701SAndroid Build Coastguard Worker // Index L4 CachingPolicy L3 CachingPolicy L3 CLOS ignorePAT
500*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_MOCS( 0 , L4_UC , L3_WB , 0 , 0) // Defer to PAT
501*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_MOCS( 1 , L4_UC , L3_WB , 0 , 1) // L3
502*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_MOCS( 2 , L4_WB , L3_UC , 0 , 1) // L4
503*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_MOCS( 3 , L4_UC , L3_UC , 0 , 1) // UC
504*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_MOCS( 4 , L4_WB , L3_WB , 0 , 1) // L3+L4
505*35ffd701SAndroid Build Coastguard Worker
506*35ffd701SAndroid Build Coastguard Worker CurrentMaxMocsIndex = 4;
507*35ffd701SAndroid Build Coastguard Worker CurrentMaxL1HdcMocsIndex = 0;
508*35ffd701SAndroid Build Coastguard Worker CurrentMaxSpecialMocsIndex = 0;
509*35ffd701SAndroid Build Coastguard Worker // clang-format on
510*35ffd701SAndroid Build Coastguard Worker
511*35ffd701SAndroid Build Coastguard Worker #undef GMM_DEFINE_MOCS
512*35ffd701SAndroid Build Coastguard Worker #undef L4_WB
513*35ffd701SAndroid Build Coastguard Worker #undef L4_WT
514*35ffd701SAndroid Build Coastguard Worker #undef L4_UC
515*35ffd701SAndroid Build Coastguard Worker
516*35ffd701SAndroid Build Coastguard Worker #undef L3_WB
517*35ffd701SAndroid Build Coastguard Worker #undef L3_XD
518*35ffd701SAndroid Build Coastguard Worker #undef L3_UC
519*35ffd701SAndroid Build Coastguard Worker }
520*35ffd701SAndroid Build Coastguard Worker
521*35ffd701SAndroid Build Coastguard Worker
522*35ffd701SAndroid Build Coastguard Worker //=============================================================================
523*35ffd701SAndroid Build Coastguard Worker //
524*35ffd701SAndroid Build Coastguard Worker // Function: SetupPAT
525*35ffd701SAndroid Build Coastguard Worker //
526*35ffd701SAndroid Build Coastguard Worker // Desc:
527*35ffd701SAndroid Build Coastguard Worker //
528*35ffd701SAndroid Build Coastguard Worker // Parameters:
529*35ffd701SAndroid Build Coastguard Worker //
530*35ffd701SAndroid Build Coastguard Worker // Return: GMM_STATUS
531*35ffd701SAndroid Build Coastguard Worker //
532*35ffd701SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
SetupPAT()533*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmXe2_LPGCachePolicy::SetupPAT()
534*35ffd701SAndroid Build Coastguard Worker {
535*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT *pPATTlbElement = &(pGmmLibContext->GetPrivatePATTable()[0]);
536*35ffd701SAndroid Build Coastguard Worker
537*35ffd701SAndroid Build Coastguard Worker #define L4_WB (0x0)
538*35ffd701SAndroid Build Coastguard Worker #define L4_WT (0x1)
539*35ffd701SAndroid Build Coastguard Worker #define L4_UC (0x3)
540*35ffd701SAndroid Build Coastguard Worker
541*35ffd701SAndroid Build Coastguard Worker #define L3_WB (0x0)
542*35ffd701SAndroid Build Coastguard Worker #define L3_XD (pGmmLibContext->GetSkuTable().FtrL3TransientDataFlush ? 0x1 : 0x0)
543*35ffd701SAndroid Build Coastguard Worker #define L3_UC (0x3)
544*35ffd701SAndroid Build Coastguard Worker #define L3_XA (0x2) // WB Transient App
545*35ffd701SAndroid Build Coastguard Worker
546*35ffd701SAndroid Build Coastguard Worker #define GMM_DEFINE_PAT_ELEMENT(indx, Coh, L4Caching, L3Caching, L3ClassOfService, CompressionEn, NoCachePromote) \
547*35ffd701SAndroid Build Coastguard Worker { \
548*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.Coherency = Coh; \
549*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.L4CC = L4Caching; \
550*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.Reserved1 = 0; \
551*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.Reserved2 = 0; \
552*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.L3CC = L3Caching; \
553*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.L3CLOS = L3ClassOfService; \
554*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.LosslessCompressionEn = CompressionEn; \
555*35ffd701SAndroid Build Coastguard Worker pPATTlbElement[indx].Xe2.NoCachingPromote = NoCachePromote; \
556*35ffd701SAndroid Build Coastguard Worker }
557*35ffd701SAndroid Build Coastguard Worker
558*35ffd701SAndroid Build Coastguard Worker // clang-format off
559*35ffd701SAndroid Build Coastguard Worker
560*35ffd701SAndroid Build Coastguard Worker // Default PAT Table
561*35ffd701SAndroid Build Coastguard Worker // 32 nos
562*35ffd701SAndroid Build Coastguard Worker for (uint32_t i = 0; i < (NumPATRegisters); i++)
563*35ffd701SAndroid Build Coastguard Worker { // Index Coherency CachingPolicy L3Caching L3ClassOfService CompressionEn NoCachingPromote
564*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( i, 3, L4_UC, L3_UC, 0, 0, 0);
565*35ffd701SAndroid Build Coastguard Worker }
566*35ffd701SAndroid Build Coastguard Worker
567*35ffd701SAndroid Build Coastguard Worker // Fixed PAT Table
568*35ffd701SAndroid Build Coastguard Worker // Index Coherency L4 CachingPolicy L3 CachingPolicy L3 CLOS CompressionEn NoCachingPromote
569*35ffd701SAndroid Build Coastguard Worker //Group: GGT/PPGTT[4]
570*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 0 , 0 , L4_UC , L3_WB , 0 , 0 , 0) // | L3_WB
571*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 1 , 2 , L4_UC , L3_WB , 0 , 0 , 0) // | L3_WB | 1 way coherent
572*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 2 , 3 , L4_UC , L3_WB , 0 , 0 , 0) // | L3_WB | 2 way coherent
573*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 3 , 0 , L4_UC , L3_UC , 0 , 0 , 0) // **UC
574*35ffd701SAndroid Build Coastguard Worker //Group: 1 way Coh
575*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 4 , 2 , L4_WB , L3_UC , 0 , 0 , 0) // L4_WB | 1 way coherent
576*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 5 , 2 , L4_UC , L3_UC , 0 , 0 , 0) // **UC | 1 way coherent
577*35ffd701SAndroid Build Coastguard Worker //Group: Compression Disabled
578*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 6 , 0 , L4_UC , L3_XD , 0 , 0 , 1) // | L3_XD
579*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 7 , 3 , L4_WB , L3_UC , 0 , 0 , 0) // L4_WB | 2 way coherent
580*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 8 , 0 , L4_WB , L3_UC , 0 , 0 , 0) // L4_WB
581*35ffd701SAndroid Build Coastguard Worker //Group: Compression Enabled
582*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 9 , 0 , L4_UC , L3_WB , 0 , 1 , 0) // | L3_WB | Comp
583*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 10 , 0 , L4_WB , L3_UC , 0 , 1 , 0) // L4_WB | Comp
584*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 11 , 0 , L4_UC , L3_XD , 0 , 1 , 1) // | L3_XD | Comp
585*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 12 , 0 , L4_UC , L3_UC , 0 , 1 , 0) // **UC | Comp
586*35ffd701SAndroid Build Coastguard Worker
587*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 13 , 0 , L4_WB , L3_WB , 0 , 0 , 0) // L4_WB | L3_WB
588*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 14 , 0 , L4_WB , L3_WB , 0 , 1 , 0) // L4_WB | L3_WB | Comp
589*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 15 , 0 , L4_WT , L3_XD , 0 , 1 , 1) // L4_WT | L3_XD | Comp
590*35ffd701SAndroid Build Coastguard Worker
591*35ffd701SAndroid Build Coastguard Worker //Reserved 16-19
592*35ffd701SAndroid Build Coastguard Worker //Group: CLOS1
593*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 20 , 0 , L4_UC , L3_WB , 1 , 0 , 0) // | L3_WB
594*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 21 , 0 , L4_UC , L3_WB , 1 , 1 , 0) // | L3_WB | Comp
595*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 22 , 2 , L4_UC , L3_WB , 1 , 0 , 0) // | L3_WB | 1 way coherent
596*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 23 , 3 , L4_UC , L3_WB , 1 , 0 , 0) // | L3_WB | 2 way coherent
597*35ffd701SAndroid Build Coastguard Worker //Group:CLOS2=>Clone of CLOS1
598*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 24 , 0 , L4_UC , L3_WB , 2 , 0 , 0) // | L3_WB
599*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 25 , 0 , L4_UC , L3_WB , 2 , 1 , 0) // | L3_WB | Comp
600*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 26 , 2 , L4_UC , L3_WB , 2 , 0 , 0) // | L3_WB | 1 way coherent
601*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 27 , 3 , L4_UC , L3_WB , 2 , 0 , 0) // | L3_WB | 2 way coherent
602*35ffd701SAndroid Build Coastguard Worker //Group:CLOS3=>Clone of CLOS1
603*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 28 , 0 , L4_UC , L3_WB , 3 , 0 , 0) // | L3_WB
604*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 29 , 0 , L4_UC , L3_WB , 3 , 1 , 0) // | L3_WB | Comp
605*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 30 , 2 , L4_UC , L3_WB , 3 , 0 , 0) // | L3_WB | 1 way coherent
606*35ffd701SAndroid Build Coastguard Worker GMM_DEFINE_PAT_ELEMENT( 31 , 3 , L4_UC , L3_WB , 3 , 0 , 0) // | L3_WB | 2 way coherent
607*35ffd701SAndroid Build Coastguard Worker
608*35ffd701SAndroid Build Coastguard Worker CurrentMaxPATIndex = 31;
609*35ffd701SAndroid Build Coastguard Worker
610*35ffd701SAndroid Build Coastguard Worker // clang-format on
611*35ffd701SAndroid Build Coastguard Worker #undef GMM_DEFINE_PAT
612*35ffd701SAndroid Build Coastguard Worker #undef L4_WB
613*35ffd701SAndroid Build Coastguard Worker #undef L4_WT
614*35ffd701SAndroid Build Coastguard Worker #undef L4_UC
615*35ffd701SAndroid Build Coastguard Worker
616*35ffd701SAndroid Build Coastguard Worker #undef L3_WB
617*35ffd701SAndroid Build Coastguard Worker #undef L3_XD
618*35ffd701SAndroid Build Coastguard Worker #undef L3_UC
619*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
620*35ffd701SAndroid Build Coastguard Worker }
621