Added new clock types

Also added missing error code strings and improved test output
messages


[ROCm/rocm_smi_lib commit: c77f3c0ebd]
This commit is contained in:
Chris Freehill
2019-03-28 17:01:35 -05:00
parent 2b903fceca
commit 93055a1698
9 changed files with 180 additions and 36 deletions
@@ -85,7 +85,7 @@ typedef enum {
RSMI_STATUS_INVALID_ARGS, //!< Passed in arguments are not valid
RSMI_STATUS_NOT_SUPPORTED, //!< The requested information or
//!< action is not available for the
//!< given input
//!< given input, on the given system
RSMI_STATUS_FILE_ERROR, //!< Problem accessing a file. This
//!< may because the operation is not
//!< supported by the Linux kernel
@@ -147,9 +147,16 @@ typedef rsmi_dev_perf_level_t rsmi_dev_perf_level;
typedef enum {
RSMI_CLK_TYPE_SYS = 0x0, //!< System clock
RSMI_CLK_TYPE_FIRST = RSMI_CLK_TYPE_SYS,
RSMI_CLK_TYPE_DF, //!< Data Fabric clock (for ASICs
//!< running on a separate clock)
RSMI_CLK_TYPE_DCEF, //!< Display Controller Engine clock
RSMI_CLK_TYPE_SOC, //!< SOC clock
RSMI_CLK_TYPE_MEM, //!< Memory clock
RSMI_CLK_TYPE_LAST = RSMI_CLK_TYPE_MEM
// Add new clocks to the end (not in the middle) and update
// RSMI_CLK_TYPE_LAST
RSMI_CLK_TYPE_LAST = RSMI_CLK_TYPE_MEM,
RSMI_CLK_INVALID = 0xFFFFFFFF
} rsmi_clk_type_t;
/// \cond Ignore in docs.
typedef rsmi_clk_type_t rsmi_clk_type;
@@ -50,10 +50,11 @@
std::cout << "*****" << __FUNCTION__ << std::endl; \
std::cout << "*****Opening file: " << (FN) << std::endl; \
if ((WR_STR) != nullptr) { \
std::cout << "***** for writing. Writing: \"" << *(WR_STR) << "\""; \
std::cout << "***** for writing. Writing: \"" << (WR_STR) << "\""; \
} else { std::cout << "***** for reading.";} \
std::cout << std::endl; \
std::cout << " at " << __FILE__ << ":" << __LINE__ << std::endl;\
std::cout << " at " << __FILE__ << ":" << std::dec << __LINE__ << \
std::endl;\
}
// Add different debug filters here, as powers of 2; e.g, 1, 2, 4, 8, ...
@@ -65,6 +65,9 @@ enum DevInfoTypes {
kDevSubSysVendorID,
kDevGPUMClk,
kDevGPUSClk,
kDevDCEFClk,
kDevFClk,
kDevSOCClk,
kDevPCIEClk,
kDevPowerProfileMode,
kDevUsage,
@@ -113,7 +116,7 @@ class Device {
uint32_t index_;
const RocmSMI_env_vars *env_;
template <typename T> int openSysfsFileStream(DevInfoTypes type, T *fs,
bool write = false);
const char *str = nullptr);
int readDevInfoStr(DevInfoTypes type, std::string *retStr);
int readDevInfoMultiLineStr(DevInfoTypes type,
+45 -9
View File
@@ -879,16 +879,30 @@ rsmi_status_t
rsmi_dev_gpu_clk_freq_get(uint32_t dv_ind, rsmi_clk_type_t clk_type,
rsmi_frequencies_t *f) {
TRY
amd::smi::DevInfoTypes dev_type;
switch (clk_type) {
case RSMI_CLK_TYPE_SYS:
return get_frequencies(amd::smi::kDevGPUSClk, dv_ind, f);
dev_type = amd::smi::kDevGPUSClk;
break;
case RSMI_CLK_TYPE_MEM:
return get_frequencies(amd::smi::kDevGPUMClk, dv_ind, f);
dev_type = amd::smi::kDevGPUMClk;
break;
case RSMI_CLK_TYPE_DF:
dev_type = amd::smi::kDevFClk;
break;
case RSMI_CLK_TYPE_DCEF:
dev_type = amd::smi::kDevDCEFClk;
break;
case RSMI_CLK_TYPE_SOC:
dev_type = amd::smi::kDevSOCClk;
break;
default:
return RSMI_STATUS_INVALID_ARGS;
}
return get_frequencies(dev_type, dv_ind, f);
CATCH
}
@@ -940,22 +954,30 @@ rsmi_dev_gpu_clk_freq_set(uint32_t dv_ind,
}
int ret_i;
amd::smi::DevInfoTypes dev_type;
switch (clk_type) {
case RSMI_CLK_TYPE_SYS:
ret_i = dev->writeDevInfo(amd::smi::kDevGPUSClk, freq_enable_str);
return errno_to_rsmi_status(ret_i);
dev_type = amd::smi::kDevGPUSClk;
break;
case RSMI_CLK_TYPE_MEM:
ret_i = dev->writeDevInfo(amd::smi::kDevGPUMClk, freq_enable_str);
return errno_to_rsmi_status(ret_i);
dev_type = amd::smi::kDevGPUMClk;
break;
case RSMI_CLK_TYPE_DF:
dev_type = amd::smi::kDevFClk;
break;
case RSMI_CLK_TYPE_SOC:
dev_type = amd::smi::kDevSOCClk;
break;
case RSMI_CLK_TYPE_DCEF:
dev_type = amd::smi::kDevDCEFClk;
break;
default:
return RSMI_STATUS_INVALID_ARGS;
}
return RSMI_STATUS_SUCCESS;
ret_i = dev->writeDevInfo(dev_type, freq_enable_str);
return errno_to_rsmi_status(ret_i);
CATCH
}
@@ -1691,6 +1713,20 @@ rsmi_status_string(rsmi_status_t status, const char **status_string) {
"system for this device type";
break;
case RSMI_STATUS_NOT_FOUND:
*status_string = "An item required to complete the call was not found";
break;
case RSMI_STATUS_INSUFFICIENT_SIZE:
*status_string = "Not enough resources were available to fully execute"
" the call";
break;
case RSMI_STATUS_UNKNOWN_ERROR:
*status_string = "An unknown error prevented the call from completing"
" successfully";
break;
default:
*status_string = "An unknown error occurred";
return RSMI_STATUS_UNKNOWN_ERROR;
+16 -4
View File
@@ -68,6 +68,9 @@ static const char *kDevSubSysVendorIDFName = "subsystem_vendor";
static const char *kDevOverDriveLevelFName = "pp_sclk_od";
static const char *kDevGPUSClkFName = "pp_dpm_sclk";
static const char *kDevGPUMClkFName = "pp_dpm_mclk";
static const char *kDevDCEFClkFName = "pp_dpm_dcefclk";
static const char *kDevFClkFName = "pp_dpm_fclk";
static const char *kDevSOCClkFName = "pp_dpm_socclk";
static const char *kDevGPUPCIEClkFname = "pp_dpm_pcie";
static const char *kDevPowerProfileModeFName = "pp_power_profile_mode";
static const char *kDevPowerODVoltageFName = "pp_od_clk_voltage";
@@ -104,6 +107,9 @@ static const std::map<DevInfoTypes, const char *> kDevAttribNameMap = {
{kDevSubSysVendorID, kDevSubSysVendorIDFName},
{kDevGPUMClk, kDevGPUMClkFName},
{kDevGPUSClk, kDevGPUSClkFName},
{kDevDCEFClk, kDevDCEFClkFName},
{kDevFClk, kDevFClkFName},
{kDevSOCClk, kDevSOCClkFName},
{kDevPCIEClk, kDevGPUPCIEClkFname},
{kDevPowerProfileMode, kDevPowerProfileModeFName},
{kDevUsage, kDevUsageFName},
@@ -152,13 +158,13 @@ Device:: ~Device() {
}
template <typename T>
int Device::openSysfsFileStream(DevInfoTypes type, T *fs, bool write) {
int Device::openSysfsFileStream(DevInfoTypes type, T *fs, const char *str) {
auto sysfs_path = path_;
if (env_->path_DRM_root_override && type == env_->enum_override) {
sysfs_path = env_->path_DRM_root_override;
if (write) {
if (str) {
sysfs_path += ".write";
}
}
@@ -166,7 +172,7 @@ int Device::openSysfsFileStream(DevInfoTypes type, T *fs, bool write) {
sysfs_path += "/device/";
sysfs_path += kDevAttribNameMap.at(type);
DBG_FILE_ERROR(sysfs_path, (std::string *)nullptr);
DBG_FILE_ERROR(sysfs_path, str);
if (!isRegularFile(sysfs_path)) {
return EISDIR;
}
@@ -202,7 +208,7 @@ int Device::writeDevInfoStr(DevInfoTypes type, std::string valStr) {
std::ofstream fs;
int ret;
ret = openSysfsFileStream(type, &fs, true);
ret = openSysfsFileStream(type, &fs, valStr.c_str());
if (ret != 0) {
return ret;
}
@@ -252,9 +258,12 @@ int Device::writeDevInfo(DevInfoTypes type, uint64_t val) {
int Device::writeDevInfo(DevInfoTypes type, std::string val) {
switch (type) {
case kDevGPUMClk:
case kDevDCEFClk:
case kDevFClk:
case kDevGPUSClk:
case kDevPCIEClk:
case kDevPowerODVoltage:
case kDevSOCClk:
return writeDevInfoStr(type, val);
default:
@@ -347,7 +356,10 @@ int Device::readDevInfo(DevInfoTypes type, std::vector<std::string> *val) {
switch (type) {
case kDevGPUMClk:
case kDevGPUSClk:
case kDevDCEFClk:
case kDevFClk:
case kDevPCIEClk:
case kDevSOCClk:
case kDevPowerProfileMode:
case kDevPowerODVoltage:
case kDevErrCntSDMA:
@@ -109,18 +109,33 @@ void TestFrequenciesRead::Run(void) {
TestBase::Run();
for (uint32_t i = 0; i < num_monitor_devs(); ++i) {
auto freq_output = [&](rsmi_clk_type_t t, const char *name) {
err = rsmi_dev_gpu_clk_freq_get(i, t, &f);
if (err == RSMI_STATUS_NOT_SUPPORTED || err == RSMI_STATUS_FILE_ERROR) {
std::cout << "\t**Get " << name << ": Not supported on this machine"
<< std::endl;
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Supported " << name << " clock frequencies: ";
std::cout << f.num_supported << std::endl;
print_frequencies(&f);
}
}
};
PrintDeviceHeader(i);
err = rsmi_dev_gpu_clk_freq_get(i, RSMI_CLK_TYPE_MEM, &f);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Supported GPU Memory clock frequencies: ";
std::cout << f.num_supported << std::endl;
print_frequencies(&f);
}
freq_output(RSMI_CLK_TYPE_MEM, "Supported GPU Memory");
freq_output(RSMI_CLK_TYPE_SYS, "Supported GPU");
freq_output(RSMI_CLK_TYPE_DF, "Data Fabric Clock");
freq_output(RSMI_CLK_TYPE_DCEF, "Display Controller Engine Clock");
freq_output(RSMI_CLK_TYPE_SOC, "SOC Clock");
err = rsmi_dev_pci_bandwidth_get(i, &b);
if (err == RSMI_STATUS_NOT_YET_IMPLEMENTED) {
if (err == RSMI_STATUS_NOT_SUPPORTED || err == RSMI_STATUS_FILE_ERROR) {
std::cout << "\t**Get PCIE Bandwidth: Not supported on this machine"
<< std::endl;
} else {
@@ -131,12 +146,5 @@ void TestFrequenciesRead::Run(void) {
print_frequencies(&b.transfer_rate, b.lanes);
}
}
err = rsmi_dev_gpu_clk_freq_get(i, RSMI_CLK_TYPE_SYS, &f);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Supported GPU clock frequencies: ";
std::cout << f.num_supported << std::endl;
print_frequencies(&f);
}
}
}
@@ -101,9 +101,73 @@ void TestFrequenciesReadWrite::Run(void) {
PrintDeviceHeader(dv_ind);
for (uint32_t clk = (uint32_t)RSMI_CLK_TYPE_FIRST;
clk <= RSMI_CLK_TYPE_LAST; ++clk) {
clk <= RSMI_CLK_TYPE_LAST; ++clk) {
rsmi_clk = (rsmi_clk_type)clk;
auto freq_read = [&]() -> bool {
ret = rsmi_dev_gpu_clk_freq_get(dv_ind, rsmi_clk, &f);
if (ret == RSMI_STATUS_NOT_SUPPORTED ||
ret == RSMI_STATUS_FILE_ERROR) {
std::cout << "\t**Set " << FreqEnumToStr(rsmi_clk) <<
": Not supported on this machine" << std::endl;
return false;
} else {
// CHK_ERR_ASRT(ret)
IF_VERB(STANDARD) {
std::cout << "Initial frequency for clock " <<
FreqEnumToStr(rsmi_clk) << " is " << f.current << std::endl;
}
return true;
}
};
auto freq_write = [&]() {
// Set clocks to something other than the usual default of the lowest
// frequency.
freq_bitmask = 0b01100; // Try the 3rd and 4th clocks
std::string freq_bm_str =
std::bitset<RSMI_MAX_NUM_FREQUENCIES>(freq_bitmask).to_string();
freq_bm_str.erase(0, std::min(freq_bm_str.find_first_not_of('0'),
freq_bm_str.size()-1));
IF_VERB(STANDARD) {
std::cout << "Setting frequency mask for " <<
FreqEnumToStr(rsmi_clk) << " to 0b" << freq_bm_str << " ..." <<
std::endl;
}
ret = rsmi_dev_gpu_clk_freq_set(dv_ind, rsmi_clk, freq_bitmask);
CHK_ERR_ASRT(ret)
ret = rsmi_dev_gpu_clk_freq_get(dv_ind, rsmi_clk, &f);
if (ret != RSMI_STATUS_SUCCESS) {
return;
}
IF_VERB(STANDARD) {
std::cout << "Frequency is now index " << f.current << std::endl;
std::cout << "Resetting mask to all frequencies." << std::endl;
}
ret = rsmi_dev_gpu_clk_freq_set(dv_ind, rsmi_clk, 0xFFFFFFFF);
if (ret != RSMI_STATUS_SUCCESS) {
return;
}
ret = rsmi_dev_perf_level_set(dv_ind, RSMI_DEV_PERF_LEVEL_AUTO);
if (ret != RSMI_STATUS_SUCCESS) {
return;
}
};
if (freq_read()) {
CHK_ERR_ASRT(ret)
} else {
continue;
}
freq_write();
CHK_ERR_ASRT(ret)
#if 0
ret = rsmi_dev_gpu_clk_freq_get(dv_ind, rsmi_clk, &f);
CHK_ERR_ASRT(ret)
@@ -140,6 +204,7 @@ void TestFrequenciesReadWrite::Run(void) {
ret = rsmi_dev_perf_level_set(dv_ind, RSMI_DEV_PERF_LEVEL_AUTO);
CHK_ERR_ASRT(ret)
#endif
}
}
}
@@ -135,7 +135,18 @@ const char *GetBlockNameStr(rsmi_gpu_block_t id) {
return kBlockNameMap.at(id);
}
const char *FreqEnumToStr(rsmi_clk_type rsmi_clk) {
static_assert(RSMI_CLK_TYPE_LAST == RSMI_CLK_TYPE_MEM,
"FreqEnumToStr() needs to be updated");
switch (rsmi_clk) {
case RSMI_CLK_TYPE_SYS: return "System clock";
case RSMI_CLK_TYPE_DF: return "Data Fabric clock";
case RSMI_CLK_TYPE_DCEF: return "Display Controller Engine clock";
case RSMI_CLK_TYPE_SOC: return "SOC clock";
case RSMI_CLK_TYPE_MEM: return "Memory clock";
default: return "Invalid Clock ID";
}
}
#if ENABLE_SMI
void DumpMonitorInfo(const TestBase *test) {
@@ -62,6 +62,7 @@ uint32_t ProcessCmdline(RSMITstGlobals* test, int arg_cnt, char** arg_list);
void PrintTestHeader(uint32_t dv_ind);
const char *GetBlockNameStr(rsmi_gpu_block_t id);
const char *FreqEnumToStr(rsmi_clk_type rsmi_clk);
#if ENABLE_SMI
void DumpMonitorInfo(const TestBase *test);