forked from luck/tmp_suning_uos_patched
x86/msi: Consolidate MSI allocation
Convert the interrupt remap drivers to retrieve the pci device from the msi descriptor and use info::hwirq. This is the first step to prepare x86 for using the generic MSI domain ops. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Wei Liu <wei.liu@kernel.org> Acked-by: Joerg Roedel <jroedel@suse.de> Link: https://lore.kernel.org/r/20200826112332.466405395@linutronix.de
This commit is contained in:
parent
dfb9eb7cf6
commit
3b9c1d377d
|
@ -86,14 +86,6 @@ struct irq_alloc_info {
|
||||||
union {
|
union {
|
||||||
struct ioapic_alloc_info ioapic;
|
struct ioapic_alloc_info ioapic;
|
||||||
struct uv_alloc_info uv;
|
struct uv_alloc_info uv;
|
||||||
|
|
||||||
int unused;
|
|
||||||
#ifdef CONFIG_PCI_MSI
|
|
||||||
struct {
|
|
||||||
struct pci_dev *msi_dev;
|
|
||||||
irq_hw_number_t msi_hwirq;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,6 @@ int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||||
|
|
||||||
init_irq_alloc_info(&info, NULL);
|
init_irq_alloc_info(&info, NULL);
|
||||||
info.type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
|
info.type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
|
||||||
info.msi_dev = dev;
|
|
||||||
|
|
||||||
domain = irq_remapping_get_irq_domain(&info);
|
domain = irq_remapping_get_irq_domain(&info);
|
||||||
if (domain == NULL)
|
if (domain == NULL)
|
||||||
|
@ -207,7 +206,7 @@ void native_teardown_msi_irq(unsigned int irq)
|
||||||
static irq_hw_number_t pci_msi_get_hwirq(struct msi_domain_info *info,
|
static irq_hw_number_t pci_msi_get_hwirq(struct msi_domain_info *info,
|
||||||
msi_alloc_info_t *arg)
|
msi_alloc_info_t *arg)
|
||||||
{
|
{
|
||||||
return arg->msi_hwirq;
|
return arg->hwirq;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
|
int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
|
||||||
|
@ -217,7 +216,6 @@ int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
|
||||||
struct msi_desc *desc = first_pci_msi_entry(pdev);
|
struct msi_desc *desc = first_pci_msi_entry(pdev);
|
||||||
|
|
||||||
init_irq_alloc_info(arg, NULL);
|
init_irq_alloc_info(arg, NULL);
|
||||||
arg->msi_dev = pdev;
|
|
||||||
if (desc->msi_attrib.is_msix) {
|
if (desc->msi_attrib.is_msix) {
|
||||||
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
|
arg->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
|
||||||
} else {
|
} else {
|
||||||
|
@ -231,7 +229,8 @@ EXPORT_SYMBOL_GPL(pci_msi_prepare);
|
||||||
|
|
||||||
void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
|
void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
|
||||||
{
|
{
|
||||||
arg->msi_hwirq = pci_msi_domain_calc_hwirq(desc);
|
arg->desc = desc;
|
||||||
|
arg->hwirq = pci_msi_domain_calc_hwirq(desc);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pci_msi_set_desc);
|
EXPORT_SYMBOL_GPL(pci_msi_set_desc);
|
||||||
|
|
||||||
|
|
|
@ -3528,7 +3528,7 @@ static int get_devid(struct irq_alloc_info *info)
|
||||||
return get_hpet_devid(info->devid);
|
return get_hpet_devid(info->devid);
|
||||||
case X86_IRQ_ALLOC_TYPE_PCI_MSI:
|
case X86_IRQ_ALLOC_TYPE_PCI_MSI:
|
||||||
case X86_IRQ_ALLOC_TYPE_PCI_MSIX:
|
case X86_IRQ_ALLOC_TYPE_PCI_MSIX:
|
||||||
return get_device_id(&info->msi_dev->dev);
|
return get_device_id(msi_desc_to_dev(info->desc));
|
||||||
default:
|
default:
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -3702,7 +3702,8 @@ static int irq_remapping_alloc(struct irq_domain *domain, unsigned int virq,
|
||||||
info->type == X86_IRQ_ALLOC_TYPE_PCI_MSIX) {
|
info->type == X86_IRQ_ALLOC_TYPE_PCI_MSIX) {
|
||||||
bool align = (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI);
|
bool align = (info->type == X86_IRQ_ALLOC_TYPE_PCI_MSI);
|
||||||
|
|
||||||
index = alloc_irq_index(devid, nr_irqs, align, info->msi_dev);
|
index = alloc_irq_index(devid, nr_irqs, align,
|
||||||
|
msi_desc_to_pci_dev(info->desc));
|
||||||
} else {
|
} else {
|
||||||
index = alloc_irq_index(devid, nr_irqs, false, NULL);
|
index = alloc_irq_index(devid, nr_irqs, false, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1124,7 +1124,7 @@ static struct irq_domain *intel_get_irq_domain(struct irq_alloc_info *info)
|
||||||
return map_hpet_to_ir(info->devid);
|
return map_hpet_to_ir(info->devid);
|
||||||
case X86_IRQ_ALLOC_TYPE_PCI_MSI:
|
case X86_IRQ_ALLOC_TYPE_PCI_MSI:
|
||||||
case X86_IRQ_ALLOC_TYPE_PCI_MSIX:
|
case X86_IRQ_ALLOC_TYPE_PCI_MSIX:
|
||||||
return map_dev_to_ir(info->msi_dev);
|
return map_dev_to_ir(msi_desc_to_pci_dev(info->desc));
|
||||||
default:
|
default:
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1293,7 +1293,7 @@ static void intel_irq_remapping_prepare_irte(struct intel_ir_data *data,
|
||||||
if (info->type == X86_IRQ_ALLOC_TYPE_HPET)
|
if (info->type == X86_IRQ_ALLOC_TYPE_HPET)
|
||||||
set_hpet_sid(irte, info->devid);
|
set_hpet_sid(irte, info->devid);
|
||||||
else
|
else
|
||||||
set_msi_sid(irte, info->msi_dev);
|
set_msi_sid(irte, msi_desc_to_pci_dev(info->desc));
|
||||||
|
|
||||||
msg->address_hi = MSI_ADDR_BASE_HI;
|
msg->address_hi = MSI_ADDR_BASE_HI;
|
||||||
msg->data = sub_handle;
|
msg->data = sub_handle;
|
||||||
|
|
|
@ -1534,7 +1534,7 @@ static struct irq_chip hv_msi_irq_chip = {
|
||||||
static irq_hw_number_t hv_msi_domain_ops_get_hwirq(struct msi_domain_info *info,
|
static irq_hw_number_t hv_msi_domain_ops_get_hwirq(struct msi_domain_info *info,
|
||||||
msi_alloc_info_t *arg)
|
msi_alloc_info_t *arg)
|
||||||
{
|
{
|
||||||
return arg->msi_hwirq;
|
return arg->hwirq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct msi_domain_ops hv_msi_ops = {
|
static struct msi_domain_ops hv_msi_ops = {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user