@@ -1392,6 +1392,12 @@ static rsmi_status_t get_od_clk_volt_info(uint32_t dv_ind,
13921392 return RSMI_STATUS_INVALID_ARGS;
13931393 }
13941394
1395+ // fill out rsmi_od_volt_freq_data_t p with default max values to indicate no valid data
1396+ p->curr_sclk_range .lower_bound = UINT64_MAX;
1397+ p->curr_sclk_range .upper_bound = UINT64_MAX;
1398+ p->curr_mclk_range .lower_bound = UINT64_MAX;
1399+ p->curr_mclk_range .upper_bound = UINT64_MAX;
1400+
13951401 ret = GetDevValueVec (amd::smi::kDevPowerODVoltage , dv_ind, &val_vec);
13961402 if (ret != RSMI_STATUS_SUCCESS) {
13971403 return ret;
@@ -1419,13 +1425,6 @@ static rsmi_status_t get_od_clk_volt_info(uint32_t dv_ind,
14191425 .set_key_data_splitter (" :" , amd::smi::TagSplitterPositional_t::kBETWEEN )
14201426 .structure_content ();
14211427
1422- //
1423- // Note: We must have minimum of 'GFXCLK:' && 'MCLK:' OR:
1424- // 'OD_SCLK:' && 'OD_MCLK:' tags.
1425- if (txt_power_dev_od_voltage.get_title_size () < kMIN_VALID_LINES ) {
1426- return rsmi_status_t ::RSMI_STATUS_NO_DATA;
1427- }
1428-
14291428 // Note: For debug builds/purposes only.
14301429 assert (txt_power_dev_od_voltage.contains_title_key (kTAG_GFXCLK ) ||
14311430 txt_power_dev_od_voltage.contains_title_key (kTAG_OD_SCLK ));
@@ -1446,47 +1445,60 @@ static rsmi_status_t get_od_clk_volt_info(uint32_t dv_ind,
14461445 return std::vector<std::string>{upper_bound_data};
14471446 };
14481447
1449- // Validates 'OD_SCLK' is in the structure
1450- if (txt_power_dev_od_voltage.contains_structured_key (kTAG_OD_SCLK ,
1448+ // track the number of keys found, if this goes down to 0 then that means that there is no valid data
1449+ const uint8_t kNumStructuredKeysToCheck = 6 ;
1450+ uint8_t structured_key_counter = kNumStructuredKeysToCheck ;
1451+ // Validates 'OD_SCLK' is in the structure
1452+ if (txt_power_dev_od_voltage.contains_structured_key (kTAG_OD_SCLK ,
14511453 KTAG_FIRST_FREQ_IDX)) {
14521454 p->curr_sclk_range .lower_bound = freq_string_to_int (build_lower_bound (kTAG_OD_SCLK ), nullptr , nullptr , 0 );
14531455 p->curr_sclk_range .upper_bound = freq_string_to_int (build_upper_bound (kTAG_OD_SCLK ), nullptr , nullptr , 0 );
1454-
1456+ }
1457+ else
1458+ structured_key_counter--;
14551459 // Validates 'OD_MCLK' is in the structure
1456- if (txt_power_dev_od_voltage.contains_structured_key (KTAG_OD_MCLK,
1457- KTAG_FIRST_FREQ_IDX)) {
1458- p->curr_mclk_range .lower_bound = freq_string_to_int (build_lower_bound (KTAG_OD_MCLK), nullptr , nullptr , 0 );
1459- p->curr_mclk_range .upper_bound = freq_string_to_int (build_upper_bound (KTAG_OD_MCLK), nullptr , nullptr , 0 );
1460- }
1460+ if (txt_power_dev_od_voltage.contains_structured_key (KTAG_OD_MCLK,
1461+ KTAG_FIRST_FREQ_IDX)) {
1462+ p->curr_mclk_range .lower_bound = freq_string_to_int (build_lower_bound (KTAG_OD_MCLK), nullptr , nullptr , 0 );
1463+ p->curr_mclk_range .upper_bound = freq_string_to_int (build_upper_bound (KTAG_OD_MCLK), nullptr , nullptr , 0 );
1464+ }
1465+ else
1466+ structured_key_counter--;
14611467
1462- // Validates 'OD_RANGE' is in the structure
1463- if (txt_power_dev_od_voltage.contains_structured_key (KTAG_OD_RANGE,
1464- KTAG_SCLK)) {
1465- od_value_pair_str_to_range (txt_power_dev_od_voltage
1466- .get_structured_value_by_keys (KTAG_OD_RANGE, KTAG_SCLK),
1467- &p->sclk_freq_limits );
1468- }
1469- if (txt_power_dev_od_voltage.contains_structured_key (KTAG_OD_RANGE,
1470- KTAG_MCLK)) {
1471- od_value_pair_str_to_range (txt_power_dev_od_voltage
1472- .get_structured_value_by_keys (KTAG_OD_RANGE, KTAG_MCLK),
1473- &p->mclk_freq_limits );
1474- }
1475- }
1476- // Validates 'GFXCLK' is in the structure
1477- else if (txt_power_dev_od_voltage.contains_structured_key (kTAG_GFXCLK ,
1478- KTAG_FIRST_FREQ_IDX)) {
1479- p->curr_sclk_range .lower_bound = freq_string_to_int (build_lower_bound (kTAG_GFXCLK ), nullptr , nullptr , 0 );
1480- p->curr_sclk_range .upper_bound = freq_string_to_int (build_upper_bound (kTAG_GFXCLK ), nullptr , nullptr , 0 );
1481-
1482- // Validates 'MCLK' is in the structure
1483- if (txt_power_dev_od_voltage.contains_structured_key (KTAG_MCLK,
1484- KTAG_FIRST_FREQ_IDX)) {
1485- p->curr_mclk_range .lower_bound = freq_string_to_int (build_lower_bound (KTAG_MCLK), nullptr , nullptr , 0 );
1486- p->curr_mclk_range .upper_bound = freq_string_to_int (build_upper_bound (KTAG_MCLK), nullptr , nullptr , 0 );
1487- }
1488- }
1489- else {
1468+ // Validates 'OD_RANGE' is in the structure
1469+ if (txt_power_dev_od_voltage.contains_structured_key (KTAG_OD_RANGE,
1470+ KTAG_SCLK)) {
1471+ od_value_pair_str_to_range (txt_power_dev_od_voltage
1472+ .get_structured_value_by_keys (KTAG_OD_RANGE, KTAG_SCLK),
1473+ &p->sclk_freq_limits );
1474+ }
1475+ else
1476+ structured_key_counter--;
1477+ if (txt_power_dev_od_voltage.contains_structured_key (KTAG_OD_RANGE,
1478+ KTAG_MCLK)) {
1479+ od_value_pair_str_to_range (txt_power_dev_od_voltage
1480+ .get_structured_value_by_keys (KTAG_OD_RANGE, KTAG_MCLK),
1481+ &p->mclk_freq_limits );
1482+ }
1483+ else
1484+ structured_key_counter--;
1485+ // Validates 'GFXCLK' is in the structure
1486+ if (txt_power_dev_od_voltage.contains_structured_key (kTAG_GFXCLK ,
1487+ KTAG_FIRST_FREQ_IDX)) {
1488+ p->curr_sclk_range .lower_bound = freq_string_to_int (build_lower_bound (kTAG_GFXCLK ), nullptr , nullptr , 0 );
1489+ p->curr_sclk_range .upper_bound = freq_string_to_int (build_upper_bound (kTAG_GFXCLK ), nullptr , nullptr , 0 );
1490+ }
1491+ else
1492+ structured_key_counter--;
1493+ // Validates 'MCLK' is in the structure
1494+ if (txt_power_dev_od_voltage.contains_structured_key (KTAG_MCLK,
1495+ KTAG_FIRST_FREQ_IDX)) {
1496+ p->curr_mclk_range .lower_bound = freq_string_to_int (build_lower_bound (KTAG_MCLK), nullptr , nullptr , 0 );
1497+ p->curr_mclk_range .upper_bound = freq_string_to_int (build_upper_bound (KTAG_MCLK), nullptr , nullptr , 0 );
1498+ }
1499+ else
1500+ structured_key_counter--;
1501+ if (structured_key_counter == 0 ) {
14901502 return RSMI_STATUS_NOT_YET_IMPLEMENTED;
14911503 }
14921504
0 commit comments