aboutsummaryrefslogtreecommitdiff
path: root/pkgs/patches-linux-5.15/0016-PCI-pci-bridge-emul-Add-support-for-new-flag-PCI_BRI.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/patches-linux-5.15/0016-PCI-pci-bridge-emul-Add-support-for-new-flag-PCI_BRI.patch')
-rw-r--r--pkgs/patches-linux-5.15/0016-PCI-pci-bridge-emul-Add-support-for-new-flag-PCI_BRI.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/pkgs/patches-linux-5.15/0016-PCI-pci-bridge-emul-Add-support-for-new-flag-PCI_BRI.patch b/pkgs/patches-linux-5.15/0016-PCI-pci-bridge-emul-Add-support-for-new-flag-PCI_BRI.patch
new file mode 100644
index 0000000..5d0dad6
--- /dev/null
+++ b/pkgs/patches-linux-5.15/0016-PCI-pci-bridge-emul-Add-support-for-new-flag-PCI_BRI.patch
@@ -0,0 +1,62 @@
+From 369e0346a0e54c96ef8776bd32d810c4e1cbbb1d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
+Date: Tue, 16 Nov 2021 16:53:33 +0100
+Subject: [PATCH 16/90] PCI: pci-bridge-emul: Add support for new flag
+ PCI_BRIDGE_EMUL_NO_IO_FORWARD
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Like PCI_BRIDGE_EMUL_NO_PREFMEM_FORWARD, this new flag specifies that
+emulated PCI bridge does not support forwarding of IO requests in given
+range between primary and secondary buses. This flag should be used as
+argument for pci_bridge_emul_init() for hardware setup without IO support.
+
+Setting this flag cause that IO base and limit registers are read-only.
+
+Signed-off-by: Pali Rohár <pali@kernel.org>
+---
+ drivers/pci/pci-bridge-emul.c | 9 +++++++++
+ drivers/pci/pci-bridge-emul.h | 6 ++++++
+ 2 files changed, 15 insertions(+)
+
+diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c
+index ceacba03e714..a16f9e30099e 100644
+--- a/drivers/pci/pci-bridge-emul.c
++++ b/drivers/pci/pci-bridge-emul.c
+@@ -382,6 +382,15 @@ int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
+ bridge->pci_regs_behavior[PCI_PREF_MEMORY_BASE / 4].rw = 0;
+ }
+
++ if (flags & PCI_BRIDGE_EMUL_NO_IO_FORWARD) {
++ bridge->pci_regs_behavior[PCI_COMMAND / 4].ro |= PCI_COMMAND_IO;
++ bridge->pci_regs_behavior[PCI_COMMAND / 4].rw &= ~PCI_COMMAND_IO;
++ bridge->pci_regs_behavior[PCI_IO_BASE / 4].ro |= GENMASK(15, 0);
++ bridge->pci_regs_behavior[PCI_IO_BASE / 4].rw &= ~GENMASK(15, 0);
++ bridge->pci_regs_behavior[PCI_IO_BASE_UPPER16 / 4].ro = ~0;
++ bridge->pci_regs_behavior[PCI_IO_BASE_UPPER16 / 4].rw = 0;
++ }
++
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(pci_bridge_emul_init);
+diff --git a/drivers/pci/pci-bridge-emul.h b/drivers/pci/pci-bridge-emul.h
+index 087b5fa01bcf..4953274cac18 100644
+--- a/drivers/pci/pci-bridge-emul.h
++++ b/drivers/pci/pci-bridge-emul.h
+@@ -125,6 +125,12 @@ enum {
+ * requests between primary and secondary buses.
+ */
+ PCI_BRIDGE_EMUL_NO_PREFMEM_FORWARD = BIT(0),
++
++ /*
++ * PCI bridge does not support forwarding of IO requests between
++ * primary and secondary buses.
++ */
++ PCI_BRIDGE_EMUL_NO_IO_FORWARD = BIT(1),
+ };
+
+ int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
+--
+2.34.1
+