diff mbox series

[v2] PCI: vmd: Disable MSI remapping after suspend

Message ID 20221109142652.450998-1-nirmal.patel@linux.intel.com (mailing list archive)
State Accepted
Delegated to: Lorenzo Pieralisi
Headers show
Series [v2] PCI: vmd: Disable MSI remapping after suspend | expand

Commit Message

Nirmal Patel Nov. 9, 2022, 2:26 p.m. UTC
MSI remapping is disabled by VMD driver for Intel's Icelake and
newer systems in order to improve performance by setting
VMCONFIG_MSI_REMAP. By design VMCONFIG_MSI_REMAP register is cleared
by firmware during boot. The same register gets cleared when system
is put in S3 power state. VMD driver needs to set this register again
in order to avoid interrupt issues with devices behind VMD if MSI
remapping was disabled before.

Fixes: ee81ee84f873 ("PCI: vmd: Disable MSI-X remapping when possible")
Signed-off-by: Nirmal Patel <nirmal.patel@linux.intel.com>
Reviewed-by: Francisco Munoz <francisco.munoz.ruiz@linux.intel.com>
---
v1->v2: Updating commit log and removing firmware dependency.
---
 drivers/pci/controller/vmd.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Lorenzo Pieralisi Nov. 11, 2022, 11:01 a.m. UTC | #1
On Wed, 9 Nov 2022 07:26:52 -0700, Nirmal Patel wrote:
> MSI remapping is disabled by VMD driver for Intel's Icelake and
> newer systems in order to improve performance by setting
> VMCONFIG_MSI_REMAP. By design VMCONFIG_MSI_REMAP register is cleared
> by firmware during boot. The same register gets cleared when system
> is put in S3 power state. VMD driver needs to set this register again
> in order to avoid interrupt issues with devices behind VMD if MSI
> remapping was disabled before.
> 
> [...]

Applied to pci/vmd, thanks!

[1/1] PCI: vmd: Disable MSI remapping after suspend
      https://git.kernel.org/lpieralisi/pci/c/d899aa668498

Thanks,
Lorenzo
diff mbox series

Patch

diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index e06e9f4fc50f..98e0746e681c 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -980,6 +980,11 @@  static int vmd_resume(struct device *dev)
 	struct vmd_dev *vmd = pci_get_drvdata(pdev);
 	int err, i;
 
+       if (vmd->irq_domain)
+               vmd_set_msi_remapping(vmd, true);
+       else
+               vmd_set_msi_remapping(vmd, false);
+
 	for (i = 0; i < vmd->msix_count; i++) {
 		err = devm_request_irq(dev, vmd->irqs[i].virq,
 				       vmd_irq, IRQF_NO_THREAD,