diff --git a/level_zero/api/tools/zet_sysman.cpp b/level_zero/api/tools/zet_sysman.cpp index 794340bf10..64f43b4c57 100644 --- a/level_zero/api/tools/zet_sysman.cpp +++ b/level_zero/api/tools/zet_sysman.cpp @@ -813,7 +813,7 @@ zesDeviceEnumFabricPorts( zes_device_handle_t hDevice, uint32_t *pCount, zes_fabric_port_handle_t *phPort) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::SysmanDevice::fromHandle(hDevice)->fabricPortGet(pCount, phPort); } __zedllexport ze_result_t __zecall @@ -828,7 +828,7 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zesFabricPortGetProperties( zes_fabric_port_handle_t hPort, zes_fabric_port_properties_t *pProperties) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::FabricPort::fromHandle(hPort)->fabricPortGetProperties(pProperties); } __zedllexport ze_result_t __zecall @@ -842,7 +842,7 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zesFabricPortGetLinkType( zes_fabric_port_handle_t hPort, zes_fabric_link_type_t *pLinkType) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::FabricPort::fromHandle(hPort)->fabricPortGetLinkType(pLinkType); } __zedllexport ze_result_t __zecall @@ -857,7 +857,7 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zesFabricPortGetConfig( zes_fabric_port_handle_t hPort, zes_fabric_port_config_t *pConfig) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::FabricPort::fromHandle(hPort)->fabricPortGetConfig(pConfig); } __zedllexport ze_result_t __zecall @@ -871,7 +871,7 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zesFabricPortSetConfig( zes_fabric_port_handle_t hPort, const zes_fabric_port_config_t *pConfig) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::FabricPort::fromHandle(hPort)->fabricPortSetConfig(pConfig); } __zedllexport ze_result_t __zecall @@ -885,7 +885,7 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zesFabricPortGetState( zes_fabric_port_handle_t hPort, zes_fabric_port_state_t *pState) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::FabricPort::fromHandle(hPort)->fabricPortGetState(pState); } __zedllexport ze_result_t __zecall @@ -899,7 +899,7 @@ ZE_APIEXPORT ze_result_t ZE_APICALL zesFabricPortGetThroughput( zes_fabric_port_handle_t hPort, zes_fabric_port_throughput_t *pThroughput) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::FabricPort::fromHandle(hPort)->fabricPortGetThroughput(pThroughput); } __zedllexport ze_result_t __zecall diff --git a/level_zero/tools/source/sysman/fabric_port/fabric_port.cpp b/level_zero/tools/source/sysman/fabric_port/fabric_port.cpp index 4f87775808..e994b87f09 100644 --- a/level_zero/tools/source/sysman/fabric_port/fabric_port.cpp +++ b/level_zero/tools/source/sysman/fabric_port/fabric_port.cpp @@ -13,21 +13,23 @@ namespace L0 { +FabricPortHandleContext::FabricPortHandleContext(OsSysman *pOsSysman) { + pFabricDevice = new FabricDeviceImp(pOsSysman); + UNRECOVERABLE_IF(nullptr == pFabricDevice); +} + FabricPortHandleContext::~FabricPortHandleContext() { - if (nullptr != pFabricDevice) { - for (FabricPort *pFabricPort : handleList) { - delete pFabricPort; - } - handleList.clear(); - delete pFabricDevice; - pFabricDevice = nullptr; + UNRECOVERABLE_IF(nullptr == pFabricDevice); + for (FabricPort *pFabricPort : handleList) { + delete pFabricPort; } + handleList.clear(); + delete pFabricDevice; + pFabricDevice = nullptr; } ze_result_t FabricPortHandleContext::init() { - pFabricDevice = new FabricDeviceImp(pOsSysman); UNRECOVERABLE_IF(nullptr == pFabricDevice); - uint32_t numPorts = pFabricDevice->getNumPorts(); for (uint32_t portNum = 0; portNum < numPorts; portNum++) { @@ -38,18 +40,35 @@ ze_result_t FabricPortHandleContext::init() { return ZE_RESULT_SUCCESS; } -ze_result_t FabricPortHandleContext::fabricPortGet(uint32_t *pCount, zet_sysman_fabric_port_handle_t *phPort) { - if (nullptr == phPort) { +ze_result_t FabricPortHandleContext::fabricPortGet(uint32_t *pCount, zes_fabric_port_handle_t *phPort) { + if (0 == *pCount || handleList.size() < *pCount) { *pCount = static_cast(handleList.size()); - return ZE_RESULT_SUCCESS; } - uint32_t i = 0; - for (FabricPort *pFabricPort : handleList) { - if (i >= *pCount) - break; - phPort[i++] = pFabricPort->toHandle(); + if (nullptr != phPort) { + uint32_t i = 0; + for (FabricPort *pFabricPort : handleList) { + if (i >= *pCount) { + break; + } + phPort[i++] = pFabricPort->toZesHandle(); + } + } + return ZE_RESULT_SUCCESS; +} + +ze_result_t FabricPortHandleContext::fabricPortGet(uint32_t *pCount, zet_sysman_fabric_port_handle_t *phPort) { + if (0 == *pCount || handleList.size() < *pCount) { + *pCount = static_cast(handleList.size()); + } + if (nullptr != phPort) { + uint32_t i = 0; + for (FabricPort *pFabricPort : handleList) { + if (i >= *pCount) { + break; + } + phPort[i++] = pFabricPort->toHandle(); + } } - *pCount = i; return ZE_RESULT_SUCCESS; } diff --git a/level_zero/tools/source/sysman/fabric_port/fabric_port.h b/level_zero/tools/source/sysman/fabric_port/fabric_port.h index 2cfda43f98..a50baf679a 100644 --- a/level_zero/tools/source/sysman/fabric_port/fabric_port.h +++ b/level_zero/tools/source/sysman/fabric_port/fabric_port.h @@ -6,11 +6,20 @@ */ #pragma once +#include "shared/source/helpers/non_copyable_or_moveable.h" + #include +#include "third_party/level_zero/zes_api_ext.h" + #include -struct _zet_sysman_fabric_port_handle_t {}; +struct _zet_sysman_fabric_port_handle_t { + virtual ~_zet_sysman_fabric_port_handle_t() = default; +}; +struct _zes_fabric_port_handle_t { + virtual ~_zes_fabric_port_handle_t() = default; +}; namespace L0 { @@ -24,9 +33,16 @@ class FabricDevice { virtual uint32_t getNumPorts() = 0; }; -class FabricPort : _zet_sysman_fabric_port_handle_t { +class FabricPort : _zet_sysman_fabric_port_handle_t, _zes_fabric_port_handle_t { public: virtual ~FabricPort() = default; + virtual ze_result_t fabricPortGetProperties(zes_fabric_port_properties_t *pProperties) = 0; + virtual ze_result_t fabricPortGetLinkType(zes_fabric_link_type_t *pLinkType) = 0; + virtual ze_result_t fabricPortGetConfig(zes_fabric_port_config_t *pConfig) = 0; + virtual ze_result_t fabricPortSetConfig(const zes_fabric_port_config_t *pConfig) = 0; + virtual ze_result_t fabricPortGetState(zes_fabric_port_state_t *pState) = 0; + virtual ze_result_t fabricPortGetThroughput(zes_fabric_port_throughput_t *pThroughput) = 0; + virtual ze_result_t fabricPortGetProperties(zet_fabric_port_properties_t *pProperties) = 0; virtual ze_result_t fabricPortGetLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) = 0; virtual ze_result_t fabricPortGetConfig(zet_fabric_port_config_t *pConfig) = 0; @@ -34,22 +50,28 @@ class FabricPort : _zet_sysman_fabric_port_handle_t { virtual ze_result_t fabricPortGetState(zet_fabric_port_state_t *pState) = 0; virtual ze_result_t fabricPortGetThroughput(zet_fabric_port_throughput_t *pThroughput) = 0; + inline zet_sysman_fabric_port_handle_t toHandle() { return this; } + inline zes_fabric_port_handle_t toZesHandle() { return this; } + static FabricPort *fromHandle(zet_sysman_fabric_port_handle_t handle) { return static_cast(handle); } - inline zet_sysman_fabric_port_handle_t toHandle() { return this; } + + static FabricPort *fromHandle(zes_fabric_port_handle_t handle) { + return static_cast(handle); + } }; -struct FabricPortHandleContext { - FabricPortHandleContext(OsSysman *pOsSysman) : pOsSysman(pOsSysman){}; +struct FabricPortHandleContext : NEO::NonCopyableOrMovableClass { + FabricPortHandleContext(OsSysman *pOsSysman); ~FabricPortHandleContext(); ze_result_t init(); + ze_result_t fabricPortGet(uint32_t *pCount, zes_fabric_port_handle_t *phPort); ze_result_t fabricPortGet(uint32_t *pCount, zet_sysman_fabric_port_handle_t *phPort); FabricDevice *pFabricDevice = nullptr; - OsSysman *pOsSysman = nullptr; std::vector handleList = {}; }; diff --git a/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.cpp b/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.cpp index 1ca27c47c4..641bfaa078 100644 --- a/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.cpp +++ b/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.cpp @@ -33,8 +33,45 @@ void fabricPortGetTimestamp(uint64_t ×tamp) { timestamp = std::chrono::duration_cast(ts.time_since_epoch()).count(); } +ze_result_t FabricPortImp::fabricPortGetProperties(zes_fabric_port_properties_t *pProperties) { + pOsFabricPort->getModel(pProperties->model); + pProperties->onSubdevice = onSubdevice; + pProperties->subdeviceId = subdeviceId; + pOsFabricPort->getPortId(pProperties->portId); + pOsFabricPort->getMaxRxSpeed(pProperties->maxRxSpeed); + pOsFabricPort->getMaxTxSpeed(pProperties->maxTxSpeed); + + return ZE_RESULT_SUCCESS; +} + +ze_result_t FabricPortImp::fabricPortGetLinkType(zes_fabric_link_type_t *pLinkType) { + return pOsFabricPort->getLinkType(pLinkType); +} + +ze_result_t FabricPortImp::fabricPortGetConfig(zes_fabric_port_config_t *pConfig) { + return pOsFabricPort->getConfig(pConfig); +} + +ze_result_t FabricPortImp::fabricPortSetConfig(const zes_fabric_port_config_t *pConfig) { + return pOsFabricPort->setConfig(pConfig); +} + +ze_result_t FabricPortImp::fabricPortGetState(zes_fabric_port_state_t *pState) { + return pOsFabricPort->getState(pState); +} + +ze_result_t FabricPortImp::fabricPortGetThroughput(zes_fabric_port_throughput_t *pThroughput) { + fabricPortGetTimestamp(pThroughput->timestamp); + return pOsFabricPort->getThroughput(pThroughput); +} + ze_result_t FabricPortImp::fabricPortGetProperties(zet_fabric_port_properties_t *pProperties) { - *pProperties = fabricPortProperties; + pOsFabricPort->getModel(pProperties->model); + pProperties->onSubdevice = onSubdevice; + pProperties->subdeviceId = subdeviceId; + pOsFabricPort->getPortUuid(pProperties->portUuid); + pOsFabricPort->getMaxRxSpeed(pProperties->maxRxSpeed); + pOsFabricPort->getMaxTxSpeed(pProperties->maxTxSpeed); return ZE_RESULT_SUCCESS; } @@ -56,17 +93,12 @@ ze_result_t FabricPortImp::fabricPortGetState(zet_fabric_port_state_t *pState) { ze_result_t FabricPortImp::fabricPortGetThroughput(zet_fabric_port_throughput_t *pThroughput) { fabricPortGetTimestamp(pThroughput->timestamp); - ze_result_t result = pOsFabricPort->getThroughput(pThroughput); - return result; + return pOsFabricPort->getThroughput(pThroughput); } void FabricPortImp::init() { - fabricPortProperties.onSubdevice = false; - fabricPortProperties.subdeviceId = 0L; - pOsFabricPort->getModel(fabricPortProperties.model); - pOsFabricPort->getPortUuid(fabricPortProperties.portUuid); - pOsFabricPort->getMaxRxSpeed(fabricPortProperties.maxRxSpeed); - pOsFabricPort->getMaxTxSpeed(fabricPortProperties.maxTxSpeed); + onSubdevice = false; + subdeviceId = 0L; } FabricPortImp::FabricPortImp(FabricDevice *pFabricDevice, uint32_t portNum) { diff --git a/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.h b/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.h index 68719ad15b..ec0499c07b 100644 --- a/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.h +++ b/level_zero/tools/source/sysman/fabric_port/fabric_port_imp.h @@ -13,6 +13,8 @@ #include "level_zero/tools/source/sysman/fabric_port/os_fabric_port.h" #include +#include "third_party/level_zero/zes_api_ext.h" + namespace L0 { class FabricDeviceImp : public FabricDevice, NEO::NonCopyableOrMovableClass { @@ -29,6 +31,13 @@ class FabricDeviceImp : public FabricDevice, NEO::NonCopyableOrMovableClass { class FabricPortImp : public FabricPort, NEO::NonCopyableOrMovableClass { public: + ze_result_t fabricPortGetProperties(zes_fabric_port_properties_t *pProperties) override; + ze_result_t fabricPortGetLinkType(zes_fabric_link_type_t *pLinkType) override; + ze_result_t fabricPortGetConfig(zes_fabric_port_config_t *pConfig) override; + ze_result_t fabricPortSetConfig(const zes_fabric_port_config_t *pConfig) override; + ze_result_t fabricPortGetState(zes_fabric_port_state_t *pState) override; + ze_result_t fabricPortGetThroughput(zes_fabric_port_throughput_t *pThroughput) override; + ze_result_t fabricPortGetProperties(zet_fabric_port_properties_t *pProperties) override; ze_result_t fabricPortGetLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) override; ze_result_t fabricPortGetConfig(zet_fabric_port_config_t *pConfig) override; @@ -45,7 +54,8 @@ class FabricPortImp : public FabricPort, NEO::NonCopyableOrMovableClass { OsFabricPort *pOsFabricPort = nullptr; private: - zet_fabric_port_properties_t fabricPortProperties = {}; + bool onSubdevice = false; + uint32_t subdeviceId = 0U; }; } // namespace L0 diff --git a/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.cpp b/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.cpp index 890e98aa6a..c64c184045 100644 --- a/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.cpp +++ b/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.cpp @@ -21,6 +21,57 @@ LinuxFabricDeviceImp::LinuxFabricDeviceImp(OsSysman *pOsSysman) { LinuxFabricDeviceImp::~LinuxFabricDeviceImp() { } +ze_result_t LinuxFabricPortImp::getLinkType(zes_fabric_link_type_t *pLinkType) { + ::snprintf(pLinkType->desc, ZET_MAX_FABRIC_LINK_TYPE_SIZE, "%s", "SAMPLE LINK, VERBOSE"); + return ZE_RESULT_SUCCESS; +} + +ze_result_t LinuxFabricPortImp::getConfig(zes_fabric_port_config_t *pConfig) { + *pConfig = config; + return ZE_RESULT_SUCCESS; +} + +ze_result_t LinuxFabricPortImp::setConfig(const zes_fabric_port_config_t *pConfig) { + config = *pConfig; + return ZE_RESULT_SUCCESS; +} + +ze_result_t LinuxFabricPortImp::getState(zes_fabric_port_state_t *pState) { + pState->status = ZES_FABRIC_PORT_STATUS_UNKNOWN; + pState->qualityIssues = 0U; + pState->failureReasons = 0U; + pState->remotePortId.fabricId = 0U; + pState->remotePortId.attachId = 0U; + pState->remotePortId.portNumber = 0U; + pState->rxSpeed.bitRate = 0LU; + pState->rxSpeed.width = 0U; + pState->txSpeed.bitRate = 0LU; + pState->txSpeed.width = 0U; + return ZE_RESULT_SUCCESS; +} + +ze_result_t LinuxFabricPortImp::getThroughput(zes_fabric_port_throughput_t *pThroughput) { + pThroughput->rxCounter = 0LU; + pThroughput->txCounter = 0LU; + return ZE_RESULT_SUCCESS; +} + +void LinuxFabricPortImp::getModel(char *model) { + ::snprintf(model, ZET_MAX_FABRIC_PORT_MODEL_SIZE, "%s", this->model.c_str()); +} + +void LinuxFabricPortImp::getPortId(zes_fabric_port_id_t &portId) { + portId = this->portId; +} + +void LinuxFabricPortImp::getMaxRxSpeed(zes_fabric_port_speed_t &maxRxSpeed) { + maxRxSpeed = this->maxRxSpeed; +} + +void LinuxFabricPortImp::getMaxTxSpeed(zes_fabric_port_speed_t &maxTxSpeed) { + maxTxSpeed = this->maxTxSpeed; +} + ze_result_t LinuxFabricPortImp::getLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) { if (verbose) { ::snprintf(reinterpret_cast(pLinkType->desc), ZET_MAX_FABRIC_LINK_TYPE_SIZE, "%s", "SAMPLE LINK, VERBOSE"); @@ -31,12 +82,12 @@ ze_result_t LinuxFabricPortImp::getLinkType(ze_bool_t verbose, zet_fabric_link_t } ze_result_t LinuxFabricPortImp::getConfig(zet_fabric_port_config_t *pConfig) { - *pConfig = config; + *pConfig = zetConfig; return ZE_RESULT_SUCCESS; } ze_result_t LinuxFabricPortImp::setConfig(const zet_fabric_port_config_t *pConfig) { - config = *pConfig; + zetConfig = *pConfig; return ZE_RESULT_SUCCESS; } @@ -62,24 +113,25 @@ ze_result_t LinuxFabricPortImp::getThroughput(zet_fabric_port_throughput_t *pThr } void LinuxFabricPortImp::getModel(int8_t *model) { - ::snprintf(reinterpret_cast(model), ZET_MAX_FABRIC_PORT_MODEL_SIZE, "%s", this->model.c_str()); + ::snprintf(reinterpret_cast(model), ZET_MAX_FABRIC_PORT_MODEL_SIZE, "%s", this->zetModel.c_str()); } void LinuxFabricPortImp::getPortUuid(zet_fabric_port_uuid_t &portUuid) { - portUuid = this->portUuid; + portUuid = this->zetPortUuid; } void LinuxFabricPortImp::getMaxRxSpeed(zet_fabric_port_speed_t &maxRxSpeed) { - maxRxSpeed = this->maxRxSpeed; + maxRxSpeed = this->zetMaxRxSpeed; } void LinuxFabricPortImp::getMaxTxSpeed(zet_fabric_port_speed_t &maxTxSpeed) { - maxTxSpeed = this->maxTxSpeed; + maxTxSpeed = this->zetMaxTxSpeed; } LinuxFabricPortImp::LinuxFabricPortImp(OsFabricDevice *pOsFabricDevice, uint32_t portNum) { this->portNum = portNum; model = std::string("EXAMPLE"); + zetModel = std::string("EXAMPLE"); } LinuxFabricPortImp::~LinuxFabricPortImp() { diff --git a/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.h b/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.h index 95d9a7a317..f30a2a8f7b 100644 --- a/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.h +++ b/level_zero/tools/source/sysman/fabric_port/linux/os_fabric_port_imp.h @@ -28,6 +28,16 @@ class LinuxFabricDeviceImp : public OsFabricDevice, NEO::NonCopyableOrMovableCla class LinuxFabricPortImp : public OsFabricPort, NEO::NonCopyableOrMovableClass { public: + ze_result_t getLinkType(zes_fabric_link_type_t *pLinkType) override; + ze_result_t getConfig(zes_fabric_port_config_t *pConfig) override; + ze_result_t setConfig(const zes_fabric_port_config_t *pConfig) override; + ze_result_t getState(zes_fabric_port_state_t *pState) override; + ze_result_t getThroughput(zes_fabric_port_throughput_t *pThroughput) override; + void getModel(char *model) override; + void getPortId(zes_fabric_port_id_t &portId) override; + void getMaxRxSpeed(zes_fabric_port_speed_t &maxRxSpeed) override; + void getMaxTxSpeed(zes_fabric_port_speed_t &maxTxSpeed) override; + ze_result_t getLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) override; ze_result_t getConfig(zet_fabric_port_config_t *pConfig) override; ze_result_t setConfig(const zet_fabric_port_config_t *pConfig) override; @@ -45,10 +55,16 @@ class LinuxFabricPortImp : public OsFabricPort, NEO::NonCopyableOrMovableClass { private: uint32_t portNum = 0; std::string model = ""; - zet_fabric_port_uuid_t portUuid = {}; - zet_fabric_port_speed_t maxRxSpeed = {}; - zet_fabric_port_speed_t maxTxSpeed = {}; - zet_fabric_port_config_t config = {}; + zes_fabric_port_id_t portId = {}; + zes_fabric_port_speed_t maxRxSpeed = {}; + zes_fabric_port_speed_t maxTxSpeed = {}; + zes_fabric_port_config_t config = {}; + + std::string zetModel = ""; + zet_fabric_port_uuid_t zetPortUuid = {}; + zet_fabric_port_speed_t zetMaxRxSpeed = {}; + zet_fabric_port_speed_t zetMaxTxSpeed = {}; + zet_fabric_port_config_t zetConfig = {}; }; } // namespace L0 diff --git a/level_zero/tools/source/sysman/fabric_port/os_fabric_port.h b/level_zero/tools/source/sysman/fabric_port/os_fabric_port.h index b2fca8ca00..e52df9f73b 100644 --- a/level_zero/tools/source/sysman/fabric_port/os_fabric_port.h +++ b/level_zero/tools/source/sysman/fabric_port/os_fabric_port.h @@ -10,6 +10,8 @@ #include "level_zero/tools/source/sysman/os_sysman.h" #include +#include "third_party/level_zero/zes_api_ext.h" + namespace L0 { class OsFabricDevice { @@ -23,6 +25,16 @@ class OsFabricDevice { class OsFabricPort { public: + virtual ze_result_t getLinkType(zes_fabric_link_type_t *pLinkType) = 0; + virtual ze_result_t getConfig(zes_fabric_port_config_t *pConfig) = 0; + virtual ze_result_t setConfig(const zes_fabric_port_config_t *pConfig) = 0; + virtual ze_result_t getState(zes_fabric_port_state_t *pState) = 0; + virtual ze_result_t getThroughput(zes_fabric_port_throughput_t *pThroughput) = 0; + virtual void getModel(char *model) = 0; + virtual void getPortId(zes_fabric_port_id_t &portId) = 0; + virtual void getMaxRxSpeed(zes_fabric_port_speed_t &maxRxSpeed) = 0; + virtual void getMaxTxSpeed(zes_fabric_port_speed_t &maxTxSpeed) = 0; + virtual ze_result_t getLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) = 0; virtual ze_result_t getConfig(zet_fabric_port_config_t *pConfig) = 0; virtual ze_result_t setConfig(const zet_fabric_port_config_t *pConfig) = 0; diff --git a/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.cpp b/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.cpp index 6de1248eed..49f01807a6 100644 --- a/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.cpp +++ b/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.cpp @@ -21,6 +21,42 @@ WddmFabricDeviceImp::WddmFabricDeviceImp(OsSysman *pOsSysman) { WddmFabricDeviceImp::~WddmFabricDeviceImp() { } +ze_result_t WddmFabricPortImp::getLinkType(zes_fabric_link_type_t *pLinkType) { + return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; +} + +ze_result_t WddmFabricPortImp::getConfig(zes_fabric_port_config_t *pConfig) { + return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; +} + +ze_result_t WddmFabricPortImp::setConfig(const zes_fabric_port_config_t *pConfig) { + return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; +} + +ze_result_t WddmFabricPortImp::getState(zes_fabric_port_state_t *pState) { + return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; +} + +ze_result_t WddmFabricPortImp::getThroughput(zes_fabric_port_throughput_t *pThroughput) { + return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; +} + +void WddmFabricPortImp::getModel(char *model) { + ::memset(model, '\0', ZES_MAX_FABRIC_PORT_MODEL_SIZE); +} + +void WddmFabricPortImp::getPortId(zes_fabric_port_id_t &portId) { + ::memset(&portId, '\0', sizeof(portId)); +} + +void WddmFabricPortImp::getMaxRxSpeed(zes_fabric_port_speed_t &maxRxSpeed) { + ::memset(&maxRxSpeed, '\0', sizeof(maxRxSpeed)); +} + +void WddmFabricPortImp::getMaxTxSpeed(zes_fabric_port_speed_t &maxTxSpeed) { + ::memset(&maxTxSpeed, '\0', sizeof(maxTxSpeed)); +} + ze_result_t WddmFabricPortImp::getLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } diff --git a/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.h b/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.h index c91203b180..d664774703 100644 --- a/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.h +++ b/level_zero/tools/source/sysman/fabric_port/windows/os_fabric_port_imp.h @@ -29,6 +29,16 @@ class WddmFabricDeviceImp : public OsFabricDevice, NEO::NonCopyableOrMovableClas class WddmFabricPortImp : public OsFabricPort, NEO::NonCopyableOrMovableClass { public: + ze_result_t getLinkType(zes_fabric_link_type_t *pLinkType) override; + ze_result_t getConfig(zes_fabric_port_config_t *pConfig) override; + ze_result_t setConfig(const zes_fabric_port_config_t *pConfig) override; + ze_result_t getState(zes_fabric_port_state_t *pState) override; + ze_result_t getThroughput(zes_fabric_port_throughput_t *pThroughput) override; + void getModel(char *model) override; + void getPortId(zes_fabric_port_id_t &portId) override; + void getMaxRxSpeed(zes_fabric_port_speed_t &maxRxSpeed) override; + void getMaxTxSpeed(zes_fabric_port_speed_t &maxTxSpeed) override; + ze_result_t getLinkType(ze_bool_t verbose, zet_fabric_link_type_t *pLinkType) override; ze_result_t getConfig(zet_fabric_port_config_t *pConfig) override; ze_result_t setConfig(const zet_fabric_port_config_t *pConfig) override; @@ -39,6 +49,7 @@ class WddmFabricPortImp : public OsFabricPort, NEO::NonCopyableOrMovableClass { void getMaxRxSpeed(zet_fabric_port_speed_t &maxRxSpeed) override; void getMaxTxSpeed(zet_fabric_port_speed_t &maxTxSpeed) override; + WddmFabricPortImp() = delete; WddmFabricPortImp(OsFabricDevice *pOsFabricDevice, uint32_t portNum); ~WddmFabricPortImp() override; }; diff --git a/level_zero/tools/source/sysman/sysman.h b/level_zero/tools/source/sysman/sysman.h index 608cdf9d8a..715ba629c6 100644 --- a/level_zero/tools/source/sysman/sysman.h +++ b/level_zero/tools/source/sysman/sysman.h @@ -83,6 +83,7 @@ struct SysmanDevice : _ze_device_handle_t { virtual ze_result_t powerGet(uint32_t *pCount, zes_pwr_handle_t *phPower) = 0; virtual ze_result_t frequencyGet(uint32_t *pCount, zes_freq_handle_t *phFrequency) = 0; + virtual ze_result_t fabricPortGet(uint32_t *pCount, zes_fabric_port_handle_t *phPort) = 0; virtual ~SysmanDevice() = default; }; diff --git a/level_zero/tools/source/sysman/sysman_imp.cpp b/level_zero/tools/source/sysman/sysman_imp.cpp index fd71f789b9..0ab44493f6 100644 --- a/level_zero/tools/source/sysman/sysman_imp.cpp +++ b/level_zero/tools/source/sysman/sysman_imp.cpp @@ -24,9 +24,11 @@ SysmanDeviceImp::SysmanDeviceImp(ze_device_handle_t hDevice) { UNRECOVERABLE_IF(nullptr == pOsSysman); pPowerHandleContext = new PowerHandleContext(pOsSysman); pFrequencyHandleContext = new FrequencyHandleContext(pOsSysman); + pFabricPortHandleContext = new FabricPortHandleContext(pOsSysman); } SysmanDeviceImp::~SysmanDeviceImp() { + freeResource(pFabricPortHandleContext); freeResource(pOsSysman); freeResource(pPowerHandleContext); freeResource(pFrequencyHandleContext); @@ -40,6 +42,9 @@ void SysmanDeviceImp::init() { if (pFrequencyHandleContext) { pFrequencyHandleContext->init(); } + if (pFabricPortHandleContext) { + pFabricPortHandleContext->init(); + } } SysmanImp::SysmanImp(ze_device_handle_t hDevice) { @@ -224,6 +229,10 @@ ze_result_t SysmanImp::memoryGet(uint32_t *pCount, zet_sysman_mem_handle_t *phMe return pMemoryHandleContext->memoryGet(pCount, phMemory); } +ze_result_t SysmanDeviceImp::fabricPortGet(uint32_t *pCount, zes_fabric_port_handle_t *phPort) { + return pFabricPortHandleContext->fabricPortGet(pCount, phPort); +} + ze_result_t SysmanImp::fabricPortGet(uint32_t *pCount, zet_sysman_fabric_port_handle_t *phPort) { return pFabricPortHandleContext->fabricPortGet(pCount, phPort); } diff --git a/level_zero/tools/source/sysman/sysman_imp.h b/level_zero/tools/source/sysman/sysman_imp.h index e264f47e03..c7ce6e61b7 100644 --- a/level_zero/tools/source/sysman/sysman_imp.h +++ b/level_zero/tools/source/sysman/sysman_imp.h @@ -94,9 +94,11 @@ struct SysmanDeviceImp : SysmanDevice, NEO::NonCopyableOrMovableClass { OsSysman *pOsSysman = nullptr; PowerHandleContext *pPowerHandleContext = nullptr; FrequencyHandleContext *pFrequencyHandleContext = nullptr; + FabricPortHandleContext *pFabricPortHandleContext = nullptr; ze_result_t powerGet(uint32_t *pCount, zes_pwr_handle_t *phPower) override; ze_result_t frequencyGet(uint32_t *pCount, zes_freq_handle_t *phFrequency) override; + ze_result_t fabricPortGet(uint32_t *pCount, zes_fabric_port_handle_t *phPort) override; private: template diff --git a/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/CMakeLists.txt b/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/CMakeLists.txt index c185c71657..d58cac117e 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/CMakeLists.txt +++ b/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/CMakeLists.txt @@ -9,5 +9,7 @@ if(UNIX) PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURRENT_SOURCE_DIR}/test_sysman_fabric_port.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_zes_fabric_port.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/mock_fabric_device.h ) endif() diff --git a/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/mock_fabric_device.h b/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/mock_fabric_device.h new file mode 100644 index 0000000000..395c195066 --- /dev/null +++ b/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/mock_fabric_device.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once +#include "level_zero/core/test/unit_tests/fixtures/device_fixture.h" + +#include "sysman/fabric_port/fabric_port.h" + +namespace L0 { +namespace ult { + +template <> +struct Mock : public FabricDevice { + MOCK_METHOD(uint32_t, getNumPorts, (), (override)); + MOCK_METHOD(OsFabricDevice *, getOsFabricDevice, (), (override)); + + Mock() = default; + ~Mock() override = default; +}; + +} // namespace ult +} // namespace L0 diff --git a/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/test_zes_fabric_port.cpp b/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/test_zes_fabric_port.cpp new file mode 100644 index 0000000000..3e93dcff84 --- /dev/null +++ b/level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/test_zes_fabric_port.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "level_zero/tools/test/unit_tests/sources/sysman/fabric_port/linux/mock_fabric_device.h" +#include "level_zero/tools/test/unit_tests/sources/sysman/mock_sysman_fixture.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include + +using ::testing::Return; + +namespace L0 { +namespace ult { + +class ZesFabricPortFixture : public SysmanDeviceFixture { + protected: + static uint32_t numPorts; + + void SetUp() override { + SysmanDeviceFixture::SetUp(); + FabricPortHandleContext *pFabricPortHandleContext = pSysmanDeviceImp->pFabricPortHandleContext; + if (nullptr != pFabricPortHandleContext->pFabricDevice) { + for (FabricPort *pFabricPort : pFabricPortHandleContext->handleList) { + delete pFabricPort; + } + pFabricPortHandleContext->handleList.clear(); + delete pFabricPortHandleContext->pFabricDevice; + pFabricPortHandleContext->pFabricDevice = nullptr; + } + Mock *mockFabricDevice = new NiceMock>; + ON_CALL(*mockFabricDevice, getNumPorts()) + .WillByDefault(Return(numPorts)); + + pFabricPortHandleContext->pFabricDevice = mockFabricDevice; + pFabricPortHandleContext->init(); + } + void TearDown() override { + SysmanDeviceFixture::TearDown(); + } +}; + +uint32_t ZesFabricPortFixture::numPorts = 2U; + +TEST_F(ZesFabricPortFixture, GivenPortCountZeroWhenCallingZesFabricPortGetThenCountIsReturnedAndVerifyZesFabricPortGetCallSucceeds) { + uint32_t count = 0U; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, NULL); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, ZesFabricPortFixture::numPorts); +} + +TEST_F(ZesFabricPortFixture, GivenPortCountCorrectWhenCallingZesFabricPortGetThenCountHandlesAreReturnedAndAndVerifyZesFabricPortGetCallSucceeds) { + uint32_t count = ZesFabricPortFixture::numPorts; + zes_fabric_port_handle_t hPorts[ZesFabricPortFixture::numPorts]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, ZesFabricPortFixture::numPorts); +} + +TEST_F(ZesFabricPortFixture, GivenPortCountGreaterThanPortsWhenCallingZesFabricPortGetThenCorrectCountisReturnedAndAndVerifyZesFabricPortGetCallSucceeds) { + uint32_t count = ZesFabricPortFixture::numPorts + 1U; + zes_fabric_port_handle_t hPorts[ZesFabricPortFixture::numPorts + 1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, ZesFabricPortFixture::numPorts); +} + +TEST_F(ZesFabricPortFixture, GivenPortCounLessThanPortsWhenCallingZesFabricPortGetThenCountLessTanPortsHandlesAreReturned) { + uint32_t count = ZesFabricPortFixture::numPorts - 1U; + zes_fabric_port_handle_t hPorts[ZesFabricPortFixture::numPorts - 1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, ZesFabricPortFixture::numPorts - 1U); +} + +TEST_F(ZesFabricPortFixture, GivenValidFabricPortHandleWhenCallingZesFabricPortGetPropertiesThenZesFabricPortGetPropertiesCallSucceeds) { + uint32_t count = 1U; + zes_fabric_port_handle_t hPorts[1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, 1U); + + zes_fabric_port_properties_t properties; + // Initialize values + properties.onSubdevice = true; + properties.subdeviceId = std::numeric_limits::max(); + std::memset(properties.model, std::numeric_limits::max(), ZES_MAX_FABRIC_PORT_MODEL_SIZE); + properties.portId.fabricId = std::numeric_limits::max(); + properties.portId.attachId = std::numeric_limits::max(); + properties.portId.portNumber = std::numeric_limits::max(); + properties.maxRxSpeed.bitRate = std::numeric_limits::max(); + properties.maxRxSpeed.width = std::numeric_limits::max(); + properties.maxTxSpeed.bitRate = std::numeric_limits::max(); + properties.maxTxSpeed.width = std::numeric_limits::max(); + + result = zesFabricPortGetProperties(hPorts[0], &properties); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_FALSE(properties.onSubdevice); + EXPECT_EQ(0L, properties.subdeviceId); + EXPECT_STREQ("EXAMPLE", properties.model); + EXPECT_EQ(0U, properties.portId.fabricId); + EXPECT_EQ(0U, properties.portId.attachId); + EXPECT_EQ(0U, properties.portId.portNumber); + EXPECT_EQ(0L, properties.maxRxSpeed.bitRate); + EXPECT_EQ(0, properties.maxRxSpeed.width); + EXPECT_EQ(0L, properties.maxTxSpeed.bitRate); + EXPECT_EQ(0, properties.maxTxSpeed.width); +} + +TEST_F(ZesFabricPortFixture, GivenValidFabricPortHandleWhenCallingZesFabricPortGetLinkTypeThenZesFabricPortGetLinkTypeCallSucceeds) { + uint32_t count = 1U; + zes_fabric_port_handle_t hPorts[1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, 1U); + + zes_fabric_link_type_t linkType; + result = zesFabricPortGetLinkType(hPorts[0], &linkType); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_STREQ("SAMPLE LINK, VERBOSE", linkType.desc); +} + +TEST_F(ZesFabricPortFixture, GivenValidFabricPortHandleWhenCallingZesFabricPortGetConfigThenZesFabricPortGetConfigCallSucceeds) { + uint32_t count = 1U; + zes_fabric_port_handle_t hPorts[1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, 1U); + + zes_fabric_port_config_t getConfig = {.stype = ZES_STRUCTURE_TYPE_FABRIC_PORT_PROPERTIES, .pNext = nullptr, .enabled = true, .beaconing = true}; + result = zesFabricPortGetConfig(hPorts[0], &getConfig); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_FALSE(getConfig.enabled); + EXPECT_FALSE(getConfig.beaconing); +} + +TEST_F(ZesFabricPortFixture, GivenValidFabricPortHandleWhenCallingZesFabricPortSetConfigThenZesFabricPortGetConfigCallSucceeds) { + uint32_t count = 1U; + zes_fabric_port_handle_t hPorts[1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, 1U); + + zes_fabric_port_config_t setConfig = {.stype = ZES_STRUCTURE_TYPE_FABRIC_PORT_PROPERTIES, .pNext = nullptr, .enabled = true, .beaconing = false}; + result = zesFabricPortSetConfig(hPorts[0U], &setConfig); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + zes_fabric_port_config_t getConfig = {.stype = ZES_STRUCTURE_TYPE_FABRIC_PORT_PROPERTIES, .pNext = nullptr, .enabled = false, .beaconing = true}; + result = zesFabricPortGetConfig(hPorts[0], &getConfig); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_TRUE(getConfig.enabled); + EXPECT_FALSE(getConfig.beaconing); +} + +TEST_F(ZesFabricPortFixture, GivenValidFabricPortHandleWhenCallingZesFabricPortGetStateThenZesFabricPortGetStateCallSucceeds) { + uint32_t count = 1U; + zes_fabric_port_handle_t hPorts[1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, 1U); + + zes_fabric_port_state_t state; + result = zesFabricPortGetState(hPorts[0], &state); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(0U, state.status); + EXPECT_EQ(0U, state.qualityIssues); + EXPECT_EQ(0U, state.failureReasons); + EXPECT_EQ(0U, state.remotePortId.fabricId); + EXPECT_EQ(0U, state.remotePortId.attachId); + EXPECT_EQ(0U, state.remotePortId.portNumber); + EXPECT_EQ(0L, state.rxSpeed.bitRate); + EXPECT_EQ(0, state.rxSpeed.width); + EXPECT_EQ(0L, state.txSpeed.bitRate); + EXPECT_EQ(0, state.txSpeed.width); +} + +TEST_F(ZesFabricPortFixture, GivenValidFabricPortHandleWhenCallingZesFabricPortGetThroughputThenZesFabricPortGetThroughputCallSucceeds) { + uint32_t count = 1U; + zes_fabric_port_handle_t hPorts[1U]; + ze_result_t result = zesDeviceEnumFabricPorts(device, &count, hPorts); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(count, 1U); + + zes_fabric_port_throughput_t throughput; + // Initialize values + throughput.timestamp = 0LU; + throughput.rxCounter = std::numeric_limits::max(); + throughput.txCounter = std::numeric_limits::max(); + + result = zesFabricPortGetThroughput(hPorts[0], &throughput); + + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_NE(0LU, throughput.timestamp); + EXPECT_EQ(0LU, throughput.rxCounter); + EXPECT_EQ(0LU, throughput.txCounter); +} + +} // namespace ult +} // namespace L0