* devices don't request anymore.
*/
mutex_lock(&hive->hive_lock);
+ if (atomic_read(&hive->requested_nps_mode) ==
+ UNKNOWN_MEMORY_PARTITION_MODE) {
+ dev_dbg(adev->dev, "Unexpected entry for hive NPS change");
+ mutex_unlock(&hive->hive_lock);
+ return 0;
+ }
list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {
r = adev->gmc.gmc_funcs->request_mem_partition_mode(
tmp_adev, req_nps_mode);
if (r)
- goto err;
+ break;
+ }
+ if (r) {
+ /* Request back current mode if one of the requests failed */
+ cur_nps_mode =
+ adev->gmc.gmc_funcs->query_mem_partition_mode(tmp_adev);
+ list_for_each_entry_continue_reverse(
+ tmp_adev, &hive->device_list, gmc.xgmi.head)
+ adev->gmc.gmc_funcs->request_mem_partition_mode(
+ tmp_adev, cur_nps_mode);
}
/* Set to UNKNOWN so that other devices don't request anymore */
atomic_set(&hive->requested_nps_mode, UNKNOWN_MEMORY_PARTITION_MODE);
-
mutex_unlock(&hive->hive_lock);
- return 0;
-err:
- /* Request back current mode if one of the requests failed */
- cur_nps_mode = adev->gmc.gmc_funcs->query_mem_partition_mode(tmp_adev);
- list_for_each_entry_continue_reverse(tmp_adev, &hive->device_list,
- gmc.xgmi.head)
- adev->gmc.gmc_funcs->request_mem_partition_mode(tmp_adev,
- cur_nps_mode);
- mutex_lock(&hive->hive_lock);
-
return r;
}