[SWDEV-437365] Fix --showpower

Updates:
  - [CLI] Switching to use generic rsmi_dev_power_get()
  this is a backwards compatible function to
  retrieve power values. More consistent than
  previous fixes.
  - [API] Update API for rsmi_dev_power_get()
  Now provides @depricated for this function.
  Providing notes on newer ASICS only support
  current socket power, where as previous
  ASICS only provided average power.

Change-Id: I34da0e925cf0b6c669bdd801b017f33f3b3ee86a
Signed-off-by: Charis Poag <Charis.Poag@amd.com>


[ROCm/rocm_smi_lib commit: 51aec98edd]
Этот коммит содержится в:
Charis Poag
2024-02-02 00:00:38 -06:00
родитель 443d034d36
Коммит 2e3cc74c79
3 изменённых файлов: 64 добавлений и 38 удалений
+9 -1
Просмотреть файл
@@ -1818,6 +1818,11 @@ rsmi_status_t rsmi_dev_pci_bandwidth_set(uint32_t dv_ind, uint64_t bw_bitmask);
* @p power, this function will write the current average power consumption
* (in microwatts) to the uint64_t pointed to by @p power.
*
* @deprecated ::rsmi_dev_power_get() is preferred due to providing
* backwards compatibility, which looks at both average and current power
* values. Whereas ::rsmi_dev_power_ave_get only looks for average power
* consumption. Newer ASICs will support current power only.
*
* @param[in] dv_ind a device index
*
* @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.
@@ -1886,7 +1891,10 @@ rsmi_dev_current_socket_power_get(uint32_t dv_ind, uint64_t *socket_power);
* @param[inout] type a pointer to RSMI_POWER_TYPE object. Returns the type
* of power retrieved from the device. Current power is ::RSMI_CURRENT_POWER
* and average power is ::RSMI_AVERAGE_POWER. If an error occurs,
* returns an invalid power type ::RSMI_INVALID_POWER.
* returns an invalid power type ::RSMI_INVALID_POWER - example device
* neither supports average power or current power.
* If this parameter is nullptr, this function will return
* ::RSMI_STATUS_INVALID_ARGS.
*
* @retval ::RSMI_STATUS_SUCCESS call was successful
* @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not
+45 -37
Просмотреть файл
@@ -387,32 +387,40 @@ def getPidList():
return
def getAvgPower(device, silent=False):
""" Return the average power level of a given device
def getPower(device):
""" Return dictionary of power responses.
@param device: DRM device identifier
@param silent=Turn on to silence error output
(you plan to handle manually). Default is off.
"""
power = c_uint32()
ret = rocmsmi.rsmi_dev_power_ave_get(device, 0, byref(power))
if rsmi_ret_ok(ret, device, 'get_power_avg', silent):
return str(power.value / 1000000)
return 'N/A'
def getCurrentSocketPower(device, silent=False):
""" Return the current (also known as instant)
socket power of a given device
Response power dictionary:
{
'power': string wattage response or 'N/A' (for not RSMI_STATUS_SUCCESS),
'power_type': power type string - 'Current Socket' or 'Average',
'unit': W (Watt)
'ret': response of rsmi_dev_power_get(device, byref(power), byref(power_type))
}
@param device: DRM device identifier
@param silent=Turn on to silence error output
(you plan to handle manually). Default is off.
"""
power = c_uint32()
ret = rocmsmi.rsmi_dev_current_socket_power_get(device, byref(power))
if rsmi_ret_ok(ret, device, 'get_socket_power', silent):
return str(power.value / 1000000)
return 'N/A'
power = c_int64(0)
power_type = rsmi_power_type_t()
power_ret_dict = {
'power': "N/A",
'power_type': "N/A",
'unit': 'W',
'ret': rsmi_status_t.RSMI_STATUS_NOT_SUPPORTED
}
ret = rocmsmi.rsmi_dev_power_get(device, byref(power), byref(power_type))
if ret == rsmi_status_t.RSMI_STATUS_SUCCESS:
power_ret_dict = {
'power': str(power.value / 1000000),
'power_type': rsmi_power_type_dict[power_type.value],
'unit': 'W',
'ret': ret
}
else:
power_ret_dict['ret'] = ret
return power_ret_dict
def getRasEnablement(device, block, silent=True):
@@ -492,8 +500,9 @@ def getPowerLabel(deviceList):
if len(deviceList) < 1:
return powerLabel
device=deviceList[0]
power = getCurrentSocketPower(device, True)
if power != '0.0' and power != 'N/A':
power_dict = getPower(device)
if (power_dict['ret'] == rsmi_status_t.RSMI_STATUS_SUCCESS and
power_dict['power_type'] == 'CURRENT SOCKET'):
powerLabel = rsmi_power_label.CURRENT_SOCKET_POWER
return powerLabel
@@ -1756,17 +1765,12 @@ def showAllConcise(deviceList):
temp_val = str(getTemp(device, available_temp_type, silent))
if temp_val != 'N/A':
temp_val += degree_sign + 'C'
socketPwr = getCurrentSocketPower(device, True)
avgPwr = getAvgPower(device, True)
power_dict = getPower(device)
powerVal = 'N/A'
if socketPwr != '0.0' and socketPwr != 'N/A':
socketPwr += 'W'
powerVal=socketPwr
elif avgPwr != '0.0' and avgPwr != 'N/A':
avgPwr += 'W'
powerVal=avgPwr
else:
powerVal = 'N/A'
if (power_dict['ret'] == rsmi_status_t.RSMI_STATUS_SUCCESS and
power_dict['power_type'] != 'INVALID_POWER_TYPE'):
if power_dict['power'] != 0:
powerVal = power_dict['power'] + power_dict['unit']
combined_partition = (getMemoryPartition(device, silent) + ", "
+ getComputePartition(device, silent))
sclk = showCurrentClocks([device], 'sclk', concise=silent)
@@ -2469,13 +2473,17 @@ def showPower(deviceList):
secondaryPresent=False
printLogSpacer(' Power Consumption ')
for device in deviceList:
if str(getCurrentSocketPower(device, True)) != 'N/A':
printLog(device, 'Current Socket Graphics Package Power (W)', getCurrentSocketPower(device))
power_dict = getPower(device)
power = 'N/A'
if (power_dict['ret'] == rsmi_status_t.RSMI_STATUS_SUCCESS and
power_dict['power_type'] != 'INVALID_POWER_TYPE'):
power = power_dict['power']
printLog(device, power_dict['power_type'].title() + ' Graphics Package Power ('
+ power_dict['unit'] + ')',
power)
elif checkIfSecondaryDie(device):
printLog(device, 'Average Graphics Package Power (W)', "N/A (Secondary die)")
secondaryPresent=True
elif str(getAvgPower(device)) != '0.0':
printLog(device, 'Average Graphics Package Power (W)', getAvgPower(device))
else:
printErrLog(device, 'Unable to get Average or Current Socket Graphics Package Power Consumption')
if secondaryPresent:
+10
Просмотреть файл
@@ -662,3 +662,13 @@ class rsmi_power_label(str, Enum):
AVG_POWER = '(Avg)'
CURRENT_SOCKET_POWER = '(Socket)'
class rsmi_power_type_t(c_int):
RSMI_AVERAGE_POWER = 0,
RSMI_CURRENT_POWER = 1,
RSMI_INVALID_POWER = 0xFFFFFFFF
rsmi_power_type_dict = {
0: 'AVERAGE',
1: 'CURRENT SOCKET',
0xFFFFFFFF: 'INVALID_POWER_TYPE'
}