Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add JPEG common functions to amdgpu_jpeg

They will be used for JPEG2.0 and later.

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Leo Liu and committed by
Alex Deucher
2eb16729 8d1b04a6

+86
+76
drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
··· 26 26 27 27 #include "amdgpu.h" 28 28 #include "amdgpu_jpeg.h" 29 + #include "amdgpu_pm.h" 29 30 #include "soc15d.h" 30 31 #include "soc15_common.h" 32 + 33 + #define JPEG_IDLE_TIMEOUT msecs_to_jiffies(1000) 34 + 35 + static void amdgpu_jpeg_idle_work_handler(struct work_struct *work); 36 + 37 + int amdgpu_jpeg_sw_init(struct amdgpu_device *adev) 38 + { 39 + INIT_DELAYED_WORK(&adev->jpeg.idle_work, amdgpu_jpeg_idle_work_handler); 40 + 41 + return 0; 42 + } 43 + 44 + int amdgpu_jpeg_sw_fini(struct amdgpu_device *adev) 45 + { 46 + int i; 47 + 48 + cancel_delayed_work_sync(&adev->jpeg.idle_work); 49 + 50 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 51 + if (adev->jpeg.harvest_config & (1 << i)) 52 + continue; 53 + 54 + amdgpu_ring_fini(&adev->jpeg.inst[i].ring_dec); 55 + } 56 + 57 + return 0; 58 + } 59 + 60 + int amdgpu_jpeg_suspend(struct amdgpu_device *adev) 61 + { 62 + cancel_delayed_work_sync(&adev->jpeg.idle_work); 63 + 64 + return 0; 65 + } 66 + 67 + int amdgpu_jpeg_resume(struct amdgpu_device *adev) 68 + { 69 + return 0; 70 + } 71 + 72 + static void amdgpu_jpeg_idle_work_handler(struct work_struct *work) 73 + { 74 + struct amdgpu_device *adev = 75 + container_of(work, struct amdgpu_device, jpeg.idle_work.work); 76 + unsigned int fences = 0; 77 + unsigned int i; 78 + 79 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 80 + if (adev->jpeg.harvest_config & (1 << i)) 81 + continue; 82 + 83 + fences += amdgpu_fence_count_emitted(&adev->jpeg.inst[i].ring_dec); 84 + } 85 + 86 + if (fences == 0) 87 + amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_JPEG, 88 + AMD_PG_STATE_GATE); 89 + else 90 + schedule_delayed_work(&adev->jpeg.idle_work, JPEG_IDLE_TIMEOUT); 91 + } 92 + 93 + void amdgpu_jpeg_ring_begin_use(struct amdgpu_ring *ring) 94 + { 95 + struct amdgpu_device *adev = ring->adev; 96 + bool set_clocks = !cancel_delayed_work_sync(&adev->jpeg.idle_work); 97 + 98 + if (set_clocks) 99 + amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_JPEG, 100 + AMD_PG_STATE_UNGATE); 101 + } 102 + 103 + void amdgpu_jpeg_ring_end_use(struct amdgpu_ring *ring) 104 + { 105 + schedule_delayed_work(&ring->adev->jpeg.idle_work, JPEG_IDLE_TIMEOUT); 106 + } 31 107 32 108 int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring) 33 109 {
+10
drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h
··· 41 41 struct amdgpu_jpeg_inst inst[AMDGPU_MAX_JPEG_INSTANCES]; 42 42 struct amdgpu_jpeg_reg internal; 43 43 unsigned harvest_config; 44 + struct delayed_work idle_work; 45 + enum amd_powergating_state cur_state; 44 46 }; 47 + 48 + int amdgpu_jpeg_sw_init(struct amdgpu_device *adev); 49 + int amdgpu_jpeg_sw_fini(struct amdgpu_device *adev); 50 + int amdgpu_jpeg_suspend(struct amdgpu_device *adev); 51 + int amdgpu_jpeg_resume(struct amdgpu_device *adev); 52 + 53 + void amdgpu_jpeg_ring_begin_use(struct amdgpu_ring *ring); 54 + void amdgpu_jpeg_ring_end_use(struct amdgpu_ring *ring); 45 55 46 56 int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring); 47 57 int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout);