2020-03-06 18:09:57 +08:00
|
|
|
/*
|
2023-01-03 00:19:30 +08:00
|
|
|
* Copyright (C) 2020-2023 Intel Corporation
|
2020-03-06 18:09:57 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "level_zero/tools/source/sysman/sysman_imp.h"
|
|
|
|
|
2022-12-07 19:51:44 +08:00
|
|
|
#include "shared/source/device/sub_device.h"
|
2023-01-03 00:19:30 +08:00
|
|
|
#include "shared/source/helpers/basic_math.h"
|
2023-02-02 00:23:01 +08:00
|
|
|
#include "shared/source/helpers/gfx_core_helper.h"
|
2023-02-06 17:05:43 +08:00
|
|
|
#include "shared/source/helpers/hw_info.h"
|
2022-10-21 18:50:55 +08:00
|
|
|
#include "shared/source/helpers/sleep.h"
|
|
|
|
|
2020-03-19 13:21:57 +08:00
|
|
|
#include "level_zero/core/source/driver/driver.h"
|
|
|
|
#include "level_zero/core/source/driver/driver_handle_imp.h"
|
2022-04-12 19:45:58 +08:00
|
|
|
#include "level_zero/tools/source/sysman/ecc/ecc_imp.h"
|
2020-10-09 13:34:35 +08:00
|
|
|
#include "level_zero/tools/source/sysman/events/events_imp.h"
|
2020-07-03 22:35:35 +08:00
|
|
|
#include "level_zero/tools/source/sysman/global_operations/global_operations_imp.h"
|
2020-03-22 15:52:57 +08:00
|
|
|
#include "level_zero/tools/source/sysman/pci/pci_imp.h"
|
2020-03-06 18:09:57 +08:00
|
|
|
#include "level_zero/tools/source/sysman/sysman.h"
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace L0 {
|
|
|
|
|
2020-07-03 22:35:35 +08:00
|
|
|
SysmanDeviceImp::SysmanDeviceImp(ze_device_handle_t hDevice) {
|
|
|
|
hCoreDevice = hDevice;
|
|
|
|
pOsSysman = OsSysman::create(this);
|
|
|
|
UNRECOVERABLE_IF(nullptr == pOsSysman);
|
2020-08-14 02:03:21 +08:00
|
|
|
pPci = new PciImp(pOsSysman);
|
2020-07-17 18:19:21 +08:00
|
|
|
pPowerHandleContext = new PowerHandleContext(pOsSysman);
|
2020-07-24 19:09:09 +08:00
|
|
|
pFrequencyHandleContext = new FrequencyHandleContext(pOsSysman);
|
2020-07-21 04:06:42 +08:00
|
|
|
pFabricPortHandleContext = new FabricPortHandleContext(pOsSysman);
|
2020-07-29 18:58:08 +08:00
|
|
|
pTempHandleContext = new TemperatureHandleContext(pOsSysman);
|
2020-07-15 02:36:12 +08:00
|
|
|
pStandbyHandleContext = new StandbyHandleContext(pOsSysman);
|
2020-07-30 20:31:57 +08:00
|
|
|
pEngineHandleContext = new EngineHandleContext(pOsSysman);
|
2020-07-31 18:34:29 +08:00
|
|
|
pSchedulerHandleContext = new SchedulerHandleContext(pOsSysman);
|
2020-08-05 03:22:42 +08:00
|
|
|
pRasHandleContext = new RasHandleContext(pOsSysman);
|
2020-08-14 02:03:21 +08:00
|
|
|
pMemoryHandleContext = new MemoryHandleContext(pOsSysman);
|
|
|
|
pGlobalOperations = new GlobalOperationsImp(pOsSysman);
|
2020-10-09 13:34:35 +08:00
|
|
|
pEvents = new EventsImp(pOsSysman);
|
2020-08-15 09:30:53 +08:00
|
|
|
pFanHandleContext = new FanHandleContext(pOsSysman);
|
2020-08-13 18:34:11 +08:00
|
|
|
pFirmwareHandleContext = new FirmwareHandleContext(pOsSysman);
|
2021-03-10 14:57:01 +08:00
|
|
|
pDiagnosticsHandleContext = new DiagnosticsHandleContext(pOsSysman);
|
2020-12-28 12:25:52 +08:00
|
|
|
pPerformanceHandleContext = new PerformanceHandleContext(pOsSysman);
|
2022-04-12 19:45:58 +08:00
|
|
|
pEcc = new EccImp(pOsSysman);
|
2020-07-03 22:35:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
SysmanDeviceImp::~SysmanDeviceImp() {
|
2020-12-28 12:25:52 +08:00
|
|
|
freeResource(pPerformanceHandleContext);
|
2021-03-10 14:57:01 +08:00
|
|
|
freeResource(pDiagnosticsHandleContext);
|
2020-08-13 18:34:11 +08:00
|
|
|
freeResource(pFirmwareHandleContext);
|
2020-10-09 13:34:35 +08:00
|
|
|
freeResource(pFanHandleContext);
|
|
|
|
freeResource(pEvents);
|
2020-07-26 02:23:21 +08:00
|
|
|
freeResource(pGlobalOperations);
|
2020-08-07 10:27:43 +08:00
|
|
|
freeResource(pMemoryHandleContext);
|
2020-08-05 03:22:42 +08:00
|
|
|
freeResource(pRasHandleContext);
|
2020-07-31 18:34:29 +08:00
|
|
|
freeResource(pSchedulerHandleContext);
|
2020-07-30 20:31:57 +08:00
|
|
|
freeResource(pEngineHandleContext);
|
2020-07-15 02:36:12 +08:00
|
|
|
freeResource(pStandbyHandleContext);
|
2020-07-29 18:58:08 +08:00
|
|
|
freeResource(pTempHandleContext);
|
2020-07-21 04:06:42 +08:00
|
|
|
freeResource(pFabricPortHandleContext);
|
2020-07-23 09:34:28 +08:00
|
|
|
freeResource(pPci);
|
2020-07-24 19:09:09 +08:00
|
|
|
freeResource(pFrequencyHandleContext);
|
2020-07-29 18:58:08 +08:00
|
|
|
freeResource(pPowerHandleContext);
|
2022-04-12 19:45:58 +08:00
|
|
|
freeResource(pEcc);
|
2020-07-29 18:58:08 +08:00
|
|
|
freeResource(pOsSysman);
|
2020-07-03 22:35:35 +08:00
|
|
|
}
|
|
|
|
|
2021-10-11 23:34:03 +08:00
|
|
|
void SysmanDeviceImp::updateSubDeviceHandlesLocally() {
|
2020-09-10 13:24:55 +08:00
|
|
|
uint32_t subDeviceCount = 0;
|
2021-10-11 23:34:03 +08:00
|
|
|
deviceHandles.clear();
|
2020-09-10 13:24:55 +08:00
|
|
|
Device::fromHandle(hCoreDevice)->getSubDevices(&subDeviceCount, nullptr);
|
|
|
|
if (subDeviceCount == 0) {
|
|
|
|
deviceHandles.resize(1, hCoreDevice);
|
|
|
|
} else {
|
|
|
|
deviceHandles.resize(subDeviceCount, nullptr);
|
|
|
|
Device::fromHandle(hCoreDevice)->getSubDevices(&subDeviceCount, deviceHandles.data());
|
|
|
|
}
|
2021-10-11 23:34:03 +08:00
|
|
|
}
|
|
|
|
|
2022-11-28 19:55:07 +08:00
|
|
|
void SysmanDeviceImp::getSysmanDeviceInfo(zes_device_handle_t hDevice, uint32_t &subdeviceId, ze_bool_t &onSubdevice, ze_bool_t useMultiArchEnabled) {
|
2022-01-11 13:40:46 +08:00
|
|
|
NEO::Device *neoDevice = Device::fromHandle(hDevice)->getNEODevice();
|
2022-11-28 19:55:07 +08:00
|
|
|
onSubdevice = false;
|
|
|
|
|
|
|
|
// Check for root device with 1 sub-device case
|
|
|
|
if (!neoDevice->isSubDevice() && neoDevice->getDeviceBitfield().count() == 1) {
|
2022-01-11 13:40:46 +08:00
|
|
|
subdeviceId = Math::log2(static_cast<uint32_t>(neoDevice->getDeviceBitfield().to_ulong()));
|
2022-11-28 19:55:07 +08:00
|
|
|
if ((NEO::GfxCoreHelper::getSubDevicesCount(&neoDevice->getHardwareInfo()) > 1) && useMultiArchEnabled) {
|
|
|
|
onSubdevice = true;
|
|
|
|
}
|
|
|
|
} else if (neoDevice->isSubDevice()) {
|
2022-01-11 13:40:46 +08:00
|
|
|
subdeviceId = static_cast<NEO::SubDevice *>(neoDevice)->getSubDeviceIndex();
|
2022-11-28 19:55:07 +08:00
|
|
|
onSubdevice = true;
|
2022-01-11 13:40:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-23 16:50:53 +08:00
|
|
|
PRODUCT_FAMILY SysmanDeviceImp::getProductFamily(Device *pDevice) {
|
|
|
|
return pDevice->getNEODevice()->getHardwareInfo().platform.eProductFamily;
|
|
|
|
}
|
|
|
|
|
2021-10-11 23:34:03 +08:00
|
|
|
ze_result_t SysmanDeviceImp::init() {
|
|
|
|
// We received a device handle. Check for subdevices in this device
|
|
|
|
updateSubDeviceHandlesLocally();
|
2020-09-10 13:24:55 +08:00
|
|
|
|
2021-09-15 19:50:49 +08:00
|
|
|
auto result = pOsSysman->init();
|
|
|
|
return result;
|
2020-07-03 22:35:35 +08:00
|
|
|
}
|
|
|
|
|
2020-07-24 19:09:09 +08:00
|
|
|
ze_result_t SysmanDeviceImp::frequencyGet(uint32_t *pCount, zes_freq_handle_t *phFrequency) {
|
|
|
|
return pFrequencyHandleContext->frequencyGet(pCount, phFrequency);
|
|
|
|
}
|
|
|
|
|
2020-07-26 02:23:21 +08:00
|
|
|
ze_result_t SysmanDeviceImp::deviceGetProperties(zes_device_properties_t *pProperties) {
|
|
|
|
return pGlobalOperations->deviceGetProperties(pProperties);
|
|
|
|
}
|
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::processesGetState(uint32_t *pCount, zes_process_state_t *pProcesses) {
|
|
|
|
return pGlobalOperations->processesGetState(pCount, pProcesses);
|
|
|
|
}
|
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::deviceReset(ze_bool_t force) {
|
|
|
|
return pGlobalOperations->reset(force);
|
|
|
|
}
|
|
|
|
|
2020-10-09 13:34:35 +08:00
|
|
|
ze_result_t SysmanDeviceImp::deviceEventRegister(zes_event_type_flags_t events) {
|
|
|
|
return pEvents->eventRegister(events);
|
|
|
|
}
|
|
|
|
|
2023-02-17 00:16:31 +08:00
|
|
|
OsSysman *SysmanDeviceImp::deviceGetOsInterface() {
|
|
|
|
return pOsSysman;
|
|
|
|
}
|
|
|
|
|
2021-04-05 12:08:22 +08:00
|
|
|
bool SysmanDeviceImp::deviceEventListen(zes_event_type_flags_t &pEvent, uint64_t timeout) {
|
2020-11-06 10:23:38 +08:00
|
|
|
return pEvents->eventListen(pEvent, timeout);
|
2020-10-09 13:34:35 +08:00
|
|
|
}
|
|
|
|
|
2020-07-26 02:23:21 +08:00
|
|
|
ze_result_t SysmanDeviceImp::deviceGetState(zes_device_state_t *pState) {
|
2020-10-07 15:37:58 +08:00
|
|
|
return pGlobalOperations->deviceGetState(pState);
|
2020-07-26 02:23:21 +08:00
|
|
|
}
|
|
|
|
|
2020-07-23 09:34:28 +08:00
|
|
|
ze_result_t SysmanDeviceImp::pciGetProperties(zes_pci_properties_t *pProperties) {
|
|
|
|
return pPci->pciStaticProperties(pProperties);
|
|
|
|
}
|
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::pciGetState(zes_pci_state_t *pState) {
|
2020-08-14 16:19:58 +08:00
|
|
|
return pPci->pciGetState(pState);
|
2020-07-23 09:34:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::pciGetBars(uint32_t *pCount, zes_pci_bar_properties_t *pProperties) {
|
|
|
|
return pPci->pciGetInitializedBars(pCount, pProperties);
|
|
|
|
}
|
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::pciGetStats(zes_pci_stats_t *pStats) {
|
|
|
|
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
|
|
|
|
}
|
|
|
|
|
2022-04-05 20:29:27 +08:00
|
|
|
ze_result_t SysmanDeviceImp::powerGetCardDomain(zes_pwr_handle_t *phPower) {
|
|
|
|
return pPowerHandleContext->powerGetCardDomain(phPower);
|
|
|
|
}
|
|
|
|
|
2020-07-29 17:45:54 +08:00
|
|
|
ze_result_t SysmanDeviceImp::powerGet(uint32_t *pCount, zes_pwr_handle_t *phPower) {
|
|
|
|
return pPowerHandleContext->powerGet(pCount, phPower);
|
2020-03-06 18:09:57 +08:00
|
|
|
}
|
|
|
|
|
2020-07-30 20:31:57 +08:00
|
|
|
ze_result_t SysmanDeviceImp::engineGet(uint32_t *pCount, zes_engine_handle_t *phEngine) {
|
|
|
|
return pEngineHandleContext->engineGet(pCount, phEngine);
|
|
|
|
}
|
|
|
|
|
2020-07-15 02:36:12 +08:00
|
|
|
ze_result_t SysmanDeviceImp::standbyGet(uint32_t *pCount, zes_standby_handle_t *phStandby) {
|
|
|
|
return pStandbyHandleContext->standbyGet(pCount, phStandby);
|
|
|
|
}
|
|
|
|
|
2020-07-21 04:06:42 +08:00
|
|
|
ze_result_t SysmanDeviceImp::fabricPortGet(uint32_t *pCount, zes_fabric_port_handle_t *phPort) {
|
|
|
|
return pFabricPortHandleContext->fabricPortGet(pCount, phPort);
|
|
|
|
}
|
|
|
|
|
2020-07-29 18:58:08 +08:00
|
|
|
ze_result_t SysmanDeviceImp::temperatureGet(uint32_t *pCount, zes_temp_handle_t *phTemperature) {
|
|
|
|
return pTempHandleContext->temperatureGet(pCount, phTemperature);
|
|
|
|
}
|
|
|
|
|
2020-07-31 18:34:29 +08:00
|
|
|
ze_result_t SysmanDeviceImp::schedulerGet(uint32_t *pCount, zes_sched_handle_t *phScheduler) {
|
|
|
|
return pSchedulerHandleContext->schedulerGet(pCount, phScheduler);
|
|
|
|
}
|
|
|
|
|
2020-08-05 03:22:42 +08:00
|
|
|
ze_result_t SysmanDeviceImp::rasGet(uint32_t *pCount, zes_ras_handle_t *phRas) {
|
|
|
|
return pRasHandleContext->rasGet(pCount, phRas);
|
|
|
|
}
|
|
|
|
|
2020-08-13 18:34:11 +08:00
|
|
|
ze_result_t SysmanDeviceImp::firmwareGet(uint32_t *pCount, zes_firmware_handle_t *phFirmware) {
|
|
|
|
return pFirmwareHandleContext->firmwareGet(pCount, phFirmware);
|
|
|
|
}
|
|
|
|
|
2021-03-10 14:57:01 +08:00
|
|
|
ze_result_t SysmanDeviceImp::diagnosticsGet(uint32_t *pCount, zes_diag_handle_t *phDiagnostics) {
|
|
|
|
return pDiagnosticsHandleContext->diagnosticsGet(pCount, phDiagnostics);
|
|
|
|
}
|
|
|
|
|
2020-08-07 10:27:43 +08:00
|
|
|
ze_result_t SysmanDeviceImp::memoryGet(uint32_t *pCount, zes_mem_handle_t *phMemory) {
|
|
|
|
return pMemoryHandleContext->memoryGet(pCount, phMemory);
|
|
|
|
}
|
2020-08-15 09:30:53 +08:00
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::fanGet(uint32_t *pCount, zes_fan_handle_t *phFan) {
|
|
|
|
return pFanHandleContext->fanGet(pCount, phFan);
|
|
|
|
}
|
2020-12-28 12:25:52 +08:00
|
|
|
|
|
|
|
ze_result_t SysmanDeviceImp::performanceGet(uint32_t *pCount, zes_perf_handle_t *phPerformance) {
|
|
|
|
return pPerformanceHandleContext->performanceGet(pCount, phPerformance);
|
|
|
|
}
|
|
|
|
|
2022-04-12 19:45:58 +08:00
|
|
|
ze_result_t SysmanDeviceImp::deviceEccAvailable(ze_bool_t *pAvailable) {
|
|
|
|
return pEcc->deviceEccAvailable(pAvailable);
|
|
|
|
}
|
|
|
|
ze_result_t SysmanDeviceImp::deviceEccConfigurable(ze_bool_t *pConfigurable) {
|
|
|
|
return pEcc->deviceEccConfigurable(pConfigurable);
|
|
|
|
}
|
|
|
|
ze_result_t SysmanDeviceImp::deviceGetEccState(zes_device_ecc_properties_t *pState) {
|
|
|
|
return pEcc->getEccState(pState);
|
|
|
|
}
|
|
|
|
ze_result_t SysmanDeviceImp::deviceSetEccState(const zes_device_ecc_desc_t *newState, zes_device_ecc_properties_t *pState) {
|
|
|
|
return pEcc->setEccState(newState, pState);
|
|
|
|
}
|
|
|
|
|
2020-03-06 18:09:57 +08:00
|
|
|
} // namespace L0
|