xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/CachePolicy/GmmGen10CachePolicy.cpp (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
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 #include "External/Common/CachePolicy/GmmCachePolicyGen10.h"
26*35ffd701SAndroid Build Coastguard Worker //=============================================================================
27*35ffd701SAndroid Build Coastguard Worker //
28*35ffd701SAndroid Build Coastguard Worker // Function: __GmmGen10InitCachePolicy
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::GmmGen10CachePolicy::InitCachePolicy()
39*35ffd701SAndroid Build Coastguard Worker {
40*35ffd701SAndroid Build Coastguard Worker 
41*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pCachePolicy, GMM_ERROR);
42*35ffd701SAndroid Build Coastguard Worker 
43*35ffd701SAndroid Build Coastguard Worker #define DEFINE_CACHE_ELEMENT(usage, llc, ellc, l3, wt, age, lecc_scc, l3_scc, sso, cos, hdcl1) DEFINE_CP_ELEMENT(usage, llc, ellc, l3, wt, age, 0, lecc_scc, l3_scc, 0, sso, cos, hdcl1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
44*35ffd701SAndroid Build Coastguard Worker #include "GmmGen10CachePolicy.h"
45*35ffd701SAndroid Build Coastguard Worker 
46*35ffd701SAndroid Build Coastguard Worker #define TC_LLC (1)
47*35ffd701SAndroid Build Coastguard Worker #define TC_ELLC (0) //Is this supported anymore in TargetCache?
48*35ffd701SAndroid Build Coastguard Worker #define TC_LLC_ELLC (2)
49*35ffd701SAndroid Build Coastguard Worker 
50*35ffd701SAndroid Build Coastguard Worker #define LeCC_UNCACHEABLE (0x1)
51*35ffd701SAndroid Build Coastguard Worker #define LeCC_WT_CACHEABLE (0x2) //Only used as MemPushWRite disqualifier if set along with eLLC-only
52*35ffd701SAndroid Build Coastguard Worker #define LeCC_WB_CACHEABLE (0x3)
53*35ffd701SAndroid Build Coastguard Worker 
54*35ffd701SAndroid Build Coastguard Worker #define L3_UNCACHEABLE (0x1)
55*35ffd701SAndroid Build Coastguard Worker #define L3_WB_CACHEABLE (0x3)
56*35ffd701SAndroid Build Coastguard Worker 
57*35ffd701SAndroid Build Coastguard Worker #define DISABLE_SKIP_CACHING_CONTROL (0x0)
58*35ffd701SAndroid Build Coastguard Worker #define ENABLE_SKIP_CACHING_CONTROL (0x1)
59*35ffd701SAndroid Build Coastguard Worker 
60*35ffd701SAndroid Build Coastguard Worker #define DISABLE_SELF_SNOOP_OVERRIDE (0x0)
61*35ffd701SAndroid Build Coastguard Worker #define ENABLE_SELF_SNOOP_OVERRIDE (0x1)
62*35ffd701SAndroid Build Coastguard Worker #define ENABLE_SELF_SNOOP_ALWAYS (0x3)
63*35ffd701SAndroid Build Coastguard Worker #define CLASS_SERVICE_ZERO 0
64*35ffd701SAndroid Build Coastguard Worker     {
65*35ffd701SAndroid Build Coastguard Worker         // Define index of cache element
66*35ffd701SAndroid Build Coastguard Worker         uint32_t Usage = 0;
67*35ffd701SAndroid Build Coastguard Worker 
68*35ffd701SAndroid Build Coastguard Worker         uint32_t                      CurrentMaxIndex        = 0;
69*35ffd701SAndroid Build Coastguard Worker         uint32_t                      CurrentMaxHDCL1Index   = GMM_GEN10_HDCL1_MOCS_INDEX_START - 1; // define constant
70*35ffd701SAndroid Build Coastguard Worker         GMM_CACHE_POLICY_TBL_ELEMENT *pCachePolicyTlbElement = pGmmLibContext->GetCachePolicyTlbElement();
71*35ffd701SAndroid Build Coastguard Worker 
72*35ffd701SAndroid Build Coastguard Worker         // index 0 is uncached.
73*35ffd701SAndroid Build Coastguard Worker         {
74*35ffd701SAndroid Build Coastguard Worker             GMM_CACHE_POLICY_TBL_ELEMENT *Entry0 = &(pCachePolicyTlbElement[0]);
75*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.Cacheability            = LeCC_UNCACHEABLE;
76*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.TargetCache             = TC_LLC_ELLC;
77*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.LRUM                    = 0;
78*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.ESC                     = DISABLE_SKIP_CACHING_CONTROL;
79*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.SCC                     = 0;
80*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.CoS                     = CLASS_SERVICE_ZERO;
81*35ffd701SAndroid Build Coastguard Worker             Entry0->LeCC.SelfSnoop               = DISABLE_SELF_SNOOP_OVERRIDE;
82*35ffd701SAndroid Build Coastguard Worker             Entry0->L3.Cacheability              = L3_UNCACHEABLE;
83*35ffd701SAndroid Build Coastguard Worker             Entry0->L3.ESC                       = DISABLE_SKIP_CACHING_CONTROL;
84*35ffd701SAndroid Build Coastguard Worker             Entry0->L3.SCC                       = 0;
85*35ffd701SAndroid Build Coastguard Worker             Entry0->HDCL1                        = 0;
86*35ffd701SAndroid Build Coastguard Worker         }
87*35ffd701SAndroid Build Coastguard Worker 
88*35ffd701SAndroid Build Coastguard Worker         // Process the cache policy and fill in the look up table
89*35ffd701SAndroid Build Coastguard Worker         for(; Usage < GMM_RESOURCE_USAGE_MAX; Usage++)
90*35ffd701SAndroid Build Coastguard Worker         {
91*35ffd701SAndroid Build Coastguard Worker             bool                         CachePolicyError = false;
92*35ffd701SAndroid Build Coastguard Worker             int32_t                      CPTblIdx         = -1;
93*35ffd701SAndroid Build Coastguard Worker             uint32_t                     j                = 0;
94*35ffd701SAndroid Build Coastguard Worker             uint64_t                     PTEValue         = 0;
95*35ffd701SAndroid Build Coastguard Worker             GMM_CACHE_POLICY_TBL_ELEMENT UsageEle         = {0};
96*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.Reserved                        = 0; // Reserved bits zeroe'd, this is so we
97*35ffd701SAndroid Build Coastguard Worker                                                                // we can compare the unioned LeCC.DwordValue.
98*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.SelfSnoop = DISABLE_SELF_SNOOP_OVERRIDE;
99*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.CoS       = CLASS_SERVICE_ZERO;
100*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.SCC       = 0;
101*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.ESC       = 0;
102*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].SSO & ENABLE_SELF_SNOOP_OVERRIDE)
103*35ffd701SAndroid Build Coastguard Worker             {
104*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.SelfSnoop = pCachePolicy[Usage].SSO & ENABLE_SELF_SNOOP_ALWAYS;
105*35ffd701SAndroid Build Coastguard Worker             }
106*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].CoS)
107*35ffd701SAndroid Build Coastguard Worker             {
108*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.CoS = pCachePolicy[Usage].CoS;
109*35ffd701SAndroid Build Coastguard Worker             }
110*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].HDCL1)
111*35ffd701SAndroid Build Coastguard Worker             {
112*35ffd701SAndroid Build Coastguard Worker                 UsageEle.HDCL1 = 1;
113*35ffd701SAndroid Build Coastguard Worker             }
114*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].LeCC_SCC)
115*35ffd701SAndroid Build Coastguard Worker             {
116*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.SCC = pCachePolicy[Usage].LeCC_SCC;
117*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.ESC = ENABLE_SKIP_CACHING_CONTROL;
118*35ffd701SAndroid Build Coastguard Worker             }
119*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.LRUM = pCachePolicy[Usage].AGE;
120*35ffd701SAndroid Build Coastguard Worker 
121*35ffd701SAndroid Build Coastguard Worker             // default to LLC/ELLC target cache.
122*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.TargetCache  = TC_LLC_ELLC;
123*35ffd701SAndroid Build Coastguard Worker             UsageEle.LeCC.Cacheability = LeCC_WB_CACHEABLE;
124*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].LLC && pCachePolicy[Usage].ELLC)
125*35ffd701SAndroid Build Coastguard Worker             {
126*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.TargetCache = TC_LLC_ELLC;
127*35ffd701SAndroid Build Coastguard Worker             }
128*35ffd701SAndroid Build Coastguard Worker             else if(pCachePolicy[Usage].LLC)
129*35ffd701SAndroid Build Coastguard Worker             {
130*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.TargetCache = TC_LLC;
131*35ffd701SAndroid Build Coastguard Worker             }
132*35ffd701SAndroid Build Coastguard Worker             else if(pCachePolicy[Usage].ELLC)
133*35ffd701SAndroid Build Coastguard Worker             {
134*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.TargetCache = TC_ELLC;
135*35ffd701SAndroid Build Coastguard Worker                 if(pCachePolicy[Usage].WT)
136*35ffd701SAndroid Build Coastguard Worker                 {
137*35ffd701SAndroid Build Coastguard Worker                     UsageEle.LeCC.Cacheability = LeCC_WT_CACHEABLE;
138*35ffd701SAndroid Build Coastguard Worker                 }
139*35ffd701SAndroid Build Coastguard Worker             }
140*35ffd701SAndroid Build Coastguard Worker             else
141*35ffd701SAndroid Build Coastguard Worker             {
142*35ffd701SAndroid Build Coastguard Worker                 UsageEle.LeCC.Cacheability = LeCC_UNCACHEABLE;
143*35ffd701SAndroid Build Coastguard Worker             }
144*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.Reserved = 0; // Reserved bits zeroe'd, this is so we
145*35ffd701SAndroid Build Coastguard Worker                                       // we can compare the unioned L3.UshortValue.
146*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.ESC          = DISABLE_SKIP_CACHING_CONTROL;
147*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.SCC          = 0;
148*35ffd701SAndroid Build Coastguard Worker             UsageEle.L3.Cacheability = pCachePolicy[Usage].L3 ? L3_WB_CACHEABLE : L3_UNCACHEABLE;
149*35ffd701SAndroid Build Coastguard Worker 
150*35ffd701SAndroid Build Coastguard Worker             if(pCachePolicy[Usage].L3_SCC)
151*35ffd701SAndroid Build Coastguard Worker             {
152*35ffd701SAndroid Build Coastguard Worker                 UsageEle.L3.ESC = ENABLE_SKIP_CACHING_CONTROL;
153*35ffd701SAndroid Build Coastguard Worker                 UsageEle.L3.SCC = (uint16_t)pCachePolicy[Usage].L3_SCC;
154*35ffd701SAndroid Build Coastguard Worker             }
155*35ffd701SAndroid Build Coastguard Worker             //For HDC L1 caching, MOCS Table index 48-61 should be used
156*35ffd701SAndroid Build Coastguard Worker             if(UsageEle.HDCL1)
157*35ffd701SAndroid Build Coastguard Worker             {
158*35ffd701SAndroid Build Coastguard Worker                 for(j = GMM_GEN10_HDCL1_MOCS_INDEX_START; j <= CurrentMaxHDCL1Index; j++)
159*35ffd701SAndroid Build Coastguard Worker                 {
160*35ffd701SAndroid Build Coastguard Worker                     GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pCachePolicyTlbElement[j];
161*35ffd701SAndroid Build Coastguard Worker                     if(TblEle->LeCC.DwordValue == UsageEle.LeCC.DwordValue &&
162*35ffd701SAndroid Build Coastguard Worker                        TblEle->L3.UshortValue == UsageEle.L3.UshortValue &&
163*35ffd701SAndroid Build Coastguard Worker                        TblEle->HDCL1 == UsageEle.HDCL1)
164*35ffd701SAndroid Build Coastguard Worker                     {
165*35ffd701SAndroid Build Coastguard Worker                         CPTblIdx = j;
166*35ffd701SAndroid Build Coastguard Worker                         break;
167*35ffd701SAndroid Build Coastguard Worker                     }
168*35ffd701SAndroid Build Coastguard Worker                 }
169*35ffd701SAndroid Build Coastguard Worker             }
170*35ffd701SAndroid Build Coastguard Worker             else
171*35ffd701SAndroid Build Coastguard Worker             {
172*35ffd701SAndroid Build Coastguard Worker                 for(j = 0; j <= CurrentMaxIndex; j++)
173*35ffd701SAndroid Build Coastguard Worker                 {
174*35ffd701SAndroid Build Coastguard Worker                     GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &pCachePolicyTlbElement[j];
175*35ffd701SAndroid Build Coastguard Worker                     if(TblEle->LeCC.DwordValue == UsageEle.LeCC.DwordValue &&
176*35ffd701SAndroid Build Coastguard Worker                        TblEle->L3.UshortValue == UsageEle.L3.UshortValue &&
177*35ffd701SAndroid Build Coastguard Worker                        TblEle->HDCL1 == UsageEle.HDCL1)
178*35ffd701SAndroid Build Coastguard Worker                     {
179*35ffd701SAndroid Build Coastguard Worker                         CPTblIdx = j;
180*35ffd701SAndroid Build Coastguard Worker                         break;
181*35ffd701SAndroid Build Coastguard Worker                     }
182*35ffd701SAndroid Build Coastguard Worker                 }
183*35ffd701SAndroid Build Coastguard Worker             }
184*35ffd701SAndroid Build Coastguard Worker 
185*35ffd701SAndroid Build Coastguard Worker             // Didn't find the caching settings in one of the already programmed lookup table entries.
186*35ffd701SAndroid Build Coastguard Worker             // Need to add a new lookup table entry.
187*35ffd701SAndroid Build Coastguard Worker             if(CPTblIdx == -1)
188*35ffd701SAndroid Build Coastguard Worker             {
189*35ffd701SAndroid Build Coastguard Worker                 if(UsageEle.HDCL1 && CurrentMaxHDCL1Index < GMM_GEN9_MAX_NUMBER_MOCS_INDEXES - 1)
190*35ffd701SAndroid Build Coastguard Worker                 {
191*35ffd701SAndroid Build Coastguard Worker                     GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &(pCachePolicyTlbElement[++CurrentMaxHDCL1Index]);
192*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx                             = CurrentMaxHDCL1Index;
193*35ffd701SAndroid Build Coastguard Worker 
194*35ffd701SAndroid Build Coastguard Worker                     TblEle->LeCC.DwordValue = UsageEle.LeCC.DwordValue;
195*35ffd701SAndroid Build Coastguard Worker                     TblEle->L3.UshortValue  = UsageEle.L3.UshortValue;
196*35ffd701SAndroid Build Coastguard Worker                     TblEle->HDCL1           = UsageEle.HDCL1;
197*35ffd701SAndroid Build Coastguard Worker                 }
198*35ffd701SAndroid Build Coastguard Worker                 else if(CurrentMaxIndex < GMM_GEN10_HDCL1_MOCS_INDEX_START)
199*35ffd701SAndroid Build Coastguard Worker                 {
200*35ffd701SAndroid Build Coastguard Worker                     GMM_CACHE_POLICY_TBL_ELEMENT *TblEle = &(pCachePolicyTlbElement[++CurrentMaxIndex]);
201*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx                             = CurrentMaxIndex;
202*35ffd701SAndroid Build Coastguard Worker 
203*35ffd701SAndroid Build Coastguard Worker                     TblEle->LeCC.DwordValue = UsageEle.LeCC.DwordValue;
204*35ffd701SAndroid Build Coastguard Worker                     TblEle->L3.UshortValue  = UsageEle.L3.UshortValue;
205*35ffd701SAndroid Build Coastguard Worker                     TblEle->HDCL1           = UsageEle.HDCL1;
206*35ffd701SAndroid Build Coastguard Worker                 }
207*35ffd701SAndroid Build Coastguard Worker                 else
208*35ffd701SAndroid Build Coastguard Worker                 {
209*35ffd701SAndroid Build Coastguard Worker                     // Too many unique caching combinations to program the
210*35ffd701SAndroid Build Coastguard Worker                     // MOCS lookup table.
211*35ffd701SAndroid Build Coastguard Worker                     CachePolicyError = true;
212*35ffd701SAndroid Build Coastguard Worker                     GMM_ASSERTDPF(
213*35ffd701SAndroid Build Coastguard Worker                     "Cache Policy Init Error: Invalid Cache Programming, too many unique caching combinations"
214*35ffd701SAndroid Build Coastguard Worker                     "(we only support GMM_GEN_MAX_NUMBER_MOCS_INDEXES = %d)",
215*35ffd701SAndroid Build Coastguard Worker                     GMM_GEN9_MAX_NUMBER_MOCS_INDEXES - 1);
216*35ffd701SAndroid Build Coastguard Worker                     // Set cache policy index to uncached.
217*35ffd701SAndroid Build Coastguard Worker                     CPTblIdx = 0;
218*35ffd701SAndroid Build Coastguard Worker                 }
219*35ffd701SAndroid Build Coastguard Worker             }
220*35ffd701SAndroid Build Coastguard Worker 
221*35ffd701SAndroid Build Coastguard Worker             // PTE entries do not control caching on SKL+ (for legacy context)
222*35ffd701SAndroid Build Coastguard Worker             if(!GetUsagePTEValue(pCachePolicy[Usage], Usage, &PTEValue))
223*35ffd701SAndroid Build Coastguard Worker             {
224*35ffd701SAndroid Build Coastguard Worker                 CachePolicyError = true;
225*35ffd701SAndroid Build Coastguard Worker             }
226*35ffd701SAndroid Build Coastguard Worker 
227*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].PTE.DwordValue     = PTEValue & 0xFFFFFFFF;
228*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].PTE.HighDwordValue = 0;
229*35ffd701SAndroid Build Coastguard Worker 
230*35ffd701SAndroid Build Coastguard Worker             pCachePolicy[Usage].MemoryObjectOverride.Gen10.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 = CurrentMaxHDCL1Index;
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 WA's needed for setting up the Private PATs
248*35ffd701SAndroid Build Coastguard Worker /// WaNoMocsEllcOnly, WaGttPat0, WaGttPat0GttWbOverOsIommuEllcOnly, WaGttPat0WB
249*35ffd701SAndroid Build Coastguard Worker ///
250*35ffd701SAndroid Build Coastguard Worker /// @return        GMM_STATUS
251*35ffd701SAndroid Build Coastguard Worker ///
252*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetPATInitWA()253*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen10CachePolicy::SetPATInitWA()
254*35ffd701SAndroid Build Coastguard Worker {
255*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status = GMM_SUCCESS;
256*35ffd701SAndroid Build Coastguard Worker 
257*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
258*35ffd701SAndroid Build Coastguard Worker     if(pGmmLibContext->GetGtSysInfoPtr()->EdramSizeInKb)
259*35ffd701SAndroid Build Coastguard Worker     {
260*35ffd701SAndroid Build Coastguard Worker         const_cast<WA_TABLE &>(pGmmLibContext->GetWaTable()).WaNoMocsEllcOnly = 1;
261*35ffd701SAndroid Build Coastguard Worker     }
262*35ffd701SAndroid Build Coastguard Worker #else
263*35ffd701SAndroid Build Coastguard Worker     Status = GMM_ERROR;
264*35ffd701SAndroid Build Coastguard Worker #endif
265*35ffd701SAndroid Build Coastguard Worker 
266*35ffd701SAndroid Build Coastguard Worker     return Status;
267*35ffd701SAndroid Build Coastguard Worker }
268*35ffd701SAndroid Build Coastguard Worker 
269*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
270*35ffd701SAndroid Build Coastguard Worker /// Returns the PAT idx that best matches the cache policy for this usage.
271*35ffd701SAndroid Build Coastguard Worker ///
272*35ffd701SAndroid Build Coastguard Worker /// @param: CachePolicy: cache policy for a usage
273*35ffd701SAndroid Build Coastguard Worker ///
274*35ffd701SAndroid Build Coastguard Worker /// @return        PAT Idx to use in the PTE
275*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
BestMatchingPATIdx(GMM_CACHE_POLICY_ELEMENT CachePolicy)276*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::GmmGen10CachePolicy::BestMatchingPATIdx(GMM_CACHE_POLICY_ELEMENT CachePolicy)
277*35ffd701SAndroid Build Coastguard Worker {
278*35ffd701SAndroid Build Coastguard Worker     uint32_t             i;
279*35ffd701SAndroid Build Coastguard Worker     uint32_t             PATIdx           = 0;
280*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_MEMORY_TYPE  WantedMemoryType = GMM_GFX_UC_WITH_FENCE, MemoryType;
281*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_TARGET_CACHE WantedTC         = GMM_GFX_TC_ELLC_LLC;
282*35ffd701SAndroid Build Coastguard Worker 
283*35ffd701SAndroid Build Coastguard Worker     WantedMemoryType = GetWantedMemoryType(CachePolicy);
284*35ffd701SAndroid Build Coastguard Worker 
285*35ffd701SAndroid Build Coastguard Worker     if(CachePolicy.LLC && CachePolicy.ELLC)
286*35ffd701SAndroid Build Coastguard Worker     {
287*35ffd701SAndroid Build Coastguard Worker         WantedTC = GMM_GFX_TC_ELLC_LLC;
288*35ffd701SAndroid Build Coastguard Worker     }
289*35ffd701SAndroid Build Coastguard Worker     else if(CachePolicy.LLC)
290*35ffd701SAndroid Build Coastguard Worker     {
291*35ffd701SAndroid Build Coastguard Worker         WantedTC = GMM_GFX_TC_LLC_ONLY;
292*35ffd701SAndroid Build Coastguard Worker     }
293*35ffd701SAndroid Build Coastguard Worker     else if(CachePolicy.ELLC)
294*35ffd701SAndroid Build Coastguard Worker     {
295*35ffd701SAndroid Build Coastguard Worker         WantedTC = GMM_GFX_TC_ELLC_ONLY; // Note: this overrides the MOCS target cache selection.
296*35ffd701SAndroid Build Coastguard Worker     }
297*35ffd701SAndroid Build Coastguard Worker 
298*35ffd701SAndroid Build Coastguard Worker     for(i = 1; i < NumPATRegisters; i++)
299*35ffd701SAndroid Build Coastguard Worker     {
300*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT PAT1 = GetPrivatePATEntry(PATIdx);
301*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT PAT2 = GetPrivatePATEntry(i);
302*35ffd701SAndroid Build Coastguard Worker 
303*35ffd701SAndroid Build Coastguard Worker         if(SelectNewPATIdx(WantedMemoryType, WantedTC,
304*35ffd701SAndroid Build Coastguard Worker                            (GMM_GFX_MEMORY_TYPE)PAT1.Gen10.MemoryType, (GMM_GFX_TARGET_CACHE)PAT1.Gen10.TargetCache,
305*35ffd701SAndroid Build Coastguard Worker                            (GMM_GFX_MEMORY_TYPE)PAT2.Gen10.MemoryType, (GMM_GFX_TARGET_CACHE)PAT2.Gen10.TargetCache))
306*35ffd701SAndroid Build Coastguard Worker         {
307*35ffd701SAndroid Build Coastguard Worker             PATIdx = i;
308*35ffd701SAndroid Build Coastguard Worker         }
309*35ffd701SAndroid Build Coastguard Worker     }
310*35ffd701SAndroid Build Coastguard Worker 
311*35ffd701SAndroid Build Coastguard Worker     MemoryType = (GMM_GFX_MEMORY_TYPE)GetPrivatePATEntry(PATIdx).Gen10.MemoryType;
312*35ffd701SAndroid Build Coastguard Worker 
313*35ffd701SAndroid Build Coastguard Worker     if(MemoryType != WantedMemoryType)
314*35ffd701SAndroid Build Coastguard Worker     {
315*35ffd701SAndroid Build Coastguard Worker         // Failed to find a matching PAT entry
316*35ffd701SAndroid Build Coastguard Worker         return GMM_PAT_ERROR;
317*35ffd701SAndroid Build Coastguard Worker     }
318*35ffd701SAndroid Build Coastguard Worker     return PATIdx;
319*35ffd701SAndroid Build Coastguard Worker }
320*35ffd701SAndroid Build Coastguard Worker 
321*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
322*35ffd701SAndroid Build Coastguard Worker ///  Initializes the Gfx PAT tables for AdvCtx and Gfx MMIO/Private PAT
323*35ffd701SAndroid Build Coastguard Worker ///    PAT0 = WB_COHERENT or UC depending on WaGttPat0WB
324*35ffd701SAndroid Build Coastguard Worker ///    PAT1 = UC or WB_COHERENT depending on WaGttPat0WB
325*35ffd701SAndroid Build Coastguard Worker ///    PAT2 = WB_MOCSLESS, with TC = eLLC+LLC
326*35ffd701SAndroid Build Coastguard Worker ///    PAT3 = WB
327*35ffd701SAndroid Build Coastguard Worker ///    PAT4 = WT
328*35ffd701SAndroid Build Coastguard Worker ///    PAT5 = WC
329*35ffd701SAndroid Build Coastguard Worker ///    PAT6 = WC
330*35ffd701SAndroid Build Coastguard Worker ///    PAT7 = WC
331*35ffd701SAndroid Build Coastguard Worker ///  HLD says to set to PAT0/1 to WC, but since we don't have a WC in GPU,
332*35ffd701SAndroid Build Coastguard Worker ///  WC option is same as UC. Hence setting PAT0 or PAT1 to UC.
333*35ffd701SAndroid Build Coastguard Worker ///  Unused PAT's (5,6,7) are set to WC.
334*35ffd701SAndroid Build Coastguard Worker ///
335*35ffd701SAndroid Build Coastguard Worker /// @return        GMM_STATUS
336*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
SetupPAT()337*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GmmLib::GmmGen10CachePolicy::SetupPAT()
338*35ffd701SAndroid Build Coastguard Worker {
339*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS Status = GMM_SUCCESS;
340*35ffd701SAndroid Build Coastguard Worker #if(defined(__GMM_KMD__))
341*35ffd701SAndroid Build Coastguard Worker     uint32_t i = 0;
342*35ffd701SAndroid Build Coastguard Worker 
343*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_MEMORY_TYPE GfxMemType = GMM_GFX_UC_WITH_FENCE;
344*35ffd701SAndroid Build Coastguard Worker     // No optional selection on Age or Target Cache because for an SVM-OS Age and
345*35ffd701SAndroid Build Coastguard Worker     // Target Cache would not work [for an SVM-OS the Page Table is shared with IA
346*35ffd701SAndroid Build Coastguard Worker     // and we don't have control of the PAT Idx]. If there is a strong ask from D3D
347*35ffd701SAndroid Build Coastguard Worker     // or the performance analysis team, Age could be added.
348*35ffd701SAndroid Build Coastguard Worker     // Add Class of Service when required.
349*35ffd701SAndroid Build Coastguard Worker     GMM_GFX_TARGET_CACHE GfxTargetCache             = GMM_GFX_TC_ELLC_LLC;
350*35ffd701SAndroid Build Coastguard Worker     uint8_t              Age                        = 1;
351*35ffd701SAndroid Build Coastguard Worker     uint8_t              ServiceClass               = 0;
352*35ffd701SAndroid Build Coastguard Worker     int32_t *            pPrivatePATTableMemoryType = NULL;
353*35ffd701SAndroid Build Coastguard Worker     pPrivatePATTableMemoryType                      = pGmmLibContext->GetPrivatePATTableMemoryType();
354*35ffd701SAndroid Build Coastguard Worker 
355*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERT(pGmmLibContext->GetSkuTable().FtrIA32eGfxPTEs);
356*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i < GMM_NUM_GFX_PAT_TYPES; i++)
357*35ffd701SAndroid Build Coastguard Worker     {
358*35ffd701SAndroid Build Coastguard Worker         pPrivatePATTableMemoryType[i] = -1;
359*35ffd701SAndroid Build Coastguard Worker     }
360*35ffd701SAndroid Build Coastguard Worker 
361*35ffd701SAndroid Build Coastguard Worker     // Set values for GmmGlobalInfo PrivatePATTable
362*35ffd701SAndroid Build Coastguard Worker     for(i = 0; i < NumPATRegisters; i++)
363*35ffd701SAndroid Build Coastguard Worker     {
364*35ffd701SAndroid Build Coastguard Worker         GMM_PRIVATE_PAT PAT = {0};
365*35ffd701SAndroid Build Coastguard Worker 
366*35ffd701SAndroid Build Coastguard Worker 	if(pGmmLibContext->GetWaTable().WaNoMocsEllcOnly)
367*35ffd701SAndroid Build Coastguard Worker         {
368*35ffd701SAndroid Build Coastguard Worker             GfxTargetCache = GMM_GFX_TC_ELLC_ONLY;
369*35ffd701SAndroid Build Coastguard Worker         }
370*35ffd701SAndroid Build Coastguard Worker         else
371*35ffd701SAndroid Build Coastguard Worker         {
372*35ffd701SAndroid Build Coastguard Worker             GfxTargetCache = GMM_GFX_TC_ELLC_LLC;
373*35ffd701SAndroid Build Coastguard Worker         }
374*35ffd701SAndroid Build Coastguard Worker 
375*35ffd701SAndroid Build Coastguard Worker         switch(i)
376*35ffd701SAndroid Build Coastguard Worker         {
377*35ffd701SAndroid Build Coastguard Worker             case PAT0:
378*35ffd701SAndroid Build Coastguard Worker                 if(pGmmLibContext->GetWaTable().WaGttPat0)
379*35ffd701SAndroid Build Coastguard Worker 		{
380*35ffd701SAndroid Build Coastguard Worker                     if(pGmmLibContext->GetWaTable().WaGttPat0WB)
381*35ffd701SAndroid Build Coastguard Worker 	            {
382*35ffd701SAndroid Build Coastguard Worker                         GfxMemType = GMM_GFX_WB;
383*35ffd701SAndroid Build Coastguard Worker                         if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
384*35ffd701SAndroid Build Coastguard Worker                         {
385*35ffd701SAndroid Build Coastguard Worker                             PAT.PreGen10.Snoop = 1;
386*35ffd701SAndroid Build Coastguard Worker                         }
387*35ffd701SAndroid Build Coastguard Worker                         pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT0;
388*35ffd701SAndroid Build Coastguard Worker                     }
389*35ffd701SAndroid Build Coastguard Worker                     else
390*35ffd701SAndroid Build Coastguard Worker                     {
391*35ffd701SAndroid Build Coastguard Worker                         GfxMemType                                 = GMM_GFX_UC_WITH_FENCE;
392*35ffd701SAndroid Build Coastguard Worker                         pPrivatePATTableMemoryType[GMM_GFX_PAT_UC] = PAT0;
393*35ffd701SAndroid Build Coastguard Worker                     }
394*35ffd701SAndroid Build Coastguard Worker                 }
395*35ffd701SAndroid Build Coastguard Worker                 else // if GTT is not tied to PAT0 then WaGttPat0WB is NA
396*35ffd701SAndroid Build Coastguard Worker                 {
397*35ffd701SAndroid Build Coastguard Worker                     GfxMemType = GMM_GFX_WB;
398*35ffd701SAndroid Build Coastguard Worker                     if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
399*35ffd701SAndroid Build Coastguard Worker                     {
400*35ffd701SAndroid Build Coastguard Worker                         PAT.PreGen10.Snoop = 1;
401*35ffd701SAndroid Build Coastguard Worker                     }
402*35ffd701SAndroid Build Coastguard Worker                     pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT0;
403*35ffd701SAndroid Build Coastguard Worker                 }
404*35ffd701SAndroid Build Coastguard Worker                 break;
405*35ffd701SAndroid Build Coastguard Worker 
406*35ffd701SAndroid Build Coastguard Worker             case PAT1:
407*35ffd701SAndroid Build Coastguard Worker                 if(pGmmLibContext->GetWaTable().WaGttPat0 && !pGmmLibContext->GetWaTable().WaGttPat0WB)
408*35ffd701SAndroid Build Coastguard Worker                 {
409*35ffd701SAndroid Build Coastguard Worker                     GfxMemType = GMM_GFX_WB;
410*35ffd701SAndroid Build Coastguard Worker                     if(GFX_IS_ATOM_PLATFORM(pGmmLibContext))
411*35ffd701SAndroid Build Coastguard Worker                     {
412*35ffd701SAndroid Build Coastguard Worker                         PAT.PreGen10.Snoop = 1;
413*35ffd701SAndroid Build Coastguard Worker                     }
414*35ffd701SAndroid Build Coastguard Worker                     pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_COHERENT] = PAT1;
415*35ffd701SAndroid Build Coastguard Worker                 }
416*35ffd701SAndroid Build Coastguard Worker                 else
417*35ffd701SAndroid Build Coastguard Worker                 {
418*35ffd701SAndroid Build Coastguard Worker                     GfxMemType                                 = GMM_GFX_UC_WITH_FENCE;
419*35ffd701SAndroid Build Coastguard Worker                     pPrivatePATTableMemoryType[GMM_GFX_PAT_UC] = PAT1;
420*35ffd701SAndroid Build Coastguard Worker                 }
421*35ffd701SAndroid Build Coastguard Worker                 break;
422*35ffd701SAndroid Build Coastguard Worker 
423*35ffd701SAndroid Build Coastguard Worker             case PAT2:
424*35ffd701SAndroid Build Coastguard Worker                 // This PAT idx shall be used for MOCS'Less resources like Page Tables
425*35ffd701SAndroid Build Coastguard Worker                 // Page Tables have TC hardcoded to eLLC+LLC in Adv Ctxt. Hence making this to have same in Leg Ctxt.
426*35ffd701SAndroid Build Coastguard Worker                 // For BDW-H, due to Perf issue, TC has to be eLLC only for Page Tables when eDRAM is present.
427*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                          = GMM_GFX_WB;
428*35ffd701SAndroid Build Coastguard Worker                 GfxTargetCache                                      = GMM_GFX_TC_ELLC_LLC;
429*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WB_MOCSLESS] = PAT2;
430*35ffd701SAndroid Build Coastguard Worker                 break;
431*35ffd701SAndroid Build Coastguard Worker 
432*35ffd701SAndroid Build Coastguard Worker             case PAT3:
433*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                 = GMM_GFX_WB;
434*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WB] = PAT3;
435*35ffd701SAndroid Build Coastguard Worker                 break;
436*35ffd701SAndroid Build Coastguard Worker 
437*35ffd701SAndroid Build Coastguard Worker             case PAT4:
438*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                 = GMM_GFX_WT;
439*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WT] = PAT4;
440*35ffd701SAndroid Build Coastguard Worker                 break;
441*35ffd701SAndroid Build Coastguard Worker 
442*35ffd701SAndroid Build Coastguard Worker             case PAT5:
443*35ffd701SAndroid Build Coastguard Worker             case PAT6:
444*35ffd701SAndroid Build Coastguard Worker             case PAT7:
445*35ffd701SAndroid Build Coastguard Worker                 GfxMemType                                 = GMM_GFX_WC;
446*35ffd701SAndroid Build Coastguard Worker                 pPrivatePATTableMemoryType[GMM_GFX_PAT_WC] = PAT5;
447*35ffd701SAndroid Build Coastguard Worker                 break;
448*35ffd701SAndroid Build Coastguard Worker 
449*35ffd701SAndroid Build Coastguard Worker             default:
450*35ffd701SAndroid Build Coastguard Worker                 __GMM_ASSERT(0);
451*35ffd701SAndroid Build Coastguard Worker                 Status = GMM_ERROR;
452*35ffd701SAndroid Build Coastguard Worker         }
453*35ffd701SAndroid Build Coastguard Worker 
454*35ffd701SAndroid Build Coastguard Worker         PAT.Gen10.MemoryType  = GfxMemType;
455*35ffd701SAndroid Build Coastguard Worker         PAT.Gen10.TargetCache = GfxTargetCache;
456*35ffd701SAndroid Build Coastguard Worker         PAT.Gen10.Age         = Age;
457*35ffd701SAndroid Build Coastguard Worker         PAT.Gen10.CoS         = ServiceClass;
458*35ffd701SAndroid Build Coastguard Worker 
459*35ffd701SAndroid Build Coastguard Worker         SetPrivatePATEntry(i, PAT);
460*35ffd701SAndroid Build Coastguard Worker     }
461*35ffd701SAndroid Build Coastguard Worker 
462*35ffd701SAndroid Build Coastguard Worker #else
463*35ffd701SAndroid Build Coastguard Worker     Status = GMM_ERROR;
464*35ffd701SAndroid Build Coastguard Worker #endif
465*35ffd701SAndroid Build Coastguard Worker     return Status;
466*35ffd701SAndroid Build Coastguard Worker }
467