Lines Matching refs:mdev

29 	struct mic_device *mdev = dev;  in mic_thread_fn()  local
30 struct mic_intr_info *intr_info = mdev->intr_info; in mic_thread_fn()
31 struct mic_irq_info *irq_info = &mdev->irq_info; in mic_thread_fn()
33 struct pci_dev *pdev = container_of(mdev->sdev->parent, in mic_thread_fn()
56 struct mic_device *mdev = dev; in mic_interrupt() local
57 struct mic_intr_info *intr_info = mdev->intr_info; in mic_interrupt()
58 struct mic_irq_info *irq_info = &mdev->irq_info; in mic_interrupt()
60 struct pci_dev *pdev = container_of(mdev->sdev->parent, in mic_interrupt()
65 mask = mdev->ops->ack_interrupt(mdev); in mic_interrupt()
85 static u16 mic_map_src_to_offset(struct mic_device *mdev, in mic_map_src_to_offset() argument
90 if (intr_src >= mdev->intr_info->intr_len[type]) in mic_map_src_to_offset()
93 return mdev->intr_info->intr_start_idx[type] + intr_src; in mic_map_src_to_offset()
97 static struct msix_entry *mic_get_available_vector(struct mic_device *mdev) in mic_get_available_vector() argument
100 struct mic_irq_info *info = &mdev->irq_info; in mic_get_available_vector()
121 static struct mic_intr_cb *mic_register_intr_callback(struct mic_device *mdev, in mic_register_intr_callback() argument
136 intr_cb->cb_id = ida_simple_get(&mdev->irq_info.cb_ida, in mic_register_intr_callback()
143 spin_lock(&mdev->irq_info.mic_thread_lock); in mic_register_intr_callback()
144 spin_lock_irqsave(&mdev->irq_info.mic_intr_lock, flags); in mic_register_intr_callback()
145 list_add_tail(&intr_cb->list, &mdev->irq_info.cb_list[idx]); in mic_register_intr_callback()
146 spin_unlock_irqrestore(&mdev->irq_info.mic_intr_lock, flags); in mic_register_intr_callback()
147 spin_unlock(&mdev->irq_info.mic_thread_lock); in mic_register_intr_callback()
164 static u8 mic_unregister_intr_callback(struct mic_device *mdev, u32 idx) in mic_unregister_intr_callback() argument
171 spin_lock(&mdev->irq_info.mic_thread_lock); in mic_unregister_intr_callback()
172 spin_lock_irqsave(&mdev->irq_info.mic_intr_lock, flags); in mic_unregister_intr_callback()
174 list_for_each_safe(pos, tmp, &mdev->irq_info.cb_list[i]) { in mic_unregister_intr_callback()
178 ida_simple_remove(&mdev->irq_info.cb_ida, in mic_unregister_intr_callback()
182 &mdev->irq_info.mic_intr_lock, flags); in mic_unregister_intr_callback()
183 spin_unlock(&mdev->irq_info.mic_thread_lock); in mic_unregister_intr_callback()
188 spin_unlock_irqrestore(&mdev->irq_info.mic_intr_lock, flags); in mic_unregister_intr_callback()
189 spin_unlock(&mdev->irq_info.mic_thread_lock); in mic_unregister_intr_callback()
201 static int mic_setup_msix(struct mic_device *mdev, struct pci_dev *pdev) in mic_setup_msix() argument
204 int entry_size = sizeof(*mdev->irq_info.msix_entries); in mic_setup_msix()
206 mdev->irq_info.msix_entries = kmalloc_array(MIC_MIN_MSIX, in mic_setup_msix()
208 if (!mdev->irq_info.msix_entries) { in mic_setup_msix()
214 mdev->irq_info.msix_entries[i].entry = i; in mic_setup_msix()
216 rc = pci_enable_msix_exact(pdev, mdev->irq_info.msix_entries, in mic_setup_msix()
223 mdev->irq_info.num_vectors = MIC_MIN_MSIX; in mic_setup_msix()
224 mdev->irq_info.mic_msi_map = kzalloc((sizeof(u32) * in mic_setup_msix()
225 mdev->irq_info.num_vectors), GFP_KERNEL); in mic_setup_msix()
227 if (!mdev->irq_info.mic_msi_map) { in mic_setup_msix()
232 dev_dbg(mdev->sdev->parent, in mic_setup_msix()
233 "%d MSIx irqs setup\n", mdev->irq_info.num_vectors); in mic_setup_msix()
238 kfree(mdev->irq_info.msix_entries); in mic_setup_msix()
240 mdev->irq_info.num_vectors = 0; in mic_setup_msix()
250 static int mic_setup_callbacks(struct mic_device *mdev) in mic_setup_callbacks() argument
254 mdev->irq_info.cb_list = kmalloc_array(MIC_NUM_OFFSETS, in mic_setup_callbacks()
255 sizeof(*mdev->irq_info.cb_list), in mic_setup_callbacks()
257 if (!mdev->irq_info.cb_list) in mic_setup_callbacks()
261 INIT_LIST_HEAD(&mdev->irq_info.cb_list[i]); in mic_setup_callbacks()
262 ida_init(&mdev->irq_info.cb_ida); in mic_setup_callbacks()
263 spin_lock_init(&mdev->irq_info.mic_intr_lock); in mic_setup_callbacks()
264 spin_lock_init(&mdev->irq_info.mic_thread_lock); in mic_setup_callbacks()
274 static void mic_release_callbacks(struct mic_device *mdev) in mic_release_callbacks() argument
281 spin_lock(&mdev->irq_info.mic_thread_lock); in mic_release_callbacks()
282 spin_lock_irqsave(&mdev->irq_info.mic_intr_lock, flags); in mic_release_callbacks()
285 if (list_empty(&mdev->irq_info.cb_list[i])) in mic_release_callbacks()
288 list_for_each_safe(pos, tmp, &mdev->irq_info.cb_list[i]) { in mic_release_callbacks()
291 ida_simple_remove(&mdev->irq_info.cb_ida, in mic_release_callbacks()
296 spin_unlock_irqrestore(&mdev->irq_info.mic_intr_lock, flags); in mic_release_callbacks()
297 spin_unlock(&mdev->irq_info.mic_thread_lock); in mic_release_callbacks()
298 ida_destroy(&mdev->irq_info.cb_ida); in mic_release_callbacks()
299 kfree(mdev->irq_info.cb_list); in mic_release_callbacks()
310 static int mic_setup_msi(struct mic_device *mdev, struct pci_dev *pdev) in mic_setup_msi() argument
320 mdev->irq_info.num_vectors = 1; in mic_setup_msi()
321 mdev->irq_info.mic_msi_map = kzalloc((sizeof(u32) * in mic_setup_msi()
322 mdev->irq_info.num_vectors), GFP_KERNEL); in mic_setup_msi()
324 if (!mdev->irq_info.mic_msi_map) { in mic_setup_msi()
329 rc = mic_setup_callbacks(mdev); in mic_setup_msi()
336 0, "mic-msi", mdev); in mic_setup_msi()
342 dev_dbg(&pdev->dev, "%d MSI irqs setup\n", mdev->irq_info.num_vectors); in mic_setup_msi()
345 mic_release_callbacks(mdev); in mic_setup_msi()
347 kfree(mdev->irq_info.mic_msi_map); in mic_setup_msi()
350 mdev->irq_info.num_vectors = 0; in mic_setup_msi()
362 static int mic_setup_intx(struct mic_device *mdev, struct pci_dev *pdev) in mic_setup_intx() argument
368 rc = mic_setup_callbacks(mdev); in mic_setup_intx()
375 IRQF_SHARED, "mic-intx", mdev); in mic_setup_intx()
382 mic_release_callbacks(mdev); in mic_setup_intx()
396 int mic_next_db(struct mic_device *mdev) in mic_next_db() argument
400 next_db = mdev->irq_info.next_avail_src % in mic_next_db()
401 mdev->intr_info->intr_len[MIC_INTR_DB]; in mic_next_db()
402 mdev->irq_info.next_avail_src++; in mic_next_db()
435 mic_request_threaded_irq(struct mic_device *mdev, in mic_request_threaded_irq() argument
446 struct pci_dev *pdev = container_of(mdev->sdev->parent, in mic_request_threaded_irq()
449 offset = mic_map_src_to_offset(mdev, intr_src, type); in mic_request_threaded_irq()
451 dev_err(mdev->sdev->parent, in mic_request_threaded_irq()
458 if (mdev->irq_info.num_vectors > 1) { in mic_request_threaded_irq()
459 msix = mic_get_available_vector(mdev); in mic_request_threaded_irq()
461 dev_err(mdev->sdev->parent, in mic_request_threaded_irq()
470 dev_dbg(mdev->sdev->parent, in mic_request_threaded_irq()
475 mdev->irq_info.mic_msi_map[entry] |= BIT(offset); in mic_request_threaded_irq()
476 mdev->intr_ops->program_msi_to_src_map(mdev, in mic_request_threaded_irq()
479 dev_dbg(mdev->sdev->parent, "irq: %d assigned for src: %d\n", in mic_request_threaded_irq()
482 intr_cb = mic_register_intr_callback(mdev, offset, handler, in mic_request_threaded_irq()
485 dev_err(mdev->sdev->parent, in mic_request_threaded_irq()
493 mdev->irq_info.mic_msi_map[entry] |= (1 << offset); in mic_request_threaded_irq()
494 mdev->intr_ops->program_msi_to_src_map(mdev, in mic_request_threaded_irq()
498 dev_dbg(mdev->sdev->parent, "callback %d registered for src: %d\n", in mic_request_threaded_irq()
517 void mic_free_irq(struct mic_device *mdev, in mic_free_irq() argument
524 struct pci_dev *pdev = container_of(mdev->sdev->parent, in mic_free_irq()
529 if (mdev->irq_info.num_vectors > 1) { in mic_free_irq()
530 if (entry >= mdev->irq_info.num_vectors) { in mic_free_irq()
531 dev_warn(mdev->sdev->parent, in mic_free_irq()
533 entry, mdev->irq_info.num_vectors); in mic_free_irq()
536 irq = mdev->irq_info.msix_entries[entry].vector; in mic_free_irq()
538 mdev->irq_info.mic_msi_map[entry] &= ~(BIT(offset)); in mic_free_irq()
539 mdev->intr_ops->program_msi_to_src_map(mdev, in mic_free_irq()
542 dev_dbg(mdev->sdev->parent, "irq: %d freed\n", irq); in mic_free_irq()
545 src_id = mic_unregister_intr_callback(mdev, offset); in mic_free_irq()
547 dev_warn(mdev->sdev->parent, "Error unregistering callback\n"); in mic_free_irq()
551 mdev->irq_info.mic_msi_map[entry] &= ~(BIT(src_id)); in mic_free_irq()
552 mdev->intr_ops->program_msi_to_src_map(mdev, in mic_free_irq()
555 dev_dbg(mdev->sdev->parent, "callback %d unregistered for src: %d\n", in mic_free_irq()
568 int mic_setup_interrupts(struct mic_device *mdev, struct pci_dev *pdev) in mic_setup_interrupts() argument
572 rc = mic_setup_msix(mdev, pdev); in mic_setup_interrupts()
576 rc = mic_setup_msi(mdev, pdev); in mic_setup_interrupts()
580 rc = mic_setup_intx(mdev, pdev); in mic_setup_interrupts()
582 dev_err(mdev->sdev->parent, "no usable interrupts\n"); in mic_setup_interrupts()
586 mdev->intr_ops->enable_interrupts(mdev); in mic_setup_interrupts()
598 void mic_free_interrupts(struct mic_device *mdev, struct pci_dev *pdev) in mic_free_interrupts() argument
602 mdev->intr_ops->disable_interrupts(mdev); in mic_free_interrupts()
603 if (mdev->irq_info.num_vectors > 1) { in mic_free_interrupts()
604 for (i = 0; i < mdev->irq_info.num_vectors; i++) { in mic_free_interrupts()
605 if (mdev->irq_info.mic_msi_map[i]) in mic_free_interrupts()
607 mdev->irq_info.msix_entries[i].vector); in mic_free_interrupts()
609 kfree(mdev->irq_info.mic_msi_map); in mic_free_interrupts()
610 kfree(mdev->irq_info.msix_entries); in mic_free_interrupts()
614 free_irq(pdev->irq, mdev); in mic_free_interrupts()
615 kfree(mdev->irq_info.mic_msi_map); in mic_free_interrupts()
618 free_irq(pdev->irq, mdev); in mic_free_interrupts()
620 mic_release_callbacks(mdev); in mic_free_interrupts()
635 void mic_intr_restore(struct mic_device *mdev) in mic_intr_restore() argument
638 struct pci_dev *pdev = container_of(mdev->sdev->parent, in mic_intr_restore()
644 for (entry = 0; entry < mdev->irq_info.num_vectors; entry++) { in mic_intr_restore()
646 if (mdev->irq_info.mic_msi_map[entry] & BIT(offset)) in mic_intr_restore()
647 mdev->intr_ops->program_msi_to_src_map(mdev, in mic_intr_restore()