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

drm/amdgpu: Implement irq interfaces for CGS

This implements the irq src registrar.

Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+84 -6
+75 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
··· 290 290 return -EPERM; 291 291 } 292 292 293 + struct cgs_irq_params { 294 + unsigned src_id; 295 + cgs_irq_source_set_func_t set; 296 + cgs_irq_handler_func_t handler; 297 + void *private_data; 298 + }; 299 + 300 + static int cgs_set_irq_state(struct amdgpu_device *adev, 301 + struct amdgpu_irq_src *src, 302 + unsigned type, 303 + enum amdgpu_interrupt_state state) 304 + { 305 + struct cgs_irq_params *irq_params = 306 + (struct cgs_irq_params *)src->data; 307 + if (!irq_params) 308 + return -EINVAL; 309 + if (!irq_params->set) 310 + return -EINVAL; 311 + return irq_params->set(irq_params->private_data, 312 + irq_params->src_id, 313 + type, 314 + (int)state); 315 + } 316 + 317 + static int cgs_process_irq(struct amdgpu_device *adev, 318 + struct amdgpu_irq_src *source, 319 + struct amdgpu_iv_entry *entry) 320 + { 321 + struct cgs_irq_params *irq_params = 322 + (struct cgs_irq_params *)source->data; 323 + if (!irq_params) 324 + return -EINVAL; 325 + if (!irq_params->handler) 326 + return -EINVAL; 327 + return irq_params->handler(irq_params->private_data, 328 + irq_params->src_id, 329 + entry->iv_entry); 330 + } 331 + 332 + static const struct amdgpu_irq_src_funcs cgs_irq_funcs = { 333 + .set = cgs_set_irq_state, 334 + .process = cgs_process_irq, 335 + }; 336 + 293 337 static int amdgpu_cgs_add_irq_source(void *cgs_device, unsigned src_id, 294 338 unsigned num_types, 295 339 cgs_irq_source_set_func_t set, 296 340 cgs_irq_handler_func_t handler, 297 341 void *private_data) 298 342 { 299 - /* TODO */ 300 - return 0; 343 + CGS_FUNC_ADEV; 344 + int ret = 0; 345 + struct cgs_irq_params *irq_params; 346 + struct amdgpu_irq_src *source = 347 + kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL); 348 + if (!source) 349 + return -ENOMEM; 350 + irq_params = 351 + kzalloc(sizeof(struct cgs_irq_params), GFP_KERNEL); 352 + if (!irq_params) { 353 + kfree(source); 354 + return -ENOMEM; 355 + } 356 + source->num_types = num_types; 357 + source->funcs = &cgs_irq_funcs; 358 + irq_params->src_id = src_id; 359 + irq_params->set = set; 360 + irq_params->handler = handler; 361 + irq_params->private_data = private_data; 362 + source->data = (void *)irq_params; 363 + ret = amdgpu_irq_add_id(adev, src_id, source); 364 + if (ret) { 365 + kfree(irq_params); 366 + kfree(source); 367 + } 368 + 369 + return ret; 301 370 } 302 371 303 372 static int amdgpu_cgs_irq_get(void *cgs_device, unsigned src_id, unsigned type) 304 373 { 305 - /* TODO */ 306 - return 0; 374 + CGS_FUNC_ADEV; 375 + return amdgpu_irq_get(adev, adev->irq.sources[src_id], type); 307 376 } 308 377 309 378 static int amdgpu_cgs_irq_put(void *cgs_device, unsigned src_id, unsigned type) 310 379 { 311 - /* TODO */ 312 - return 0; 380 + CGS_FUNC_ADEV; 381 + return amdgpu_irq_put(adev, adev->irq.sources[src_id], type); 313 382 } 314 383 315 384 static const struct cgs_ops amdgpu_cgs_ops = {
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
··· 206 206 amdgpu_amdkfd_interrupt(adev, 207 207 (const void *) &adev->irq.ih.ring[ring_index]); 208 208 209 + entry.iv_entry = (const uint32_t *) 210 + &adev->irq.ih.ring[ring_index]; 209 211 amdgpu_ih_decode_iv(adev, &entry); 210 212 adev->irq.ih.rptr &= adev->irq.ih.ptr_mask; 211 213
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
··· 52 52 unsigned ring_id; 53 53 unsigned vm_id; 54 54 unsigned pas_id; 55 + const uint32_t *iv_entry; 55 56 }; 56 57 57 58 int amdgpu_ih_ring_init(struct amdgpu_device *adev, unsigned ring_size,
+5
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
··· 272 272 273 273 kfree(src->enabled_types); 274 274 src->enabled_types = NULL; 275 + if (src->data) { 276 + kfree(src->data); 277 + kfree(src); 278 + adev->irq.sources[i] = NULL; 279 + } 275 280 } 276 281 } 277 282
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
··· 40 40 unsigned num_types; 41 41 atomic_t *enabled_types; 42 42 const struct amdgpu_irq_src_funcs *funcs; 43 + void *data; 43 44 }; 44 45 45 46 /* provided by interrupt generating IP blocks */