xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/CachePolicy/GmmGen9CachePolicy.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 
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