Merge branch 'pci/ims-removal'
- Remove unused Interrupt Message Store (IMS) support (Bjorn Helgaas) * pci/ims-removal: Revert "genirq/msi: Provide constants for PCI/IMS support" Revert "x86/apic/msi: Enable PCI/IMS" Revert "iommu/vt-d: Enable PCI/IMS" Revert "iommu/amd: Enable PCI/IMS" Revert "PCI/MSI: Provide IMS (Interrupt Message Store) support" Revert "PCI/MSI: Provide pci_ims_alloc/free_irq()" Revert "PCI/MSI: Provide stubs for IMS functions"
This commit is contained in:
commit
375a99fd86
@ -184,7 +184,6 @@ static int x86_msi_prepare(struct irq_domain *domain, struct device *dev,
|
||||
alloc->type = X86_IRQ_ALLOC_TYPE_PCI_MSI;
|
||||
return 0;
|
||||
case DOMAIN_BUS_PCI_DEVICE_MSIX:
|
||||
case DOMAIN_BUS_PCI_DEVICE_IMS:
|
||||
alloc->type = X86_IRQ_ALLOC_TYPE_PCI_MSIX;
|
||||
return 0;
|
||||
default:
|
||||
@ -229,10 +228,6 @@ static bool x86_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
|
||||
case DOMAIN_BUS_PCI_DEVICE_MSI:
|
||||
case DOMAIN_BUS_PCI_DEVICE_MSIX:
|
||||
break;
|
||||
case DOMAIN_BUS_PCI_DEVICE_IMS:
|
||||
if (!(pops->supported_flags & MSI_FLAG_PCI_IMS))
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
return false;
|
||||
|
@ -3701,20 +3701,11 @@ static struct irq_chip amd_ir_chip = {
|
||||
};
|
||||
|
||||
static const struct msi_parent_ops amdvi_msi_parent_ops = {
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED |
|
||||
MSI_FLAG_MULTI_PCI_MSI |
|
||||
MSI_FLAG_PCI_IMS,
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
|
||||
.prefix = "IR-",
|
||||
.init_dev_msi_info = msi_parent_init_dev_msi_info,
|
||||
};
|
||||
|
||||
static const struct msi_parent_ops virt_amdvi_msi_parent_ops = {
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED |
|
||||
MSI_FLAG_MULTI_PCI_MSI,
|
||||
.prefix = "vIR-",
|
||||
.init_dev_msi_info = msi_parent_init_dev_msi_info,
|
||||
};
|
||||
|
||||
int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
|
||||
{
|
||||
struct fwnode_handle *fn;
|
||||
@ -3732,11 +3723,7 @@ int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
|
||||
irq_domain_update_bus_token(iommu->ir_domain, DOMAIN_BUS_AMDVI);
|
||||
iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT |
|
||||
IRQ_DOMAIN_FLAG_ISOLATED_MSI;
|
||||
|
||||
if (amd_iommu_np_cache)
|
||||
iommu->ir_domain->msi_parent_ops = &virt_amdvi_msi_parent_ops;
|
||||
else
|
||||
iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops;
|
||||
iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ static const struct irq_domain_ops intel_ir_domain_ops;
|
||||
|
||||
static void iommu_disable_irq_remapping(struct intel_iommu *iommu);
|
||||
static int __init parse_ioapics_under_ir(void);
|
||||
static const struct msi_parent_ops dmar_msi_parent_ops, virt_dmar_msi_parent_ops;
|
||||
static const struct msi_parent_ops dmar_msi_parent_ops;
|
||||
|
||||
static bool ir_pre_enabled(struct intel_iommu *iommu)
|
||||
{
|
||||
@ -567,11 +567,7 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
|
||||
irq_domain_update_bus_token(iommu->ir_domain, DOMAIN_BUS_DMAR);
|
||||
iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT |
|
||||
IRQ_DOMAIN_FLAG_ISOLATED_MSI;
|
||||
|
||||
if (cap_caching_mode(iommu->cap))
|
||||
iommu->ir_domain->msi_parent_ops = &virt_dmar_msi_parent_ops;
|
||||
else
|
||||
iommu->ir_domain->msi_parent_ops = &dmar_msi_parent_ops;
|
||||
iommu->ir_domain->msi_parent_ops = &dmar_msi_parent_ops;
|
||||
|
||||
ir_table->base = page_address(pages);
|
||||
ir_table->bitmap = bitmap;
|
||||
@ -1421,20 +1417,11 @@ static const struct irq_domain_ops intel_ir_domain_ops = {
|
||||
};
|
||||
|
||||
static const struct msi_parent_ops dmar_msi_parent_ops = {
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED |
|
||||
MSI_FLAG_MULTI_PCI_MSI |
|
||||
MSI_FLAG_PCI_IMS,
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
|
||||
.prefix = "IR-",
|
||||
.init_dev_msi_info = msi_parent_init_dev_msi_info,
|
||||
};
|
||||
|
||||
static const struct msi_parent_ops virt_dmar_msi_parent_ops = {
|
||||
.supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED |
|
||||
MSI_FLAG_MULTI_PCI_MSI,
|
||||
.prefix = "vIR-",
|
||||
.init_dev_msi_info = msi_parent_init_dev_msi_info,
|
||||
};
|
||||
|
||||
/*
|
||||
* Support of Interrupt Remapping Unit Hotplug
|
||||
*/
|
||||
|
@ -365,56 +365,6 @@ const struct cpumask *pci_irq_get_affinity(struct pci_dev *dev, int nr)
|
||||
}
|
||||
EXPORT_SYMBOL(pci_irq_get_affinity);
|
||||
|
||||
/**
|
||||
* pci_ims_alloc_irq - Allocate an interrupt on a PCI/IMS interrupt domain
|
||||
* @dev: The PCI device to operate on
|
||||
* @icookie: Pointer to an IMS implementation specific cookie for this
|
||||
* IMS instance (PASID, queue ID, pointer...).
|
||||
* The cookie content is copied into the MSI descriptor for the
|
||||
* interrupt chip callbacks or domain specific setup functions.
|
||||
* @affdesc: Optional pointer to an interrupt affinity descriptor
|
||||
*
|
||||
* There is no index for IMS allocations as IMS is an implementation
|
||||
* specific storage and does not have any direct associations between
|
||||
* index, which might be a pure software construct, and device
|
||||
* functionality. This association is established by the driver either via
|
||||
* the index - if there is a hardware table - or in case of purely software
|
||||
* managed IMS implementation the association happens via the
|
||||
* irq_write_msi_msg() callback of the implementation specific interrupt
|
||||
* chip, which utilizes the provided @icookie to store the MSI message in
|
||||
* the appropriate place.
|
||||
*
|
||||
* Return: A struct msi_map
|
||||
*
|
||||
* On success msi_map::index contains the allocated index (>= 0) and
|
||||
* msi_map::virq the allocated Linux interrupt number (> 0).
|
||||
*
|
||||
* On fail msi_map::index contains the error code and msi_map::virq
|
||||
* is set to 0.
|
||||
*/
|
||||
struct msi_map pci_ims_alloc_irq(struct pci_dev *dev, union msi_instance_cookie *icookie,
|
||||
const struct irq_affinity_desc *affdesc)
|
||||
{
|
||||
return msi_domain_alloc_irq_at(&dev->dev, MSI_SECONDARY_DOMAIN, MSI_ANY_INDEX,
|
||||
affdesc, icookie);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_ims_alloc_irq);
|
||||
|
||||
/**
|
||||
* pci_ims_free_irq - Allocate an interrupt on a PCI/IMS interrupt domain
|
||||
* which was allocated via pci_ims_alloc_irq()
|
||||
* @dev: The PCI device to operate on
|
||||
* @map: A struct msi_map describing the interrupt to free as
|
||||
* returned from pci_ims_alloc_irq()
|
||||
*/
|
||||
void pci_ims_free_irq(struct pci_dev *dev, struct msi_map map)
|
||||
{
|
||||
if (WARN_ON_ONCE(map.index < 0 || map.virq <= 0))
|
||||
return;
|
||||
msi_domain_free_irqs_range(&dev->dev, MSI_SECONDARY_DOMAIN, map.index, map.index);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_ims_free_irq);
|
||||
|
||||
/**
|
||||
* pci_free_irq_vectors() - Free previously allocated IRQs for a device
|
||||
* @dev: the PCI device to operate on
|
||||
|
@ -355,65 +355,6 @@ bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask,
|
||||
return (supported & feature_mask) == feature_mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_create_ims_domain - Create a secondary IMS domain for a PCI device
|
||||
* @pdev: The PCI device to operate on
|
||||
* @template: The MSI info template which describes the domain
|
||||
* @hwsize: The size of the hardware entry table or 0 if the domain
|
||||
* is purely software managed
|
||||
* @data: Optional pointer to domain specific data to be stored
|
||||
* in msi_domain_info::data
|
||||
*
|
||||
* Return: True on success, false otherwise
|
||||
*
|
||||
* An IMS domain is expected to have the following constraints:
|
||||
* - The index space is managed by the core code
|
||||
*
|
||||
* - There is no requirement for consecutive index ranges
|
||||
*
|
||||
* - The interrupt chip must provide the following callbacks:
|
||||
* - irq_mask()
|
||||
* - irq_unmask()
|
||||
* - irq_write_msi_msg()
|
||||
*
|
||||
* - The interrupt chip must provide the following optional callbacks
|
||||
* when the irq_mask(), irq_unmask() and irq_write_msi_msg() callbacks
|
||||
* cannot operate directly on hardware, e.g. in the case that the
|
||||
* interrupt message store is in queue memory:
|
||||
* - irq_bus_lock()
|
||||
* - irq_bus_unlock()
|
||||
*
|
||||
* These callbacks are invoked from preemptible task context and are
|
||||
* allowed to sleep. In this case the mandatory callbacks above just
|
||||
* store the information. The irq_bus_unlock() callback is supposed
|
||||
* to make the change effective before returning.
|
||||
*
|
||||
* - Interrupt affinity setting is handled by the underlying parent
|
||||
* interrupt domain and communicated to the IMS domain via
|
||||
* irq_write_msi_msg().
|
||||
*
|
||||
* The domain is automatically destroyed when the PCI device is removed.
|
||||
*/
|
||||
bool pci_create_ims_domain(struct pci_dev *pdev, const struct msi_domain_template *template,
|
||||
unsigned int hwsize, void *data)
|
||||
{
|
||||
struct irq_domain *domain = dev_get_msi_domain(&pdev->dev);
|
||||
|
||||
if (!domain || !irq_domain_is_msi_parent(domain))
|
||||
return false;
|
||||
|
||||
if (template->info.bus_token != DOMAIN_BUS_PCI_DEVICE_IMS ||
|
||||
!(template->info.flags & MSI_FLAG_ALLOC_SIMPLE_MSI_DESCS) ||
|
||||
!(template->info.flags & MSI_FLAG_FREE_MSI_DESCS) ||
|
||||
!template->chip.irq_mask || !template->chip.irq_unmask ||
|
||||
!template->chip.irq_write_msi_msg || template->chip.irq_set_affinity)
|
||||
return false;
|
||||
|
||||
return msi_create_device_irq_domain(&pdev->dev, MSI_SECONDARY_DOMAIN, template,
|
||||
hwsize, data, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_create_ims_domain);
|
||||
|
||||
/*
|
||||
* Users of the generic MSI infrastructure expect a device to have a single ID,
|
||||
* so with DMA aliases we have to pick the least-worst compromise. Devices with
|
||||
|
@ -25,7 +25,6 @@ enum irq_domain_bus_token {
|
||||
DOMAIN_BUS_PCI_DEVICE_MSIX,
|
||||
DOMAIN_BUS_DMAR,
|
||||
DOMAIN_BUS_AMDVI,
|
||||
DOMAIN_BUS_PCI_DEVICE_IMS,
|
||||
DOMAIN_BUS_DEVICE_MSI,
|
||||
DOMAIN_BUS_WIRED_TO_MSI,
|
||||
};
|
||||
|
@ -573,8 +573,6 @@ enum {
|
||||
MSI_FLAG_MSIX_CONTIGUOUS = (1 << 19),
|
||||
/* PCI/MSI-X vectors can be dynamically allocated/freed post MSI-X enable */
|
||||
MSI_FLAG_PCI_MSIX_ALLOC_DYN = (1 << 20),
|
||||
/* Support for PCI/IMS */
|
||||
MSI_FLAG_PCI_IMS = (1 << 21),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -15,7 +15,6 @@ struct device;
|
||||
*/
|
||||
enum msi_domain_ids {
|
||||
MSI_DEFAULT_DOMAIN,
|
||||
MSI_SECONDARY_DOMAIN,
|
||||
MSI_MAX_DEVICE_IRQDOMAINS,
|
||||
};
|
||||
|
||||
|
@ -1656,8 +1656,6 @@ struct msix_entry {
|
||||
u16 entry; /* Driver uses to specify entry, OS writes */
|
||||
};
|
||||
|
||||
struct msi_domain_template;
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
int pci_msi_vec_count(struct pci_dev *dev);
|
||||
void pci_disable_msi(struct pci_dev *dev);
|
||||
@ -1690,11 +1688,6 @@ void pci_msix_free_irq(struct pci_dev *pdev, struct msi_map map);
|
||||
void pci_free_irq_vectors(struct pci_dev *dev);
|
||||
int pci_irq_vector(struct pci_dev *dev, unsigned int nr);
|
||||
const struct cpumask *pci_irq_get_affinity(struct pci_dev *pdev, int vec);
|
||||
bool pci_create_ims_domain(struct pci_dev *pdev, const struct msi_domain_template *template,
|
||||
unsigned int hwsize, void *data);
|
||||
struct msi_map pci_ims_alloc_irq(struct pci_dev *pdev, union msi_instance_cookie *icookie,
|
||||
const struct irq_affinity_desc *affdesc);
|
||||
void pci_ims_free_irq(struct pci_dev *pdev, struct msi_map map);
|
||||
|
||||
#else
|
||||
static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
|
||||
@ -1758,25 +1751,6 @@ static inline const struct cpumask *pci_irq_get_affinity(struct pci_dev *pdev,
|
||||
{
|
||||
return cpu_possible_mask;
|
||||
}
|
||||
|
||||
static inline bool pci_create_ims_domain(struct pci_dev *pdev,
|
||||
const struct msi_domain_template *template,
|
||||
unsigned int hwsize, void *data)
|
||||
{ return false; }
|
||||
|
||||
static inline struct msi_map pci_ims_alloc_irq(struct pci_dev *pdev,
|
||||
union msi_instance_cookie *icookie,
|
||||
const struct irq_affinity_desc *affdesc)
|
||||
{
|
||||
struct msi_map map = { .index = -ENOSYS, };
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
static inline void pci_ims_free_irq(struct pci_dev *pdev, struct msi_map map)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user