Lines Matching full:irq
33 * passed to amdgpu IRQ handler which is responsible for detecting source and
41 * For GPU interrupt sources that may be driven by another driver, IRQ domain
45 #include <linux/irq.h>
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()
151 spin_unlock_irqrestore(&adev->irq.lock, irqflags); in amdgpu_irq_disable_all()
155 * amdgpu_irq_handler - IRQ handler
157 * @irq: IRQ number (unused)
160 * IRQ handler for amdgpu driver (all ASICs).
163 * result of handling the IRQ, as defined by &irqreturn_t
165 static irqreturn_t amdgpu_irq_handler(int irq, void *arg) in amdgpu_irq_handler() argument
171 ret = amdgpu_ih_process(adev, &adev->irq.ih); in amdgpu_irq_handler()
190 irq.ih1_work); in amdgpu_irq_handle_ih1()
192 amdgpu_ih_process(adev, &adev->irq.ih1); in amdgpu_irq_handle_ih1()
205 irq.ih2_work); in amdgpu_irq_handle_ih2()
207 amdgpu_ih_process(adev, &adev->irq.ih2); in amdgpu_irq_handle_ih2()
220 irq.ih_soft_work); in amdgpu_irq_handle_ih_soft()
222 amdgpu_ih_process(adev, &adev->irq.ih_soft); in amdgpu_irq_handle_ih_soft()
274 unsigned int irq, flags; in amdgpu_irq_init() local
277 spin_lock_init(&adev->irq.lock); in amdgpu_irq_init()
280 adev->irq.msi_enabled = false; in amdgpu_irq_init()
295 adev->irq.msi_enabled = true; 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()
307 irq = r; in amdgpu_irq_init()
310 r = request_irq(irq, amdgpu_irq_handler, IRQF_SHARED, adev_to_drm(adev)->driver->name, in amdgpu_irq_init()
315 adev->irq.installed = true; in amdgpu_irq_init()
316 adev->irq.irq = irq; 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()
326 adev->irq.msi_enabled = false; in amdgpu_irq_init()
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()
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()
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()
377 * amdgpu_irq_add_id - register IRQ source
382 * @source: IRQ source pointer
384 * Registers IRQ source on a client.
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()
430 * amdgpu_irq_dispatch - dispatch IRQ to IP blocks
435 * Dispatches IRQ to IP blocks.
459 trace_amdgpu_iv(ih - &adev->irq.ih, &entry); 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()
480 } else if ((src = adev->irq.client[client_id].sources[src_id])) { in amdgpu_irq_dispatch()
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()
536 spin_lock_irqsave(&adev->irq.lock, irqflags); in amdgpu_irq_update()
547 spin_unlock_irqrestore(&adev->irq.lock, irqflags); in amdgpu_irq_update()
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()
596 if (!adev->irq.installed) in amdgpu_irq_get()
630 if (!adev->irq.installed) in amdgpu_irq_put()
664 if (!adev->irq.installed) in amdgpu_irq_enabled()
676 /* XXX: Generic IRQ handling */
695 * amdgpu_irqdomain_map - create mapping between virtual and hardware IRQ numbers
697 * @d: amdgpu IRQ domain pointer (unused)
698 * @irq: virtual IRQ number
699 * @hwirq: hardware irq number
702 * IRQ.
708 unsigned int irq, irq_hw_number_t hwirq) in amdgpu_irqdomain_map() argument
713 irq_set_chip_and_handler(irq, in amdgpu_irqdomain_map()
718 /* Implementation of methods for amdgpu IRQ domain */
724 * amdgpu_irq_add_domain - create a linear IRQ domain
728 * Creates an IRQ domain for GPU interrupt sources
736 adev->irq.domain = irq_domain_create_linear(NULL, AMDGPU_MAX_IRQ_SRC_ID, 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()
747 * amdgpu_irq_remove_domain - remove the IRQ domain
751 * Removes the IRQ domain for GPU interrupt sources
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()
768 * Creates mapping between a domain IRQ (GPU IH src id) and a Linux IRQ
773 * Linux IRQ
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()