Skip to content

Commit 8d35a25

Browse files
Likun Gaoalexdeucher
authored andcommitted
drm/amdgpu: adjust fence driver enable sequence
Fence driver was enabled per ring when sw init on per IP block before. Change to enable all the fence driver at the same time after amdgpu_device_ip_init finished. Rename some function related to fence to make it reasonable for read. Signed-off-by: Likun Gao <[email protected]> Reviewed-by: Hawking Zhang <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent edc8c81 commit 8d35a25

File tree

3 files changed

+14
-47
lines changed

3 files changed

+14
-47
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3675,6 +3675,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,
36753675
goto release_ras_con;
36763676
}
36773677

3678+
amdgpu_fence_driver_hw_init(adev);
3679+
36783680
dev_info(adev->dev,
36793681
"SE %d, SH per SE %d, CU per SH %d, active_cu_number %d\n",
36803682
adev->gfx.config.max_shader_engines,
@@ -3842,7 +3844,7 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
38423844
else
38433845
drm_atomic_helper_shutdown(adev_to_drm(adev));
38443846
}
3845-
amdgpu_fence_driver_fini_hw(adev);
3847+
amdgpu_fence_driver_hw_fini(adev);
38463848

38473849
if (adev->pm_sysfs_en)
38483850
amdgpu_pm_sysfs_fini(adev);
@@ -3864,7 +3866,7 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
38643866
void amdgpu_device_fini_sw(struct amdgpu_device *adev)
38653867
{
38663868
amdgpu_device_ip_fini(adev);
3867-
amdgpu_fence_driver_fini_sw(adev);
3869+
amdgpu_fence_driver_sw_fini(adev);
38683870
release_firmware(adev->firmware.gpu_info_fw);
38693871
adev->firmware.gpu_info_fw = NULL;
38703872
adev->accel_working = false;
@@ -3939,7 +3941,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
39393941
/* evict vram memory */
39403942
amdgpu_bo_evict_vram(adev);
39413943

3942-
amdgpu_fence_driver_suspend(adev);
3944+
amdgpu_fence_driver_hw_fini(adev);
39433945

39443946
amdgpu_device_ip_suspend_phase2(adev);
39453947
/* evict remaining vram memory
@@ -3984,7 +3986,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
39843986
dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r);
39853987
return r;
39863988
}
3987-
amdgpu_fence_driver_resume(adev);
3989+
amdgpu_fence_driver_hw_init(adev);
39883990

39893991

39903992
r = amdgpu_device_ip_late_init(adev);

drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -417,9 +417,6 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
417417
}
418418
amdgpu_fence_write(ring, atomic_read(&ring->fence_drv.last_seq));
419419

420-
if (irq_src)
421-
amdgpu_irq_get(adev, irq_src, irq_type);
422-
423420
ring->fence_drv.irq_src = irq_src;
424421
ring->fence_drv.irq_type = irq_type;
425422
ring->fence_drv.initialized = true;
@@ -525,7 +522,7 @@ int amdgpu_fence_driver_init(struct amdgpu_device *adev)
525522
*
526523
* Tear down the fence driver for all possible rings (all asics).
527524
*/
528-
void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev)
525+
void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)
529526
{
530527
int i, r;
531528

@@ -553,7 +550,7 @@ void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev)
553550
}
554551
}
555552

556-
void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev)
553+
void amdgpu_fence_driver_sw_fini(struct amdgpu_device *adev)
557554
{
558555
unsigned int i, j;
559556

@@ -572,49 +569,18 @@ void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev)
572569
}
573570

574571
/**
575-
* amdgpu_fence_driver_suspend - suspend the fence driver
576-
* for all possible rings.
577-
*
578-
* @adev: amdgpu device pointer
579-
*
580-
* Suspend the fence driver for all possible rings (all asics).
581-
*/
582-
void amdgpu_fence_driver_suspend(struct amdgpu_device *adev)
583-
{
584-
int i, r;
585-
586-
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
587-
struct amdgpu_ring *ring = adev->rings[i];
588-
if (!ring || !ring->fence_drv.initialized)
589-
continue;
590-
591-
/* wait for gpu to finish processing current batch */
592-
r = amdgpu_fence_wait_empty(ring);
593-
if (r) {
594-
/* delay GPU reset to resume */
595-
amdgpu_fence_driver_force_completion(ring);
596-
}
597-
598-
/* disable the interrupt */
599-
if (ring->fence_drv.irq_src)
600-
amdgpu_irq_put(adev, ring->fence_drv.irq_src,
601-
ring->fence_drv.irq_type);
602-
}
603-
}
604-
605-
/**
606-
* amdgpu_fence_driver_resume - resume the fence driver
572+
* amdgpu_fence_driver_hw_init - enable the fence driver
607573
* for all possible rings.
608574
*
609575
* @adev: amdgpu device pointer
610576
*
611-
* Resume the fence driver for all possible rings (all asics).
577+
* Enable the fence driver for all possible rings (all asics).
612578
* Not all asics have all rings, so each asic will only
613579
* start the fence driver on the rings it has using
614580
* amdgpu_fence_driver_start_ring().
615581
* Returns 0 for success.
616582
*/
617-
void amdgpu_fence_driver_resume(struct amdgpu_device *adev)
583+
void amdgpu_fence_driver_hw_init(struct amdgpu_device *adev)
618584
{
619585
int i;
620586

drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,6 @@ struct amdgpu_fence_driver {
107107
};
108108

109109
int amdgpu_fence_driver_init(struct amdgpu_device *adev);
110-
void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev);
111-
void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev);
112110
void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring);
113111

114112
int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
@@ -117,8 +115,9 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
117115
int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
118116
struct amdgpu_irq_src *irq_src,
119117
unsigned irq_type);
120-
void amdgpu_fence_driver_suspend(struct amdgpu_device *adev);
121-
void amdgpu_fence_driver_resume(struct amdgpu_device *adev);
118+
void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev);
119+
void amdgpu_fence_driver_sw_fini(struct amdgpu_device *adev);
120+
void amdgpu_fence_driver_hw_init(struct amdgpu_device *adev);
122121
int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **fence,
123122
unsigned flags);
124123
int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s,

0 commit comments

Comments
 (0)