mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
drm/amdkfd: split out mes queue reset sequence into standalone function
No intended functional change. Reviewed-by: Amber Lin <Amber.Lin@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
b5ded03135
commit
7b806702e0
|
|
@ -407,6 +407,32 @@ static int add_all_kfd_queues_mes(struct device_queue_manager *dqm)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int reset_queue_mes(struct device_queue_manager *dqm, struct queue *q,
|
||||
int queue_type, int pipe, int queue, unsigned int db)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
|
||||
struct kfd_process_device *pdd;
|
||||
bool use_mmio = false;
|
||||
int r;
|
||||
|
||||
pdd = kfd_get_process_device_data(q->device, q->process);
|
||||
if (!pdd)
|
||||
return -ENODEV;
|
||||
|
||||
if (use_mmio)
|
||||
r = amdgpu_mes_reset_queue_mmio(adev, queue_type, 0, 1, pipe, queue,
|
||||
ffs(dqm->dev->xcc_mask) - 1);
|
||||
else
|
||||
r = amdgpu_mes_reset_user_queue(adev, queue_type, db,
|
||||
ffs(dqm->dev->xcc_mask) - 1);
|
||||
if (r)
|
||||
return r;
|
||||
/* Proceed remove_queue with reset=true */
|
||||
remove_queue_mes_on_reset_option(dqm, q, &pdd->qpd, true, false);
|
||||
set_queue_as_reset(dqm, q, &pdd->qpd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int reset_queues_mes(struct device_queue_manager *dqm)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
|
||||
|
|
@ -414,7 +440,6 @@ static int reset_queues_mes(struct device_queue_manager *dqm)
|
|||
int num_hung = 0, r = 0, i, pipe, queue, queue_type;
|
||||
u32 *hung_array = dqm->hung_db_array;
|
||||
struct amdgpu_mes_hung_queue_hqd_info *hqd_info = dqm->hqd_info;
|
||||
struct kfd_process_device *pdd;
|
||||
struct queue *q;
|
||||
|
||||
if (!amdgpu_mes_queue_reset_by_mes_supported(adev)) {
|
||||
|
|
@ -468,24 +493,13 @@ static int reset_queues_mes(struct device_queue_manager *dqm)
|
|||
|
||||
q = find_queue_by_doorbell_offset(dqm, hung_array[i]);
|
||||
/* skip queues not owned by KFD */
|
||||
if (!q)
|
||||
if (!q) {
|
||||
continue;
|
||||
|
||||
pdd = kfd_get_process_device_data(q->device, q->process);
|
||||
if (!pdd) {
|
||||
r = -ENODEV;
|
||||
goto fail;
|
||||
} else {
|
||||
r = reset_queue_mes(dqm, q, queue_type, pipe, queue, hung_array[i]);
|
||||
if (r)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
pr_warn("Hang detected doorbell %x pipe %d queue %d type %d\n",
|
||||
hung_array[i], pipe, queue, queue_type);
|
||||
r = amdgpu_mes_reset_user_queue(adev, queue_type, hung_array[i],
|
||||
ffs(dqm->dev->xcc_mask) - 1);
|
||||
if (r)
|
||||
goto fail;
|
||||
/* Proceed remove_queue with reset=true */
|
||||
remove_queue_mes_on_reset_option(dqm, q, &pdd->qpd, true, false);
|
||||
set_queue_as_reset(dqm, q, &pdd->qpd);
|
||||
}
|
||||
|
||||
dqm->detect_hang_count = num_hung;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user