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