void kgd2kfd_unlock_kfd(struct kfd_dev *kfd);
int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id);
int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd);
+int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev);
int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id);
int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd);
+int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev);
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id);
bool kgd2kfd_vmfault_fast_path(struct amdgpu_device *adev, struct amdgpu_iv_entry *entry,
bool retry_fault);
return 0;
}
+static inline int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev)
+{
+ return 0;
+}
+
static inline int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
{
return 0;
return 0;
}
+static inline int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev)
+{
+ return 0;
+}
+
static inline bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
{
return false;
}
}
- /* Wait for GFX engine idle before PTL state transition */
if (req_code == PSP_PTL_PERF_MON_SET) {
+ amdgpu_amdkfd_stop_sched_all(adev);
+ /* Wait for GFX engine idle before PTL state transition */
ret = amdgpu_device_ip_wait_for_idle(adev,
AMD_IP_BLOCK_TYPE_GFX);
if (ret) {
+ amdgpu_amdkfd_start_sched_all(adev);
dev_err(adev->dev, "GFX not idle before PTL operation (%d)\n", ret);
return ret;
}
+ ret = psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
+ amdgpu_amdkfd_start_sched_all(adev);
+ } else {
+ ret = psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
}
- return psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
+ return ret;
}
static enum amdgpu_ptl_fmt str_to_ptl_fmt(const char *str)
if (!pdd->dev->kfd2kgd || !pdd->dev->kfd2kgd->ptl_ctrl)
return -EOPNOTSUPP;
- if (adev->kfd.init_complete)
- amdgpu_amdkfd_stop_sched(adev, pdd->dev->node_id);
-
ret = pdd->dev->kfd2kgd->ptl_ctrl(adev, PSP_PTL_PERF_MON_SET,
&ptl_state,
&pref_format1,
&pref_format2);
- if (adev->kfd.init_complete)
- amdgpu_amdkfd_start_sched(adev, pdd->dev->node_id);
-
return ret;
}
return 0;
}
+int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev)
+{
+ if (!adev->kfd.init_complete)
+ return 0;
+
+ return kgd2kfd_stop_sched_all_nodes(adev->kfd.dev);
+}
+
+int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev)
+{
+ if (!adev->kfd.init_complete)
+ return 0;
+
+ return kgd2kfd_start_sched_all_nodes(adev->kfd.dev);
+}
+
bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
{
struct kfd_node *node;