[SWDEV-412505] Handle mclk permission errors as not supported

Signed-off-by: adapryor <Adam.pryor@amd.com>
Change-Id: I25c9af42ed62697f87c70ecaeb153abe53401091


[ROCm/rocm_smi_lib commit: 61ed9e13f4]
This commit is contained in:
adapryor
2024-10-31 12:27:04 -05:00
committed by Adam Pryor
orang tua d41fbc88ca
melakukan 4e399dc383
3 mengubah file dengan 33 tambahan dan 3 penghapusan
@@ -82,6 +82,7 @@ int SameFile(const std::string fileA, const std::string fileB);
bool FileExists(char const *filename);
std::vector<std::string> globFilesExist(const std::string& filePattern);
int isRegularFile(std::string fname, bool *is_reg);
int isReadOnlyForAll(const std::string& fname, bool *is_read_only);
int ReadSysfsStr(std::string path, std::string *retStr);
int WriteSysfsStr(std::string path, std::string val);
bool IsInteger(const std::string & n_str);
+14 -3
Melihat File
@@ -1873,7 +1873,7 @@ rsmi_dev_gpu_clk_freq_set(uint32_t dv_ind,
return ret;
}
int ret_i;
rsmi_status_t status;
amd::smi::DevInfoTypes dev_type;
const auto & clk_type_it = kClkTypeMap.find(clk_type);
@@ -1883,8 +1883,19 @@ rsmi_dev_gpu_clk_freq_set(uint32_t dv_ind,
return RSMI_STATUS_INVALID_ARGS;
}
ret_i = dev->writeDevInfo(dev_type, freq_enable_str);
return amd::smi::ErrnoToRsmiStatus(ret_i);
status = amd::smi::ErrnoToRsmiStatus(dev->writeDevInfo(dev_type, freq_enable_str));
// If an operation is not supported, the dev file, ie /sys/class/drm/card1/device/pp_dpm_pcie
// will have read-only perms, and the OS will deny access, before the request hits the driver level
if (status == RSMI_STATUS_PERMISSION){
bool read_only = false;
int perms = amd::smi::isReadOnlyForAll(dev->path(), &read_only);
if(read_only){
return RSMI_STATUS_NOT_SUPPORTED;
}
}
return status;
CATCH
}
@@ -172,6 +172,24 @@ int isRegularFile(std::string fname, bool *is_reg) {
return 0;
}
int isReadOnlyForAll(const std::string& fname, bool *is_read_only){
struct stat file_stat;
int ret;
ret = stat(fname.c_str(), &file_stat);
if (ret) {
return errno;
}
if (is_read_only != nullptr) {
*is_read_only = (file_stat.st_mode & (S_IRUSR | S_IRGRP | S_IROTH)) && !(file_stat.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH));
} else {
ret = 1;
}
return ret;
}
int WriteSysfsStr(std::string path, std::string val) {
// On success, zero is returned. On error, -1 is returned, and
// errno is set to indicate the error.