From d09ebd8d2a4cea6fdfda8189f80eff008f308fd5 Mon Sep 17 00:00:00 2001 From: johnmach Date: Wed, 8 Dec 2021 20:19:16 +0530 Subject: [PATCH] Multi adapater support on Linux for different adapater BDF (#77) --- Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp | 5 +---- Source/GmmLib/ULT/GmmMultiAdapterULT.cpp | 25 ++++++++++++---------- Source/GmmLib/ULT/GmmMultiAdapterULT.h | 23 +++++++++++++++----- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp b/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp index c81145ff..117a5d81 100755 --- a/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp +++ b/Source/GmmLib/GlobalInfo/GmmLibDllMain.cpp @@ -42,7 +42,6 @@ extern "C" GMM_LIB_API GMM_STATUS GMM_STDCALL InitializeGmm(GMM_INIT_IN_ARGS *pI GMM_INIT_OUT_ARGS *pOutArgs) { GMM_STATUS Status = GMM_ERROR; - ADAPTER_BDF stAdapterBDF; if(pInArgs && pOutArgs) { @@ -52,9 +51,7 @@ extern "C" GMM_LIB_API GMM_STATUS GMM_STDCALL InitializeGmm(GMM_INIT_IN_ARGS *pI #ifdef _WIN32 stAdapterBDF = pInArgs->stAdapterBDF; #else - //ToDO: For Linux, Add the code to Get the Adapter BDF from Adapter FileDescriptor - //Hardcoding for now to 0 2 0 - stAdapterBDF = {0, 2, 0, 0}; + stAdapterBDF.Data = pInArgs->FileDescriptor; #endif Status = GmmCreateLibContext(pInArgs->Platform, pInArgs->pSkuTable, pInArgs->pWaTable, diff --git a/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp b/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp index 589daea3..f7c3439f 100644 --- a/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp +++ b/Source/GmmLib/ULT/GmmMultiAdapterULT.cpp @@ -81,7 +81,8 @@ void MACommonULT::UnLoadGmmDll(uint32_t AdapterIdx, uint32_t CountIdx) void MACommonULT::GmmInitModule(uint32_t AdapterIdx, uint32_t CountIdx) { - GMM_STATUS Status = GMM_SUCCESS; + GMM_STATUS Status = GMM_SUCCESS; + ADAPTER_BDF AdapterBDF = GetAdapterBDF(AdapterIdx); GfxPlatform[AdapterIdx][CountIdx].eProductFamily = GetProductFamily(AdapterIdx); GfxPlatform[AdapterIdx][CountIdx].eRenderCoreFamily = GetRenderCoreFamily(AdapterIdx); @@ -124,8 +125,11 @@ void MACommonULT::GmmInitModule(uint32_t AdapterIdx, uint32_t CountIdx) InArgs[AdapterIdx][CountIdx].pSkuTable = &pGfxAdapterInfo[AdapterIdx][CountIdx]->SkuTable; InArgs[AdapterIdx][CountIdx].pWaTable = &pGfxAdapterInfo[AdapterIdx][CountIdx]->WaTable; InArgs[AdapterIdx][CountIdx].Platform = GfxPlatform[AdapterIdx][CountIdx]; -#ifdef _WIN32 - InArgs[AdapterIdx][CountIdx].stAdapterBDF = GetAdapterBDF(AdapterIdx); +#if LHDM + InArgs[AdapterIdx][CountIdx].stAdapterBDF = AdapterBDF; + InArgs[AdapterIdx][CountIdx].DeviceRegistryPath = NULL; +#else + InArgs[AdapterIdx][CountIdx].FileDescriptor = AdapterBDF.Data; #endif Status = pfnGmmInit[AdapterIdx][CountIdx](&InArgs[AdapterIdx][CountIdx], &OutArgs[AdapterIdx][CountIdx]); @@ -177,10 +181,9 @@ TEST_F(CTestMA, TestLoadMultipleAdapters) GmmInitModule(0, 0); GmmInitModule(1, 0); - //Todo: Change EXPECT_EQ to EXPECT_NE once Multi-Adapter support is added to Linux - EXPECT_EQ(pLibContext[0][0], pLibContext[1][0]); - EXPECT_EQ(pLibContext[2][0], pLibContext[1][0]); - EXPECT_EQ(pLibContext[2][0], pLibContext[0][0]); + EXPECT_NE(pLibContext[0][0], pLibContext[1][0]); + EXPECT_NE(pLibContext[2][0], pLibContext[1][0]); + EXPECT_NE(pLibContext[2][0], pLibContext[0][0]); GmmDestroyModule(1, 0); GmmDestroyModule(2, 0); @@ -255,10 +258,10 @@ TEST_F(CTestMA, TestInitDestroyMultipleTimesOnMultiAdapter) GmmInitModule(1, 0); GmmInitModule(2, 0); - //Todo: Change EXPECT_EQ to EXPECT_NE once Multi-Adapter support is added to Linux - EXPECT_EQ(pLibContext[0][0], pLibContext[1][0]); - EXPECT_EQ(pLibContext[2][0], pLibContext[1][0]); - EXPECT_EQ(pLibContext[2][0], pLibContext[0][0]); + //EXPECT_NE for Multi-Adapter support is added to Linux + EXPECT_NE(pLibContext[0][0], pLibContext[1][0]); + EXPECT_NE(pLibContext[2][0], pLibContext[1][0]); + EXPECT_NE(pLibContext[2][0], pLibContext[0][0]); GmmDestroyModule(2, 0); GmmDestroyModule(1, 0); diff --git a/Source/GmmLib/ULT/GmmMultiAdapterULT.h b/Source/GmmLib/ULT/GmmMultiAdapterULT.h index ca2c81e1..7cd5592d 100644 --- a/Source/GmmLib/ULT/GmmMultiAdapterULT.h +++ b/Source/GmmLib/ULT/GmmMultiAdapterULT.h @@ -93,16 +93,29 @@ class MACommonULT : public testing::Test static ADAPTER_BDF GetAdapterBDF(uint32_t AdapterIdx) { + ADAPTER_BDF AdapterBDF={0,2,0,0}; + switch (AdapterIdx) { - case 0: return { 2, 0, 2, 0 }; - case 1: return { 1, 0, 0, 0 }; - case 2: return { 2, 0, 1, 0 }; + case 0: + AdapterBDF.Bus = 2; + AdapterBDF.Device = 0; + AdapterBDF.Function = 0; + break; + case 1: + AdapterBDF.Bus = 1; + AdapterBDF.Device = 0; + AdapterBDF.Function = 0; + break; + case 2: + AdapterBDF.Bus = 2; + AdapterBDF.Device = 1; + AdapterBDF.Function = 0; + break; default: break; } - return { 0, 2, 0, 0 }; + return AdapterBDF; } - }; typedef struct ThreadInParams_Rec