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 /// Constructor for the GmmCachePolicyCommon Class, initializes the CachePolicy
28*35ffd701SAndroid Build Coastguard Worker /// @param[in] pCachePolicy
29*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmCachePolicyCommon(GMM_CACHE_POLICY_ELEMENT * pCachePolicy,Context * pGmmLibContext)30*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmCachePolicyCommon::GmmCachePolicyCommon(GMM_CACHE_POLICY_ELEMENT *pCachePolicy, Context *pGmmLibContext)
31*35ffd701SAndroid Build Coastguard Worker {
32*35ffd701SAndroid Build Coastguard Worker this->pCachePolicy = pCachePolicy;
33*35ffd701SAndroid Build Coastguard Worker this->pGmmLibContext = pGmmLibContext;
34*35ffd701SAndroid Build Coastguard Worker NumPATRegisters = GMM_NUM_PAT_ENTRIES_LEGACY;
35*35ffd701SAndroid Build Coastguard Worker NumMOCSRegisters = GMM_MAX_NUMBER_MOCS_INDEXES;
36*35ffd701SAndroid Build Coastguard Worker }
37*35ffd701SAndroid Build Coastguard Worker
38*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
39*35ffd701SAndroid Build Coastguard Worker /// Returns the wanted memory type for this usage.
40*35ffd701SAndroid Build Coastguard Worker ///
41*35ffd701SAndroid Build Coastguard Worker /// @param[in] CachePolicy: cache policy for a usage
42*35ffd701SAndroid Build Coastguard Worker ///
43*35ffd701SAndroid Build Coastguard Worker /// @return wanted memory type
44*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetWantedMemoryType(GMM_CACHE_POLICY_ELEMENT CachePolicy)45*35ffd701SAndroid Build Coastguard Worker GMM_GFX_MEMORY_TYPE GmmLib::GmmCachePolicyCommon::GetWantedMemoryType(GMM_CACHE_POLICY_ELEMENT CachePolicy)
46*35ffd701SAndroid Build Coastguard Worker {
47*35ffd701SAndroid Build Coastguard Worker GMM_GFX_MEMORY_TYPE WantedMemoryType = GMM_GFX_UC_WITH_FENCE;
48*35ffd701SAndroid Build Coastguard Worker if(CachePolicy.WT)
49*35ffd701SAndroid Build Coastguard Worker {
50*35ffd701SAndroid Build Coastguard Worker WantedMemoryType = GMM_GFX_WT;
51*35ffd701SAndroid Build Coastguard Worker }
52*35ffd701SAndroid Build Coastguard Worker else if(!(CachePolicy.LLC || CachePolicy.ELLC))
53*35ffd701SAndroid Build Coastguard Worker {
54*35ffd701SAndroid Build Coastguard Worker WantedMemoryType = GMM_GFX_UC_WITH_FENCE;
55*35ffd701SAndroid Build Coastguard Worker }
56*35ffd701SAndroid Build Coastguard Worker else
57*35ffd701SAndroid Build Coastguard Worker {
58*35ffd701SAndroid Build Coastguard Worker WantedMemoryType = GMM_GFX_WB;
59*35ffd701SAndroid Build Coastguard Worker }
60*35ffd701SAndroid Build Coastguard Worker return WantedMemoryType;
61*35ffd701SAndroid Build Coastguard Worker }
62*35ffd701SAndroid Build Coastguard Worker
63*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
64*35ffd701SAndroid Build Coastguard Worker /// Generates memory object based on resource usage
65*35ffd701SAndroid Build Coastguard Worker ///
66*35ffd701SAndroid Build Coastguard Worker /// @param[in] pResInfo: Resource info for resource , can be null
67*35ffd701SAndroid Build Coastguard Worker /// @param[in] Usage: Current usage for resource
68*35ffd701SAndroid Build Coastguard Worker ///
69*35ffd701SAndroid Build Coastguard Worker /// @return MEMORY_OBJECT_CONTROL_STATE: Populated memory object
70*35ffd701SAndroid Build Coastguard Worker ///
71*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetOriginalMemoryObject(GMM_RESOURCE_INFO * pResInfo)72*35ffd701SAndroid Build Coastguard Worker MEMORY_OBJECT_CONTROL_STATE GMM_STDCALL GmmLib::GmmCachePolicyCommon::CachePolicyGetOriginalMemoryObject(GMM_RESOURCE_INFO *pResInfo)
73*35ffd701SAndroid Build Coastguard Worker {
74*35ffd701SAndroid Build Coastguard Worker MEMORY_OBJECT_CONTROL_STATE MOCS = pGmmLibContext->GetCachePolicyElement(GMM_RESOURCE_USAGE_UNKNOWN).MemoryObjectOverride;
75*35ffd701SAndroid Build Coastguard Worker
76*35ffd701SAndroid Build Coastguard Worker if(pResInfo)
77*35ffd701SAndroid Build Coastguard Worker {
78*35ffd701SAndroid Build Coastguard Worker MOCS = pResInfo->GetMOCS();
79*35ffd701SAndroid Build Coastguard Worker }
80*35ffd701SAndroid Build Coastguard Worker
81*35ffd701SAndroid Build Coastguard Worker return MOCS;
82*35ffd701SAndroid Build Coastguard Worker }
83*35ffd701SAndroid Build Coastguard Worker
84*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
85*35ffd701SAndroid Build Coastguard Worker /// A simple getter function returning the MOCS (cache policy) for a given
86*35ffd701SAndroid Build Coastguard Worker /// use Usage of the named resource pResInfo.
87*35ffd701SAndroid Build Coastguard Worker /// Typically used to populate a SURFACE_STATE for a GPU task.
88*35ffd701SAndroid Build Coastguard Worker ///
89*35ffd701SAndroid Build Coastguard Worker /// @param[in] pResInfo: Resource info for resource, can be NULL.
90*35ffd701SAndroid Build Coastguard Worker /// @param[in] Usage: Current usage for resource.
91*35ffd701SAndroid Build Coastguard Worker ///
92*35ffd701SAndroid Build Coastguard Worker /// @return MEMORY_OBJECT_CONTROL_STATE: Gen adjusted MOCS structure (cache
93*35ffd701SAndroid Build Coastguard Worker /// policy) for the given buffer use.
94*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetMemoryObject(GMM_RESOURCE_INFO * pResInfo,GMM_RESOURCE_USAGE_TYPE Usage)95*35ffd701SAndroid Build Coastguard Worker MEMORY_OBJECT_CONTROL_STATE GMM_STDCALL GmmLib::GmmCachePolicyCommon::CachePolicyGetMemoryObject(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage)
96*35ffd701SAndroid Build Coastguard Worker {
97*35ffd701SAndroid Build Coastguard Worker const GMM_CACHE_POLICY_ELEMENT *CachePolicy = NULL;
98*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pGmmLibContext->GetCachePolicyElement(Usage).Initialized);
99*35ffd701SAndroid Build Coastguard Worker CachePolicy = pGmmLibContext->GetCachePolicyUsage();
100*35ffd701SAndroid Build Coastguard Worker // Prevent wrong Usage for XAdapter resources. UMD does not call GetMemoryObject on shader resources but,
101*35ffd701SAndroid Build Coastguard Worker // when they add it someone could call it without knowing the restriction.
102*35ffd701SAndroid Build Coastguard Worker if(pResInfo &&
103*35ffd701SAndroid Build Coastguard Worker pResInfo->GetResFlags().Info.XAdapter &&
104*35ffd701SAndroid Build Coastguard Worker (Usage != GMM_RESOURCE_USAGE_XADAPTER_SHARED_RESOURCE))
105*35ffd701SAndroid Build Coastguard Worker {
106*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(false);
107*35ffd701SAndroid Build Coastguard Worker }
108*35ffd701SAndroid Build Coastguard Worker
109*35ffd701SAndroid Build Coastguard Worker if(!pResInfo ||
110*35ffd701SAndroid Build Coastguard Worker (CachePolicy[Usage].Override & CachePolicy[pResInfo->GetCachePolicyUsage()].IDCode) ||
111*35ffd701SAndroid Build Coastguard Worker (CachePolicy[Usage].Override == ALWAYS_OVERRIDE))
112*35ffd701SAndroid Build Coastguard Worker {
113*35ffd701SAndroid Build Coastguard Worker return CachePolicy[Usage].MemoryObjectOverride;
114*35ffd701SAndroid Build Coastguard Worker }
115*35ffd701SAndroid Build Coastguard Worker else
116*35ffd701SAndroid Build Coastguard Worker {
117*35ffd701SAndroid Build Coastguard Worker return CachePolicy[Usage].MemoryObjectNoOverride;
118*35ffd701SAndroid Build Coastguard Worker }
119*35ffd701SAndroid Build Coastguard Worker }
120*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
121*35ffd701SAndroid Build Coastguard Worker /// A simple getter function returning the PAT (cache policy) for a given
122*35ffd701SAndroid Build Coastguard Worker /// use Usage of the named resource pResInfo.
123*35ffd701SAndroid Build Coastguard Worker /// Typically used to populate PPGTT/GGTT.
124*35ffd701SAndroid Build Coastguard Worker ///
125*35ffd701SAndroid Build Coastguard Worker /// @param[in] pResInfo: Resource info for resource, can be NULL.
126*35ffd701SAndroid Build Coastguard Worker /// @param[in] Usage: Current usage for resource.
127*35ffd701SAndroid Build Coastguard Worker ///
128*35ffd701SAndroid Build Coastguard Worker /// @return PATIndex
129*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetPATIndex(GMM_RESOURCE_INFO * pResInfo,GMM_RESOURCE_USAGE_TYPE Usage,bool * pCompressionEnable,bool IsCpuCacheable)130*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmCachePolicyCommon::CachePolicyGetPATIndex(GMM_RESOURCE_INFO *pResInfo, GMM_RESOURCE_USAGE_TYPE Usage, bool *pCompressionEnable, bool IsCpuCacheable)
131*35ffd701SAndroid Build Coastguard Worker {
132*35ffd701SAndroid Build Coastguard Worker GMM_UNREFERENCED_PARAMETER(pResInfo);
133*35ffd701SAndroid Build Coastguard Worker GMM_UNREFERENCED_PARAMETER(Usage);
134*35ffd701SAndroid Build Coastguard Worker GMM_UNREFERENCED_PARAMETER(pCompressionEnable);
135*35ffd701SAndroid Build Coastguard Worker GMM_UNREFERENCED_PARAMETER(IsCpuCacheable);
136*35ffd701SAndroid Build Coastguard Worker
137*35ffd701SAndroid Build Coastguard Worker return GMM_PAT_ERROR;
138*35ffd701SAndroid Build Coastguard Worker }
139*35ffd701SAndroid Build Coastguard Worker
140*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
141*35ffd701SAndroid Build Coastguard Worker /// Generates PTE based on resource usage
142*35ffd701SAndroid Build Coastguard Worker ///
143*35ffd701SAndroid Build Coastguard Worker /// @param[in] Usage: type of usage
144*35ffd701SAndroid Build Coastguard Worker ///
145*35ffd701SAndroid Build Coastguard Worker /// @return GMM_PTE_CACHE_CONTROL_BITS: Populated PTE
146*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetPteType(GMM_RESOURCE_USAGE_TYPE Usage)147*35ffd701SAndroid Build Coastguard Worker GMM_PTE_CACHE_CONTROL_BITS GMM_STDCALL GmmLib::GmmCachePolicyCommon::CachePolicyGetPteType(GMM_RESOURCE_USAGE_TYPE Usage)
148*35ffd701SAndroid Build Coastguard Worker {
149*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pGmmLibContext->GetCachePolicyElement(Usage).Initialized);
150*35ffd701SAndroid Build Coastguard Worker return pGmmLibContext->GetCachePolicyElement(Usage).PTE;
151*35ffd701SAndroid Build Coastguard Worker }
152*35ffd701SAndroid Build Coastguard Worker
153*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
154*35ffd701SAndroid Build Coastguard Worker /// Returns number of PAT entries possible on that platform
155*35ffd701SAndroid Build Coastguard Worker ///
156*35ffd701SAndroid Build Coastguard Worker /// @return uint32_t
157*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
CachePolicyGetNumPATRegisters()158*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmCachePolicyCommon::CachePolicyGetNumPATRegisters()
159*35ffd701SAndroid Build Coastguard Worker {
160*35ffd701SAndroid Build Coastguard Worker return NumPATRegisters;
161*35ffd701SAndroid Build Coastguard Worker }
162*35ffd701SAndroid Build Coastguard Worker
163*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
164*35ffd701SAndroid Build Coastguard Worker /// Returns L1 cache attribute based on resource usage
165*35ffd701SAndroid Build Coastguard Worker ///
166*35ffd701SAndroid Build Coastguard Worker /// @return uint32_t
167*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetSurfaceStateL1CachePolicy(GMM_RESOURCE_USAGE_TYPE Usage)168*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmCachePolicyCommon::GetSurfaceStateL1CachePolicy(GMM_RESOURCE_USAGE_TYPE Usage)
169*35ffd701SAndroid Build Coastguard Worker {
170*35ffd701SAndroid Build Coastguard Worker __GMM_ASSERT(pCachePolicy[Usage].Initialized);
171*35ffd701SAndroid Build Coastguard Worker return pCachePolicy[Usage].L1CC;
172*35ffd701SAndroid Build Coastguard Worker }
173