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