diff options
Diffstat (limited to 'drivers/misc/habanalabs/common/irq.c')
| -rw-r--r-- | drivers/misc/habanalabs/common/irq.c | 56 | 
1 files changed, 56 insertions, 0 deletions
| diff --git a/drivers/misc/habanalabs/common/irq.c b/drivers/misc/habanalabs/common/irq.c index 44a0522b59b9..27129868c711 100644 --- a/drivers/misc/habanalabs/common/irq.c +++ b/drivers/misc/habanalabs/common/irq.c @@ -137,6 +137,62 @@ irqreturn_t hl_irq_handler_cq(int irq, void *arg)  	return IRQ_HANDLED;  } +static void handle_user_cq(struct hl_device *hdev, +			struct hl_user_interrupt *user_cq) +{ +	struct hl_user_pending_interrupt *pend; + +	spin_lock(&user_cq->wait_list_lock); +	list_for_each_entry(pend, &user_cq->wait_list_head, wait_list_node) +		complete_all(&pend->fence.completion); +	spin_unlock(&user_cq->wait_list_lock); +} + +/** + * hl_irq_handler_user_cq - irq handler for user completion queues + * + * @irq: irq number + * @arg: pointer to user interrupt structure + * + */ +irqreturn_t hl_irq_handler_user_cq(int irq, void *arg) +{ +	struct hl_user_interrupt *user_cq = arg; +	struct hl_device *hdev = user_cq->hdev; + +	dev_dbg(hdev->dev, +		"got user completion interrupt id %u", +		user_cq->interrupt_id); + +	/* Handle user cq interrupts registered on all interrupts */ +	handle_user_cq(hdev, &hdev->common_user_interrupt); + +	/* Handle user cq interrupts registered on this specific interrupt */ +	handle_user_cq(hdev, user_cq); + +	return IRQ_HANDLED; +} + +/** + * hl_irq_handler_default - default irq handler + * + * @irq: irq number + * @arg: pointer to user interrupt structure + * + */ +irqreturn_t hl_irq_handler_default(int irq, void *arg) +{ +	struct hl_user_interrupt *user_interrupt = arg; +	struct hl_device *hdev = user_interrupt->hdev; +	u32 interrupt_id = user_interrupt->interrupt_id; + +	dev_err(hdev->dev, +		"got invalid user interrupt %u", +		interrupt_id); + +	return IRQ_HANDLED; +} +  /**   * hl_irq_handler_eq - irq handler for event queue   * | 
