Commit 375a99fd authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

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"
parents f8891023 8a1940bc
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -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;
+2 −15
Original line number Diff line number Diff line
@@ -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,10 +3723,6 @@ 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;

	return 0;
+3 −16
Original line number Diff line number Diff line
@@ -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,10 +567,6 @@ 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;

	ir_table->base = page_address(pages);
@@ -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
 */
+0 −50
Original line number Diff line number Diff line
@@ -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
+0 −59
Original line number Diff line number Diff line
@@ -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
Loading