Lines Matching +full:msi +full:- +full:parent
1 // SPDX-License-Identifier: GPL-2.0-only
7 #include "irq-msi-lib.h"
10 * msi_lib_init_dev_msi_info - Domain info setup for MSI domains
13 * @real_parent: The real parent domain of the domain to be initialized
18 * This function is to be used for all types of MSI domains above the root
19 * parent domain and any intermediates. The topmost parent domain specific
30 const struct msi_parent_ops *pops = real_parent->msi_parent_ops; in msi_lib_init_dev_msi_info()
31 struct irq_chip *chip = info->chip; in msi_lib_init_dev_msi_info()
34 /* Parent ops available? */ in msi_lib_init_dev_msi_info()
39 * MSI parent domain specific settings. For now there is only the in msi_lib_init_dev_msi_info()
40 * root parent domain, e.g. NEXUS, acting as a MSI parent, but it is in msi_lib_init_dev_msi_info()
41 * possible to stack MSI parents. See x86 vector -> irq remapping in msi_lib_init_dev_msi_info()
43 if (domain->bus_token == pops->bus_select_token) { in msi_lib_init_dev_msi_info()
51 required_flags = pops->required_flags; in msi_lib_init_dev_msi_info()
54 switch(info->bus_token) { in msi_lib_init_dev_msi_info()
63 * Per device MSI should never have any MSI feature bits in msi_lib_init_dev_msi_info()
68 if (WARN_ON_ONCE(info->flags)) in msi_lib_init_dev_msi_info()
71 /* Core managed MSI descriptors */ in msi_lib_init_dev_msi_info()
72 info->flags = MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS | MSI_FLAG_FREE_MSI_DESCS; in msi_lib_init_dev_msi_info()
88 * Mask out the domain specific MSI feature flags which are not in msi_lib_init_dev_msi_info()
89 * supported by the real parent. in msi_lib_init_dev_msi_info()
91 info->flags &= pops->supported_flags; in msi_lib_init_dev_msi_info()
93 info->flags |= required_flags; in msi_lib_init_dev_msi_info()
96 if (!chip->irq_eoi && (pops->chip_flags & MSI_CHIP_FLAG_SET_EOI)) in msi_lib_init_dev_msi_info()
97 chip->irq_eoi = irq_chip_eoi_parent; in msi_lib_init_dev_msi_info()
98 if (!chip->irq_ack && (pops->chip_flags & MSI_CHIP_FLAG_SET_ACK)) in msi_lib_init_dev_msi_info()
99 chip->irq_ack = irq_chip_ack_parent; in msi_lib_init_dev_msi_info()
102 * The device MSI domain can never have a set affinity callback. It in msi_lib_init_dev_msi_info()
103 * always has to rely on the parent domain to handle affinity in msi_lib_init_dev_msi_info()
104 * settings. The device MSI domain just has to write the resulting in msi_lib_init_dev_msi_info()
105 * MSI message into the hardware which is the whole purpose of the in msi_lib_init_dev_msi_info()
106 * device MSI domain aside of mask/unmask which is provided e.g. by in msi_lib_init_dev_msi_info()
107 * PCI/MSI device domains. in msi_lib_init_dev_msi_info()
109 chip->irq_set_affinity = msi_domain_set_affinity; in msi_lib_init_dev_msi_info()
115 * msi_lib_irq_domain_select - Shared select function for NEXUS domains
123 * if @d is providing the parent MSI domain for the functionality
129 const struct msi_parent_ops *ops = d->msi_parent_ops; in msi_lib_irq_domain_select()
135 if (fwspec->fwnode != d->fwnode || fwspec->param_count != 0) in msi_lib_irq_domain_select()
139 if (bus_token == ops->bus_select_token) in msi_lib_irq_domain_select()
142 return !!(ops->bus_select_mask & busmask); in msi_lib_irq_domain_select()