| /*============================================================================== |
| Copyright(c) 2017 Intel Corporation |
| |
| Permission is hereby granted, free of charge, to any person obtaining a |
| copy of this software and associated documentation files(the "Software"), |
| to deal in the Software without restriction, including without limitation |
| the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| and / or sell copies of the Software, and to permit persons to whom the |
| Software is furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included |
| in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| OTHER DEALINGS IN THE SOFTWARE. |
| ============================================================================*/ |
| #pragma once |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| #include "GmmCachePolicyExt.h" |
| |
| #define ALWAYS_OVERRIDE 0xffffffff |
| #define NEVER_OVERRIDE 0x0 |
| |
| // IA PAT MSR Register |
| #define GMM_IA32e_PAT_MSR 0x277 |
| |
| #define GMM_PAT_ERROR ((uint32_t)-1) |
| |
| typedef struct GMM_CACHE_POLICY_ELEMENT_REC |
| { |
| uint32_t IDCode; |
| union { |
| struct{ |
| uint32_t LLC : 1; |
| uint32_t ELLC : 1; |
| uint32_t L3 : 1; |
| uint32_t WT : 1; |
| uint32_t AGE : 2; |
| uint32_t AOM : 1; |
| uint32_t LeCC_SCC : 3; |
| uint32_t L3_SCC : 3; |
| uint32_t SCF : 1; // Snoop Control Field for BXT |
| uint32_t CoS : 2; // Class of Service, driver default to Class 0 |
| uint32_t SSO : 2; // Self Snoop Override control and value |
| uint32_t HDCL1 : 1; // HDC L1 caching enable/disable |
| uint32_t L3Eviction : 2; // Specify L3-eviction type (NA, ReadOnly, Standard, Special) |
| uint32_t Initialized : 1; |
| uint32_t SegOv : 3; // Override seg-pref (none, local-only, sys-only, etc) |
| uint32_t GlbGo : 1; // Global GO point - L3 or Memory |
| uint32_t UcLookup : 1; // Snoop L3 for uncached |
| uint32_t Reserved : 5; |
| }; |
| uint32_t Value; |
| }; |
| |
| MEMORY_OBJECT_CONTROL_STATE MemoryObjectOverride; |
| MEMORY_OBJECT_CONTROL_STATE MemoryObjectNoOverride; |
| GMM_PTE_CACHE_CONTROL_BITS PTE; |
| uint32_t Override; |
| uint32_t IsOverridenByRegkey; // Flag to indicate If usage settings are overridden by regkey |
| }GMM_CACHE_POLICY_ELEMENT; |
| |
| // One entry in the SKL/CNL cache lookup table |
| typedef struct GMM_CACHE_POLICY_TBL_ELEMENT_REC { |
| union { |
| struct |
| { |
| uint32_t Cacheability : 2; // LLC/eDRAM Cacheability Control (LeCC). |
| uint32_t TargetCache : 2; // Target Cache (TC). |
| uint32_t LRUM : 2; // LRU (Cache Replacement) Management (LRUM). |
| uint32_t AOM : 1; // Do Not Allocate on Miss (AOM) - Not used |
| uint32_t ESC : 1; // Enable Skip Caching (ESC) on LLC |
| uint32_t SCC : 3; // Skip Caching Control (SCC). |
| uint32_t PFM : 3; // Page Fault Mode (PFM) |
| uint32_t SCF : 1; // Snoop Control Field (SCF) |
| uint32_t CoS : 2; // Class of Service (COS)- CNL+ |
| uint32_t SelfSnoop : 2; // Self Snoop override or not MIDI settings - CNL+ |
| uint32_t Reserved : 13; |
| } ; |
| uint32_t DwordValue; |
| } LeCC; |
| |
| union { |
| struct |
| { |
| uint16_t ESC : 1; // Enable Skip Caching (ESC) for L3. |
| uint16_t SCC : 3; // Skip Caching Control (SCC) for L3. |
| uint16_t Cacheability : 2; // L3 Cacheability Control (L3CC). |
| uint16_t Reserved : 10; |
| } ; |
| uint16_t UshortValue; |
| } L3; |
| uint8_t HDCL1; |
| } GMM_CACHE_POLICY_TBL_ELEMENT; |
| |
| typedef enum GMM_IA32e_MEMORY_TYPE_REC |
| { |
| GMM_IA32e_UC = 0x0, |
| GMM_IA32e_WC = 0x1, |
| GMM_IA32e_WT = 0x4, |
| GMM_IA32e_WP = 0x5, |
| GMM_IA32e_WB = 0x6, |
| GMM_IA32e_UCMINUS = 0x7 |
| } GMM_IA32e_MEMORY_TYPE; |
| |
| typedef enum GMM_GFX_MEMORY_TYPE_REC |
| { |
| GMM_GFX_UC_WITH_FENCE = 0x0, |
| GMM_GFX_WC = 0x1, |
| GMM_GFX_WT = 0x2, |
| GMM_GFX_WB = 0x3 |
| } GMM_GFX_MEMORY_TYPE; |
| |
| typedef enum GMM_GFX_PAT_TYPE_REC |
| { |
| GMM_GFX_PAT_WB_COHERENT = 0x0, // WB + Snoop : Atom |
| GMM_GFX_PAT_WC = 0x1, |
| GMM_GFX_PAT_WB_MOCSLESS = 0x2, // WB + eLLC/LLC : MOCSLess Resource (PageTables) |
| GMM_GFX_PAT_WB = 0x3, |
| GMM_GFX_PAT_WT = 0x4, |
| GMM_GFX_PAT_UC = 0x5 |
| } GMM_GFX_PAT_TYPE; |
| |
| typedef enum GMM_GFX_PAT_IDX_REC |
| { |
| PAT0 = 0x0, // Will be tied to GMM_GFX_PAT_WB_COHERENT or GMM_GFX_PAT_UC depending on WaGttPat0WB |
| PAT1, // Will be tied to GMM_GFX_PAT_UC or GMM_GFX_PAT_WB_COHERENT depending on WaGttPat0WB |
| PAT2, // Will be tied to GMM_GFX_PAT_WB_MOCSLESS |
| PAT3, // Will be tied to GMM_GFX_PAT_WB |
| PAT4, // Will be tied to GMM_GFX_PAT_WT |
| PAT5, // Will be tied to GMM_GFX_PAT_WC |
| PAT6, // Will be tied to GMM_GFX_PAT_WC |
| PAT7 // Will be tied to GMM_GFX_PAT_WC |
| }GMM_GFX_PAT_IDX; |
| |
| #define GFX_IS_ATOM_PLATFORM (GmmGetSkuTable(pGmmGlobalContext)->FtrLCIA) |
| |
| typedef enum GMM_GFX_TARGET_CACHE_REC |
| { |
| GMM_GFX_TC_ELLC_ONLY = 0x0, |
| GMM_GFX_TC_LLC_ONLY = 0x1, |
| GMM_GFX_TC_ELLC_LLC = 0x3 |
| } GMM_GFX_TARGET_CACHE; |
| |
| typedef union GMM_PRIVATE_PAT_REC { |
| |
| struct |
| { |
| uint32_t MemoryType : 2; |
| uint32_t TargetCache : 2; |
| uint32_t Age : 2; |
| uint32_t Snoop : 1; |
| uint32_t Reserved : 1; |
| }PreGen10; |
| |
| #if (IGFX_GEN >= IGFX_GEN10) |
| struct |
| { |
| uint32_t MemoryType : 2; |
| uint32_t TargetCache : 2; |
| uint32_t Age : 2; |
| uint32_t Reserved1 : 2; |
| uint32_t CoS : 2; |
| uint32_t Reserved2 : 22; |
| }Gen10; |
| #endif |
| |
| struct |
| { |
| uint32_t MemoryType : 2; |
| uint32_t Reserved : 30; |
| }Gen12; |
| |
| uint32_t Value; |
| |
| } GMM_PRIVATE_PAT; |
| |
| #ifdef _WIN32 |
| |
| #define GMM_CACHE_POLICY_OVERRIDE_REGISTY_PATH_REGISTRY_UMD "SOFTWARE\\Intel\\IGFX\\CachePolicy\\" |
| #define GMM_CACHE_POLICY_OVERRIDE_REGISTY_PATH_REGISTRY_KMD "\\REGISTRY\\MACHINE\\" GMM_CACHE_POLICY_OVERRIDE_REGISTY_PATH_REGISTRY_UMD |
| |
| // No local variables or ternary (?:) operators should be defined in the |
| // REG_OVERRIDE macro block. This block will generate hundreds of instances |
| // of itself in the OverrideCachePolicy, each of which will geneate a |
| // copy of these local variables on the stack. The ternary operator will |
| // also generate local temparoary stack variables, and all these add up and |
| // can cause a stack overflow. |
| |
| #define READOVERRIDES(Usage) \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,LLC)) LLC = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,ELLC)) ELLC = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,L3)) L3 = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,Age)) Age = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,WT)) WT = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,AOM)) AOM = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,LeCC_SCC)) LeCC_SCC = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,L3_SCC)) L3_SCC = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,SCF)) SCF = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,SSO)) SSO = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,CoS)) CoS = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,HDCL1)) HDCL1 = -1; \ |
| if (!REGISTRY_OVERRIDE_READ(Usage,L3Eviction)) L3Eviction = -1; \ |
| |
| |
| #define SETOVERRIDES(Usage) \ |
| if (LLC != -1) \ |
| { \ |
| pCachePolicy[Usage].LLC = LLC; \ |
| } \ |
| if (ELLC != -1) \ |
| { \ |
| pCachePolicy[Usage].ELLC = ELLC; \ |
| } \ |
| if (L3 != -1) \ |
| { \ |
| pCachePolicy[Usage].L3 = L3; \ |
| } \ |
| if (WT != -1) \ |
| { \ |
| pCachePolicy[Usage].WT = WT; \ |
| } \ |
| if (Age != -1) \ |
| { \ |
| pCachePolicy[Usage].AGE = Age; \ |
| } \ |
| if (AOM != -1) \ |
| { \ |
| pCachePolicy[Usage].AOM = AOM; \ |
| } \ |
| if (LeCC_SCC != -1) \ |
| { \ |
| pCachePolicy[Usage].LeCC_SCC = LeCC_SCC; \ |
| } \ |
| if (L3_SCC != -1) \ |
| { \ |
| pCachePolicy[Usage].L3_SCC = L3_SCC; \ |
| } \ |
| if (SCF != -1) \ |
| { \ |
| pCachePolicy[Usage].SCF = SCF; \ |
| } \ |
| if (SSO != -1) \ |
| { \ |
| pCachePolicy[Usage].SSO = SSO; \ |
| } \ |
| if (CoS != -1) \ |
| { \ |
| pCachePolicy[Usage].CoS = CoS; \ |
| } \ |
| if (HDCL1 != -1) \ |
| { \ |
| pCachePolicy[Usage].HDCL1 = HDCL1; \ |
| } \ |
| if (L3Eviction != -1) \ |
| { \ |
| pCachePolicy[Usage].L3Eviction = L3Eviction; \ |
| } \ |
| { \ |
| pCachePolicy[Usage].IsOverridenByRegkey = 1; \ |
| } |
| |
| #ifdef __GMM_KMD__ |
| #define REG_OVERRIDE(Usage) \ |
| { \ |
| enum {IGNORED = 0, CURRENT, DEFAULT, UNCACHED}; \ |
| \ |
| REGISTRY_OVERRIDE_READ(Usage,Enable); \ |
| \ |
| if (Enable && (GenerateKeys != UNCACHED)) \ |
| { \ |
| READOVERRIDES(Usage) \ |
| } \ |
| \ |
| if (GenerateKeys == DEFAULT || (GenerateKeys == CURRENT && !Enable)) \ |
| { \ |
| REGISTRY_OVERRIDE_WRITE(Usage,LLC, pCachePolicy[Usage].LLC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,ELLC,pCachePolicy[Usage].ELLC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,L3, pCachePolicy[Usage].L3); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,WT, pCachePolicy[Usage].WT); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,Age, pCachePolicy[Usage].AGE); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,AOM, pCachePolicy[Usage].AOM); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,LeCC_SCC, pCachePolicy[Usage].LeCC_SCC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,L3_SCC, pCachePolicy[Usage].L3_SCC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,SCF, pCachePolicy[Usage].SCF); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,SSO, pCachePolicy[Usage].SSO); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,CoS, pCachePolicy[Usage].CoS); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,HDCL1, pCachePolicy[Usage].HDCL1); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,L3Eviction, pCachePolicy[Usage].L3Eviction); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,Enable,0); \ |
| } \ |
| else if (GenerateKeys == UNCACHED || GenerateKeys == CURRENT) \ |
| { \ |
| if (GenerateKeys == UNCACHED) \ |
| { \ |
| Enable = 1; \ |
| } \ |
| REGISTRY_OVERRIDE_WRITE(Usage,LLC, LLC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,ELLC,ELLC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,L3, L3); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,WT, WT); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,Age, Age); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,AOM, AOM); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,LeCC_SCC, LeCC_SCC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,L3_SCC, L3_SCC); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,SCF, SCF); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,SSO, SSO); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,CoS, CoS); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,HDCL1, HDCL1); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,L3Eviction, L3Eviction); \ |
| REGISTRY_OVERRIDE_WRITE(Usage,Enable,Enable); \ |
| } \ |
| \ |
| if (Enable) \ |
| { \ |
| SETOVERRIDES(Usage) \ |
| } \ |
| \ |
| UsageCount++; \ |
| } |
| #else |
| #define REG_OVERRIDE(Usage) \ |
| { \ |
| REGISTRY_OVERRIDE_READ(Usage,Enable); \ |
| if (Enable) \ |
| { \ |
| READOVERRIDES(Usage) \ |
| SETOVERRIDES(Usage) \ |
| } \ |
| UsageCount++; \ |
| } |
| #endif |
| |
| #endif // #if _WIN32 |
| |
| #if __cplusplus |
| #include "GmmCachePolicyCommon.h" |
| #include "CachePolicy/GmmCachePolicyGen8.h" |
| #include "CachePolicy/GmmCachePolicyGen9.h" |
| #endif |
| |
| // Function Prototypes |
| GMM_STATUS GmmInitializeCachePolicy(); |
| GMM_GFX_MEMORY_TYPE GmmGetWantedMemoryType(GMM_CACHE_POLICY_ELEMENT CachePolicy); |
| |
| // Used for GMM ULT testing. |
| #ifdef __GMM_ULT |
| extern void __GmmULTCachePolicy(GMM_CACHE_POLICY_ELEMENT *pCachePolicy); |
| #endif |
| #ifdef __cplusplus |
| } |
| #endif |