linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sergey Miroshnichenko <s.miroshnichenko@yadro.com>
To: <linux-pci@vger.kernel.org>
Cc: <linux@yadro.com>, Sergey Miroshnichenko <s.miroshnichenko@yadro.com>
Subject: [PATCH RFC v2 03/21] PCI: hotplug: Add a flag for the movable BARs feature
Date: Fri, 11 Jan 2019 18:36:49 +0300	[thread overview]
Message-ID: <20190111153707.10140-4-s.miroshnichenko@yadro.com> (raw)
In-Reply-To: <20190111153707.10140-1-s.miroshnichenko@yadro.com>

If a new PCIe device has been hot-plugged between the two active ones
without big enough gap between their BARs, these BARs should be moved
if their drivers support this feature. The drivers should be notified
and paused during the procedure:

1)                 dev 8 (new)
                       |
                       v
.. |  dev 3  |  dev 3  |  dev 5  |  dev 7  |
.. |  BAR 0  |  BAR 1  |  BAR 0  |  BAR 0  |

2)                             dev 8
                                 |
                                 v
.. |  dev 3  |  dev 3  | -->           --> |  dev 5  |  dev 7  |
.. |  BAR 0  |  BAR 1  | -->           --> |  BAR 0  |  BAR 0  |

 3)

.. |  dev 3  |  dev 3  |  dev 8  |  dev 8  |  dev 5  |  dev 7  |
.. |  BAR 0  |  BAR 1  |  BAR 0  |  BAR 1  |  BAR 0  |  BAR 0  |

Thus, prior reservation of memory regions by BIOS/bootloader/firmware
is not required anymore for the PCIe hotplug.

The PCI_MOVABLE_BARS flag is set by the platform is this feature is
supported and tested, but can be overridden by the following command
line option:
    pcie_movable_bars={ off | force }

Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko@yadro.com>
---
 .../admin-guide/kernel-parameters.txt         |  7 ++++++
 drivers/pci/pci.c                             | 24 +++++++++++++++++++
 include/linux/pci.h                           |  2 ++
 3 files changed, 33 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index b799bcf67d7b..2165c4b5aea6 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -3387,6 +3387,13 @@
 		nomsi	Do not use MSI for native PCIe PME signaling (this makes
 			all PCIe root ports use INTx for all services).
 
+	pcie_movable_bars=[PCIE]
+			Override the movable BARs support detection:
+		off
+			Disable even if supported by the platform
+		force
+			Enable even if not explicitly declared as supported
+
 	pcmv=		[HW,PCMCIA] BadgePAD 4
 
 	pd_ignore_unused
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 5580ddc5b9b1..71e056771e67 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -139,6 +139,30 @@ static int __init pcie_port_pm_setup(char *str)
 }
 __setup("pcie_port_pm=", pcie_port_pm_setup);
 
+static bool pcie_movable_bars_off;
+static bool pcie_movable_bars_force;
+static int __init pcie_movable_bars_setup(char *str)
+{
+	if (!strcmp(str, "off"))
+		pcie_movable_bars_off = true;
+	else if (!strcmp(str, "force"))
+		pcie_movable_bars_force = true;
+	return 1;
+}
+__setup("pcie_movable_bars=", pcie_movable_bars_setup);
+
+bool pci_movable_bars_enabled(void)
+{
+	if (pcie_movable_bars_off)
+		return false;
+
+	if (pcie_movable_bars_force)
+		return true;
+
+	return pci_has_flag(PCI_MOVABLE_BARS);
+}
+EXPORT_SYMBOL(pci_movable_bars_enabled);
+
 /* Time to wait after a reset for device to become responsive */
 #define PCIE_RESET_READY_POLL_MS 60000
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 65f1d8c2f082..84751f0931cd 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -862,6 +862,7 @@ enum {
 	PCI_ENABLE_PROC_DOMAINS	= 0x00000010,	/* Enable domains in /proc */
 	PCI_COMPAT_DOMAIN_0	= 0x00000020,	/* ... except domain 0 */
 	PCI_SCAN_ALL_PCIE_DEVS	= 0x00000040,	/* Scan all, not just dev 0 */
+	PCI_MOVABLE_BARS	= 0x00000080,	/* Runtime BAR reassign after hotplug */
 };
 
 /* These external functions are only available when PCI support is enabled */
@@ -1341,6 +1342,7 @@ unsigned char pci_bus_max_busnr(struct pci_bus *bus);
 void pci_setup_bridge(struct pci_bus *bus);
 resource_size_t pcibios_window_alignment(struct pci_bus *bus,
 					 unsigned long type);
+bool pci_movable_bars_enabled(void);
 
 #define PCI_VGA_STATE_CHANGE_BRIDGE (1 << 0)
 #define PCI_VGA_STATE_CHANGE_DECODES (1 << 1)
-- 
2.20.1


  parent reply	other threads:[~2019-01-11 15:43 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-11 15:36 [PATCH RFC v2 00/21] PCI: Allow BAR movement during hotplug Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 01/21] PCI: Fix writing invalid BARs during pci_restore_state() Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 02/21] PCI: Define PCI-specific version of the release_child_resources() Sergey Miroshnichenko
2019-01-11 15:36 ` Sergey Miroshnichenko [this message]
2019-01-11 15:36 ` [PATCH RFC v2 04/21] PCI: Pause the devices with movable BARs during rescan Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 05/21] PCI: Release and reassign the root bridge resources " Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 06/21] PCI: Don't allow hotplugged devices to steal resources Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 07/21] PCI: Mark immovable BARs with PCI_FIXED Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 08/21] PCI: Include fixed BARs into the bus size calculating Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 09/21] PCI: Don't reserve memory for hotplug when enabled movable BARs Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 10/21] PCI: Allow the failed resources to be reassigned later Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 11/21] PCI: Calculate fixed areas of bridge windows based on fixed BARs Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 12/21] PCI: Calculate boundaries for bridge windows Sergey Miroshnichenko
2019-01-11 15:36 ` [PATCH RFC v2 13/21] PCI: Make sure bridge windows include their fixed BARs Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 14/21] PCI: Prioritize fixed BAR assigning over the movable ones Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 15/21] PCI: Fix race condition in pci_enable/disable_device() Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 16/21] PCI: Enable bridge's I/O and MEM access for hotplugged devices Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 17/21] PCI: pciehp: Add support for the movable BARs feature Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 18/21] nvme-pci: Handle movable BARs Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 19/21] powerpc/pci: Fix crash with enabled " Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 20/21] PCI: Wake up bridges during rescan when movable BARs enabled Sergey Miroshnichenko
2019-01-11 15:37 ` [PATCH RFC v2 21/21] x86: enable movable BARs Sergey Miroshnichenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190111153707.10140-4-s.miroshnichenko@yadro.com \
    --to=s.miroshnichenko@yadro.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux@yadro.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).