Lines Matching +full:pci +full:- +full:domain
1 // SPDX-License-Identifier: GPL-2.0
3 * PCI Endpoint *Controller* (EPC) MSI library
15 #include <linux/pci-epc.h>
16 #include <linux/pci-epf.h>
17 #include <linux/pci-ep-cfs.h>
18 #include <linux/pci-ep-msi.h>
30 epf = list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list); in pci_epf_write_msi_msg()
32 if (epf && epf->db_msg && desc->msi_index < epf->num_db) in pci_epf_write_msi_msg()
33 memcpy(&epf->db_msg[desc->msi_index].msg, msg, sizeof(*msg)); in pci_epf_write_msi_msg()
40 struct pci_epc *epc = epf->epc; in pci_epf_alloc_doorbell()
41 struct device *dev = &epf->dev; in pci_epf_alloc_doorbell()
42 struct irq_domain *domain; in pci_epf_alloc_doorbell() local
47 /* TODO: Multi-EPF support */ in pci_epf_alloc_doorbell()
48 if (list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list) != epf) { in pci_epf_alloc_doorbell()
50 return -EINVAL; in pci_epf_alloc_doorbell()
53 domain = of_msi_map_get_device_domain(epc->dev.parent, 0, in pci_epf_alloc_doorbell()
55 if (!domain) { in pci_epf_alloc_doorbell()
56 dev_err(dev, "Can't find MSI domain for EPC\n"); in pci_epf_alloc_doorbell()
57 return -ENODEV; in pci_epf_alloc_doorbell()
60 if (!irq_domain_is_msi_parent(domain)) in pci_epf_alloc_doorbell()
61 return -ENODEV; in pci_epf_alloc_doorbell()
63 if (!irq_domain_is_msi_immutable(domain)) { in pci_epf_alloc_doorbell()
65 return -ENODEV; in pci_epf_alloc_doorbell()
68 dev_set_msi_domain(epc->dev.parent, domain); in pci_epf_alloc_doorbell()
72 return -ENOMEM; in pci_epf_alloc_doorbell()
74 epf->num_db = num_db; in pci_epf_alloc_doorbell()
75 epf->db_msg = msg; in pci_epf_alloc_doorbell()
77 ret = platform_device_msi_init_and_alloc_irqs(epc->dev.parent, num_db, in pci_epf_alloc_doorbell()
86 epf->db_msg[i].virq = msi_get_virq(epc->dev.parent, i); in pci_epf_alloc_doorbell()
94 platform_device_msi_free_irqs_all(epf->epc->dev.parent); in pci_epf_free_doorbell()
96 kfree(epf->db_msg); in pci_epf_free_doorbell()
97 epf->db_msg = NULL; in pci_epf_free_doorbell()
98 epf->num_db = 0; in pci_epf_free_doorbell()