feature: add new PVC device id

Related-To: NEO-9736

Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz
2023-12-29 11:05:05 +00:00
committed by Compute-Runtime-Automation
parent edd6fd5e6c
commit 87857a6558
23 changed files with 158 additions and 13 deletions

View File

@@ -336,7 +336,7 @@ if(SUPPORT_XE_HPC_CORE)
if(SUPPORT_PVC)
set(PVC_XE_HPC_CORE_REVISIONS 3 47)
set(PVC_XE_HPC_CORE_RELEASES "12.60.0" "12.60.1" "12.60.3" "12.60.5" "12.60.6" "12.60.7")
set(PVC_XE_HPC_CORE_RELEASES "12.60.0" "12.60.1" "12.60.3" "12.60.5" "12.60.6" "12.60.7" "12.61.7")
ADD_PRODUCT("SUPPORTED" "PVC" "IGFX_PVC")
ADD_PLATFORM_FOR_CORE_TYPE("SUPPORTED" "XE_HPC_CORE" "PVC")
ADD_PLATFORM_FOR_CORE_TYPE("SUPPORTED_AUX_TRANSLATION" "XE_HPC_CORE" "PVC")

View File

@@ -89,14 +89,27 @@ PVCTEST_F(DeviceTestPvc, givenPvcXtDeviceIdAndRevIdWhenGetDeviceIpVersion) {
ze_device_ip_version_ext_t zeDeviceIpVersion = {ZE_STRUCTURE_TYPE_DEVICE_IP_VERSION_EXT};
zeDeviceIpVersion.ipVersion = std::numeric_limits<uint32_t>::max();
deviceProperties.pNext = &zeDeviceIpVersion;
std::vector<std::pair<uint32_t, AOT::PRODUCT_CONFIG>> pvcValues = {
std::vector<std::pair<uint32_t, AOT::PRODUCT_CONFIG>> pvcXtValues = {
{0x3, AOT::PVC_XT_A0},
{0x5, AOT::PVC_XT_B0},
{0x6, AOT::PVC_XT_B1},
{0x7, AOT::PVC_XT_C0}};
std::vector<std::pair<uint32_t, AOT::PRODUCT_CONFIG>> pvcXtVgValues = {{0x7, AOT::PVC_XT_C0_VG}};
for (const auto &deviceId : pvcXtDeviceIds) {
for (const auto &[revId, config] : pvcValues) {
for (const auto &[revId, config] : pvcXtValues) {
device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->platform.usDeviceID = deviceId;
device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->platform.usRevId = revId;
device->getProperties(&deviceProperties);
EXPECT_NE(std::numeric_limits<uint32_t>::max(), zeDeviceIpVersion.ipVersion);
EXPECT_EQ(config, zeDeviceIpVersion.ipVersion);
}
}
for (const auto &deviceId : pvcXtVgDeviceIds) {
for (const auto &[revId, config] : pvcXtVgValues) {
device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->platform.usDeviceID = deviceId;
device->getNEODevice()->getRootDeviceEnvironment().getMutableHardwareInfo()->platform.usRevId = revId;
device->getProperties(&deviceProperties);

View File

@@ -42,7 +42,7 @@ components:
dest_dir: kernels_bin
type: git
branch: kernels_bin
revision: 2214-1182
revision: 2214-1188
kmdaf:
branch: kmdaf
dest_dir: kmdaf

View File

@@ -61,6 +61,32 @@ PVCTEST_F(PvcOfflineCompilerTests, givenPvcDeviceAndRevisionIdValueWhenInitHwInf
}
}
PVCTEST_F(PvcOfflineCompilerTests, givenPvcXtVgDeviceAndRevisionIdValueWhenInitHwInfoThenCorrectValuesAreSet) {
MockOfflineCompiler mockOfflineCompiler;
std::string deviceStr;
auto deviceID = pvcXtVgDeviceIds.front();
HardwareIpVersion config = AOT::PVC_XT_C0_VG;
int revisionID = 0x2f;
std::stringstream deviceIDStr, expectedOutput;
mockOfflineCompiler.revisionId = revisionID;
deviceIDStr << "0x" << std::hex << deviceID;
deviceStr = mockOfflineCompiler.argHelper->productConfigHelper->getAcronymForProductConfig(config.value);
testing::internal::CaptureStdout();
mockOfflineCompiler.initHardwareInfo(deviceIDStr.str());
std::string output = testing::internal::GetCapturedStdout();
expectedOutput << "Auto-detected target based on " << deviceIDStr.str() << " device id: " << deviceStr << "\n";
EXPECT_STREQ(output.c_str(), expectedOutput.str().c_str());
EXPECT_EQ(mockOfflineCompiler.hwInfo.platform.usDeviceID, deviceID);
EXPECT_EQ(mockOfflineCompiler.hwInfo.platform.usRevId, revisionID);
EXPECT_EQ(mockOfflineCompiler.deviceConfig, config.value);
}
PVCTEST_F(PvcOfflineCompilerTests, givenPvcXtDeviceAndUnknownRevisionIdValueWhenInitHwInfoThenDefaultConfigIsSet) {
MockOfflineCompiler mockOfflineCompiler;
mockOfflineCompiler.argHelper->getPrinterRef().setSuppressMessages(true);

View File

@@ -10,7 +10,7 @@
using namespace NEO;
PVCTEST_F(DeviceIdTests, GivenPvcSupportedDeviceIdThenConfigIsCorrect) {
std::array<DeviceDescriptor, 10> expectedDescriptors = {{
std::array<DeviceDescriptor, 11> expectedDescriptors = {{
{0x0BD0, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
{0x0BD5, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
{0x0BD6, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
@@ -21,6 +21,7 @@ PVCTEST_F(DeviceIdTests, GivenPvcSupportedDeviceIdThenConfigIsCorrect) {
{0x0BDB, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
{0x0B69, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
{0x0B6E, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
{0x0BD4, &PvcHwConfig::hwInfo, &PvcHwConfig::setupHardwareInfo},
}};
testImpl(expectedDescriptors);

View File

@@ -73,6 +73,7 @@ set(CLOC_LIB_SRCS_LIB
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1256.cpp
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1257.cpp
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1260.cpp
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1261.cpp
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1270.cpp
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1271.cpp
${NEO_SHARED_DIRECTORY}/release_helper/release_helper_1274.cpp

View File

@@ -17,6 +17,7 @@ NAMEDDEVICE(0x0BDA, PvcHwConfig, "Intel(R) Data Center GPU Max 1100")
NAMEDDEVICE(0x0BDB, PvcHwConfig, "Intel(R) Data Center GPU Max 1100")
NAMEDDEVICE(0x0B69, PvcHwConfig, "Intel(R) Data Center GPU Max 1450")
NAMEDDEVICE(0x0B6E, PvcHwConfig, "Intel(R) Data Center GPU Max 1100C")
NAMEDDEVICE(0x0BD4, PvcHwConfig, "Intel(R) Data Center GPU Max 1550VG")
#endif
#endif

View File

@@ -13,6 +13,7 @@ DEVICE_CONFIG(PVC_XT_A0, PvcHwConfig, pvcXtDeviceIds, XE_FAMILY, XE_HPC_RELEASE)
DEVICE_CONFIG(PVC_XT_B0, PvcHwConfig, pvcXtDeviceIds, XE_FAMILY, XE_HPC_RELEASE)
DEVICE_CONFIG(PVC_XT_B1, PvcHwConfig, pvcXtDeviceIds, XE_FAMILY, XE_HPC_RELEASE)
DEVICE_CONFIG(PVC_XT_C0, PvcHwConfig, pvcXtDeviceIds, XE_FAMILY, XE_HPC_RELEASE)
DEVICE_CONFIG(PVC_XT_C0_VG, PvcHwConfig, pvcXtVgDeviceIds, XE_FAMILY, XE_HPC_RELEASE)
#endif
#endif

View File

@@ -21,6 +21,7 @@ if(SUPPORT_XE_HPG_CORE OR SUPPORT_XE_HPC_CORE)
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1256.cpp
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1257.cpp
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1260.cpp
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1261.cpp
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1270.cpp
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1271.cpp
${CMAKE_CURRENT_SOURCE_DIR}/release_helper_1274.cpp

View File

@@ -14,6 +14,7 @@ enum class ReleaseType {
release1256,
release1257,
release1260,
release1261,
release1270,
release1271,
release1274,

View File

@@ -19,6 +19,7 @@ EnableReleaseHelper<ReleaseType::release1255> enablerReleaseHelper1255{releaseHe
EnableReleaseHelper<ReleaseType::release1256> enablerReleaseHelper1256{releaseHelperFactoryXe[56]};
EnableReleaseHelper<ReleaseType::release1257> enablerReleaseHelper1257{releaseHelperFactoryXe[57]};
EnableReleaseHelper<ReleaseType::release1260> enablerReleaseHelper1260{releaseHelperFactoryXe[60]};
EnableReleaseHelper<ReleaseType::release1261> enablerReleaseHelper1261{releaseHelperFactoryXe[61]};
EnableReleaseHelper<ReleaseType::release1270> enablerReleaseHelper1270{releaseHelperFactoryXe[70]};
EnableReleaseHelper<ReleaseType::release1271> enablerReleaseHelper1271{releaseHelperFactoryXe[71]};
EnableReleaseHelper<ReleaseType::release1274> enablerReleaseHelper1274{releaseHelperFactoryXe[74]};

View File

@@ -0,0 +1,22 @@
/*
* Copyright (C) 2023 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/release_helper/release_helper.h"
#include "shared/source/release_helper/release_helper_base.inl"
#include "release_definitions.h"
namespace NEO {
constexpr auto release = ReleaseType::release1261;
template <>
bool ReleaseHelperHw<release>::isRcsExposureDisabled() const {
return true;
}
} // namespace NEO
template class NEO::ReleaseHelperHw<NEO::release>;

View File

@@ -28,7 +28,13 @@ uint32_t CompilerProductHelperHw<IGFX_PVC>::getProductConfigFromHwInfo(const Har
auto deviceId = hwInfo.platform.usDeviceID;
bool isPvcXl = (std::find(pvcXlDeviceIds.begin(), pvcXlDeviceIds.end(), deviceId) != pvcXlDeviceIds.end());
bool isPvcXt = (std::find(pvcXtDeviceIds.begin(), pvcXtDeviceIds.end(), deviceId) != pvcXtDeviceIds.end());
if (isPvcXl) {
bool isPvcXtVg = (std::find(pvcXtVgDeviceIds.begin(), pvcXtVgDeviceIds.end(), deviceId) != pvcXtVgDeviceIds.end());
if (isPvcXtVg) {
if ((hwInfo.platform.usRevId & PVC::pvcSteppingBits) == 7) {
return AOT::PVC_XT_C0_VG;
}
} else if (isPvcXl) {
switch (hwInfo.platform.usRevId & PVC::pvcSteppingBits) {
case 0x0:
return AOT::PVC_XL_A0;

View File

@@ -23,4 +23,9 @@ bool PVC::isXt(const HardwareInfo &hwInfo) {
return it != pvcXtDeviceIds.end();
}
bool PVC::isXtVg(const HardwareInfo &hwInfo) {
auto it = std::find(pvcXtVgDeviceIds.begin(), pvcXtVgDeviceIds.end(), hwInfo.platform.usDeviceID);
return it != pvcXtVgDeviceIds.end();
}
} // namespace NEO

View File

@@ -55,6 +55,7 @@ struct PVC : public XeHpcCoreFamily {
static bool isXl(const HardwareInfo &hwInfo);
static bool isXt(const HardwareInfo &hwInfo);
static bool isXtVg(const HardwareInfo &hwInfo);
static bool isXlA0(const HardwareInfo &hwInfo) {
auto revId = hwInfo.platform.usRevId & pvcSteppingBits;

View File

@@ -12,4 +12,5 @@
namespace NEO {
inline const std::vector<unsigned short> pvcXlDeviceIds{0x0BD0};
inline const std::vector<unsigned short> pvcXtDeviceIds{0x0BD5, 0x0BD6, 0x0BD7, 0x0BD8, 0x0BD9, 0x0BDA, 0x0BDB, 0x0B69, 0x0B6E};
inline const std::vector<unsigned short> pvcXtVgDeviceIds{0x0BD4};
} // namespace NEO

View File

@@ -18,7 +18,11 @@ bool ProductHelperHw<gfxProduct>::isMaxThreadsForWorkgroupWARequired(const Hardw
template <>
uint32_t ProductHelperHw<gfxProduct>::getHwRevIdFromStepping(uint32_t stepping, const HardwareInfo &hwInfo) const {
if (PVC::isXt(hwInfo)) {
if (PVC::isXtVg(hwInfo)) {
if (stepping == REVISION_C) {
return 0x7;
}
} else if (PVC::isXt(hwInfo)) {
switch (stepping) {
case REVISION_A0:
return 0x3;
@@ -44,7 +48,13 @@ uint32_t ProductHelperHw<gfxProduct>::getHwRevIdFromStepping(uint32_t stepping,
template <>
uint32_t ProductHelperHw<gfxProduct>::getSteppingFromHwRevId(const HardwareInfo &hwInfo) const {
switch (hwInfo.platform.usRevId & PVC::pvcSteppingBits) {
auto rev = hwInfo.platform.usRevId & PVC::pvcSteppingBits;
if (PVC::isXtVg(hwInfo) && rev != 7) {
return CommonConstants::invalidStepping;
}
switch (rev) {
case 0x0:
case 0x1:
case 0x3:
@@ -178,7 +188,7 @@ bool ProductHelperHw<gfxProduct>::isComputeDispatchAllWalkerEnableInCfeStateRequ
template <>
bool ProductHelperHw<gfxProduct>::isIpSamplingSupported(const HardwareInfo &hwInfo) const {
return PVC::isXt(hwInfo);
return PVC::isXt(hwInfo) || PVC::isXtVg(hwInfo);
}
template <>

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2022 Intel Corporation
* Copyright (C) 2022-2023 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -15,5 +15,6 @@ inline constexpr AOT::PRODUCT_CONFIG productConfigs[] = {
AOT::PVC_XT_A0,
AOT::PVC_XT_B0,
AOT::PVC_XT_B1,
AOT::PVC_XT_C0};
AOT::PVC_XT_C0,
AOT::PVC_XT_C0_VG};
}

View File

@@ -22,12 +22,18 @@ PVCTEST_F(CompilerProductHelperPvcTest, givenPvcConfigsWhenMatchConfigWithRevIdT
auto &compilerProductHelper = rootDeviceEnvironment.getHelper<CompilerProductHelper>();
for (const auto &config : AOT_PVC::productConfigs) {
if (config == AOT::PVC_XT_C0_VG) {
continue;
}
EXPECT_EQ(compilerProductHelper.matchRevisionIdWithProductConfig(config, 0x0), AOT::PVC_XL_A0);
EXPECT_EQ(compilerProductHelper.matchRevisionIdWithProductConfig(config, 0x1), AOT::PVC_XL_A0P);
EXPECT_EQ(compilerProductHelper.matchRevisionIdWithProductConfig(config, 0x3), AOT::PVC_XT_A0);
EXPECT_EQ(compilerProductHelper.matchRevisionIdWithProductConfig(config, 0x26), AOT::PVC_XT_B1);
EXPECT_EQ(compilerProductHelper.matchRevisionIdWithProductConfig(config, 0x2f), AOT::PVC_XT_C0);
}
EXPECT_EQ(compilerProductHelper.matchRevisionIdWithProductConfig(AOT::PVC_XT_C0_VG, 0x2f), AOT::PVC_XT_C0_VG);
}
PVCTEST_F(CompilerProductHelperPvcTest, givenPvcWhenFailBuildProgramWithStatefulAccessPreferenceThenFalseIsReturned) {

View File

@@ -28,6 +28,7 @@ PVCTEST_F(PvcConfigHwInfoTests, givenPvcDeviceIdsAndRevisionsWhenCheckingConfigs
hwInfo.platform.usDeviceID = deviceId;
EXPECT_TRUE(PVC::isXl(hwInfo));
EXPECT_FALSE(PVC::isXt(hwInfo));
EXPECT_FALSE(PVC::isXtVg(hwInfo));
hwInfo.platform.usRevId = 0x0;
EXPECT_TRUE(PVC::isXlA0(hwInfo));
@@ -46,6 +47,26 @@ PVCTEST_F(PvcConfigHwInfoTests, givenPvcDeviceIdsAndRevisionsWhenCheckingConfigs
hwInfo.platform.usDeviceID = deviceId;
EXPECT_FALSE(PVC::isXl(hwInfo));
EXPECT_TRUE(PVC::isXt(hwInfo));
EXPECT_FALSE(PVC::isXtVg(hwInfo));
hwInfo.platform.usRevId = 0x0;
EXPECT_TRUE(PVC::isAtMostXtA0(hwInfo));
hwInfo.platform.usRevId = 0x1;
EXPECT_TRUE(PVC::isAtMostXtA0(hwInfo));
hwInfo.platform.usRevId = 0x3;
EXPECT_TRUE(PVC::isAtMostXtA0(hwInfo));
hwInfo.platform.usRevId = 0x5;
EXPECT_FALSE(PVC::isAtMostXtA0(hwInfo));
}
for (auto &deviceId : pvcXtVgDeviceIds) {
hwInfo.platform.usDeviceID = deviceId;
EXPECT_FALSE(PVC::isXl(hwInfo));
EXPECT_FALSE(PVC::isXt(hwInfo));
EXPECT_TRUE(PVC::isXtVg(hwInfo));
hwInfo.platform.usRevId = 0x0;
EXPECT_TRUE(PVC::isAtMostXtA0(hwInfo));

View File

@@ -81,6 +81,14 @@ PVCTEST_F(ProductConfigTests, givenPvcXtDeviceIdWhenDifferentRevisionIsPassedThe
productConfig = compilerProductHelper->getHwIpVersion(hwInfo);
EXPECT_EQ(productConfig, AOT::PVC_XT_C0);
}
for (const auto &deviceId : pvcXtVgDeviceIds) {
hwInfo.platform.usDeviceID = deviceId;
hwInfo.platform.usRevId = 0x17;
productConfig = compilerProductHelper->getHwIpVersion(hwInfo);
EXPECT_EQ(productConfig, AOT::PVC_XT_C0_VG);
}
}
PVCTEST_F(ProductConfigTests, givenDefaultDeviceAndRevisionIdWhenGetProductConfigThenPvcXtC0ConfigIsReturned) {

View File

@@ -80,6 +80,11 @@ PVCTEST_F(PvcProductHelper, givenPvcHwInfoWhenIsIpSamplingSupportedThenCorrectRe
hwInfo.platform.usDeviceID = deviceId;
EXPECT_TRUE(productHelper->isIpSamplingSupported(hwInfo));
}
for (const auto &deviceId : pvcXtVgDeviceIds) {
hwInfo.platform.usDeviceID = deviceId;
EXPECT_TRUE(productHelper->isIpSamplingSupported(hwInfo));
}
}
PVCTEST_F(PvcProductHelper, givenProductHelperWhenGettingEvictIfNecessaryFlagSupportedThenExpectTrue) {
@@ -221,13 +226,19 @@ PVCTEST_F(PvcProductHelper, givenDeviceIdThenProperMaxThreadsForWorkgroupIsRetur
uint32_t numThreadsPerEU = hwInfo.gtSystemInfo.ThreadCount / hwInfo.gtSystemInfo.EUCount;
EXPECT_EQ(64u * numThreadsPerEU, productHelper->getMaxThreadsForWorkgroupInDSSOrSS(hwInfo, 64u, 64u));
}
for (const auto &deviceId : pvcXtVgDeviceIds) {
hwInfo.platform.usDeviceID = deviceId;
uint32_t numThreadsPerEU = hwInfo.gtSystemInfo.ThreadCount / hwInfo.gtSystemInfo.EUCount;
EXPECT_EQ(64u * numThreadsPerEU, productHelper->getMaxThreadsForWorkgroupInDSSOrSS(hwInfo, 64u, 64u));
}
}
PVCTEST_F(PvcProductHelper, givenVariousValuesWhenConvertingHwRevIdAndSteppingThenConversionIsCorrect) {
auto hwInfo = *defaultHwInfo;
for (uint32_t testValue = 0; testValue < 0xFF; testValue++) {
for (const auto *pvc : {&pvcXlDeviceIds, &pvcXtDeviceIds}) {
for (const auto *pvc : {&pvcXlDeviceIds, &pvcXtDeviceIds, &pvcXtVgDeviceIds}) {
for (const auto &deviceId : *pvc) {
hwInfo.platform.usDeviceID = deviceId;
auto hwRevIdFromStepping = productHelper->getHwRevIdFromStepping(testValue, hwInfo);
@@ -241,7 +252,7 @@ PVCTEST_F(PvcProductHelper, givenVariousValuesWhenConvertingHwRevIdAndSteppingTh
auto steppingFromHwRevId = productHelper->getSteppingFromHwRevId(hwInfo);
if (steppingFromHwRevId != CommonConstants::invalidStepping) {
bool anyMatchAfterConversionFromStepping = false;
for (const auto *pvc : {&pvcXlDeviceIds, &pvcXtDeviceIds}) {
for (const auto *pvc : {&pvcXlDeviceIds, &pvcXtDeviceIds, &pvcXtVgDeviceIds}) {
for (const auto &deviceId : *pvc) {
hwInfo.platform.usDeviceID = deviceId;
auto hwRevId = productHelper->getHwRevIdFromStepping(steppingFromHwRevId, hwInfo);
@@ -270,6 +281,11 @@ PVCTEST_F(PvcProductHelper, givenPvcProductHelperWhenIsIpSamplingSupportedThenCo
hwInfo.platform.usDeviceID = deviceId;
EXPECT_TRUE(productHelper->isIpSamplingSupported(hwInfo));
}
for (const auto &deviceId : pvcXtVgDeviceIds) {
hwInfo.platform.usDeviceID = deviceId;
EXPECT_TRUE(productHelper->isIpSamplingSupported(hwInfo));
}
}
PVCTEST_F(PvcProductHelper, givenPvcProductHelperAndKernelBinaryFormatsWhenCheckingIsDetectIndirectAccessInKernelSupportedThenCorrectValueIsReturned) {

View File

@@ -48,6 +48,7 @@ enum PRODUCT_CONFIG : uint32_t {
PVC_XT_B0 = 0x030f0005,
PVC_XT_B1 = 0x030f0006,
PVC_XT_C0 = 0x030f0007,
PVC_XT_C0_VG = 0x030f4007,
MTL_M_A0 = 0x03118000,
MTL_M_B0 = 0x03118004,
MTL_P_A0 = 0x0311c000,
@@ -189,6 +190,7 @@ inline const std::map<std::string, AOT::PRODUCT_CONFIG> deviceAcronyms = {
#ifdef SUPPORT_PVC
{"pvc-sdv", PVC_XL_A0P},
{"pvc", PVC_XT_C0},
{"pvc-xt-c0-vg", PVC_XT_C0_VG},
#endif
#ifdef SUPPORT_MTL
{"mtl-s", MTL_M_B0},