xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/GlobalInfo/GmmInfo.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 
25*35ffd701SAndroid Build Coastguard Worker #if(!defined(__GMM_KMD__) && !GMM_LIB_DLL_MA)
26*35ffd701SAndroid Build Coastguard Worker int32_t GmmLib::Context::RefCount = 0;
27*35ffd701SAndroid Build Coastguard Worker #endif
28*35ffd701SAndroid Build Coastguard Worker 
29*35ffd701SAndroid Build Coastguard Worker #ifdef GMM_LIB_DLL
30*35ffd701SAndroid Build Coastguard Worker 
31*35ffd701SAndroid Build Coastguard Worker // Create Mutex Object used for syncronization of ProcessSingleton Context
32*35ffd701SAndroid Build Coastguard Worker #if !GMM_LIB_DLL_MA
33*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
34*35ffd701SAndroid Build Coastguard Worker GMM_MUTEX_HANDLE GmmLib::Context::SingletonContextSyncMutex = ::CreateMutex(NULL, false, NULL);
35*35ffd701SAndroid Build Coastguard Worker #else  //_WIN32
36*35ffd701SAndroid Build Coastguard Worker GMM_MUTEX_HANDLE      GmmLib::Context::SingletonContextSyncMutex = PTHREAD_MUTEX_INITIALIZER;
37*35ffd701SAndroid Build Coastguard Worker #endif // _WIN32
38*35ffd701SAndroid Build Coastguard Worker #endif //!GMM_LIB_DLL_MA
39*35ffd701SAndroid Build Coastguard Worker 
40*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
41*35ffd701SAndroid Build Coastguard Worker /// GMM lib DLL Multi Adapter Functions
42*35ffd701SAndroid Build Coastguard Worker /// 1. This is the main holder of the Gmmlib Context
43*35ffd701SAndroid Build Coastguard Worker /// 2. There is only one Multi-Adpater Context object created per process.
44*35ffd701SAndroid Build Coastguard Worker /// 3. Gmmlib dll is loaded only once per process, This done by the first UMD client
45*35ffd701SAndroid Build Coastguard Worker ///    requesting Libcontext on a first Adpater to be registered with Gmmlib.
46*35ffd701SAndroid Build Coastguard Worker /// 4. Gmmlib dll is Unloaded only once per process, this is done by the last client
47*35ffd701SAndroid Build Coastguard Worker ///    destroying the LibContext on the only last registered Adapter with Gmmlib.
48*35ffd701SAndroid Build Coastguard Worker /// 5. The LibContext for an Adapter is same across all the N clients and is always
49*35ffd701SAndroid Build Coastguard Worker ///    equal.
50*35ffd701SAndroid Build Coastguard Worker /// 6. The ClientContext for all the N clients on particaluar Adapter is unique and
51*35ffd701SAndroid Build Coastguard Worker ///    never equal.
52*35ffd701SAndroid Build Coastguard Worker /// 7  Ex: N UMD clients querying GmmLib for an GPU Adapter's Properties will have the
53*35ffd701SAndroid Build Coastguard Worker ///    Same/Single LibContext and Unique N ClientContexts for that same adpater, on
54*35ffd701SAndroid Build Coastguard Worker ///    same process.
55*35ffd701SAndroid Build Coastguard Worker /// 8. GmmLib is dynamically scalable for any number of GPU Adapters and any number
56*35ffd701SAndroid Build Coastguard Worker ///    of Clients per Adapter.
57*35ffd701SAndroid Build Coastguard Worker /// 9. In Multiprocessing, for a process, the Gmmlib Multi-Adpater Context
58*35ffd701SAndroid Build Coastguard Worker ///    object is protected/syncronized using the Lock/UnLockMAContextSyncMutex
59*35ffd701SAndroid Build Coastguard Worker /// 9. In Multiprocessing, for a process with Gmmlib Multi-Adpater Context the
60*35ffd701SAndroid Build Coastguard Worker ///    LibContetxt is protected/syncronized using Lock/unLockSingletonContextSyncMutex
61*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
62*35ffd701SAndroid Build Coastguard Worker GMM_MA_LIB_CONTEXT *pGmmMALibContext = NULL;
63*35ffd701SAndroid Build Coastguard Worker 
64*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
65*35ffd701SAndroid Build Coastguard Worker /// Function to create GmmMultiAdapterContext Object
66*35ffd701SAndroid Build Coastguard Worker /// Called only during dll load time.
67*35ffd701SAndroid Build Coastguard Worker /// Since Linux doesnt have DLL Main equivalent, adding __attribute__((constructor))
68*35ffd701SAndroid Build Coastguard Worker /// for this GmmCreateMultiAdapterContext()
69*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmCreateMultiAdapterContext()70*35ffd701SAndroid Build Coastguard Worker extern "C" GMM_LIB_API_CONSTRUCTOR void GmmCreateMultiAdapterContext()
71*35ffd701SAndroid Build Coastguard Worker {
72*35ffd701SAndroid Build Coastguard Worker     if(!pGmmMALibContext)
73*35ffd701SAndroid Build Coastguard Worker     {
74*35ffd701SAndroid Build Coastguard Worker         // This is called only during dll load
75*35ffd701SAndroid Build Coastguard Worker         // Initializes the MA context.
76*35ffd701SAndroid Build Coastguard Worker 	pGmmMALibContext = new GMM_MA_LIB_CONTEXT();
77*35ffd701SAndroid Build Coastguard Worker     }
78*35ffd701SAndroid Build Coastguard Worker }
79*35ffd701SAndroid Build Coastguard Worker 
80*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
81*35ffd701SAndroid Build Coastguard Worker /// Function to Destroy GmmMultiAdapterContext Object
82*35ffd701SAndroid Build Coastguard Worker /// Called Only during Dll Unload.
83*35ffd701SAndroid Build Coastguard Worker /// Since Linux doesnt have DLL Main equivalent, adding __attribute__((destructor))
84*35ffd701SAndroid Build Coastguard Worker /// for this GmmDestroyMultiAdapterContext()
85*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmDestroyMultiAdapterContext()86*35ffd701SAndroid Build Coastguard Worker extern "C" GMM_LIB_API_DESTRUCTOR void GmmDestroyMultiAdapterContext()
87*35ffd701SAndroid Build Coastguard Worker {
88*35ffd701SAndroid Build Coastguard Worker     if(pGmmMALibContext)
89*35ffd701SAndroid Build Coastguard Worker     {
90*35ffd701SAndroid Build Coastguard Worker         // Before destroying GmmMultiAdapterContext, check if all the Adapters have
91*35ffd701SAndroid Build Coastguard Worker         // their GmmLibContext destroyed.
92*35ffd701SAndroid Build Coastguard Worker         // At this point the linked list is empty and pHeadNode = NULL & NumAdapter=0.
93*35ffd701SAndroid Build Coastguard Worker 	if(!pGmmMALibContext->GetNumAdapters())
94*35ffd701SAndroid Build Coastguard Worker         {
95*35ffd701SAndroid Build Coastguard Worker             delete pGmmMALibContext;
96*35ffd701SAndroid Build Coastguard Worker             pGmmMALibContext = NULL;
97*35ffd701SAndroid Build Coastguard Worker         }
98*35ffd701SAndroid Build Coastguard Worker     }
99*35ffd701SAndroid Build Coastguard Worker }
100*35ffd701SAndroid Build Coastguard Worker 
101*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
102*35ffd701SAndroid Build Coastguard Worker /// GMM lib DLL function for creating Singleton Context (GmmLib::Context)
103*35ffd701SAndroid Build Coastguard Worker /// object which shall be process singleton across all UMD clients within a process
104*35ffd701SAndroid Build Coastguard Worker /// This function creates an object in the global MultiAdapter Context..
105*35ffd701SAndroid Build Coastguard Worker /// @see        Class GmmLib::Context
106*35ffd701SAndroid Build Coastguard Worker ///
107*35ffd701SAndroid Build Coastguard Worker /// @param[in]  Platform: platform variable. Includes product family (Haswell, Cherryview,
108*35ffd701SAndroid Build Coastguard Worker ///                       Broxton) with related render and display core revision (GEN3,
109*35ffd701SAndroid Build Coastguard Worker //                        ..., GEN10)
110*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pSkuTable: Pointer to the sku feature table. Set of capabilities to
111*35ffd701SAndroid Build Coastguard Worker ///                        allow code paths to be feature based and GEN agnostic.
112*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pWaTable:  Pointer to the work around table. A set of anti-features,
113*35ffd701SAndroid Build Coastguard Worker ///                        often in early/prototype silicon that require work-arounds
114*35ffd701SAndroid Build Coastguard Worker ///                        until they are resolved to allow code paths to be GEN agnostic.
115*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGtSysInfo: Pointer to the GT system info. Contains various GT System
116*35ffd701SAndroid Build Coastguard Worker ///                        Information such as EU counts, Thread Counts, Cache Sizes etc.
117*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBDF: Adapter's BDF info for which SingletonContext has to be created
118*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_SUCCESS if Context is created, GMM_ERROR otherwise
119*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
120*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
GmmCreateLibContext(const PLATFORM Platform,const SKU_FEATURE_TABLE * pSkuTable,const WA_TABLE * pWaTable,const GT_SYSTEM_INFO * pGtSysInfo,ADAPTER_BDF sBdf)121*35ffd701SAndroid Build Coastguard Worker extern "C" GMM_STATUS GMM_STDCALL GmmCreateLibContext(const PLATFORM           Platform,
122*35ffd701SAndroid Build Coastguard Worker                                                       const SKU_FEATURE_TABLE *pSkuTable,
123*35ffd701SAndroid Build Coastguard Worker                                                       const WA_TABLE *         pWaTable,
124*35ffd701SAndroid Build Coastguard Worker                                                       const GT_SYSTEM_INFO *   pGtSysInfo,
125*35ffd701SAndroid Build Coastguard Worker                                                       ADAPTER_BDF              sBdf)
126*35ffd701SAndroid Build Coastguard Worker #else
127*35ffd701SAndroid Build Coastguard Worker extern "C" GMM_STATUS GMM_STDCALL GmmCreateLibContext(const PLATFORM Platform,
128*35ffd701SAndroid Build Coastguard Worker                                                       const void *   pSkuTable,
129*35ffd701SAndroid Build Coastguard Worker                                                       const void *   pWaTable,
130*35ffd701SAndroid Build Coastguard Worker                                                       const void *   pGtSysInfo,
131*35ffd701SAndroid Build Coastguard Worker                                                       ADAPTER_BDF    sBdf,
132*35ffd701SAndroid Build Coastguard Worker                                                       const GMM_CLIENT ClientType)
133*35ffd701SAndroid Build Coastguard Worker #endif
134*35ffd701SAndroid Build Coastguard Worker {
135*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pSkuTable, GMM_ERROR);
136*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pWaTable, GMM_ERROR);
137*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(pGtSysInfo, GMM_ERROR);
138*35ffd701SAndroid Build Coastguard Worker 
139*35ffd701SAndroid Build Coastguard Worker     // If pGmmMALibContext object is NULL, return error as DLL load would have failed
140*35ffd701SAndroid Build Coastguard Worker     if(!pGmmMALibContext)
141*35ffd701SAndroid Build Coastguard Worker     {
142*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
143*35ffd701SAndroid Build Coastguard Worker     }
144*35ffd701SAndroid Build Coastguard Worker 
145*35ffd701SAndroid Build Coastguard Worker #if LHDM
146*35ffd701SAndroid Build Coastguard Worker     return pGmmMALibContext->AddContext(Platform, pSkuTable, pWaTable, pGtSysInfo, sBdf, DeviceRegistryPath);
147*35ffd701SAndroid Build Coastguard Worker #else
148*35ffd701SAndroid Build Coastguard Worker     return pGmmMALibContext->AddContext(Platform, pSkuTable, pWaTable, pGtSysInfo, sBdf, ClientType);
149*35ffd701SAndroid Build Coastguard Worker #endif
150*35ffd701SAndroid Build Coastguard Worker }
151*35ffd701SAndroid Build Coastguard Worker 
152*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
153*35ffd701SAndroid Build Coastguard Worker /// GMM lib DLL function for deleting the Singleton Context.
154*35ffd701SAndroid Build Coastguard Worker /// Reference Count will be decremented and once the reference count reaches 0,
155*35ffd701SAndroid Build Coastguard Worker /// Singleton Context will be freed in memory. This removes a singleton context from
156*35ffd701SAndroid Build Coastguard Worker /// the global MultiAdapter Context
157*35ffd701SAndroid Build Coastguard Worker ///
158*35ffd701SAndroid Build Coastguard Worker /// @param[in] sbdf: Adapter's BDF info that needs its SingletonContext to be freed
159*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmLibContextFree(ADAPTER_BDF sBdf)160*35ffd701SAndroid Build Coastguard Worker extern "C" void GMM_STDCALL GmmLibContextFree(ADAPTER_BDF sBdf)
161*35ffd701SAndroid Build Coastguard Worker {
162*35ffd701SAndroid Build Coastguard Worker     if (pGmmMALibContext)
163*35ffd701SAndroid Build Coastguard Worker     {
164*35ffd701SAndroid Build Coastguard Worker         pGmmMALibContext->RemoveContext(sBdf);
165*35ffd701SAndroid Build Coastguard Worker     }
166*35ffd701SAndroid Build Coastguard Worker }
167*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
168*35ffd701SAndroid Build Coastguard Worker /// Constructor to zero initialize the GmmLib::GmmMultiAdapterContext object and create
169*35ffd701SAndroid Build Coastguard Worker /// GmmMultiAdapterContext class object
170*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GmmMultiAdapterContext()171*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmMultiAdapterContext::GmmMultiAdapterContext()
172*35ffd701SAndroid Build Coastguard Worker {
173*35ffd701SAndroid Build Coastguard Worker     this->NumAdapters = 0;
174*35ffd701SAndroid Build Coastguard Worker     pCpuReserveBase   = NULL;
175*35ffd701SAndroid Build Coastguard Worker     CpuReserveSize    = 0;
176*35ffd701SAndroid Build Coastguard Worker     // The Multi-Adapter Initialization is done dynamiclly using a Single Linked list Vector
177*35ffd701SAndroid Build Coastguard Worker     // pHeadNode points to the root node of the linked list and registers the first
178*35ffd701SAndroid Build Coastguard Worker     // adapter received from UMD.
179*35ffd701SAndroid Build Coastguard Worker     // Initializing to NULL at DLL load.
180*35ffd701SAndroid Build Coastguard Worker     this->pHeadNode = NULL;
181*35ffd701SAndroid Build Coastguard Worker 
182*35ffd701SAndroid Build Coastguard Worker // Initializes the GmmLib::GmmMultiAdapterContext sync Mutex
183*35ffd701SAndroid Build Coastguard Worker // This is required whenever any update has to be done Multiadapter context
184*35ffd701SAndroid Build Coastguard Worker // This includes Addition, deletion and search operations of the GMM_ADAPTER_INFO linked list
185*35ffd701SAndroid Build Coastguard Worker     MAContextSyncMutex = PTHREAD_MUTEX_INITIALIZER;
186*35ffd701SAndroid Build Coastguard Worker }
187*35ffd701SAndroid Build Coastguard Worker 
188*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
189*35ffd701SAndroid Build Coastguard Worker /// Destructor to free  GmmLib::GmmMultiAdapterContext object memory
190*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
~GmmMultiAdapterContext()191*35ffd701SAndroid Build Coastguard Worker GmmLib::GmmMultiAdapterContext::~GmmMultiAdapterContext()
192*35ffd701SAndroid Build Coastguard Worker {
193*35ffd701SAndroid Build Coastguard Worker     uint32_t i = 0;
194*35ffd701SAndroid Build Coastguard Worker 
195*35ffd701SAndroid Build Coastguard Worker // Un-initializes the GmmLib::GmmMultiAdapterContext sync Mutex
196*35ffd701SAndroid Build Coastguard Worker     pthread_mutex_destroy(&MAContextSyncMutex);
197*35ffd701SAndroid Build Coastguard Worker }
198*35ffd701SAndroid Build Coastguard Worker 
199*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
200*35ffd701SAndroid Build Coastguard Worker /// Multi Adapter member function for creating Singleton Context (GmmLib::Context)
201*35ffd701SAndroid Build Coastguard Worker /// object which shall be process singleton across all UMD clients within a process.
202*35ffd701SAndroid Build Coastguard Worker /// This function is thread safe for the MultiAdapterContext object.
203*35ffd701SAndroid Build Coastguard Worker /// @see        Class GmmLib::Context
204*35ffd701SAndroid Build Coastguard Worker ///
205*35ffd701SAndroid Build Coastguard Worker /// @param[in]  Platform: platform variable. Includes product family (Haswell, Cherryview,
206*35ffd701SAndroid Build Coastguard Worker ///                       Broxton) with related render and display core revision (GEN3,
207*35ffd701SAndroid Build Coastguard Worker //                        ..., GEN10)
208*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pSkuTable:  Pointer to the sku feature table. Set of capabilities to
209*35ffd701SAndroid Build Coastguard Worker ///                         allow code paths to be feature based and GEN agnostic.
210*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pWaTable:   Pointer to the work around table. A set of anti-features,
211*35ffd701SAndroid Build Coastguard Worker ///                         often in early/prototype silicon that require work-arounds
212*35ffd701SAndroid Build Coastguard Worker ///                         until they are resolved to allow code paths to be GEN agnostic.
213*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGtSysInfo: Pointer to the GT system info. Contains various GT System
214*35ffd701SAndroid Build Coastguard Worker ///                         Information such as EU counts, Thread Counts, Cache Sizes etc.
215*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBDF:       Adapter's BDF info for which SingletonContext i.e Adapter Node
216*35ffd701SAndroid Build Coastguard Worker ///                         has to be created.
217*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_SUCCESS if Context is created, GMM_ERROR otherwise
218*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
219*35ffd701SAndroid Build Coastguard Worker #if LHDM
AddContext(const PLATFORM Platform,const SKU_FEATURE_TABLE * _pSkuTable,const WA_TABLE * _pWaTable,const GT_SYSTEM_INFO * _pGtSysInfo,ADAPTER_BDF sBdf,const char * DeviceRegistryPath,uint32_t PhysicalAdapterIndex)220*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::AddContext(const PLATFORM           Platform,
221*35ffd701SAndroid Build Coastguard Worker                                                                   const SKU_FEATURE_TABLE *_pSkuTable,
222*35ffd701SAndroid Build Coastguard Worker                                                                   const WA_TABLE          *_pWaTable,
223*35ffd701SAndroid Build Coastguard Worker                                                                   const GT_SYSTEM_INFO    *_pGtSysInfo,
224*35ffd701SAndroid Build Coastguard Worker                                                                   ADAPTER_BDF              sBdf,
225*35ffd701SAndroid Build Coastguard Worker                                                                   const char              *DeviceRegistryPath,
226*35ffd701SAndroid Build Coastguard Worker                                                                   uint32_t                 PhysicalAdapterIndex)
227*35ffd701SAndroid Build Coastguard Worker #else
228*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::AddContext(const PLATFORM Platform,
229*35ffd701SAndroid Build Coastguard Worker                                                                   const void    *_pSkuTable,
230*35ffd701SAndroid Build Coastguard Worker                                                                   const void    *_pWaTable,
231*35ffd701SAndroid Build Coastguard Worker                                                                   const void    *_pGtSysInfo,
232*35ffd701SAndroid Build Coastguard Worker                                                                   ADAPTER_BDF    sBdf,
233*35ffd701SAndroid Build Coastguard Worker                                                                   const GMM_CLIENT ClientType)
234*35ffd701SAndroid Build Coastguard Worker #endif
235*35ffd701SAndroid Build Coastguard Worker {
236*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(_pSkuTable, GMM_ERROR);
237*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(_pWaTable, GMM_ERROR);
238*35ffd701SAndroid Build Coastguard Worker     __GMM_ASSERTPTR(_pGtSysInfo, GMM_ERROR);
239*35ffd701SAndroid Build Coastguard Worker 
240*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS                Status = GMM_SUCCESS;
241*35ffd701SAndroid Build Coastguard Worker     SKU_FEATURE_TABLE        *pSkuTable;
242*35ffd701SAndroid Build Coastguard Worker     WA_TABLE                 *pWaTable;
243*35ffd701SAndroid Build Coastguard Worker     GT_SYSTEM_INFO           *pSysInfo;
244*35ffd701SAndroid Build Coastguard Worker     GMM_LIB_CONTEXT          *pGmmLibContext = NULL;
245*35ffd701SAndroid Build Coastguard Worker     GmmLib::GMM_ADAPTER_INFO *pNode          = NULL;
246*35ffd701SAndroid Build Coastguard Worker 
247*35ffd701SAndroid Build Coastguard Worker     pSkuTable = (SKU_FEATURE_TABLE *)_pSkuTable;
248*35ffd701SAndroid Build Coastguard Worker     pWaTable  = (WA_TABLE *)_pWaTable;
249*35ffd701SAndroid Build Coastguard Worker     pSysInfo  = (GT_SYSTEM_INFO *)_pGtSysInfo;
250*35ffd701SAndroid Build Coastguard Worker 
251*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS SyncLockStatus = LockMAContextSyncMutex();
252*35ffd701SAndroid Build Coastguard Worker     if (SyncLockStatus != GMM_SUCCESS)
253*35ffd701SAndroid Build Coastguard Worker     {
254*35ffd701SAndroid Build Coastguard Worker         return SyncLockStatus;
255*35ffd701SAndroid Build Coastguard Worker     }
256*35ffd701SAndroid Build Coastguard Worker 
257*35ffd701SAndroid Build Coastguard Worker     // see if a context with the given BDF already exists
258*35ffd701SAndroid Build Coastguard Worker     pNode = GetAdapterNodeUnlocked(sBdf);
259*35ffd701SAndroid Build Coastguard Worker 
260*35ffd701SAndroid Build Coastguard Worker     if (pNode)
261*35ffd701SAndroid Build Coastguard Worker     {
262*35ffd701SAndroid Build Coastguard Worker         // The requested adapter context already exists. increment the reference count.
263*35ffd701SAndroid Build Coastguard Worker         // No further initialization needed.
264*35ffd701SAndroid Build Coastguard Worker         pNode->pGmmLibContext->IncrementRefCount();
265*35ffd701SAndroid Build Coastguard Worker         UnLockMAContextSyncMutex();
266*35ffd701SAndroid Build Coastguard Worker         return GMM_SUCCESS;
267*35ffd701SAndroid Build Coastguard Worker     }
268*35ffd701SAndroid Build Coastguard Worker 
269*35ffd701SAndroid Build Coastguard Worker     // No context exists for this bdf. Add a new node to store the context.
270*35ffd701SAndroid Build Coastguard Worker     pNode = AddAdapterNode();
271*35ffd701SAndroid Build Coastguard Worker     if (pNode == NULL)
272*35ffd701SAndroid Build Coastguard Worker     {
273*35ffd701SAndroid Build Coastguard Worker         UnLockMAContextSyncMutex();
274*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
275*35ffd701SAndroid Build Coastguard Worker     }
276*35ffd701SAndroid Build Coastguard Worker 
277*35ffd701SAndroid Build Coastguard Worker     // No context for this adapter yet, Lets create a new LibContext
278*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext = new GMM_LIB_CONTEXT();
279*35ffd701SAndroid Build Coastguard Worker     if (pGmmLibContext == NULL)
280*35ffd701SAndroid Build Coastguard Worker     {
281*35ffd701SAndroid Build Coastguard Worker         RemoveAdapterNode(pNode);
282*35ffd701SAndroid Build Coastguard Worker         pNode = NULL;
283*35ffd701SAndroid Build Coastguard Worker         UnLockMAContextSyncMutex();
284*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
285*35ffd701SAndroid Build Coastguard Worker     }
286*35ffd701SAndroid Build Coastguard Worker 
287*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->IncrementRefCount();
288*35ffd701SAndroid Build Coastguard Worker 
289*35ffd701SAndroid Build Coastguard Worker     Status = (pGmmLibContext->InitContext(Platform, pSkuTable, pWaTable, pSysInfo, ClientType));
290*35ffd701SAndroid Build Coastguard Worker     if (Status != GMM_SUCCESS)
291*35ffd701SAndroid Build Coastguard Worker     {
292*35ffd701SAndroid Build Coastguard Worker         //clean everything and return error
293*35ffd701SAndroid Build Coastguard Worker         pGmmLibContext->DecrementRefCount();
294*35ffd701SAndroid Build Coastguard Worker         pGmmLibContext->DestroyContext();
295*35ffd701SAndroid Build Coastguard Worker         // Delete/free the LibContext object
296*35ffd701SAndroid Build Coastguard Worker         delete pGmmLibContext;
297*35ffd701SAndroid Build Coastguard Worker         RemoveAdapterNode(pNode);
298*35ffd701SAndroid Build Coastguard Worker         UnLockMAContextSyncMutex();
299*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
300*35ffd701SAndroid Build Coastguard Worker     }
301*35ffd701SAndroid Build Coastguard Worker 
302*35ffd701SAndroid Build Coastguard Worker #if LHDM
303*35ffd701SAndroid Build Coastguard Worker     // Initialize SingletonContext Data.
304*35ffd701SAndroid Build Coastguard Worker     // TBD: ProcessHeap creation requires size and GfxAddress parameters. These parameters are constants
305*35ffd701SAndroid Build Coastguard Worker     // and are given by GMM lib internally by PageTableMgr. Hence pHeapObj should be created here at the
306*35ffd701SAndroid Build Coastguard Worker     // time of SingletonContext creation. But untill all UMD clients have moved to GMM DLL, then we will
307*35ffd701SAndroid Build Coastguard Worker     // create this here.
308*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->pHeapObj           = NULL;
309*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->ProcessHeapCounter = 0;
310*35ffd701SAndroid Build Coastguard Worker 
311*35ffd701SAndroid Build Coastguard Worker     // TBD: ProcessVA Gfx partition should be created here using VirtualAlloc at the time of SingletonContext
312*35ffd701SAndroid Build Coastguard Worker     // creation. But untill all UMD clients have moved to GMM DLL, then we will
313*35ffd701SAndroid Build Coastguard Worker     // create this here.
314*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->ProcessVA        = {0};
315*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->ProcessVACounter = 0;
316*35ffd701SAndroid Build Coastguard Worker 
317*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->IsSVMReserved      = 0;
318*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->NullCCSTileAddress = 0;
319*35ffd701SAndroid Build Coastguard Worker #endif
320*35ffd701SAndroid Build Coastguard Worker 
321*35ffd701SAndroid Build Coastguard Worker     pGmmLibContext->sBdf = sBdf;
322*35ffd701SAndroid Build Coastguard Worker 
323*35ffd701SAndroid Build Coastguard Worker     pNode->pGmmLibContext = pGmmLibContext;
324*35ffd701SAndroid Build Coastguard Worker 
325*35ffd701SAndroid Build Coastguard Worker 
326*35ffd701SAndroid Build Coastguard Worker     UnLockMAContextSyncMutex();
327*35ffd701SAndroid Build Coastguard Worker 
328*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
329*35ffd701SAndroid Build Coastguard Worker }
330*35ffd701SAndroid Build Coastguard Worker 
331*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
332*35ffd701SAndroid Build Coastguard Worker /// GMM lib DLL function for deleting the Singleton Context.
333*35ffd701SAndroid Build Coastguard Worker /// Reference Count will be decremented and once the reference count reaches 0,
334*35ffd701SAndroid Build Coastguard Worker /// Singleton Context will be freed in memory
335*35ffd701SAndroid Build Coastguard Worker /// This function is thread safe for the MultiAdapterContext object.
336*35ffd701SAndroid Build Coastguard Worker ///
337*35ffd701SAndroid Build Coastguard Worker /// @param[in] sbdf: Adapter's BDF info that needs its SingletonContext to be freed
338*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
RemoveContext(ADAPTER_BDF sBdf)339*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::RemoveContext(ADAPTER_BDF sBdf)
340*35ffd701SAndroid Build Coastguard Worker {
341*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS SyncLockStatus = LockMAContextSyncMutex();
342*35ffd701SAndroid Build Coastguard Worker 
343*35ffd701SAndroid Build Coastguard Worker     if (SyncLockStatus != GMM_SUCCESS)
344*35ffd701SAndroid Build Coastguard Worker     {
345*35ffd701SAndroid Build Coastguard Worker         return SyncLockStatus;
346*35ffd701SAndroid Build Coastguard Worker     }
347*35ffd701SAndroid Build Coastguard Worker 
348*35ffd701SAndroid Build Coastguard Worker     GmmLib::GMM_ADAPTER_INFO *pNode = GetAdapterNodeUnlocked(sBdf);
349*35ffd701SAndroid Build Coastguard Worker     GMM_LIB_ASSERT(pNode);
350*35ffd701SAndroid Build Coastguard Worker     if (!pNode)
351*35ffd701SAndroid Build Coastguard Worker     {
352*35ffd701SAndroid Build Coastguard Worker         UnLockMAContextSyncMutex();
353*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
354*35ffd701SAndroid Build Coastguard Worker     }
355*35ffd701SAndroid Build Coastguard Worker 
356*35ffd701SAndroid Build Coastguard Worker     if (pNode->pGmmLibContext)
357*35ffd701SAndroid Build Coastguard Worker     {
358*35ffd701SAndroid Build Coastguard Worker         int32_t ContextRefCount = pNode->pGmmLibContext->DecrementRefCount();
359*35ffd701SAndroid Build Coastguard Worker         // Refount = 0, It means that it the last client on this adapter
360*35ffd701SAndroid Build Coastguard Worker         // Lets free the LibContext and the Adapter Node
361*35ffd701SAndroid Build Coastguard Worker         if (!ContextRefCount)
362*35ffd701SAndroid Build Coastguard Worker         {
363*35ffd701SAndroid Build Coastguard Worker             pNode->pGmmLibContext->DestroyContext();
364*35ffd701SAndroid Build Coastguard Worker             // Delete/free the LibContext object
365*35ffd701SAndroid Build Coastguard Worker             delete pNode->pGmmLibContext;
366*35ffd701SAndroid Build Coastguard Worker 
367*35ffd701SAndroid Build Coastguard Worker             // Delete/free the AdapterNode from the Linked List
368*35ffd701SAndroid Build Coastguard Worker             RemoveAdapterNode(pNode);
369*35ffd701SAndroid Build Coastguard Worker             pNode = NULL;
370*35ffd701SAndroid Build Coastguard Worker         }
371*35ffd701SAndroid Build Coastguard Worker     }
372*35ffd701SAndroid Build Coastguard Worker     else
373*35ffd701SAndroid Build Coastguard Worker     {
374*35ffd701SAndroid Build Coastguard Worker         // No context exists for this node. Just remove it.
375*35ffd701SAndroid Build Coastguard Worker         RemoveAdapterNode(pNode);
376*35ffd701SAndroid Build Coastguard Worker         pNode = NULL;
377*35ffd701SAndroid Build Coastguard Worker     }
378*35ffd701SAndroid Build Coastguard Worker 
379*35ffd701SAndroid Build Coastguard Worker     UnLockMAContextSyncMutex();
380*35ffd701SAndroid Build Coastguard Worker 
381*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
382*35ffd701SAndroid Build Coastguard Worker }
383*35ffd701SAndroid Build Coastguard Worker 
384*35ffd701SAndroid Build Coastguard Worker 
385*35ffd701SAndroid Build Coastguard Worker 
386*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
387*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for returning the AdapterIdx
388*35ffd701SAndroid Build Coastguard Worker ///
389*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBdf       : Adpater Bus, Device and Fucntion details
390*35ffd701SAndroid Build Coastguard Worker /// @return     Adpater Idx corresponding the given BDF.
391*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetAdapterIndex(ADAPTER_BDF sBdf)392*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmMultiAdapterContext::GetAdapterIndex(ADAPTER_BDF sBdf)
393*35ffd701SAndroid Build Coastguard Worker {
394*35ffd701SAndroid Build Coastguard Worker     return 0;
395*35ffd701SAndroid Build Coastguard Worker }
396*35ffd701SAndroid Build Coastguard Worker 
397*35ffd701SAndroid Build Coastguard Worker 
398*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
399*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class to add adapter info for a given BDF
400*35ffd701SAndroid Build Coastguard Worker /// Adds a new node with the given BDF if it is not yet tracked, otherwise returns the
401*35ffd701SAndroid Build Coastguard Worker /// existing node with a matching BDF
402*35ffd701SAndroid Build Coastguard Worker /// This function is not thread safe for the MultiAdapterContext object and calls to
403*35ffd701SAndroid Build Coastguard Worker /// it must be protected with LockMAContextSyncMutex()
404*35ffd701SAndroid Build Coastguard Worker ///
405*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBdf       : Adpater Bus, Device and Function details
406*35ffd701SAndroid Build Coastguard Worker /// @return     GmmLib::GMM_ADAPTER_INFO pointer for the BDF
407*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
AddAdapterNode()408*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_ADAPTER_INFO *GmmLib::GmmMultiAdapterContext::AddAdapterNode()
409*35ffd701SAndroid Build Coastguard Worker {
410*35ffd701SAndroid Build Coastguard Worker     GMM_ADAPTER_INFO *pNode = NULL, *pPrev = NULL;
411*35ffd701SAndroid Build Coastguard Worker 
412*35ffd701SAndroid Build Coastguard Worker     pNode = this->pHeadNode;
413*35ffd701SAndroid Build Coastguard Worker 
414*35ffd701SAndroid Build Coastguard Worker     // walk to the end of the list
415*35ffd701SAndroid Build Coastguard Worker     while (pNode)
416*35ffd701SAndroid Build Coastguard Worker     {
417*35ffd701SAndroid Build Coastguard Worker         pPrev = pNode;
418*35ffd701SAndroid Build Coastguard Worker         pNode = pNode->pNext;
419*35ffd701SAndroid Build Coastguard Worker     }
420*35ffd701SAndroid Build Coastguard Worker 
421*35ffd701SAndroid Build Coastguard Worker     // create a new node
422*35ffd701SAndroid Build Coastguard Worker     pNode = (GMM_ADAPTER_INFO *)malloc(sizeof(GMM_ADAPTER_INFO));
423*35ffd701SAndroid Build Coastguard Worker     if (!pNode)
424*35ffd701SAndroid Build Coastguard Worker     {
425*35ffd701SAndroid Build Coastguard Worker         // No memory for new node
426*35ffd701SAndroid Build Coastguard Worker         return NULL;
427*35ffd701SAndroid Build Coastguard Worker     }
428*35ffd701SAndroid Build Coastguard Worker 
429*35ffd701SAndroid Build Coastguard Worker     pNode->pGmmLibContext = NULL;
430*35ffd701SAndroid Build Coastguard Worker     pNode->pNext          = NULL;
431*35ffd701SAndroid Build Coastguard Worker 
432*35ffd701SAndroid Build Coastguard Worker     if (this->pHeadNode)
433*35ffd701SAndroid Build Coastguard Worker     {
434*35ffd701SAndroid Build Coastguard Worker         // add it to the end of the list if the list already exists
435*35ffd701SAndroid Build Coastguard Worker         pPrev->pNext = pNode;
436*35ffd701SAndroid Build Coastguard Worker     }
437*35ffd701SAndroid Build Coastguard Worker     else
438*35ffd701SAndroid Build Coastguard Worker     {
439*35ffd701SAndroid Build Coastguard Worker         // nothing in the list, insert it as the head of the list
440*35ffd701SAndroid Build Coastguard Worker         this->pHeadNode = pNode;
441*35ffd701SAndroid Build Coastguard Worker     }
442*35ffd701SAndroid Build Coastguard Worker 
443*35ffd701SAndroid Build Coastguard Worker     this->NumAdapters++;
444*35ffd701SAndroid Build Coastguard Worker 
445*35ffd701SAndroid Build Coastguard Worker     return pNode;
446*35ffd701SAndroid Build Coastguard Worker }
447*35ffd701SAndroid Build Coastguard Worker 
448*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
449*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class to remove a given GMM_ADAPTER_INFO node
450*35ffd701SAndroid Build Coastguard Worker /// This function is not thread safe for the MultiAdapterContext object and calls to
451*35ffd701SAndroid Build Coastguard Worker /// it must be protected with LockMAContextSyncMutex()
452*35ffd701SAndroid Build Coastguard Worker ///
453*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pNode      : The node to remove from the list
454*35ffd701SAndroid Build Coastguard Worker /// @return     Void       : Removes and deletes the adapter Node from the list
455*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
RemoveAdapterNode(GMM_ADAPTER_INFO * pNode)456*35ffd701SAndroid Build Coastguard Worker void GmmLib::GmmMultiAdapterContext::RemoveAdapterNode(GMM_ADAPTER_INFO *pNode)
457*35ffd701SAndroid Build Coastguard Worker {
458*35ffd701SAndroid Build Coastguard Worker     GMM_ADAPTER_INFO *pCur = NULL, *pPrev = NULL;
459*35ffd701SAndroid Build Coastguard Worker 
460*35ffd701SAndroid Build Coastguard Worker     // Find the node and remove the node from the list
461*35ffd701SAndroid Build Coastguard Worker     pCur = this->pHeadNode;
462*35ffd701SAndroid Build Coastguard Worker     while (pCur)
463*35ffd701SAndroid Build Coastguard Worker     {
464*35ffd701SAndroid Build Coastguard Worker         if (pCur == pNode)
465*35ffd701SAndroid Build Coastguard Worker         {
466*35ffd701SAndroid Build Coastguard Worker             if (pPrev)
467*35ffd701SAndroid Build Coastguard Worker             {
468*35ffd701SAndroid Build Coastguard Worker                 // the node to be removed is in the middle of the list or the tail
469*35ffd701SAndroid Build Coastguard Worker                 pPrev->pNext = pNode->pNext;
470*35ffd701SAndroid Build Coastguard Worker             }
471*35ffd701SAndroid Build Coastguard Worker             else if (pNode == this->pHeadNode)
472*35ffd701SAndroid Build Coastguard Worker             {
473*35ffd701SAndroid Build Coastguard Worker                 // the node to be removed is the head of the list
474*35ffd701SAndroid Build Coastguard Worker                 this->pHeadNode = pNode->pNext;
475*35ffd701SAndroid Build Coastguard Worker             }
476*35ffd701SAndroid Build Coastguard Worker 
477*35ffd701SAndroid Build Coastguard Worker             // Decrement the Adapter Node count tracker variable
478*35ffd701SAndroid Build Coastguard Worker             this->NumAdapters--;
479*35ffd701SAndroid Build Coastguard Worker 
480*35ffd701SAndroid Build Coastguard Worker             // Free the node that was removed from the list above.
481*35ffd701SAndroid Build Coastguard Worker             free(pNode);
482*35ffd701SAndroid Build Coastguard Worker             break;
483*35ffd701SAndroid Build Coastguard Worker         }
484*35ffd701SAndroid Build Coastguard Worker         pPrev = pCur;
485*35ffd701SAndroid Build Coastguard Worker         pCur  = pCur->pNext;
486*35ffd701SAndroid Build Coastguard Worker     }
487*35ffd701SAndroid Build Coastguard Worker     GMM_ASSERTDPF(pCur != NULL, "CRITICAL ERROR: Node to be released does not exist in list");
488*35ffd701SAndroid Build Coastguard Worker }
489*35ffd701SAndroid Build Coastguard Worker 
490*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
491*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for returning the Adapter Node
492*35ffd701SAndroid Build Coastguard Worker /// This function is thread safe for the MultiAdapterContext object
493*35ffd701SAndroid Build Coastguard Worker ///
494*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBdf       : Adpater Bus, Device and Fucntion details
495*35ffd701SAndroid Build Coastguard Worker /// @return     Adpater Node corresponding the given BDF or return NULL if not found
496*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetAdapterNode(ADAPTER_BDF sBdf)497*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_ADAPTER_INFO *GmmLib::GmmMultiAdapterContext::GetAdapterNode(ADAPTER_BDF sBdf)
498*35ffd701SAndroid Build Coastguard Worker {
499*35ffd701SAndroid Build Coastguard Worker     GMM_ADAPTER_INFO *pNode = NULL;
500*35ffd701SAndroid Build Coastguard Worker 
501*35ffd701SAndroid Build Coastguard Worker     GMM_STATUS SyncLockStatus = LockMAContextSyncMutex();
502*35ffd701SAndroid Build Coastguard Worker     if (SyncLockStatus != GMM_SUCCESS)
503*35ffd701SAndroid Build Coastguard Worker     {
504*35ffd701SAndroid Build Coastguard Worker         return NULL;
505*35ffd701SAndroid Build Coastguard Worker     }
506*35ffd701SAndroid Build Coastguard Worker 
507*35ffd701SAndroid Build Coastguard Worker     pNode = GetAdapterNodeUnlocked(sBdf);
508*35ffd701SAndroid Build Coastguard Worker 
509*35ffd701SAndroid Build Coastguard Worker     UnLockMAContextSyncMutex();
510*35ffd701SAndroid Build Coastguard Worker 
511*35ffd701SAndroid Build Coastguard Worker     return pNode;
512*35ffd701SAndroid Build Coastguard Worker }
513*35ffd701SAndroid Build Coastguard Worker 
514*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
515*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for returning the Adapter Node
516*35ffd701SAndroid Build Coastguard Worker /// This function is not thread safe for the MultiAdapterContext object and calls to
517*35ffd701SAndroid Build Coastguard Worker /// it must be protected with LockMAContextSyncMutex()
518*35ffd701SAndroid Build Coastguard Worker ///
519*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBdf       : Adpater Bus, Device and Fucntion details
520*35ffd701SAndroid Build Coastguard Worker /// @return     Adpater Node corresponding the given BDF or return NULL if not found
521*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetAdapterNodeUnlocked(ADAPTER_BDF sBdf)522*35ffd701SAndroid Build Coastguard Worker GmmLib::GMM_ADAPTER_INFO *GmmLib::GmmMultiAdapterContext::GetAdapterNodeUnlocked(ADAPTER_BDF sBdf)
523*35ffd701SAndroid Build Coastguard Worker {
524*35ffd701SAndroid Build Coastguard Worker     GMM_ADAPTER_INFO *pNode = this->pHeadNode;
525*35ffd701SAndroid Build Coastguard Worker 
526*35ffd701SAndroid Build Coastguard Worker     // Search the entire linked list if the Adapter Node with sBdf is found or not
527*35ffd701SAndroid Build Coastguard Worker     while (pNode)
528*35ffd701SAndroid Build Coastguard Worker     {
529*35ffd701SAndroid Build Coastguard Worker         if ((sBdf.Bus == pNode->pGmmLibContext->sBdf.Bus) &&
530*35ffd701SAndroid Build Coastguard Worker             (sBdf.Device == pNode->pGmmLibContext->sBdf.Device) &&
531*35ffd701SAndroid Build Coastguard Worker             (sBdf.Function == pNode->pGmmLibContext->sBdf.Function))
532*35ffd701SAndroid Build Coastguard Worker         {
533*35ffd701SAndroid Build Coastguard Worker             // Yes, Found!. This is the Adapter Node
534*35ffd701SAndroid Build Coastguard Worker             // pNode != NULL, will be valid pointer.
535*35ffd701SAndroid Build Coastguard Worker             return pNode;
536*35ffd701SAndroid Build Coastguard Worker         }
537*35ffd701SAndroid Build Coastguard Worker         else
538*35ffd701SAndroid Build Coastguard Worker         {
539*35ffd701SAndroid Build Coastguard Worker             // Not found, Search Next
540*35ffd701SAndroid Build Coastguard Worker             // pNode = NULL if traversed till the tail and not found
541*35ffd701SAndroid Build Coastguard Worker             pNode = pNode->pNext;
542*35ffd701SAndroid Build Coastguard Worker         }
543*35ffd701SAndroid Build Coastguard Worker     }
544*35ffd701SAndroid Build Coastguard Worker 
545*35ffd701SAndroid Build Coastguard Worker     return NULL;
546*35ffd701SAndroid Build Coastguard Worker }
547*35ffd701SAndroid Build Coastguard Worker 
548*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////////////
549*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for returning the GmmLibContext
550*35ffd701SAndroid Build Coastguard Worker /// This function is thread safe for the MultiAdapterContext object
551*35ffd701SAndroid Build Coastguard Worker //
552*35ffd701SAndroid Build Coastguard Worker /// @param[in]  sBdf       : Adpater Bus, Device and Fucntion details
553*35ffd701SAndroid Build Coastguard Worker /// @return     GmmLibContext corresponding the given BDF.
554*35ffd701SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////////////
GetAdapterLibContext(ADAPTER_BDF sBdf)555*35ffd701SAndroid Build Coastguard Worker GmmLib::Context *GMM_STDCALL GmmLib::GmmMultiAdapterContext::GetAdapterLibContext(ADAPTER_BDF sBdf)
556*35ffd701SAndroid Build Coastguard Worker {
557*35ffd701SAndroid Build Coastguard Worker     GMM_ADAPTER_INFO *pNode = NULL;
558*35ffd701SAndroid Build Coastguard Worker 
559*35ffd701SAndroid Build Coastguard Worker     //Search the list and get the Adapter Node
560*35ffd701SAndroid Build Coastguard Worker     pNode = (GMM_ADAPTER_INFO *)GetAdapterNode(sBdf);
561*35ffd701SAndroid Build Coastguard Worker     if(pNode)
562*35ffd701SAndroid Build Coastguard Worker     {
563*35ffd701SAndroid Build Coastguard Worker         return pNode->pGmmLibContext;
564*35ffd701SAndroid Build Coastguard Worker     }
565*35ffd701SAndroid Build Coastguard Worker     else
566*35ffd701SAndroid Build Coastguard Worker     {
567*35ffd701SAndroid Build Coastguard Worker         return NULL; //return Null if not found
568*35ffd701SAndroid Build Coastguard Worker     }
569*35ffd701SAndroid Build Coastguard Worker }
570*35ffd701SAndroid Build Coastguard Worker 
571*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
572*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for returning the NumAdapters
573*35ffd701SAndroid Build Coastguard Worker /// that are initialized within a process
574*35ffd701SAndroid Build Coastguard Worker /// This function is thread safe for the MultiAdapterContext object
575*35ffd701SAndroid Build Coastguard Worker ///
576*35ffd701SAndroid Build Coastguard Worker /// @return     Number of Adpaters that are opened and initialized within a process.
577*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
GetNumAdapters()578*35ffd701SAndroid Build Coastguard Worker uint32_t GMM_STDCALL GmmLib::GmmMultiAdapterContext::GetNumAdapters()
579*35ffd701SAndroid Build Coastguard Worker {
580*35ffd701SAndroid Build Coastguard Worker     return this->NumAdapters;
581*35ffd701SAndroid Build Coastguard Worker }
582*35ffd701SAndroid Build Coastguard Worker 
583*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
584*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
585*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for Locking MultiAdapter Mutex
586*35ffd701SAndroid Build Coastguard Worker /// SyncMutex to protect access of GmmMultiAdpaterContext object
587*35ffd701SAndroid Build Coastguard Worker ///
588*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
589*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
LockMAContextSyncMutex()590*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::LockMAContextSyncMutex()
591*35ffd701SAndroid Build Coastguard Worker {
592*35ffd701SAndroid Build Coastguard Worker     if(MAContextSyncMutex)
593*35ffd701SAndroid Build Coastguard Worker     {
594*35ffd701SAndroid Build Coastguard Worker         while(WAIT_OBJECT_0 != ::WaitForSingleObject(MAContextSyncMutex, INFINITE))
595*35ffd701SAndroid Build Coastguard Worker             ;
596*35ffd701SAndroid Build Coastguard Worker         return GMM_SUCCESS;
597*35ffd701SAndroid Build Coastguard Worker     }
598*35ffd701SAndroid Build Coastguard Worker     else
599*35ffd701SAndroid Build Coastguard Worker     {
600*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
601*35ffd701SAndroid Build Coastguard Worker     }
602*35ffd701SAndroid Build Coastguard Worker }
603*35ffd701SAndroid Build Coastguard Worker 
604*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
605*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for UnLocking MultiAdapter Mutex
606*35ffd701SAndroid Build Coastguard Worker /// SyncMutex to protect access of GmmMultiAdpaterContext
607*35ffd701SAndroid Build Coastguard Worker ///
608*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
609*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
UnLockMAContextSyncMutex()610*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::UnLockMAContextSyncMutex()
611*35ffd701SAndroid Build Coastguard Worker {
612*35ffd701SAndroid Build Coastguard Worker     if(MAContextSyncMutex)
613*35ffd701SAndroid Build Coastguard Worker     {
614*35ffd701SAndroid Build Coastguard Worker         ::ReleaseMutex(MAContextSyncMutex);
615*35ffd701SAndroid Build Coastguard Worker         return GMM_SUCCESS;
616*35ffd701SAndroid Build Coastguard Worker     }
617*35ffd701SAndroid Build Coastguard Worker     else
618*35ffd701SAndroid Build Coastguard Worker     {
619*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
620*35ffd701SAndroid Build Coastguard Worker     }
621*35ffd701SAndroid Build Coastguard Worker }
622*35ffd701SAndroid Build Coastguard Worker 
623*35ffd701SAndroid Build Coastguard Worker #else // Non Win OS
624*35ffd701SAndroid Build Coastguard Worker 
625*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
626*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for Locking MultiAdapter Mutex
627*35ffd701SAndroid Build Coastguard Worker ///
628*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
629*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
LockMAContextSyncMutex()630*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::LockMAContextSyncMutex()
631*35ffd701SAndroid Build Coastguard Worker {
632*35ffd701SAndroid Build Coastguard Worker     pthread_mutex_lock(&MAContextSyncMutex);
633*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
634*35ffd701SAndroid Build Coastguard Worker }
635*35ffd701SAndroid Build Coastguard Worker 
636*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
637*35ffd701SAndroid Build Coastguard Worker /// Member function of GmmMultiAdapterContext class for UnLocking MultiAdapter Mutex
638*35ffd701SAndroid Build Coastguard Worker ///
639*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
640*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
UnLockMAContextSyncMutex()641*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::GmmMultiAdapterContext::UnLockMAContextSyncMutex()
642*35ffd701SAndroid Build Coastguard Worker {
643*35ffd701SAndroid Build Coastguard Worker     pthread_mutex_unlock(&MAContextSyncMutex);
644*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
645*35ffd701SAndroid Build Coastguard Worker }
646*35ffd701SAndroid Build Coastguard Worker #endif //#ifdef _WIN32
647*35ffd701SAndroid Build Coastguard Worker 
648*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
649*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
650*35ffd701SAndroid Build Coastguard Worker /// Get ProcessHeapVA Singleton HeapObj
651*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GetSharedHeapObject()652*35ffd701SAndroid Build Coastguard Worker GMM_HEAP *GmmLib::Context::GetSharedHeapObject()
653*35ffd701SAndroid Build Coastguard Worker {
654*35ffd701SAndroid Build Coastguard Worker     GMM_HEAP *pHeapObjOut = NULL;
655*35ffd701SAndroid Build Coastguard Worker     // Obtain ProcessSingleton Lock
656*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
657*35ffd701SAndroid Build Coastguard Worker     LockSingletonContextSyncMutex();
658*35ffd701SAndroid Build Coastguard Worker #else
659*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::LockSingletonContextSyncMutex();
660*35ffd701SAndroid Build Coastguard Worker #endif
661*35ffd701SAndroid Build Coastguard Worker 
662*35ffd701SAndroid Build Coastguard Worker     //Check if the ProcessHeapCounter is 0 or not, if not 0 increment the counter and return the heapObj
663*35ffd701SAndroid Build Coastguard Worker     // that is stored in the DLL Singleton context
664*35ffd701SAndroid Build Coastguard Worker     if(ProcessHeapCounter)
665*35ffd701SAndroid Build Coastguard Worker     {
666*35ffd701SAndroid Build Coastguard Worker         ProcessHeapCounter++;
667*35ffd701SAndroid Build Coastguard Worker         pHeapObjOut = pHeapObj;
668*35ffd701SAndroid Build Coastguard Worker     }
669*35ffd701SAndroid Build Coastguard Worker 
670*35ffd701SAndroid Build Coastguard Worker     // Unlock ProcessSingleton Lock
671*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
672*35ffd701SAndroid Build Coastguard Worker     UnlockSingletonContextSyncMutex();
673*35ffd701SAndroid Build Coastguard Worker #else
674*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::UnlockSingletonContextSyncMutex();
675*35ffd701SAndroid Build Coastguard Worker #endif
676*35ffd701SAndroid Build Coastguard Worker 
677*35ffd701SAndroid Build Coastguard Worker     return pHeapObjOut;
678*35ffd701SAndroid Build Coastguard Worker }
679*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
680*35ffd701SAndroid Build Coastguard Worker /// Set ProcessHeapVA Singleton HeapObj
681*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
SetSharedHeapObject(GMM_HEAP ** pProcessHeapObj)682*35ffd701SAndroid Build Coastguard Worker uint32_t GmmLib::Context::SetSharedHeapObject(GMM_HEAP **pProcessHeapObj)
683*35ffd701SAndroid Build Coastguard Worker {
684*35ffd701SAndroid Build Coastguard Worker     uint32_t DllClientsCount = 0;
685*35ffd701SAndroid Build Coastguard Worker     // Obtain ProcessSingleton Lock
686*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
687*35ffd701SAndroid Build Coastguard Worker     LockSingletonContextSyncMutex();
688*35ffd701SAndroid Build Coastguard Worker #else
689*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::LockSingletonContextSyncMutex();
690*35ffd701SAndroid Build Coastguard Worker #endif
691*35ffd701SAndroid Build Coastguard Worker 
692*35ffd701SAndroid Build Coastguard Worker     if(pProcessHeapObj)
693*35ffd701SAndroid Build Coastguard Worker     {
694*35ffd701SAndroid Build Coastguard Worker         if(!ProcessHeapCounter)
695*35ffd701SAndroid Build Coastguard Worker         {
696*35ffd701SAndroid Build Coastguard Worker             // Setting it for the first time
697*35ffd701SAndroid Build Coastguard Worker             ProcessHeapCounter++;
698*35ffd701SAndroid Build Coastguard Worker             pHeapObj = *pProcessHeapObj;
699*35ffd701SAndroid Build Coastguard Worker         }
700*35ffd701SAndroid Build Coastguard Worker         else
701*35ffd701SAndroid Build Coastguard Worker         {
702*35ffd701SAndroid Build Coastguard Worker             ProcessHeapCounter++;
703*35ffd701SAndroid Build Coastguard Worker             *pProcessHeapObj = pHeapObj;
704*35ffd701SAndroid Build Coastguard Worker         }
705*35ffd701SAndroid Build Coastguard Worker     }
706*35ffd701SAndroid Build Coastguard Worker     else // Destroy the HeapObj Handle Case
707*35ffd701SAndroid Build Coastguard Worker     {
708*35ffd701SAndroid Build Coastguard Worker         ProcessHeapCounter--;
709*35ffd701SAndroid Build Coastguard Worker         if(!ProcessHeapCounter)
710*35ffd701SAndroid Build Coastguard Worker         {
711*35ffd701SAndroid Build Coastguard Worker             // When all UMDs clients have called destroy
712*35ffd701SAndroid Build Coastguard Worker             pHeapObj = NULL;
713*35ffd701SAndroid Build Coastguard Worker         }
714*35ffd701SAndroid Build Coastguard Worker     }
715*35ffd701SAndroid Build Coastguard Worker 
716*35ffd701SAndroid Build Coastguard Worker     DllClientsCount = ProcessHeapCounter;
717*35ffd701SAndroid Build Coastguard Worker 
718*35ffd701SAndroid Build Coastguard Worker     // Unlock ProcessSingleton Lock
719*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
720*35ffd701SAndroid Build Coastguard Worker     UnlockSingletonContextSyncMutex();
721*35ffd701SAndroid Build Coastguard Worker #else
722*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::UnlockSingletonContextSyncMutex();
723*35ffd701SAndroid Build Coastguard Worker #endif
724*35ffd701SAndroid Build Coastguard Worker 
725*35ffd701SAndroid Build Coastguard Worker     return DllClientsCount;
726*35ffd701SAndroid Build Coastguard Worker }
727*35ffd701SAndroid Build Coastguard Worker 
728*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
729*35ffd701SAndroid Build Coastguard Worker /// Get ProcessGfxPartition
730*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GetProcessGfxPartition(GMM_GFX_PARTITIONING * pProcessVA)731*35ffd701SAndroid Build Coastguard Worker void GmmLib::Context::GetProcessGfxPartition(GMM_GFX_PARTITIONING *pProcessVA)
732*35ffd701SAndroid Build Coastguard Worker {
733*35ffd701SAndroid Build Coastguard Worker     // Obtain ProcessSingleton Lock
734*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
735*35ffd701SAndroid Build Coastguard Worker    LockSingletonContextSyncMutex();
736*35ffd701SAndroid Build Coastguard Worker #else
737*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::LockSingletonContextSyncMutex();
738*35ffd701SAndroid Build Coastguard Worker #endif
739*35ffd701SAndroid Build Coastguard Worker 
740*35ffd701SAndroid Build Coastguard Worker     //Check if the ProcessVACounter is 0 or not, if not 0 increment the counter and return the ProcessVA
741*35ffd701SAndroid Build Coastguard Worker     // that is stored in the DLL Singleton context
742*35ffd701SAndroid Build Coastguard Worker     if(ProcessVACounter)
743*35ffd701SAndroid Build Coastguard Worker     {
744*35ffd701SAndroid Build Coastguard Worker         ProcessVACounter++;
745*35ffd701SAndroid Build Coastguard Worker         if(pProcessVA)
746*35ffd701SAndroid Build Coastguard Worker         {
747*35ffd701SAndroid Build Coastguard Worker             *pProcessVA = ProcessVA;
748*35ffd701SAndroid Build Coastguard Worker         }
749*35ffd701SAndroid Build Coastguard Worker     }
750*35ffd701SAndroid Build Coastguard Worker 
751*35ffd701SAndroid Build Coastguard Worker     // Unlock ProcessSingleton Lock
752*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
753*35ffd701SAndroid Build Coastguard Worker     UnlockSingletonContextSyncMutex();
754*35ffd701SAndroid Build Coastguard Worker #else
755*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::UnlockSingletonContextSyncMutex();
756*35ffd701SAndroid Build Coastguard Worker #endif
757*35ffd701SAndroid Build Coastguard Worker }
758*35ffd701SAndroid Build Coastguard Worker 
759*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
760*35ffd701SAndroid Build Coastguard Worker /// Set ProcessGfxPartition
761*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
SetProcessGfxPartition(GMM_GFX_PARTITIONING * pProcessVA)762*35ffd701SAndroid Build Coastguard Worker void GmmLib::Context::SetProcessGfxPartition(GMM_GFX_PARTITIONING *pProcessVA)
763*35ffd701SAndroid Build Coastguard Worker {
764*35ffd701SAndroid Build Coastguard Worker     // Obtain ProcessSingleton Lock
765*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
766*35ffd701SAndroid Build Coastguard Worker     LockSingletonContextSyncMutex();
767*35ffd701SAndroid Build Coastguard Worker #else
768*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::LockSingletonContextSyncMutex();
769*35ffd701SAndroid Build Coastguard Worker #endif
770*35ffd701SAndroid Build Coastguard Worker 
771*35ffd701SAndroid Build Coastguard Worker     if(pProcessVA)
772*35ffd701SAndroid Build Coastguard Worker     {
773*35ffd701SAndroid Build Coastguard Worker         if(!ProcessVACounter)
774*35ffd701SAndroid Build Coastguard Worker         {
775*35ffd701SAndroid Build Coastguard Worker             // Setting it for the first time
776*35ffd701SAndroid Build Coastguard Worker             ProcessVACounter++;
777*35ffd701SAndroid Build Coastguard Worker             ProcessVA = *pProcessVA;
778*35ffd701SAndroid Build Coastguard Worker         }
779*35ffd701SAndroid Build Coastguard Worker         else
780*35ffd701SAndroid Build Coastguard Worker         {
781*35ffd701SAndroid Build Coastguard Worker             ProcessVACounter++;
782*35ffd701SAndroid Build Coastguard Worker             //Add code to return the stored value of ProcessVA when Escapes are removed
783*35ffd701SAndroid Build Coastguard Worker         }
784*35ffd701SAndroid Build Coastguard Worker     }
785*35ffd701SAndroid Build Coastguard Worker     else // Reset the ProcessVA Case
786*35ffd701SAndroid Build Coastguard Worker     {
787*35ffd701SAndroid Build Coastguard Worker         ProcessVACounter--;
788*35ffd701SAndroid Build Coastguard Worker         if(!ProcessVACounter)
789*35ffd701SAndroid Build Coastguard Worker         {
790*35ffd701SAndroid Build Coastguard Worker             // When all UMDs clients have called destroy
791*35ffd701SAndroid Build Coastguard Worker             ProcessVA = {0};
792*35ffd701SAndroid Build Coastguard Worker         }
793*35ffd701SAndroid Build Coastguard Worker     }
794*35ffd701SAndroid Build Coastguard Worker 
795*35ffd701SAndroid Build Coastguard Worker     // Unlock ProcessSingleton Lock
796*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
797*35ffd701SAndroid Build Coastguard Worker     UnlockSingletonContextSyncMutex();
798*35ffd701SAndroid Build Coastguard Worker #else
799*35ffd701SAndroid Build Coastguard Worker     GmmLib::Context::UnlockSingletonContextSyncMutex();
800*35ffd701SAndroid Build Coastguard Worker #endif
801*35ffd701SAndroid Build Coastguard Worker }
802*35ffd701SAndroid Build Coastguard Worker 
803*35ffd701SAndroid Build Coastguard Worker #endif // _WIN32
804*35ffd701SAndroid Build Coastguard Worker 
805*35ffd701SAndroid Build Coastguard Worker #endif // GMM_LIB_DLL
806*35ffd701SAndroid Build Coastguard Worker 
807*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
808*35ffd701SAndroid Build Coastguard Worker /// Constructor to zero initialize the GmmLib::Context object
809*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
Context()810*35ffd701SAndroid Build Coastguard Worker GmmLib::Context::Context()
811*35ffd701SAndroid Build Coastguard Worker     : ClientType(),
812*35ffd701SAndroid Build Coastguard Worker       pPlatformInfo(),
813*35ffd701SAndroid Build Coastguard Worker       pTextureCalc(),
814*35ffd701SAndroid Build Coastguard Worker       SkuTable(),
815*35ffd701SAndroid Build Coastguard Worker       WaTable(),
816*35ffd701SAndroid Build Coastguard Worker       GtSysInfo(),
817*35ffd701SAndroid Build Coastguard Worker       pGmmKmdContext(),
818*35ffd701SAndroid Build Coastguard Worker       pGmmUmdContext(),
819*35ffd701SAndroid Build Coastguard Worker       pKmdHwDev(),
820*35ffd701SAndroid Build Coastguard Worker       pUmdAdapter(),
821*35ffd701SAndroid Build Coastguard Worker       pGmmCachePolicy()
822*35ffd701SAndroid Build Coastguard Worker {
823*35ffd701SAndroid Build Coastguard Worker     memset(CachePolicy, 0, sizeof(CachePolicy));
824*35ffd701SAndroid Build Coastguard Worker     memset(CachePolicyTbl, 0, sizeof(CachePolicyTbl));
825*35ffd701SAndroid Build Coastguard Worker 
826*35ffd701SAndroid Build Coastguard Worker     //Default initialize 64KB Page padding percentage.
827*35ffd701SAndroid Build Coastguard Worker     AllowedPaddingFor64KbPagesPercentage = 10;
828*35ffd701SAndroid Build Coastguard Worker     InternalGpuVaMax                     = 0;
829*35ffd701SAndroid Build Coastguard Worker     AllowedPaddingFor64KBTileSurf        = 10;
830*35ffd701SAndroid Build Coastguard Worker 
831*35ffd701SAndroid Build Coastguard Worker #if(!defined(__GMM_KMD__) && !defined(GMM_UNIFIED_LIB))
832*35ffd701SAndroid Build Coastguard Worker     pGmmGlobalClientContext = NULL;
833*35ffd701SAndroid Build Coastguard Worker #endif
834*35ffd701SAndroid Build Coastguard Worker 
835*35ffd701SAndroid Build Coastguard Worker #ifdef GMM_LIB_DLL
836*35ffd701SAndroid Build Coastguard Worker //Protect this adapter context with a sync mutex. Initialize sync mutex
837*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
838*35ffd701SAndroid Build Coastguard Worker     SyncMutex = ::CreateMutex(NULL, FALSE, NULL);
839*35ffd701SAndroid Build Coastguard Worker #else  // !_WIN32
840*35ffd701SAndroid Build Coastguard Worker     SyncMutex = PTHREAD_MUTEX_INITIALIZER;
841*35ffd701SAndroid Build Coastguard Worker #endif // _WIN32
842*35ffd701SAndroid Build Coastguard Worker 
843*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
844*35ffd701SAndroid Build Coastguard Worker     RefCount = 0;
845*35ffd701SAndroid Build Coastguard Worker #endif //GMM_LIB_DLL_MA
846*35ffd701SAndroid Build Coastguard Worker #endif //GMM_LIB_DLL
847*35ffd701SAndroid Build Coastguard Worker }
848*35ffd701SAndroid Build Coastguard Worker 
849*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
850*35ffd701SAndroid Build Coastguard Worker /// Destructor to release  GmmLib::Context object memory
851*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
~Context()852*35ffd701SAndroid Build Coastguard Worker GmmLib::Context::~Context()
853*35ffd701SAndroid Build Coastguard Worker {
854*35ffd701SAndroid Build Coastguard Worker #ifdef GMM_LIB_DLL
855*35ffd701SAndroid Build Coastguard Worker // Close the Mutex protecting this context
856*35ffd701SAndroid Build Coastguard Worker     pthread_mutex_destroy(&SyncMutex);
857*35ffd701SAndroid Build Coastguard Worker #endif //GMM_LIB_DLL
858*35ffd701SAndroid Build Coastguard Worker }
859*35ffd701SAndroid Build Coastguard Worker 
860*35ffd701SAndroid Build Coastguard Worker #ifdef _WIN32
861*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
862*35ffd701SAndroid Build Coastguard Worker /// Member function of Context class for Locking Singleton Context
863*35ffd701SAndroid Build Coastguard Worker /// SyncMutex to protect access of GmmLibContext
864*35ffd701SAndroid Build Coastguard Worker ///
865*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
866*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
LockSingletonContextSyncMutex()867*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::Context::LockSingletonContextSyncMutex()
868*35ffd701SAndroid Build Coastguard Worker {
869*35ffd701SAndroid Build Coastguard Worker #ifdef GMM_LIB_DLL
870*35ffd701SAndroid Build Coastguard Worker     if(SyncMutex)
871*35ffd701SAndroid Build Coastguard Worker     {
872*35ffd701SAndroid Build Coastguard Worker         while(WAIT_OBJECT_0 != ::WaitForSingleObject(SyncMutex, INFINITE))
873*35ffd701SAndroid Build Coastguard Worker             ;
874*35ffd701SAndroid Build Coastguard Worker         return GMM_SUCCESS;
875*35ffd701SAndroid Build Coastguard Worker     }
876*35ffd701SAndroid Build Coastguard Worker #endif //GMM_LIB_DLL
877*35ffd701SAndroid Build Coastguard Worker     return GMM_ERROR;
878*35ffd701SAndroid Build Coastguard Worker }
879*35ffd701SAndroid Build Coastguard Worker 
880*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
881*35ffd701SAndroid Build Coastguard Worker /// Member function of Context class for Unlocking Singleton Context
882*35ffd701SAndroid Build Coastguard Worker /// SyncMutex to protect access of GmmLibContext
883*35ffd701SAndroid Build Coastguard Worker ///
884*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
885*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
UnlockSingletonContextSyncMutex()886*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::Context::UnlockSingletonContextSyncMutex()
887*35ffd701SAndroid Build Coastguard Worker {
888*35ffd701SAndroid Build Coastguard Worker #ifdef GMM_LIB_DLL
889*35ffd701SAndroid Build Coastguard Worker     if(SyncMutex)
890*35ffd701SAndroid Build Coastguard Worker     {
891*35ffd701SAndroid Build Coastguard Worker         ::ReleaseMutex(SyncMutex);
892*35ffd701SAndroid Build Coastguard Worker         return GMM_SUCCESS;
893*35ffd701SAndroid Build Coastguard Worker     }
894*35ffd701SAndroid Build Coastguard Worker #endif //GMM_LIB_DLL
895*35ffd701SAndroid Build Coastguard Worker     return GMM_ERROR;
896*35ffd701SAndroid Build Coastguard Worker }
897*35ffd701SAndroid Build Coastguard Worker 
898*35ffd701SAndroid Build Coastguard Worker #else //_WIN32
899*35ffd701SAndroid Build Coastguard Worker 
900*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
901*35ffd701SAndroid Build Coastguard Worker /// Member function of Context class for Locking Singleton Context
902*35ffd701SAndroid Build Coastguard Worker ///
903*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
904*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
LockSingletonContextSyncMutex()905*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::Context::LockSingletonContextSyncMutex()
906*35ffd701SAndroid Build Coastguard Worker {
907*35ffd701SAndroid Build Coastguard Worker     pthread_mutex_lock(&SyncMutex);
908*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
909*35ffd701SAndroid Build Coastguard Worker }
910*35ffd701SAndroid Build Coastguard Worker 
911*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
912*35ffd701SAndroid Build Coastguard Worker /// Member function of Context class for Unlocking Singleton Context
913*35ffd701SAndroid Build Coastguard Worker ///
914*35ffd701SAndroid Build Coastguard Worker /// @return     GMM_STATUS.
915*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
UnlockSingletonContextSyncMutex()916*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::Context::UnlockSingletonContextSyncMutex()
917*35ffd701SAndroid Build Coastguard Worker {
918*35ffd701SAndroid Build Coastguard Worker     pthread_mutex_unlock(&SyncMutex);
919*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
920*35ffd701SAndroid Build Coastguard Worker }
921*35ffd701SAndroid Build Coastguard Worker 
922*35ffd701SAndroid Build Coastguard Worker #endif //_WIN32
923*35ffd701SAndroid Build Coastguard Worker 
924*35ffd701SAndroid Build Coastguard Worker #if GMM_LIB_DLL_MA
925*35ffd701SAndroid Build Coastguard Worker 
926*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
927*35ffd701SAndroid Build Coastguard Worker /// Member function of Context class for Incrementing Adpater Ref
928*35ffd701SAndroid Build Coastguard Worker /// Count
929*35ffd701SAndroid Build Coastguard Worker /// RefCount indicates the number of UMD clients using a particaluar Adapter.
930*35ffd701SAndroid Build Coastguard Worker /// RefCount is incremented when a client requests LibContext on already registered
931*35ffd701SAndroid Build Coastguard Worker /// adapter.
932*35ffd701SAndroid Build Coastguard Worker /// RefCount = 0, when no clients are using an adapter's LibContext
933*35ffd701SAndroid Build Coastguard Worker /// RefCount > 0, when at least one client is using the adapter's LibContext
934*35ffd701SAndroid Build Coastguard Worker ///
935*35ffd701SAndroid Build Coastguard Worker /// @param1     sBdf        Adpater's Bus, Device and Fucntion
936*35ffd701SAndroid Build Coastguard Worker /// @return     Current value of the ref count.
937*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
IncrementRefCount()938*35ffd701SAndroid Build Coastguard Worker int32_t GmmLib::Context::IncrementRefCount()
939*35ffd701SAndroid Build Coastguard Worker {
940*35ffd701SAndroid Build Coastguard Worker     int32_t *Ref = &RefCount;
941*35ffd701SAndroid Build Coastguard Worker 
942*35ffd701SAndroid Build Coastguard Worker #if defined(__linux__)
943*35ffd701SAndroid Build Coastguard Worker     // returns 0 only when registering the first client
944*35ffd701SAndroid Build Coastguard Worker     return (__sync_fetch_and_add(Ref, 1));
945*35ffd701SAndroid Build Coastguard Worker #endif
946*35ffd701SAndroid Build Coastguard Worker }
947*35ffd701SAndroid Build Coastguard Worker 
948*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
949*35ffd701SAndroid Build Coastguard Worker /// Member function of Context class for Decrementing Adpater's Ref
950*35ffd701SAndroid Build Coastguard Worker /// Count
951*35ffd701SAndroid Build Coastguard Worker /// RefCount indicates the number of UMD clients using a particaluar Adapter.
952*35ffd701SAndroid Build Coastguard Worker /// RefCount is decremented when a clients requests LibContext destroy on already
953*35ffd701SAndroid Build Coastguard Worker /// registered adapter.
954*35ffd701SAndroid Build Coastguard Worker /// RefCount = 0, when no clients are using an adapter's LibContext
955*35ffd701SAndroid Build Coastguard Worker /// RefCount > 0, when at least one client is using the adapter's LibContext
956*35ffd701SAndroid Build Coastguard Worker ///
957*35ffd701SAndroid Build Coastguard Worker /// @param1     sBdf        Adpater's Bus, Device and Fucntion
958*35ffd701SAndroid Build Coastguard Worker /// @return     Current value of the ref count.
959*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
DecrementRefCount()960*35ffd701SAndroid Build Coastguard Worker int32_t GmmLib::Context::DecrementRefCount()
961*35ffd701SAndroid Build Coastguard Worker {
962*35ffd701SAndroid Build Coastguard Worker 
963*35ffd701SAndroid Build Coastguard Worker     int32_t *Ref          = &RefCount;
964*35ffd701SAndroid Build Coastguard Worker     int      CurrentValue = 0;
965*35ffd701SAndroid Build Coastguard Worker     int      TargetValue  = 0;
966*35ffd701SAndroid Build Coastguard Worker     do
967*35ffd701SAndroid Build Coastguard Worker     {
968*35ffd701SAndroid Build Coastguard Worker         CurrentValue = *Ref;
969*35ffd701SAndroid Build Coastguard Worker         if(CurrentValue > 0)
970*35ffd701SAndroid Build Coastguard Worker         {
971*35ffd701SAndroid Build Coastguard Worker             TargetValue = CurrentValue - 1;
972*35ffd701SAndroid Build Coastguard Worker         }
973*35ffd701SAndroid Build Coastguard Worker         else
974*35ffd701SAndroid Build Coastguard Worker         {
975*35ffd701SAndroid Build Coastguard Worker             break;
976*35ffd701SAndroid Build Coastguard Worker         }
977*35ffd701SAndroid Build Coastguard Worker #if defined(__linux__)
978*35ffd701SAndroid Build Coastguard Worker     } while(!__sync_bool_compare_and_swap(Ref, CurrentValue, TargetValue));
979*35ffd701SAndroid Build Coastguard Worker #endif
980*35ffd701SAndroid Build Coastguard Worker     return TargetValue;
981*35ffd701SAndroid Build Coastguard Worker }
982*35ffd701SAndroid Build Coastguard Worker 
983*35ffd701SAndroid Build Coastguard Worker #endif //GMM_LIB_DLL_MA
984*35ffd701SAndroid Build Coastguard Worker 
985*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
986*35ffd701SAndroid Build Coastguard Worker /// Member function to initialize the GmmLib::Context object with cache policy,
987*35ffd701SAndroid Build Coastguard Worker /// platform info, Texture calculator etc.
988*35ffd701SAndroid Build Coastguard Worker /// @param[in]  Platform: ref to platform
989*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pSkuTable: ptr to sku table
990*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pWaTable: ptr to workaround table
991*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGtSysInfo: ptr to gt system info
992*35ffd701SAndroid Build Coastguard Worker /// @param[in]  ClientType: client type such as dx, ogl, ocl etc
993*35ffd701SAndroid Build Coastguard Worker /// @return   GMM_SUCCESS if init is success, GMM_ERROR otherwise
994*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
InitContext(const PLATFORM & Platform,const SKU_FEATURE_TABLE * pSkuTable,const WA_TABLE * pWaTable,const GT_SYSTEM_INFO * pGtSysInfo,GMM_CLIENT ClientType)995*35ffd701SAndroid Build Coastguard Worker GMM_STATUS GMM_STDCALL GmmLib::Context::InitContext(
996*35ffd701SAndroid Build Coastguard Worker const PLATFORM &         Platform,
997*35ffd701SAndroid Build Coastguard Worker const SKU_FEATURE_TABLE *pSkuTable,
998*35ffd701SAndroid Build Coastguard Worker const WA_TABLE *         pWaTable,
999*35ffd701SAndroid Build Coastguard Worker const GT_SYSTEM_INFO *   pGtSysInfo,
1000*35ffd701SAndroid Build Coastguard Worker GMM_CLIENT               ClientType)
1001*35ffd701SAndroid Build Coastguard Worker {
1002*35ffd701SAndroid Build Coastguard Worker     this->ClientType = ClientType;
1003*35ffd701SAndroid Build Coastguard Worker 
1004*35ffd701SAndroid Build Coastguard Worker     // Save the SKU and WA
1005*35ffd701SAndroid Build Coastguard Worker     this->SkuTable  = *pSkuTable;
1006*35ffd701SAndroid Build Coastguard Worker     this->WaTable   = *pWaTable;
1007*35ffd701SAndroid Build Coastguard Worker     this->GtSysInfo = *pGtSysInfo;
1008*35ffd701SAndroid Build Coastguard Worker 
1009*35ffd701SAndroid Build Coastguard Worker     this->pPlatformInfo = CreatePlatformInfo(Platform, false);
1010*35ffd701SAndroid Build Coastguard Worker     if(this->pPlatformInfo == NULL)
1011*35ffd701SAndroid Build Coastguard Worker     {
1012*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
1013*35ffd701SAndroid Build Coastguard Worker     }
1014*35ffd701SAndroid Build Coastguard Worker 
1015*35ffd701SAndroid Build Coastguard Worker     OverrideSkuWa();
1016*35ffd701SAndroid Build Coastguard Worker 
1017*35ffd701SAndroid Build Coastguard Worker 
1018*35ffd701SAndroid Build Coastguard Worker     this->pGmmCachePolicy = CreateCachePolicyCommon();
1019*35ffd701SAndroid Build Coastguard Worker     if(this->pGmmCachePolicy == NULL)
1020*35ffd701SAndroid Build Coastguard Worker     {
1021*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
1022*35ffd701SAndroid Build Coastguard Worker     }
1023*35ffd701SAndroid Build Coastguard Worker 
1024*35ffd701SAndroid Build Coastguard Worker     this->pGmmCachePolicy->InitCachePolicy();
1025*35ffd701SAndroid Build Coastguard Worker 
1026*35ffd701SAndroid Build Coastguard Worker     this->pTextureCalc = CreateTextureCalc(Platform, false);
1027*35ffd701SAndroid Build Coastguard Worker     if(this->pTextureCalc == NULL)
1028*35ffd701SAndroid Build Coastguard Worker     {
1029*35ffd701SAndroid Build Coastguard Worker         return GMM_ERROR;
1030*35ffd701SAndroid Build Coastguard Worker     }
1031*35ffd701SAndroid Build Coastguard Worker 
1032*35ffd701SAndroid Build Coastguard Worker     return GMM_SUCCESS;
1033*35ffd701SAndroid Build Coastguard Worker }
1034*35ffd701SAndroid Build Coastguard Worker 
1035*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
1036*35ffd701SAndroid Build Coastguard Worker /// Member function to deallcoate the GmmLib::Context's cache policy, platform info,
1037*35ffd701SAndroid Build Coastguard Worker /// Texture calculator etc.
1038*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////////////
DestroyContext()1039*35ffd701SAndroid Build Coastguard Worker void GMM_STDCALL GmmLib::Context::DestroyContext()
1040*35ffd701SAndroid Build Coastguard Worker {
1041*35ffd701SAndroid Build Coastguard Worker     if(this->pGmmCachePolicy)
1042*35ffd701SAndroid Build Coastguard Worker     {
1043*35ffd701SAndroid Build Coastguard Worker             delete this->pGmmCachePolicy;
1044*35ffd701SAndroid Build Coastguard Worker             this->pGmmCachePolicy = NULL;
1045*35ffd701SAndroid Build Coastguard Worker     }
1046*35ffd701SAndroid Build Coastguard Worker 
1047*35ffd701SAndroid Build Coastguard Worker     if(this->pTextureCalc)
1048*35ffd701SAndroid Build Coastguard Worker     {
1049*35ffd701SAndroid Build Coastguard Worker             delete this->pTextureCalc;
1050*35ffd701SAndroid Build Coastguard Worker             this->pTextureCalc = NULL;
1051*35ffd701SAndroid Build Coastguard Worker     }
1052*35ffd701SAndroid Build Coastguard Worker 
1053*35ffd701SAndroid Build Coastguard Worker     if(this->pPlatformInfo)
1054*35ffd701SAndroid Build Coastguard Worker     {
1055*35ffd701SAndroid Build Coastguard Worker             delete this->pPlatformInfo;
1056*35ffd701SAndroid Build Coastguard Worker             this->pPlatformInfo = NULL;
1057*35ffd701SAndroid Build Coastguard Worker     }
1058*35ffd701SAndroid Build Coastguard Worker }
1059*35ffd701SAndroid Build Coastguard Worker 
OverrideSkuWa()1060*35ffd701SAndroid Build Coastguard Worker void GMM_STDCALL GmmLib::Context::OverrideSkuWa()
1061*35ffd701SAndroid Build Coastguard Worker {
1062*35ffd701SAndroid Build Coastguard Worker     if((GFX_GET_CURRENT_PRODUCT(this->GetPlatformInfo().Platform) < IGFX_XE_HP_SDV))
1063*35ffd701SAndroid Build Coastguard Worker     {
1064*35ffd701SAndroid Build Coastguard Worker         SkuTable.FtrTileY = true;
1065*35ffd701SAndroid Build Coastguard Worker     }
1066*35ffd701SAndroid Build Coastguard Worker 
1067*35ffd701SAndroid Build Coastguard Worker     if(GFX_GET_CURRENT_PRODUCT(this->GetPlatformInfo().Platform) == IGFX_PVC)
1068*35ffd701SAndroid Build Coastguard Worker     {
1069*35ffd701SAndroid Build Coastguard Worker         SkuTable.Ftr57bGPUAddressing = true;
1070*35ffd701SAndroid Build Coastguard Worker     }
1071*35ffd701SAndroid Build Coastguard Worker 
1072*35ffd701SAndroid Build Coastguard Worker     if (GFX_GET_CURRENT_PRODUCT(this->GetPlatformInfo().Platform) >= IGFX_BMG)
1073*35ffd701SAndroid Build Coastguard Worker     {
1074*35ffd701SAndroid Build Coastguard Worker         // FtrL3TransientDataFlush is always enabled for XE2 adding GMM Override if UMDs might have reset this.
1075*35ffd701SAndroid Build Coastguard Worker         SkuTable.FtrL3TransientDataFlush = true;
1076*35ffd701SAndroid Build Coastguard Worker     }
1077*35ffd701SAndroid Build Coastguard Worker }
1078*35ffd701SAndroid Build Coastguard Worker 
CreateCachePolicyCommon()1079*35ffd701SAndroid Build Coastguard Worker GMM_CACHE_POLICY *GMM_STDCALL GmmLib::Context::CreateCachePolicyCommon()
1080*35ffd701SAndroid Build Coastguard Worker {
1081*35ffd701SAndroid Build Coastguard Worker     GMM_CACHE_POLICY *        pGmmCachePolicy = NULL;
1082*35ffd701SAndroid Build Coastguard Worker     GMM_CACHE_POLICY_ELEMENT *CachePolicy     = NULL;
1083*35ffd701SAndroid Build Coastguard Worker     CachePolicy                               = GetCachePolicyUsage();
1084*35ffd701SAndroid Build Coastguard Worker     PRODUCT_FAMILY ProductFamily              = GFX_GET_CURRENT_PRODUCT(GetPlatformInfo().Platform);
1085*35ffd701SAndroid Build Coastguard Worker 
1086*35ffd701SAndroid Build Coastguard Worker     if(GetCachePolicyObj())
1087*35ffd701SAndroid Build Coastguard Worker     {
1088*35ffd701SAndroid Build Coastguard Worker         return GetCachePolicyObj();
1089*35ffd701SAndroid Build Coastguard Worker     }
1090*35ffd701SAndroid Build Coastguard Worker 
1091*35ffd701SAndroid Build Coastguard Worker     if(ProductFamily >= IGFX_BMG)
1092*35ffd701SAndroid Build Coastguard Worker     {
1093*35ffd701SAndroid Build Coastguard Worker         pGmmCachePolicy = new GmmLib::GmmXe2_LPGCachePolicy(CachePolicy, this);
1094*35ffd701SAndroid Build Coastguard Worker     }
1095*35ffd701SAndroid Build Coastguard Worker     else if((ProductFamily == IGFX_METEORLAKE) || (ProductFamily == IGFX_ARROWLAKE))
1096*35ffd701SAndroid Build Coastguard Worker     {
1097*35ffd701SAndroid Build Coastguard Worker         pGmmCachePolicy = new GmmLib::GmmXe_LPGCachePolicy(CachePolicy, this);
1098*35ffd701SAndroid Build Coastguard Worker     }
1099*35ffd701SAndroid Build Coastguard Worker     else
1100*35ffd701SAndroid Build Coastguard Worker     {
1101*35ffd701SAndroid Build Coastguard Worker         switch(GFX_GET_CURRENT_RENDERCORE(this->GetPlatformInfo().Platform))
1102*35ffd701SAndroid Build Coastguard Worker         {
1103*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE2_HPG_CORE:
1104*35ffd701SAndroid Build Coastguard Worker                 pGmmCachePolicy = new GmmLib::GmmXe2_LPGCachePolicy(CachePolicy, this);
1105*35ffd701SAndroid Build Coastguard Worker                 break;
1106*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN12LP_CORE:
1107*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN12_CORE:
1108*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE_HP_CORE:
1109*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE_HPG_CORE:
1110*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE_HPC_CORE:
1111*35ffd701SAndroid Build Coastguard Worker                 if(GetSkuTable().FtrLocalMemory)
1112*35ffd701SAndroid Build Coastguard Worker                 {
1113*35ffd701SAndroid Build Coastguard Worker                     pGmmCachePolicy = new GmmLib::GmmGen12dGPUCachePolicy(CachePolicy, this);
1114*35ffd701SAndroid Build Coastguard Worker                 }
1115*35ffd701SAndroid Build Coastguard Worker                 else
1116*35ffd701SAndroid Build Coastguard Worker                 {
1117*35ffd701SAndroid Build Coastguard Worker                     pGmmCachePolicy = new GmmLib::GmmGen12CachePolicy(CachePolicy, this);
1118*35ffd701SAndroid Build Coastguard Worker                 }
1119*35ffd701SAndroid Build Coastguard Worker                 break;
1120*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN11_CORE:
1121*35ffd701SAndroid Build Coastguard Worker                 pGmmCachePolicy = new GmmLib::GmmGen11CachePolicy(CachePolicy, this);
1122*35ffd701SAndroid Build Coastguard Worker                 break;
1123*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN10_CORE:
1124*35ffd701SAndroid Build Coastguard Worker                 pGmmCachePolicy = new GmmLib::GmmGen10CachePolicy(CachePolicy, this);
1125*35ffd701SAndroid Build Coastguard Worker                 break;
1126*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN9_CORE:
1127*35ffd701SAndroid Build Coastguard Worker                 pGmmCachePolicy = new GmmLib::GmmGen9CachePolicy(CachePolicy, this);
1128*35ffd701SAndroid Build Coastguard Worker                 break;
1129*35ffd701SAndroid Build Coastguard Worker             default:
1130*35ffd701SAndroid Build Coastguard Worker                 pGmmCachePolicy = new GmmLib::GmmGen8CachePolicy(CachePolicy, this);
1131*35ffd701SAndroid Build Coastguard Worker                 break;
1132*35ffd701SAndroid Build Coastguard Worker         }
1133*35ffd701SAndroid Build Coastguard Worker     }
1134*35ffd701SAndroid Build Coastguard Worker     if(!pGmmCachePolicy)
1135*35ffd701SAndroid Build Coastguard Worker     {
1136*35ffd701SAndroid Build Coastguard Worker         GMM_DPF_CRITICAL("unable to allocate memory for CachePolicy Object");
1137*35ffd701SAndroid Build Coastguard Worker     }
1138*35ffd701SAndroid Build Coastguard Worker 
1139*35ffd701SAndroid Build Coastguard Worker     return pGmmCachePolicy;
1140*35ffd701SAndroid Build Coastguard Worker }
1141*35ffd701SAndroid Build Coastguard Worker 
CreateTextureCalc(PLATFORM Platform,bool Override)1142*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_CALC *GMM_STDCALL GmmLib::Context::CreateTextureCalc(PLATFORM Platform, bool Override)
1143*35ffd701SAndroid Build Coastguard Worker {
1144*35ffd701SAndroid Build Coastguard Worker     if(!Override)
1145*35ffd701SAndroid Build Coastguard Worker     {
1146*35ffd701SAndroid Build Coastguard Worker         if(GetTextureCalc())
1147*35ffd701SAndroid Build Coastguard Worker         {
1148*35ffd701SAndroid Build Coastguard Worker             return GetTextureCalc();
1149*35ffd701SAndroid Build Coastguard Worker         }
1150*35ffd701SAndroid Build Coastguard Worker     }
1151*35ffd701SAndroid Build Coastguard Worker 
1152*35ffd701SAndroid Build Coastguard Worker     if(GFX_GET_CURRENT_PRODUCT(GetPlatformInfo().Platform) >= IGFX_METEORLAKE)
1153*35ffd701SAndroid Build Coastguard Worker     {
1154*35ffd701SAndroid Build Coastguard Worker         return new GmmXe_LPGTextureCalc(this);
1155*35ffd701SAndroid Build Coastguard Worker     }
1156*35ffd701SAndroid Build Coastguard Worker     else
1157*35ffd701SAndroid Build Coastguard Worker     {
1158*35ffd701SAndroid Build Coastguard Worker         switch(GFX_GET_CURRENT_RENDERCORE(Platform))
1159*35ffd701SAndroid Build Coastguard Worker         {
1160*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN7_CORE:
1161*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN7_5_CORE:
1162*35ffd701SAndroid Build Coastguard Worker                 return new GmmGen7TextureCalc(this);
1163*35ffd701SAndroid Build Coastguard Worker                 break;
1164*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN8_CORE:
1165*35ffd701SAndroid Build Coastguard Worker                 return new GmmGen8TextureCalc(this);
1166*35ffd701SAndroid Build Coastguard Worker                 break;
1167*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN9_CORE:
1168*35ffd701SAndroid Build Coastguard Worker                 return new GmmGen9TextureCalc(this);
1169*35ffd701SAndroid Build Coastguard Worker                 break;
1170*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN10_CORE:
1171*35ffd701SAndroid Build Coastguard Worker                 return new GmmGen10TextureCalc(this);
1172*35ffd701SAndroid Build Coastguard Worker                 break;
1173*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN11_CORE:
1174*35ffd701SAndroid Build Coastguard Worker                 return new GmmGen11TextureCalc(this);
1175*35ffd701SAndroid Build Coastguard Worker                 break;
1176*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN12LP_CORE:
1177*35ffd701SAndroid Build Coastguard Worker             case IGFX_GEN12_CORE:
1178*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE_HP_CORE:
1179*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE_HPG_CORE:
1180*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE_HPC_CORE:
1181*35ffd701SAndroid Build Coastguard Worker                  return new GmmGen12TextureCalc(this);
1182*35ffd701SAndroid Build Coastguard Worker 				 break;
1183*35ffd701SAndroid Build Coastguard Worker             case IGFX_XE2_HPG_CORE:
1184*35ffd701SAndroid Build Coastguard Worker             default:
1185*35ffd701SAndroid Build Coastguard Worker                 return new GmmXe_LPGTextureCalc(this);
1186*35ffd701SAndroid Build Coastguard Worker                 break;
1187*35ffd701SAndroid Build Coastguard Worker         }
1188*35ffd701SAndroid Build Coastguard Worker     }
1189*35ffd701SAndroid Build Coastguard Worker }
1190*35ffd701SAndroid Build Coastguard Worker 
CreatePlatformInfo(PLATFORM Platform,bool Override)1191*35ffd701SAndroid Build Coastguard Worker GMM_PLATFORM_INFO_CLASS *GMM_STDCALL GmmLib::Context::CreatePlatformInfo(PLATFORM Platform, bool Override)
1192*35ffd701SAndroid Build Coastguard Worker {
1193*35ffd701SAndroid Build Coastguard Worker     GMM_DPF_ENTER;
1194*35ffd701SAndroid Build Coastguard Worker 
1195*35ffd701SAndroid Build Coastguard Worker     PRODUCT_FAMILY ProductFamily = GFX_GET_CURRENT_PRODUCT(Platform);
1196*35ffd701SAndroid Build Coastguard Worker 
1197*35ffd701SAndroid Build Coastguard Worker     if(Override == false)
1198*35ffd701SAndroid Build Coastguard Worker     {
1199*35ffd701SAndroid Build Coastguard Worker         if(pPlatformInfo != NULL)
1200*35ffd701SAndroid Build Coastguard Worker         {
1201*35ffd701SAndroid Build Coastguard Worker             return pPlatformInfo;
1202*35ffd701SAndroid Build Coastguard Worker         }
1203*35ffd701SAndroid Build Coastguard Worker     }
1204*35ffd701SAndroid Build Coastguard Worker 
1205*35ffd701SAndroid Build Coastguard Worker     if (ProductFamily >= IGFX_LUNARLAKE)
1206*35ffd701SAndroid Build Coastguard Worker     {
1207*35ffd701SAndroid Build Coastguard Worker         return new GmmLib::PlatformInfoGen12(Platform, (GMM_LIB_CONTEXT *)this);
1208*35ffd701SAndroid Build Coastguard Worker     }
1209*35ffd701SAndroid Build Coastguard Worker     else
1210*35ffd701SAndroid Build Coastguard Worker     {
1211*35ffd701SAndroid Build Coastguard Worker         switch (GFX_GET_CURRENT_RENDERCORE(Platform))
1212*35ffd701SAndroid Build Coastguard Worker         {
1213*35ffd701SAndroid Build Coastguard Worker         case IGFX_GEN12LP_CORE:
1214*35ffd701SAndroid Build Coastguard Worker         case IGFX_GEN12_CORE:
1215*35ffd701SAndroid Build Coastguard Worker         case IGFX_XE_HP_CORE:
1216*35ffd701SAndroid Build Coastguard Worker         case IGFX_XE_HPG_CORE:
1217*35ffd701SAndroid Build Coastguard Worker         case IGFX_XE_HPC_CORE:
1218*35ffd701SAndroid Build Coastguard Worker         case IGFX_XE2_HPG_CORE:
1219*35ffd701SAndroid Build Coastguard Worker             return new GmmLib::PlatformInfoGen12(Platform, (GMM_LIB_CONTEXT *)this);
1220*35ffd701SAndroid Build Coastguard Worker             break;
1221*35ffd701SAndroid Build Coastguard Worker         case IGFX_GEN11_CORE:
1222*35ffd701SAndroid Build Coastguard Worker             return new GmmLib::PlatformInfoGen11(Platform, (GMM_LIB_CONTEXT *)this);
1223*35ffd701SAndroid Build Coastguard Worker             break;
1224*35ffd701SAndroid Build Coastguard Worker         case IGFX_GEN10_CORE:
1225*35ffd701SAndroid Build Coastguard Worker             return new GmmLib::PlatformInfoGen10(Platform, (GMM_LIB_CONTEXT *)this);
1226*35ffd701SAndroid Build Coastguard Worker             break;
1227*35ffd701SAndroid Build Coastguard Worker         case IGFX_GEN9_CORE:
1228*35ffd701SAndroid Build Coastguard Worker             return new GmmLib::PlatformInfoGen9(Platform, (GMM_LIB_CONTEXT *)this);
1229*35ffd701SAndroid Build Coastguard Worker             break;
1230*35ffd701SAndroid Build Coastguard Worker         default:
1231*35ffd701SAndroid Build Coastguard Worker             return new GmmLib::PlatformInfoGen8(Platform, (GMM_LIB_CONTEXT *)this);
1232*35ffd701SAndroid Build Coastguard Worker             break;
1233*35ffd701SAndroid Build Coastguard Worker         }
1234*35ffd701SAndroid Build Coastguard Worker     }
1235*35ffd701SAndroid Build Coastguard Worker }
1236*35ffd701SAndroid Build Coastguard Worker 
1237*35ffd701SAndroid Build Coastguard Worker //C - Wrappers
1238*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
1239*35ffd701SAndroid Build Coastguard Worker /// C-wrapper to get the PlatformInfo ptr
1240*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGmmLibContext: ptr to GMM_GLOBAL_CONTEXT
1241*35ffd701SAndroid Build Coastguard Worker /// @return   const PlatformInfo ptr
1242*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GmmGetPlatformInfo(GMM_LIB_CONTEXT * pGmmLibContext)1243*35ffd701SAndroid Build Coastguard Worker const GMM_PLATFORM_INFO *GMM_STDCALL GmmGetPlatformInfo(GMM_LIB_CONTEXT *pGmmLibContext)
1244*35ffd701SAndroid Build Coastguard Worker {
1245*35ffd701SAndroid Build Coastguard Worker     return (&pGmmLibContext->GetPlatformInfo());
1246*35ffd701SAndroid Build Coastguard Worker }
1247*35ffd701SAndroid Build Coastguard Worker 
1248*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
1249*35ffd701SAndroid Build Coastguard Worker /// C-wrapper to get the cache policy element array ptr
1250*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGmmLibContext: ptr to GMM_GLOBAL_CONTEXT
1251*35ffd701SAndroid Build Coastguard Worker /// @return   const cache policy elment ptr
1252*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GmmGetCachePolicyUsage(GMM_LIB_CONTEXT * pGmmLibContext)1253*35ffd701SAndroid Build Coastguard Worker const GMM_CACHE_POLICY_ELEMENT *GmmGetCachePolicyUsage(GMM_LIB_CONTEXT *pGmmLibContext)
1254*35ffd701SAndroid Build Coastguard Worker {
1255*35ffd701SAndroid Build Coastguard Worker     return (pGmmLibContext->GetCachePolicyUsage());
1256*35ffd701SAndroid Build Coastguard Worker }
1257*35ffd701SAndroid Build Coastguard Worker 
1258*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
1259*35ffd701SAndroid Build Coastguard Worker /// C-wrapper to get the texture calculation object ptr
1260*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGmmLibContext: ptr to GMM_GLOBAL_CONTEXT
1261*35ffd701SAndroid Build Coastguard Worker /// @return   TextureCalc ptr
1262*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GmmGetTextureCalc(GMM_LIB_CONTEXT * pGmmLibContext)1263*35ffd701SAndroid Build Coastguard Worker GMM_TEXTURE_CALC *GmmGetTextureCalc(GMM_LIB_CONTEXT *pGmmLibContext)
1264*35ffd701SAndroid Build Coastguard Worker {
1265*35ffd701SAndroid Build Coastguard Worker     return (pGmmLibContext->GetTextureCalc());
1266*35ffd701SAndroid Build Coastguard Worker }
1267*35ffd701SAndroid Build Coastguard Worker 
1268*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
1269*35ffd701SAndroid Build Coastguard Worker /// C-wrapper to get the sku table ptr
1270*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGmmLibContext: ptr to GMM_GLOBAL_CONTEXT
1271*35ffd701SAndroid Build Coastguard Worker /// @return   const SkuTable ptr
1272*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GmmGetSkuTable(GMM_LIB_CONTEXT * pGmmLibContext)1273*35ffd701SAndroid Build Coastguard Worker const SKU_FEATURE_TABLE *GmmGetSkuTable(GMM_LIB_CONTEXT *pGmmLibContext)
1274*35ffd701SAndroid Build Coastguard Worker {
1275*35ffd701SAndroid Build Coastguard Worker     return (&pGmmLibContext->GetSkuTable());
1276*35ffd701SAndroid Build Coastguard Worker }
1277*35ffd701SAndroid Build Coastguard Worker 
1278*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
1279*35ffd701SAndroid Build Coastguard Worker /// C-wrapper to get the Wa table ptr
1280*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGmmLibContext: ptr to GMM_GLOBAL_CONTEXT
1281*35ffd701SAndroid Build Coastguard Worker /// @return   const WaTable ptr
1282*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GmmGetWaTable(GMM_LIB_CONTEXT * pGmmLibContext)1283*35ffd701SAndroid Build Coastguard Worker const WA_TABLE *GmmGetWaTable(GMM_LIB_CONTEXT *pGmmLibContext)
1284*35ffd701SAndroid Build Coastguard Worker {
1285*35ffd701SAndroid Build Coastguard Worker     return (&pGmmLibContext->GetWaTable());
1286*35ffd701SAndroid Build Coastguard Worker }
1287*35ffd701SAndroid Build Coastguard Worker 
1288*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
1289*35ffd701SAndroid Build Coastguard Worker /// C-wrapper to get the GT system info ptr
1290*35ffd701SAndroid Build Coastguard Worker /// @param[in]  pGmmLibContext: ptr to GMM_GLOBAL_CONTEXT
1291*35ffd701SAndroid Build Coastguard Worker /// @return   const GtSysInfo ptr
1292*35ffd701SAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////
GmmGetGtSysInfo(GMM_LIB_CONTEXT * pGmmLibContext)1293*35ffd701SAndroid Build Coastguard Worker const GT_SYSTEM_INFO *GmmGetGtSysInfo(GMM_LIB_CONTEXT *pGmmLibContext)
1294*35ffd701SAndroid Build Coastguard Worker {
1295*35ffd701SAndroid Build Coastguard Worker     return (pGmmLibContext->GetGtSysInfoPtr());
1296*35ffd701SAndroid Build Coastguard Worker }
1297*35ffd701SAndroid Build Coastguard Worker 
1298