Lines Matching refs:adev

124 void amdgpu_irq_disable_all(struct amdgpu_device *adev)  in amdgpu_irq_disable_all()  argument
130 spin_lock_irqsave(&adev->irq.lock, irqflags); in amdgpu_irq_disable_all()
132 if (!adev->irq.client[i].sources) in amdgpu_irq_disable_all()
136 struct amdgpu_irq_src *src = adev->irq.client[i].sources[j]; in amdgpu_irq_disable_all()
142 r = src->funcs->set(adev, src, k, in amdgpu_irq_disable_all()
145 dev_err(adev->dev, in amdgpu_irq_disable_all()
151 spin_unlock_irqrestore(&adev->irq.lock, irqflags); in amdgpu_irq_disable_all()
168 struct amdgpu_device *adev = drm_to_adev(dev); in amdgpu_irq_handler() local
171 ret = amdgpu_ih_process(adev, &adev->irq.ih); in amdgpu_irq_handler()
175 amdgpu_ras_interrupt_fatal_error_handler(adev); in amdgpu_irq_handler()
189 struct amdgpu_device *adev = container_of(work, struct amdgpu_device, in amdgpu_irq_handle_ih1() local
192 amdgpu_ih_process(adev, &adev->irq.ih1); in amdgpu_irq_handle_ih1()
204 struct amdgpu_device *adev = container_of(work, struct amdgpu_device, in amdgpu_irq_handle_ih2() local
207 amdgpu_ih_process(adev, &adev->irq.ih2); in amdgpu_irq_handle_ih2()
219 struct amdgpu_device *adev = container_of(work, struct amdgpu_device, in amdgpu_irq_handle_ih_soft() local
222 amdgpu_ih_process(adev, &adev->irq.ih_soft); in amdgpu_irq_handle_ih_soft()
236 static bool amdgpu_msi_ok(struct amdgpu_device *adev) in amdgpu_msi_ok() argument
246 void amdgpu_restore_msix(struct amdgpu_device *adev) in amdgpu_restore_msix() argument
250 pci_read_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, &ctrl); in amdgpu_restore_msix()
256 pci_write_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, ctrl); in amdgpu_restore_msix()
258 pci_write_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, ctrl); in amdgpu_restore_msix()
272 int amdgpu_irq_init(struct amdgpu_device *adev) in amdgpu_irq_init() argument
277 spin_lock_init(&adev->irq.lock); in amdgpu_irq_init()
280 adev->irq.msi_enabled = false; in amdgpu_irq_init()
282 if (!amdgpu_msi_ok(adev)) in amdgpu_irq_init()
288 r = pci_alloc_irq_vectors(adev->pdev, 1, 1, flags); in amdgpu_irq_init()
290 dev_err(adev->dev, "Failed to alloc msi vectors\n"); in amdgpu_irq_init()
294 if (amdgpu_msi_ok(adev)) { in amdgpu_irq_init()
295 adev->irq.msi_enabled = true; in amdgpu_irq_init()
296 dev_dbg(adev->dev, "using MSI/MSI-X.\n"); in amdgpu_irq_init()
299 INIT_WORK(&adev->irq.ih1_work, amdgpu_irq_handle_ih1); in amdgpu_irq_init()
300 INIT_WORK(&adev->irq.ih2_work, amdgpu_irq_handle_ih2); in amdgpu_irq_init()
301 INIT_WORK(&adev->irq.ih_soft_work, amdgpu_irq_handle_ih_soft); in amdgpu_irq_init()
304 r = pci_irq_vector(adev->pdev, 0); in amdgpu_irq_init()
310 r = request_irq(irq, amdgpu_irq_handler, IRQF_SHARED, adev_to_drm(adev)->driver->name, in amdgpu_irq_init()
311 adev_to_drm(adev)); in amdgpu_irq_init()
315 adev->irq.installed = true; in amdgpu_irq_init()
316 adev->irq.irq = irq; in amdgpu_irq_init()
317 adev_to_drm(adev)->max_vblank_count = 0x00ffffff; in amdgpu_irq_init()
319 dev_dbg(adev->dev, "amdgpu: irq initialized.\n"); in amdgpu_irq_init()
323 if (adev->irq.msi_enabled) in amdgpu_irq_init()
324 pci_free_irq_vectors(adev->pdev); in amdgpu_irq_init()
326 adev->irq.msi_enabled = false; in amdgpu_irq_init()
330 void amdgpu_irq_fini_hw(struct amdgpu_device *adev) in amdgpu_irq_fini_hw() argument
332 if (adev->irq.installed) { in amdgpu_irq_fini_hw()
333 free_irq(adev->irq.irq, adev_to_drm(adev)); in amdgpu_irq_fini_hw()
334 adev->irq.installed = false; in amdgpu_irq_fini_hw()
335 if (adev->irq.msi_enabled) in amdgpu_irq_fini_hw()
336 pci_free_irq_vectors(adev->pdev); in amdgpu_irq_fini_hw()
339 amdgpu_ih_ring_fini(adev, &adev->irq.ih_soft); in amdgpu_irq_fini_hw()
340 amdgpu_ih_ring_fini(adev, &adev->irq.ih); in amdgpu_irq_fini_hw()
341 amdgpu_ih_ring_fini(adev, &adev->irq.ih1); in amdgpu_irq_fini_hw()
342 amdgpu_ih_ring_fini(adev, &adev->irq.ih2); in amdgpu_irq_fini_hw()
354 void amdgpu_irq_fini_sw(struct amdgpu_device *adev) in amdgpu_irq_fini_sw() argument
359 if (!adev->irq.client[i].sources) in amdgpu_irq_fini_sw()
363 struct amdgpu_irq_src *src = adev->irq.client[i].sources[j]; in amdgpu_irq_fini_sw()
371 kfree(adev->irq.client[i].sources); in amdgpu_irq_fini_sw()
372 adev->irq.client[i].sources = NULL; in amdgpu_irq_fini_sw()
389 int amdgpu_irq_add_id(struct amdgpu_device *adev, in amdgpu_irq_add_id() argument
402 if (!adev->irq.client[client_id].sources) { in amdgpu_irq_add_id()
403 adev->irq.client[client_id].sources = in amdgpu_irq_add_id()
407 if (!adev->irq.client[client_id].sources) in amdgpu_irq_add_id()
411 if (adev->irq.client[client_id].sources[src_id] != NULL) in amdgpu_irq_add_id()
425 adev->irq.client[client_id].sources[src_id] = source; in amdgpu_irq_add_id()
437 void amdgpu_irq_dispatch(struct amdgpu_device *adev, in amdgpu_irq_dispatch() argument
457 amdgpu_ih_decode_iv(adev, &entry); in amdgpu_irq_dispatch()
459 trace_amdgpu_iv(ih - &adev->irq.ih, &entry); in amdgpu_irq_dispatch()
465 dev_dbg(adev->dev, "Invalid client_id in IV: %d\n", client_id); in amdgpu_irq_dispatch()
468 dev_dbg(adev->dev, "Invalid src_id in IV: %d\n", src_id); in amdgpu_irq_dispatch()
472 adev->irq.virq[src_id]) { in amdgpu_irq_dispatch()
473 generic_handle_domain_irq(adev->irq.domain, src_id); in amdgpu_irq_dispatch()
475 } else if (!adev->irq.client[client_id].sources) { in amdgpu_irq_dispatch()
476 dev_dbg(adev->dev, in amdgpu_irq_dispatch()
480 } else if ((src = adev->irq.client[client_id].sources[src_id])) { in amdgpu_irq_dispatch()
481 r = src->funcs->process(adev, src, &entry); in amdgpu_irq_dispatch()
483 dev_err(adev->dev, "error processing interrupt (%d)\n", in amdgpu_irq_dispatch()
489 dev_dbg(adev->dev, in amdgpu_irq_dispatch()
496 amdgpu_amdkfd_interrupt(adev, entry.iv_entry); in amdgpu_irq_dispatch()
512 void amdgpu_irq_delegate(struct amdgpu_device *adev, in amdgpu_irq_delegate() argument
516 amdgpu_ih_ring_write(adev, &adev->irq.ih_soft, entry->iv_entry, num_dw); in amdgpu_irq_delegate()
517 schedule_work(&adev->irq.ih_soft_work); in amdgpu_irq_delegate()
529 int amdgpu_irq_update(struct amdgpu_device *adev, in amdgpu_irq_update() argument
536 spin_lock_irqsave(&adev->irq.lock, irqflags); in amdgpu_irq_update()
541 if (amdgpu_irq_enabled(adev, src, type)) in amdgpu_irq_update()
546 r = src->funcs->set(adev, src, type, state); in amdgpu_irq_update()
547 spin_unlock_irqrestore(&adev->irq.lock, irqflags); in amdgpu_irq_update()
559 void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev) in amdgpu_irq_gpu_reset_resume_helper() argument
563 if (amdgpu_sriov_vf(adev) || amdgpu_passthrough(adev)) in amdgpu_irq_gpu_reset_resume_helper()
564 amdgpu_restore_msix(adev); in amdgpu_irq_gpu_reset_resume_helper()
567 if (!adev->irq.client[i].sources) in amdgpu_irq_gpu_reset_resume_helper()
571 struct amdgpu_irq_src *src = adev->irq.client[i].sources[j]; in amdgpu_irq_gpu_reset_resume_helper()
576 amdgpu_irq_update(adev, src, k); in amdgpu_irq_gpu_reset_resume_helper()
593 int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src, in amdgpu_irq_get() argument
596 if (!adev->irq.installed) in amdgpu_irq_get()
606 return amdgpu_irq_update(adev, src, type); in amdgpu_irq_get()
623 int amdgpu_irq_put(struct amdgpu_device *adev, struct amdgpu_irq_src *src, in amdgpu_irq_put() argument
627 if (amdgpu_ras_is_rma(adev) && !amdgpu_irq_enabled(adev, src, type)) in amdgpu_irq_put()
630 if (!adev->irq.installed) in amdgpu_irq_put()
639 if (WARN_ON(!amdgpu_irq_enabled(adev, src, type))) in amdgpu_irq_put()
643 return amdgpu_irq_update(adev, src, type); in amdgpu_irq_put()
661 bool amdgpu_irq_enabled(struct amdgpu_device *adev, struct amdgpu_irq_src *src, in amdgpu_irq_enabled() argument
664 if (!adev->irq.installed) in amdgpu_irq_enabled()
734 int amdgpu_irq_add_domain(struct amdgpu_device *adev) in amdgpu_irq_add_domain() argument
736 adev->irq.domain = irq_domain_create_linear(NULL, AMDGPU_MAX_IRQ_SRC_ID, in amdgpu_irq_add_domain()
737 &amdgpu_hw_irqdomain_ops, adev); in amdgpu_irq_add_domain()
738 if (!adev->irq.domain) { in amdgpu_irq_add_domain()
739 dev_err(adev->dev, "GPU irq add domain failed\n"); in amdgpu_irq_add_domain()
754 void amdgpu_irq_remove_domain(struct amdgpu_device *adev) in amdgpu_irq_remove_domain() argument
756 if (adev->irq.domain) { in amdgpu_irq_remove_domain()
757 irq_domain_remove(adev->irq.domain); in amdgpu_irq_remove_domain()
758 adev->irq.domain = NULL; in amdgpu_irq_remove_domain()
775 unsigned int amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned int src_id) in amdgpu_irq_create_mapping() argument
777 adev->irq.virq[src_id] = irq_create_mapping(adev->irq.domain, src_id); in amdgpu_irq_create_mapping()
779 return adev->irq.virq[src_id]; in amdgpu_irq_create_mapping()