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

drm/amdgpu: cleanup amdgpu_ih_process a bit more

Remove the callback and call the dispatcher directly.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
e2fb6e0a 16065fcd

+21 -39
+2 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
··· 140 140 * Interrupt hander (VI), walk the IH ring. 141 141 * Returns irq process return code. 142 142 */ 143 - int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 144 - void (*callback)(struct amdgpu_device *adev, 145 - struct amdgpu_ih_ring *ih)) 143 + int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih) 146 144 { 147 145 u32 wptr; 148 146 ··· 160 162 rmb(); 161 163 162 164 while (ih->rptr != wptr) { 163 - callback(adev, ih); 165 + amdgpu_irq_dispatch(adev, ih); 164 166 ih->rptr &= ih->ptr_mask; 165 167 } 166 168
+1 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
··· 69 69 int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 70 70 unsigned ring_size, bool use_bus_addr); 71 71 void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih); 72 - int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 73 - void (*callback)(struct amdgpu_device *adev, 74 - struct amdgpu_ih_ring *ih)); 72 + int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih); 75 73 76 74 #endif
+17 -31
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
··· 131 131 } 132 132 133 133 /** 134 - * amdgpu_irq_callback - callback from the IH ring 135 - * 136 - * @adev: amdgpu device pointer 137 - * @ih: amdgpu ih ring 138 - * 139 - * Callback from IH ring processing to handle the entry at the current position 140 - * and advance the read pointer. 141 - */ 142 - static void amdgpu_irq_callback(struct amdgpu_device *adev, 143 - struct amdgpu_ih_ring *ih) 144 - { 145 - u32 ring_index = ih->rptr >> 2; 146 - struct amdgpu_iv_entry entry; 147 - 148 - entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; 149 - amdgpu_ih_decode_iv(adev, &entry); 150 - 151 - trace_amdgpu_iv(ih - &adev->irq.ih, &entry); 152 - 153 - amdgpu_irq_dispatch(adev, &entry); 154 - } 155 - 156 - /** 157 134 * amdgpu_irq_handler - IRQ handler 158 135 * 159 136 * @irq: IRQ number (unused) ··· 147 170 struct amdgpu_device *adev = dev->dev_private; 148 171 irqreturn_t ret; 149 172 150 - ret = amdgpu_ih_process(adev, &adev->irq.ih, amdgpu_irq_callback); 173 + ret = amdgpu_ih_process(adev, &adev->irq.ih); 151 174 if (ret == IRQ_HANDLED) 152 175 pm_runtime_mark_last_busy(dev->dev); 153 176 return ret; ··· 165 188 struct amdgpu_device *adev = container_of(work, struct amdgpu_device, 166 189 irq.ih1_work); 167 190 168 - amdgpu_ih_process(adev, &adev->irq.ih1, amdgpu_irq_callback); 191 + amdgpu_ih_process(adev, &adev->irq.ih1); 169 192 } 170 193 171 194 /** ··· 180 203 struct amdgpu_device *adev = container_of(work, struct amdgpu_device, 181 204 irq.ih2_work); 182 205 183 - amdgpu_ih_process(adev, &adev->irq.ih2, amdgpu_irq_callback); 206 + amdgpu_ih_process(adev, &adev->irq.ih2); 184 207 } 185 208 186 209 /** ··· 371 394 * Dispatches IRQ to IP blocks. 372 395 */ 373 396 void amdgpu_irq_dispatch(struct amdgpu_device *adev, 374 - struct amdgpu_iv_entry *entry) 397 + struct amdgpu_ih_ring *ih) 375 398 { 376 - unsigned client_id = entry->client_id; 377 - unsigned src_id = entry->src_id; 399 + u32 ring_index = ih->rptr >> 2; 400 + struct amdgpu_iv_entry entry; 401 + unsigned client_id, src_id; 378 402 struct amdgpu_irq_src *src; 379 403 bool handled = false; 380 404 int r; 405 + 406 + entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; 407 + amdgpu_ih_decode_iv(adev, &entry); 408 + 409 + trace_amdgpu_iv(ih - &adev->irq.ih, &entry); 410 + 411 + client_id = entry.client_id; 412 + src_id = entry.src_id; 381 413 382 414 if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) { 383 415 DRM_DEBUG("Invalid client_id in IV: %d\n", client_id); ··· 402 416 client_id, src_id); 403 417 404 418 } else if ((src = adev->irq.client[client_id].sources[src_id])) { 405 - r = src->funcs->process(adev, src, entry); 419 + r = src->funcs->process(adev, src, &entry); 406 420 if (r < 0) 407 421 DRM_ERROR("error processing interrupt (%d)\n", r); 408 422 else if (r) ··· 414 428 415 429 /* Send it to amdkfd as well if it isn't already handled */ 416 430 if (!handled) 417 - amdgpu_amdkfd_interrupt(adev, entry->iv_entry); 431 + amdgpu_amdkfd_interrupt(adev, entry.iv_entry); 418 432 } 419 433 420 434 /**
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
··· 108 108 unsigned client_id, unsigned src_id, 109 109 struct amdgpu_irq_src *source); 110 110 void amdgpu_irq_dispatch(struct amdgpu_device *adev, 111 - struct amdgpu_iv_entry *entry); 111 + struct amdgpu_ih_ring *ih); 112 112 int amdgpu_irq_update(struct amdgpu_device *adev, struct amdgpu_irq_src *src, 113 113 unsigned type); 114 114 int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src,