1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker
23*35ffd701SAndroid Build Coastguard Worker #include "Internal/Common/GmmLibInc.h"
24*35ffd701SAndroid Build Coastguard Worker #include "External/Common/GmmCachePolicy.h"
25*35ffd701SAndroid Build Coastguard Worker
26*35ffd701SAndroid Build Coastguard Worker //=============================================================================
27*35ffd701SAndroid Build Coastguard Worker //
28*35ffd701SAndroid Build Coastguard Worker // Function: __GmmGen9InitCachePolicy
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::GmmGen9CachePolicy::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 #if defined(GMM_DYNAMIC_MOCS_TABLE)
43*35ffd701SAndroid Build Coastguard Worker #define DEFINE_CACHE_ELEMENT(usage, llc, ellc, l3, age, i915) DEFINE_CP_ELEMENT(usage, llc, ellc, l3, 0, age, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
44*35ffd701SAndroid Build Coastguard Worker #else
45*35ffd701SAndroid Build Coastguard Worker // i915 only supports three GEN9 MOCS entires:
46*35ffd701SAndroid Build Coastguard Worker // MOCS[0]...LLC=0, ELLC=0, L3=0, AGE=0
47*35ffd701SAndroid Build Coastguard Worker // MOCS[1]...<N/A for GmmLib Purposes>
48*35ffd701SAndroid Build Coastguard Worker // MOCS[2]...LLC=1, ELLC=1, L3=1, AGE=3
49*35ffd701SAndroid Build Coastguard Worker #define DEFINE_CACHE_ELEMENT(usage, llc, ellc, l3, age, i915) \
50*35ffd701SAndroid Build Coastguard Worker do \
51*35ffd701SAndroid Build Coastguard Worker { \
52*35ffd701SAndroid Build Coastguard Worker if((i915) == 0) \
53*35ffd701SAndroid Build Coastguard Worker { \
54*35ffd701SAndroid Build Coastguard Worker DEFINE_CP_ELEMENT(usage, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\
55*35ffd701SAndroid Build Coastguard Worker } \
56*35ffd701SAndroid Build Coastguard Worker else if((i915) == 2) \
57*35ffd701SAndroid Build Coastguard Worker { \
58*35ffd701SAndroid Build Coastguard Worker DEFINE_CP_ELEMENT(usage, 1, 1, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\
59*35ffd701SAndroid Build Coastguard Worker } \
60*35ffd701SAndroid Build Coastguard Worker else \
61*35ffd701SAndroid Build Coastguard Worker { \
62*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(0, "Invalid i915 MOCS specified"); \
63*35ffd701SAndroid Build Coastguard Worker } \
64*35ffd701SAndroid Build Coastguard Worker } while(0) ////////////////////////////////////////////////////////////////
65*35ffd701SAndroid Build Coastguard Worker #endif
66*35ffd701SAndroid Build Coastguard Worker #include "GmmGen9CachePolicy.h"
67*35ffd701SAndroid Build Coastguard Worker
68*35ffd701SAndroid Build Coastguard Worker #define TC_LLC (1)
69*35ffd701SAndroid Build Coastguard Worker #define TC_ELLC (0)
70*35ffd701SAndroid Build Coastguard Worker #define TC_LLC_ELLC (2)
71*35ffd701SAndroid Build Coastguard Worker
72*35ffd701SAndroid Build Coastguard Worker #define LeCC_UNCACHEABLE (0x1)
73*35ffd701SAndroid Build Coastguard Worker #define LeCC_WB_CACHEABLE (0x3)
74*35ffd701SAndroid Build Coastguard Worker
75*35ffd701SAndroid Build Coastguard Worker #define L3_UNCACHEABLE (0x1)
76*35ffd701SAndroid Build Coastguard Worker #define L3_WB_CACHEABLE (0x3)
77*35ffd701SAndroid Build Coastguard Worker
78*35ffd701SAndroid Build Coastguard Worker #define DISABLE_SKIP_CACHING_CONTROL (0x0)
79*35ffd701SAndroid Build Coastguard Worker #define ENABLE_SKIP_CACHING_CONTROL (0x1)
80*35ffd701SAndroid Build Coastguard Worker
81*35ffd701SAndroid Build Coastguard Worker {
82*35ffd701SAndroid Build Coastguard Worker uint32_t CurrentMaxIndex = 0;
83*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT *pCachePolicyTblElement = pGmmLibContext->GetCachePolicyTlbElement();
84*35ffd701SAndroid Build Coastguard Worker
85*35ffd701SAndroid Build Coastguard Worker bool LLC = (pGmmLibContext->GetGtSysInfo()->LLCCacheSizeInKb > 0); // aka "Core -vs- Atom".
86*35ffd701SAndroid Build Coastguard Worker
87*35ffd701SAndroid Build Coastguard Worker #if defined(_WIN32)
88*35ffd701SAndroid Build Coastguard Worker {
89*35ffd701SAndroid Build Coastguard Worker pCachePolicyTblElement[0].L3.Cacheability = L3_UNCACHEABLE;
90*35ffd701SAndroid Build Coastguard Worker pCachePolicyTblElement[0].LeCC.Cacheability = LeCC_UNCACHEABLE;
91*35ffd701SAndroid Build Coastguard Worker pCachePolicyTblElement[0].LeCC.TargetCache = LLC ? TC_LLC_ELLC : TC_ELLC; // No LLC for Broxton, GLK - keep clear configuration for LLC
92*35ffd701SAndroid Build Coastguard Worker }
93*35ffd701SAndroid Build Coastguard Worker #else
94*35ffd701SAndroid Build Coastguard Worker {
95*35ffd701SAndroid Build Coastguard Worker #define I915_GEN9_MOCS_ENTRIES 3
96*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT *pEntry = pCachePolicyTblElement;
97*35ffd701SAndroid Build Coastguard Worker C_ASSERT(I915_GEN9_MOCS_ENTRIES <= GMM_GEN9_MAX_NUMBER_MOCS_INDEXES);
98*35ffd701SAndroid Build Coastguard Worker
99*35ffd701SAndroid Build Coastguard Worker // I915_MOCS_UNCACHED(0)...
100*35ffd701SAndroid Build Coastguard Worker pEntry[0].L3.Cacheability = L3_UNCACHEABLE;
101*35ffd701SAndroid Build Coastguard Worker pEntry[0].LeCC.Cacheability = LeCC_UNCACHEABLE;
102*35ffd701SAndroid Build Coastguard Worker pEntry[0].LeCC.TargetCache = TC_LLC_ELLC;
103*35ffd701SAndroid Build Coastguard Worker
104*35ffd701SAndroid Build Coastguard Worker // I915_MOCS_PTE(1)...
105*35ffd701SAndroid Build Coastguard Worker pEntry[1] = pEntry[0]; // Unused by GmmLib clients, so set to UC.
106*35ffd701SAndroid Build Coastguard Worker CurrentMaxIndex++;
107*35ffd701SAndroid Build Coastguard Worker
108*35ffd701SAndroid Build Coastguard Worker // I915_MOCS_CACHED(2)...
109*35ffd701SAndroid Build Coastguard Worker pEntry[2].L3.Cacheability = L3_WB_CACHEABLE;
110*35ffd701SAndroid Build Coastguard Worker pEntry[2].LeCC.Cacheability = LLC ? LeCC_WB_CACHEABLE : LeCC_UNCACHEABLE;
111*35ffd701SAndroid Build Coastguard Worker pEntry[2].LeCC.TargetCache = TC_LLC_ELLC;
112*35ffd701SAndroid Build Coastguard Worker pEntry[2].LeCC.LRUM = 3;
113*35ffd701SAndroid Build Coastguard Worker CurrentMaxIndex++;
114*35ffd701SAndroid Build Coastguard Worker }
115*35ffd701SAndroid Build Coastguard Worker #endif
116*35ffd701SAndroid Build Coastguard Worker
117*35ffd701SAndroid Build Coastguard Worker // Process the cache policy and fill in the look up table
118*35ffd701SAndroid Build Coastguard Worker for(uint32_t Usage = 0; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
119*35ffd701SAndroid Build Coastguard Worker {
120*35ffd701SAndroid Build Coastguard Worker bool CachePolicyError = false;
121*35ffd701SAndroid Build Coastguard Worker uint64_t PTEValue = 0;
122*35ffd701SAndroid Build Coastguard Worker int32_t CPTblIdx = -1;
123*35ffd701SAndroid Build Coastguard Worker uint32_t j = 0;
124*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT UsageEle = {0};
125*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.Reserved = 0; // Reserved bits zeroe'd, this is so we
126*35ffd701SAndroid Build Coastguard Worker // we can compare the unioned LeCC.DwordValue.
127*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.SCF = pCachePolicy[Usage].SCF;
128*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.PFM = 0; // TODO: decide what the page faulting mode should be
129*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.SCC = 0;
130*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.ESC = 0;
131*35ffd701SAndroid Build Coastguard Worker if(pCachePolicy[Usage].LeCC_SCC)
132*35ffd701SAndroid Build Coastguard Worker {
133*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.SCC = pCachePolicy[Usage].LeCC_SCC;
134*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.ESC = ENABLE_SKIP_CACHING_CONTROL;
135*35ffd701SAndroid Build Coastguard Worker }
136*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.AOM = pCachePolicy[Usage].AOM;
137*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.LRUM = pCachePolicy[Usage].AGE;
138*35ffd701SAndroid Build Coastguard Worker
139*35ffd701SAndroid Build Coastguard Worker // default to LLC/ELLC target cache.
140*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.TargetCache = TC_LLC_ELLC;
141*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.Cacheability = LeCC_WB_CACHEABLE;
142*35ffd701SAndroid Build Coastguard Worker
143*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetPlatformInfo().Platform.eProductFamily == IGFX_BROXTON ||
144*35ffd701SAndroid Build Coastguard Worker pGmmLibContext->GetPlatformInfo().Platform.eProductFamily == IGFX_GEMINILAKE)
145*35ffd701SAndroid Build Coastguard Worker {
146*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.AOM = 0;
147*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.Cacheability = LeCC_UNCACHEABLE; // To avoid side effects use 01b even though 01b(UC) 11b(WB) are equivalent option
148*35ffd701SAndroid Build Coastguard Worker
149*35ffd701SAndroid Build Coastguard Worker #if defined(GMM_DYNAMIC_MOCS_TABLE)
150*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.TargetCache = TC_LLC; // No LLC for Broxton, but we still set it to LLC since it is needed for IA coherency cases
151*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.LRUM = 0;
152*35ffd701SAndroid Build Coastguard Worker #else
153*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.TargetCache = TC_LLC_ELLC; // To match I915_GEN9_MOCS[0]
154*35ffd701SAndroid Build Coastguard Worker #endif
155*35ffd701SAndroid Build Coastguard Worker }
156*35ffd701SAndroid Build Coastguard Worker else
157*35ffd701SAndroid Build Coastguard Worker {
158*35ffd701SAndroid Build Coastguard Worker if(pCachePolicy[Usage].LLC && pCachePolicy[Usage].ELLC)
159*35ffd701SAndroid Build Coastguard Worker {
160*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.TargetCache = TC_LLC_ELLC;
161*35ffd701SAndroid Build Coastguard Worker }
162*35ffd701SAndroid Build Coastguard Worker else if(pCachePolicy[Usage].LLC)
163*35ffd701SAndroid Build Coastguard Worker {
164*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.TargetCache = TC_LLC;
165*35ffd701SAndroid Build Coastguard Worker }
166*35ffd701SAndroid Build Coastguard Worker else if(pCachePolicy[Usage].ELLC)
167*35ffd701SAndroid Build Coastguard Worker {
168*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.TargetCache = TC_ELLC;
169*35ffd701SAndroid Build Coastguard Worker }
170*35ffd701SAndroid Build Coastguard Worker else
171*35ffd701SAndroid Build Coastguard Worker {
172*35ffd701SAndroid Build Coastguard Worker UsageEle.LeCC.Cacheability = LeCC_UNCACHEABLE;
173*35ffd701SAndroid Build Coastguard Worker }
174*35ffd701SAndroid Build Coastguard Worker }
175*35ffd701SAndroid Build Coastguard Worker
176*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.Reserved = 0; // Reserved bits zeroe'd, this is so we
177*35ffd701SAndroid Build Coastguard Worker // we can compare the unioned L3.UshortValue.
178*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.ESC = DISABLE_SKIP_CACHING_CONTROL;
179*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.SCC = 0;
180*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.Cacheability = pCachePolicy[Usage].L3 ? L3_WB_CACHEABLE : L3_UNCACHEABLE;
181*35ffd701SAndroid Build Coastguard Worker if(pCachePolicy[Usage].L3_SCC)
182*35ffd701SAndroid Build Coastguard Worker {
183*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.ESC = ENABLE_SKIP_CACHING_CONTROL;
184*35ffd701SAndroid Build Coastguard Worker UsageEle.L3.SCC = (uint16_t)pCachePolicy[Usage].L3_SCC;
185*35ffd701SAndroid Build Coastguard Worker }
186*35ffd701SAndroid Build Coastguard Worker for(j = 0; j <= CurrentMaxIndex; j++)
187*35ffd701SAndroid Build Coastguard Worker {
188*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pCachePolicyTblElement[j];
189*35ffd701SAndroid Build Coastguard Worker if(TblEle->LeCC.DwordValue == UsageEle.LeCC.DwordValue &&
190*35ffd701SAndroid Build Coastguard Worker TblEle->L3.UshortValue == UsageEle.L3.UshortValue)
191*35ffd701SAndroid Build Coastguard Worker {
192*35ffd701SAndroid Build Coastguard Worker CPTblIdx = j;
193*35ffd701SAndroid Build Coastguard Worker break;
194*35ffd701SAndroid Build Coastguard Worker }
195*35ffd701SAndroid Build Coastguard Worker }
196*35ffd701SAndroid Build Coastguard Worker
197*35ffd701SAndroid Build Coastguard Worker // Didn't find the caching settings in one of the already programmed lookup table entries.
198*35ffd701SAndroid Build Coastguard Worker // Need to add a new lookup table entry.
199*35ffd701SAndroid Build Coastguard Worker if(CPTblIdx == -1)
200*35ffd701SAndroid Build Coastguard Worker {
201*35ffd701SAndroid Build Coastguard Worker if(CurrentMaxIndex < GMM_GEN9_MAX_NUMBER_MOCS_INDEXES - 1)
202*35ffd701SAndroid Build Coastguard Worker {
203*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &(pCachePolicyTblElement[++CurrentMaxIndex]);
204*35ffd701SAndroid Build Coastguard Worker CPTblIdx = CurrentMaxIndex;
205*35ffd701SAndroid Build Coastguard Worker
206*35ffd701SAndroid Build Coastguard Worker TblEle->LeCC.DwordValue = UsageEle.LeCC.DwordValue;
207*35ffd701SAndroid Build Coastguard Worker TblEle->L3.UshortValue = UsageEle.L3.UshortValue;
208*35ffd701SAndroid Build Coastguard Worker }
209*35ffd701SAndroid Build Coastguard Worker else
210*35ffd701SAndroid Build Coastguard Worker {
211*35ffd701SAndroid Build Coastguard Worker // Too many unique caching combinations to program the
212*35ffd701SAndroid Build Coastguard Worker // MOCS lookup table.
213*35ffd701SAndroid Build Coastguard Worker CachePolicyError = true;
214*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF(
215*35ffd701SAndroid Build Coastguard Worker "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
216*35ffd701SAndroid Build Coastguard Worker "(we only support GMM_GEN_MAX_NUMBER_MOCS_INDEXES = %d)",
217*35ffd701SAndroid Build Coastguard Worker GMM_GEN9_MAX_NUMBER_MOCS_INDEXES);
218*35ffd701SAndroid Build Coastguard Worker // Set cache policy index to uncached.
219*35ffd701SAndroid Build Coastguard Worker CPTblIdx = 0;
220*35ffd701SAndroid Build Coastguard Worker }
221*35ffd701SAndroid Build Coastguard Worker }
222*35ffd701SAndroid Build Coastguard Worker
223*35ffd701SAndroid Build Coastguard Worker if(!GetUsagePTEValue(pCachePolicy[Usage], Usage, &PTEValue))
224*35ffd701SAndroid Build Coastguard Worker {
225*35ffd701SAndroid Build Coastguard Worker CachePolicyError = true;
226*35ffd701SAndroid Build Coastguard Worker }
227*35ffd701SAndroid Build Coastguard Worker
228*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].PTE.DwordValue = PTEValue & 0xFFFFFFFF;
229*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].PTE.HighDwordValue = 0;
230*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].MemoryObjectOverride.Gen9.Index = CPTblIdx;
231*35ffd701SAndroid Build Coastguard Worker
232*35ffd701SAndroid Build Coastguard Worker pCachePolicy[Usage].Override = ALWAYS_OVERRIDE;
233*35ffd701SAndroid Build Coastguard Worker
234*35ffd701SAndroid Build Coastguard Worker if(CachePolicyError)
235*35ffd701SAndroid Build Coastguard Worker {
236*35ffd701SAndroid Build Coastguard Worker GMM_ASSERTDPF("Cache Policy Init Error: Invalid Cache Programming - Element %d", Usage);
237*35ffd701SAndroid Build Coastguard Worker }
238*35ffd701SAndroid Build Coastguard Worker }
239*35ffd701SAndroid Build Coastguard Worker CurrentMaxMocsIndex = CurrentMaxIndex;
240*35ffd701SAndroid Build Coastguard Worker CurrentMaxL1HdcMocsIndex = 0;
241*35ffd701SAndroid Build Coastguard Worker }
242*35ffd701SAndroid Build Coastguard Worker
243*35ffd701SAndroid Build Coastguard Worker return GMM_SUCCESS;
244*35ffd701SAndroid Build Coastguard Worker }
245*35ffd701SAndroid Build Coastguard Worker
246*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
247*35ffd701SAndroid Build Coastguard Worker /// Initializes the Gfx PAT tables for AdvCtx and Gfx MMIO/Private PAT
248*35ffd701SAndroid Build Coastguard Worker /// PAT0 = WB_COHERENT or UC depending on WaGttPat0WB
249*35ffd701SAndroid Build Coastguard Worker /// PAT1 = UC or WB_COHERENT depending on WaGttPat0WB
250*35ffd701SAndroid Build Coastguard Worker /// PAT2 = WB_MOCSLESS, with TC = eLLC+LLC
251*35ffd701SAndroid Build Coastguard Worker /// PAT3 = WB
252*35ffd701SAndroid Build Coastguard Worker /// PAT4 = WT
253*35ffd701SAndroid Build Coastguard Worker /// PAT5 = WC
254*35ffd701SAndroid Build Coastguard Worker /// PAT6 = WC
255*35ffd701SAndroid Build Coastguard Worker /// PAT7 = WC
256*35ffd701SAndroid Build Coastguard Worker /// HLD says to set to PAT0/1 to WC, but since we don't have a WC in GPU,
257*35ffd701SAndroid Build Coastguard Worker /// WC option is same as UC. Hence setting PAT0 or PAT1 to UC.
258*35ffd701SAndroid Build Coastguard Worker /// Unused PAT's (5,6,7) are set to WC.
259*35ffd701SAndroid Build Coastguard Worker ///
260*35ffd701SAndroid Build Coastguard Worker /// @return GMM_STATUS
261*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetupPAT()262*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen9CachePolicy::SetupPAT()
263*35ffd701SAndroid Build Coastguard Worker {
264*35ffd701SAndroid Build Coastguard Worker GMM_STATUS Status = GMM_SUCCESS;
265*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
266*35ffd701SAndroid Build Coastguard Worker uint32_t i = 0;
267*35ffd701SAndroid Build Coastguard Worker
268*35ffd701SAndroid Build Coastguard Worker GMM_GFX_MEMORY_TYPE GfxMemType = GMM_GFX_UC_WITH_FENCE;
269*35ffd701SAndroid Build Coastguard Worker // No optional selection on Age or Target Cache because for an SVM-OS Age and
270*35ffd701SAndroid Build Coastguard Worker // Target Cache would not work [for an SVM-OS the Page Table is shared with IA
271*35ffd701SAndroid Build Coastguard Worker // and we don't have control of the PAT Idx]. If there is a strong ask from D3D
272*35ffd701SAndroid Build Coastguard Worker // or the performance analysis team, Age could be added.
273*35ffd701SAndroid Build Coastguard Worker // Add Class of Service when required.
274*35ffd701SAndroid Build Coastguard Worker GMM_GFX_TARGET_CACHE GfxTargetCache = GMM_GFX_TC_ELLC_LLC;
275*35ffd701SAndroid Build Coastguard Worker uint8_t Age = 1;
276*35ffd701SAndroid Build Coastguard Worker uint8_t ServiceClass = 0;
277*35ffd701SAndroid Build Coastguard Worker int32_t * pPrivatePATTableMemoryType = NULL;
278*35ffd701SAndroid Build Coastguard Worker
279*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType = pGmmLibContext->GetPrivatePATTableMemoryType();
280*35ffd701SAndroid Build Coastguard Worker
281*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pGmmLibContext->GetSkuTable().FtrIA32eGfxPTEs);
282*35ffd701SAndroid Build Coastguard Worker
283*35ffd701SAndroid Build Coastguard Worker for(i = 0; i < GMM_NUM_GFX_PAT_TYPES; i++)
284*35ffd701SAndroid Build Coastguard Worker {
285*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[i] = -1;
286*35ffd701SAndroid Build Coastguard Worker }
287*35ffd701SAndroid Build Coastguard Worker
288*35ffd701SAndroid Build Coastguard Worker // Set values for GmmGlobalInfo PrivatePATTable
289*35ffd701SAndroid Build Coastguard Worker for(i = 0; i < NumPATRegisters; i++)
290*35ffd701SAndroid Build Coastguard Worker {
291*35ffd701SAndroid Build Coastguard Worker GMM_PRIVATE_PAT PAT = {0};
292*35ffd701SAndroid Build Coastguard Worker
293*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetSkuTable().FtrMemTypeMocsDeferPAT)
294*35ffd701SAndroid Build Coastguard Worker {
295*35ffd701SAndroid Build Coastguard Worker GfxTargetCache = GMM_GFX_TC_ELLC_ONLY;
296*35ffd701SAndroid Build Coastguard Worker }
297*35ffd701SAndroid Build Coastguard Worker else
298*35ffd701SAndroid Build Coastguard Worker {
299*35ffd701SAndroid Build Coastguard Worker GfxTargetCache = GMM_GFX_TC_ELLC_LLC;
300*35ffd701SAndroid Build Coastguard Worker }
301*35ffd701SAndroid Build Coastguard Worker
302*35ffd701SAndroid Build Coastguard Worker switch(i)
303*35ffd701SAndroid Build Coastguard Worker {
304*35ffd701SAndroid Build Coastguard Worker case PAT0:
305*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetWaTable().WaGttPat0)
306*35ffd701SAndroid Build Coastguard Worker {
307*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetWaTable().WaGttPat0WB)
308*35ffd701SAndroid Build Coastguard Worker {
309*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WB;
310*35ffd701SAndroid Build Coastguard Worker if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
311*35ffd701SAndroid Build Coastguard Worker {
312*35ffd701SAndroid Build Coastguard Worker PAT.PreGen10.Snoop = 1;
313*35ffd701SAndroid Build Coastguard Worker }
314*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT0;
315*35ffd701SAndroid Build Coastguard Worker }
316*35ffd701SAndroid Build Coastguard Worker else
317*35ffd701SAndroid Build Coastguard Worker {
318*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_UC_WITH_FENCE;
319*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_UC] = PAT0;
320*35ffd701SAndroid Build Coastguard Worker }
321*35ffd701SAndroid Build Coastguard Worker }
322*35ffd701SAndroid Build Coastguard Worker else // if GTT is not tied to PAT0 then WaGttPat0WB is NA
323*35ffd701SAndroid Build Coastguard Worker {
324*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WB;
325*35ffd701SAndroid Build Coastguard Worker if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
326*35ffd701SAndroid Build Coastguard Worker {
327*35ffd701SAndroid Build Coastguard Worker PAT.PreGen10.Snoop = 1;
328*35ffd701SAndroid Build Coastguard Worker }
329*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT0;
330*35ffd701SAndroid Build Coastguard Worker }
331*35ffd701SAndroid Build Coastguard Worker break;
332*35ffd701SAndroid Build Coastguard Worker
333*35ffd701SAndroid Build Coastguard Worker case PAT1:
334*35ffd701SAndroid Build Coastguard Worker if(pGmmLibContext->GetWaTable().WaGttPat0 && !pGmmLibContext->GetWaTable().WaGttPat0WB)
335*35ffd701SAndroid Build Coastguard Worker {
336*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WB;
337*35ffd701SAndroid Build Coastguard Worker if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
338*35ffd701SAndroid Build Coastguard Worker {
339*35ffd701SAndroid Build Coastguard Worker PAT.PreGen10.Snoop = 1;
340*35ffd701SAndroid Build Coastguard Worker }
341*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT1;
342*35ffd701SAndroid Build Coastguard Worker }
343*35ffd701SAndroid Build Coastguard Worker else
344*35ffd701SAndroid Build Coastguard Worker {
345*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_UC_WITH_FENCE;
346*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_UC] = PAT1;
347*35ffd701SAndroid Build Coastguard Worker }
348*35ffd701SAndroid Build Coastguard Worker break;
349*35ffd701SAndroid Build Coastguard Worker
350*35ffd701SAndroid Build Coastguard Worker case PAT2:
351*35ffd701SAndroid Build Coastguard Worker // This PAT idx shall be used for MOCS'Less resources like Page Tables
352*35ffd701SAndroid Build Coastguard Worker // Page Tables have TC hardcoded to eLLC+LLC in Adv Ctxt. Hence making this to have same in Leg Ctxt.
353*35ffd701SAndroid Build Coastguard Worker // For BDW-H, due to Perf issue, TC has to be eLLC only for Page Tables when eDRAM is present.
354*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WB;
355*35ffd701SAndroid Build Coastguard Worker GfxTargetCache = GMM_GFX_TC_ELLC_LLC;
356*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_MOCSLESS] = PAT2;
357*35ffd701SAndroid Build Coastguard Worker break;
358*35ffd701SAndroid Build Coastguard Worker
359*35ffd701SAndroid Build Coastguard Worker case PAT3:
360*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WB;
361*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WB] = PAT3;
362*35ffd701SAndroid Build Coastguard Worker break;
363*35ffd701SAndroid Build Coastguard Worker
364*35ffd701SAndroid Build Coastguard Worker case PAT4:
365*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WT;
366*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WT] = PAT4;
367*35ffd701SAndroid Build Coastguard Worker break;
368*35ffd701SAndroid Build Coastguard Worker
369*35ffd701SAndroid Build Coastguard Worker case PAT5:
370*35ffd701SAndroid Build Coastguard Worker case PAT6:
371*35ffd701SAndroid Build Coastguard Worker case PAT7:
372*35ffd701SAndroid Build Coastguard Worker GfxMemType = GMM_GFX_WC;
373*35ffd701SAndroid Build Coastguard Worker pPrivatePATTableMemoryType[GMM_GFX_PAT_WC] = PAT5;
374*35ffd701SAndroid Build Coastguard Worker break;
375*35ffd701SAndroid Build Coastguard Worker
376*35ffd701SAndroid Build Coastguard Worker default:
377*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(0);
378*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
379*35ffd701SAndroid Build Coastguard Worker }
380*35ffd701SAndroid Build Coastguard Worker
381*35ffd701SAndroid Build Coastguard Worker PAT.PreGen10.MemoryType = GfxMemType;
382*35ffd701SAndroid Build Coastguard Worker PAT.PreGen10.TargetCache = GfxTargetCache;
383*35ffd701SAndroid Build Coastguard Worker PAT.PreGen10.Age = Age;
384*35ffd701SAndroid Build Coastguard Worker
385*35ffd701SAndroid Build Coastguard Worker SetPrivatePATEntry(i, PAT);
386*35ffd701SAndroid Build Coastguard Worker }
387*35ffd701SAndroid Build Coastguard Worker
388*35ffd701SAndroid Build Coastguard Worker #else
389*35ffd701SAndroid Build Coastguard Worker Status = GMM_ERROR;
390*35ffd701SAndroid Build Coastguard Worker #endif
391*35ffd701SAndroid Build Coastguard Worker return Status;
392*35ffd701SAndroid Build Coastguard Worker }
393