-
-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
83 additions
and
0 deletions.
There are no files selected for viewing
82 changes: 82 additions & 0 deletions
82
0001-xen-pciback-Consider-INTx-disabled-when-MSI-MSI-X-is.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
From 7336f034ba268aa2d3bf944e18b6a63e704799c1 Mon Sep 17 00:00:00 2001 | ||
From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= | ||
<marmarek@invisiblethingslab.com> | ||
Date: Thu, 17 Nov 2022 12:35:41 +0100 | ||
Subject: [PATCH] xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
Linux enables MSI-X before disabling INTx, but keeps MSI-X masked until | ||
the table is filled. Then it disables INTx just before clearing MASKALL | ||
bit. Currently this approach is rejected by xen-pciback. | ||
According to the PCIe spec, device cannot use INTx when MSI/MSI-X is | ||
enabled. Change the logic to consider INTx disabled if MSI/MSI-X is | ||
enabled. This applies to two places: checking currently enabled | ||
interrupts type, and transition to MSI/MSI-X - where INTx would be | ||
implicitly disabled. | ||
|
||
Fixes: 5e29500eba2a ("xen-pciback: Allow setting PCI_MSIX_FLAGS_MASKALL too") | ||
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com> | ||
--- | ||
drivers/xen/xen-pciback/conf_space.c | 19 +++++++++++++------ | ||
.../xen/xen-pciback/conf_space_capability.c | 3 ++- | ||
2 files changed, 15 insertions(+), 7 deletions(-) | ||
|
||
diff --git a/drivers/xen/xen-pciback/conf_space.c b/drivers/xen/xen-pciback/conf_space.c | ||
index 059de92aea7d..d47eee6c5143 100644 | ||
--- a/drivers/xen/xen-pciback/conf_space.c | ||
+++ b/drivers/xen/xen-pciback/conf_space.c | ||
@@ -288,12 +288,6 @@ int xen_pcibk_get_interrupt_type(struct pci_dev *dev) | ||
u16 val; | ||
int ret = 0; | ||
|
||
- err = pci_read_config_word(dev, PCI_COMMAND, &val); | ||
- if (err) | ||
- return err; | ||
- if (!(val & PCI_COMMAND_INTX_DISABLE)) | ||
- ret |= INTERRUPT_TYPE_INTX; | ||
- | ||
/* | ||
* Do not trust dev->msi(x)_enabled here, as enabling could be done | ||
* bypassing the pci_*msi* functions, by the qemu. | ||
@@ -316,6 +310,19 @@ int xen_pcibk_get_interrupt_type(struct pci_dev *dev) | ||
if (val & PCI_MSIX_FLAGS_ENABLE) | ||
ret |= INTERRUPT_TYPE_MSIX; | ||
} | ||
+ | ||
+ /* | ||
+ * PCIe spec says device cannot use INTx if MSI/MSI-X is enabled, | ||
+ * so check for INTx only when both are disabled. | ||
+ */ | ||
+ if (!ret) { | ||
+ err = pci_read_config_word(dev, PCI_COMMAND, &val); | ||
+ if (err) | ||
+ return err; | ||
+ if (!(val & PCI_COMMAND_INTX_DISABLE)) | ||
+ ret |= INTERRUPT_TYPE_INTX; | ||
+ } | ||
+ | ||
return ret ?: INTERRUPT_TYPE_NONE; | ||
} | ||
|
||
diff --git a/drivers/xen/xen-pciback/conf_space_capability.c b/drivers/xen/xen-pciback/conf_space_capability.c | ||
index 097316a74126..eb4c1af44f5c 100644 | ||
--- a/drivers/xen/xen-pciback/conf_space_capability.c | ||
+++ b/drivers/xen/xen-pciback/conf_space_capability.c | ||
@@ -236,10 +236,11 @@ static int msi_msix_flags_write(struct pci_dev *dev, int offset, u16 new_value, | ||
return PCIBIOS_SET_FAILED; | ||
|
||
if (new_value & field_config->enable_bit) { | ||
- /* don't allow enabling together with other interrupt types */ | ||
+ /* don't allow enabling together with other interrupt type */ | ||
int int_type = xen_pcibk_get_interrupt_type(dev); | ||
|
||
if (int_type == INTERRUPT_TYPE_NONE || | ||
+ int_type == INTERRUPT_TYPE_INTX || | ||
int_type == field_config->int_type) | ||
goto write; | ||
return PCIBIOS_SET_FAILED; | ||
-- | ||
2.37.3 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters