Lines Matching refs:dev

28 static int pci_msi_supported(struct pci_dev *dev, int nvec)  in pci_msi_supported()  argument
36 if (!dev || dev->no_msi) in pci_msi_supported()
61 for (bus = dev->bus; bus; bus = bus->parent) in pci_msi_supported()
70 struct pci_dev *dev = pcidev; in pcim_msi_release() local
72 dev->is_msi_managed = false; in pcim_msi_release()
73 pci_free_irq_vectors(dev); in pcim_msi_release()
80 static int pcim_setup_msi_release(struct pci_dev *dev) in pcim_setup_msi_release() argument
84 if (!pci_is_managed(dev) || dev->is_msi_managed) in pcim_setup_msi_release()
87 ret = devm_add_action(&dev->dev, pcim_msi_release, dev); in pcim_setup_msi_release()
89 dev->is_msi_managed = true; in pcim_setup_msi_release()
97 static int pci_setup_msi_context(struct pci_dev *dev) in pci_setup_msi_context() argument
99 int ret = msi_setup_device_data(&dev->dev); in pci_setup_msi_context()
102 ret = pcim_setup_msi_release(dev); in pci_setup_msi_context()
112 raw_spinlock_t *lock = &to_pci_dev(desc->dev)->msi_lock; in pci_msi_update_mask()
152 struct pci_dev *dev = msi_desc_to_pci_dev(entry); in __pci_read_msi_msg() local
154 BUG_ON(dev->current_state != PCI_D0); in __pci_read_msi_msg()
166 int pos = dev->msi_cap; in __pci_read_msi_msg()
169 pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, in __pci_read_msi_msg()
172 pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, in __pci_read_msi_msg()
174 pci_read_config_word(dev, pos + PCI_MSI_DATA_64, &data); in __pci_read_msi_msg()
177 pci_read_config_word(dev, pos + PCI_MSI_DATA_32, &data); in __pci_read_msi_msg()
183 static inline void pci_write_msg_msi(struct pci_dev *dev, struct msi_desc *desc, in pci_write_msg_msi() argument
186 int pos = dev->msi_cap; in pci_write_msg_msi()
189 pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl); in pci_write_msg_msi()
192 pci_write_config_word(dev, pos + PCI_MSI_FLAGS, msgctl); in pci_write_msg_msi()
194 pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, msg->address_lo); in pci_write_msg_msi()
196 pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, msg->address_hi); in pci_write_msg_msi()
197 pci_write_config_word(dev, pos + PCI_MSI_DATA_64, msg->data); in pci_write_msg_msi()
199 pci_write_config_word(dev, pos + PCI_MSI_DATA_32, msg->data); in pci_write_msg_msi()
202 pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl); in pci_write_msg_msi()
237 struct pci_dev *dev = msi_desc_to_pci_dev(entry); in __pci_write_msi_msg() local
239 if (dev->current_state != PCI_D0 || pci_dev_is_disconnected(dev)) { in __pci_write_msi_msg()
244 pci_write_msg_msi(dev, entry, msg); in __pci_write_msi_msg()
264 static void pci_intx_for_msi(struct pci_dev *dev, int enable) in pci_intx_for_msi() argument
266 if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) in pci_intx_for_msi()
267 pci_intx(dev, enable); in pci_intx_for_msi()
270 static void pci_msi_set_enable(struct pci_dev *dev, int enable) in pci_msi_set_enable() argument
274 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in pci_msi_set_enable()
278 pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control); in pci_msi_set_enable()
281 static int msi_setup_msi_desc(struct pci_dev *dev, int nvec, in msi_setup_msi_desc() argument
290 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in msi_setup_msi_desc()
292 if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING) in msi_setup_msi_desc()
301 desc.pci.msi_attrib.default_irq = dev->irq; in msi_setup_msi_desc()
307 desc.pci.mask_pos = dev->msi_cap + PCI_MSI_MASK_64; in msi_setup_msi_desc()
309 desc.pci.mask_pos = dev->msi_cap + PCI_MSI_MASK_32; in msi_setup_msi_desc()
313 pci_read_config_dword(dev, desc.pci.mask_pos, &desc.pci.msi_mask); in msi_setup_msi_desc()
315 return msi_insert_msi_desc(&dev->dev, &desc); in msi_setup_msi_desc()
318 static int msi_verify_entries(struct pci_dev *dev) in msi_verify_entries() argument
322 if (!dev->no_64bit_msi) in msi_verify_entries()
325 msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) { in msi_verify_entries()
327 pci_err(dev, "arch assigned 64-bit MSI address %#x%08x but device only supports 32 bits\n", in msi_verify_entries()
347 static int msi_capability_init(struct pci_dev *dev, int nvec, in msi_capability_init() argument
355 if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY)) in msi_capability_init()
362 pci_msi_set_enable(dev, 0); in msi_capability_init()
363 dev->msi_enabled = 1; in msi_capability_init()
368 msi_lock_descs(&dev->dev); in msi_capability_init()
369 ret = msi_setup_msi_desc(dev, nvec, masks); in msi_capability_init()
374 entry = msi_first_desc(&dev->dev, MSI_DESC_ALL); in msi_capability_init()
384 ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI); in msi_capability_init()
388 ret = msi_verify_entries(dev); in msi_capability_init()
393 pci_intx_for_msi(dev, 0); in msi_capability_init()
394 pci_msi_set_enable(dev, 1); in msi_capability_init()
396 pcibios_free_irq(dev); in msi_capability_init()
397 dev->irq = entry->irq; in msi_capability_init()
402 pci_free_msi_irqs(dev); in msi_capability_init()
404 dev->msi_enabled = 0; in msi_capability_init()
406 msi_unlock_descs(&dev->dev); in msi_capability_init()
411 int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, in __pci_enable_msi_range() argument
417 if (!pci_msi_supported(dev, minvec) || dev->current_state != PCI_D0) in __pci_enable_msi_range()
421 if (dev->msix_enabled) { in __pci_enable_msi_range()
422 pci_info(dev, "can't enable MSI (MSI-X already enabled)\n"); in __pci_enable_msi_range()
429 if (WARN_ON_ONCE(dev->msi_enabled)) in __pci_enable_msi_range()
432 nvec = pci_msi_vec_count(dev); in __pci_enable_msi_range()
441 rc = pci_setup_msi_context(dev); in __pci_enable_msi_range()
445 if (!pci_setup_msi_device_domain(dev)) in __pci_enable_msi_range()
455 rc = msi_capability_init(dev, nvec, affd); in __pci_enable_msi_range()
478 int pci_msi_vec_count(struct pci_dev *dev) in pci_msi_vec_count() argument
483 if (!dev->msi_cap) in pci_msi_vec_count()
486 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl); in pci_msi_vec_count()
497 bool __weak arch_restore_msi_irqs(struct pci_dev *dev) in arch_restore_msi_irqs() argument
502 void __pci_restore_msi_state(struct pci_dev *dev) in __pci_restore_msi_state() argument
507 if (!dev->msi_enabled) in __pci_restore_msi_state()
510 entry = irq_get_msi_desc(dev->irq); in __pci_restore_msi_state()
512 pci_intx_for_msi(dev, 0); in __pci_restore_msi_state()
513 pci_msi_set_enable(dev, 0); in __pci_restore_msi_state()
514 if (arch_restore_msi_irqs(dev)) in __pci_restore_msi_state()
517 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control); in __pci_restore_msi_state()
521 pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control); in __pci_restore_msi_state()
524 void pci_msi_shutdown(struct pci_dev *dev) in pci_msi_shutdown() argument
528 if (!pci_msi_enable || !dev || !dev->msi_enabled) in pci_msi_shutdown()
531 pci_msi_set_enable(dev, 0); in pci_msi_shutdown()
532 pci_intx_for_msi(dev, 1); in pci_msi_shutdown()
533 dev->msi_enabled = 0; in pci_msi_shutdown()
536 desc = msi_first_desc(&dev->dev, MSI_DESC_ALL); in pci_msi_shutdown()
541 dev->irq = desc->pci.msi_attrib.default_irq; in pci_msi_shutdown()
542 pcibios_alloc_irq(dev); in pci_msi_shutdown()
547 static void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u16 set) in pci_msix_clear_and_set_ctrl() argument
551 pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl); in pci_msix_clear_and_set_ctrl()
554 pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, ctrl); in pci_msix_clear_and_set_ctrl()
557 static void __iomem *msix_map_region(struct pci_dev *dev, in msix_map_region() argument
565 pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE, in msix_map_region()
568 flags = pci_resource_flags(dev, bir); in msix_map_region()
573 phys_addr = pci_resource_start(dev, bir) + table_offset; in msix_map_region()
596 void msix_prepare_msi_desc(struct pci_dev *dev, struct msi_desc *desc) in msix_prepare_msi_desc() argument
601 desc->pci.msi_attrib.default_irq = dev->irq; in msix_prepare_msi_desc()
602 desc->pci.mask_base = dev->msix_base; in msix_prepare_msi_desc()
613 static int msix_setup_msi_descs(struct pci_dev *dev, struct msix_entry *entries, in msix_setup_msi_descs() argument
616 int ret = 0, i, vec_count = pci_msix_vec_count(dev); in msix_setup_msi_descs()
627 msix_prepare_msi_desc(dev, &desc); in msix_setup_msi_descs()
629 ret = msi_insert_msi_desc(&dev->dev, &desc); in msix_setup_msi_descs()
636 static void msix_update_entries(struct pci_dev *dev, struct msix_entry *entries) in msix_update_entries() argument
641 msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL) { in msix_update_entries()
660 static int msix_setup_interrupts(struct pci_dev *dev, struct msix_entry *entries, in msix_setup_interrupts() argument
669 msi_lock_descs(&dev->dev); in msix_setup_interrupts()
670 ret = msix_setup_msi_descs(dev, entries, nvec, masks); in msix_setup_interrupts()
674 ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX); in msix_setup_interrupts()
679 ret = msi_verify_entries(dev); in msix_setup_interrupts()
683 msix_update_entries(dev, entries); in msix_setup_interrupts()
687 pci_free_msi_irqs(dev); in msix_setup_interrupts()
689 msi_unlock_descs(&dev->dev); in msix_setup_interrupts()
705 static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries, in msix_capability_init() argument
716 pci_msix_clear_and_set_ctrl(dev, 0, PCI_MSIX_FLAGS_MASKALL | in msix_capability_init()
720 dev->msix_enabled = 1; in msix_capability_init()
722 pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control); in msix_capability_init()
725 dev->msix_base = msix_map_region(dev, tsize); in msix_capability_init()
726 if (!dev->msix_base) { in msix_capability_init()
731 ret = msix_setup_interrupts(dev, entries, nvec, affd); in msix_capability_init()
736 pci_intx_for_msi(dev, 0); in msix_capability_init()
746 msix_mask_all(dev->msix_base, tsize); in msix_capability_init()
747 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0); in msix_capability_init()
749 pcibios_free_irq(dev); in msix_capability_init()
753 dev->msix_enabled = 0; in msix_capability_init()
754 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL | PCI_MSIX_FLAGS_ENABLE, 0); in msix_capability_init()
759 static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *entries, int nvec) in pci_msix_validate_entries() argument
767 nogap = pci_msi_domain_supports(dev, MSI_FLAG_MSIX_CONTIGUOUS, DENY_LEGACY); in pci_msix_validate_entries()
782 int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec, in __pci_enable_msix_range() argument
790 if (dev->msi_enabled) { in __pci_enable_msix_range()
791 pci_info(dev, "can't enable MSI-X (MSI already enabled)\n"); in __pci_enable_msix_range()
795 if (WARN_ON_ONCE(dev->msix_enabled)) in __pci_enable_msix_range()
799 if (!pci_msi_domain_supports(dev, MSI_FLAG_PCI_MSIX, ALLOW_LEGACY)) in __pci_enable_msix_range()
802 if (!pci_msi_supported(dev, nvec) || dev->current_state != PCI_D0) in __pci_enable_msix_range()
805 hwsize = pci_msix_vec_count(dev); in __pci_enable_msix_range()
809 if (!pci_msix_validate_entries(dev, entries, nvec)) in __pci_enable_msix_range()
823 rc = pci_setup_msi_context(dev); in __pci_enable_msix_range()
827 if (!pci_setup_msix_device_domain(dev, hwsize)) in __pci_enable_msix_range()
837 rc = msix_capability_init(dev, entries, nvec, affd); in __pci_enable_msix_range()
850 void __pci_restore_msix_state(struct pci_dev *dev) in __pci_restore_msix_state() argument
855 if (!dev->msix_enabled) in __pci_restore_msix_state()
859 pci_intx_for_msi(dev, 0); in __pci_restore_msix_state()
860 pci_msix_clear_and_set_ctrl(dev, 0, in __pci_restore_msix_state()
863 write_msg = arch_restore_msi_irqs(dev); in __pci_restore_msix_state()
865 msi_lock_descs(&dev->dev); in __pci_restore_msix_state()
866 msi_for_each_desc(entry, &dev->dev, MSI_DESC_ALL) { in __pci_restore_msix_state()
871 msi_unlock_descs(&dev->dev); in __pci_restore_msix_state()
873 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0); in __pci_restore_msix_state()
876 void pci_msix_shutdown(struct pci_dev *dev) in pci_msix_shutdown() argument
880 if (!pci_msi_enable || !dev || !dev->msix_enabled) in pci_msix_shutdown()
883 if (pci_dev_is_disconnected(dev)) { in pci_msix_shutdown()
884 dev->msix_enabled = 0; in pci_msix_shutdown()
889 msi_for_each_desc(desc, &dev->dev, MSI_DESC_ALL) in pci_msix_shutdown()
892 pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); in pci_msix_shutdown()
893 pci_intx_for_msi(dev, 1); in pci_msix_shutdown()
894 dev->msix_enabled = 0; in pci_msix_shutdown()
895 pcibios_alloc_irq(dev); in pci_msix_shutdown()
900 void pci_free_msi_irqs(struct pci_dev *dev) in pci_free_msi_irqs() argument
902 pci_msi_teardown_msi_irqs(dev); in pci_free_msi_irqs()
904 if (dev->msix_base) { in pci_free_msi_irqs()
905 iounmap(dev->msix_base); in pci_free_msi_irqs()
906 dev->msix_base = NULL; in pci_free_msi_irqs()
914 return to_pci_dev(desc->dev); in msi_desc_to_pci_dev()