[dpdk-dev,v1,5/8] bus/pci: implement ctrl operator

Message ID 6e6c6a656646fb834400030518193bbc7fda86b0.1507796085.git.gaetan.rivet@6wind.com (mailing list archive)
State Rejected, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail apply patch file failure

Commit Message

Gaëtan Rivet Oct. 12, 2017, 8:18 a.m. UTC
  Add the PCI bus control operator.

This operator gives access to the probe policy setting, allowing to
read and write this configuration item. The previous existing
functionality is thus restored to the same level.

Probe policy is blacklist mode by default for the PCI bus. Configuration
is allowed once, and is then considered immutable.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
---
 drivers/bus/pci/include/rte_bus_pci.h |  1 +
 drivers/bus/pci/pci_common.c          | 52 ++++++++++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 1 deletion(-)
  

Patch

diff --git a/drivers/bus/pci/include/rte_bus_pci.h b/drivers/bus/pci/include/rte_bus_pci.h
index e6a7998..f662705 100644
--- a/drivers/bus/pci/include/rte_bus_pci.h
+++ b/drivers/bus/pci/include/rte_bus_pci.h
@@ -155,6 +155,7 @@  struct rte_pci_driver {
  */
 struct rte_pci_bus {
 	struct rte_bus bus;               /**< Inherit the generic class */
+	enum rte_bus_probe_mode probe_mode; /**< Probe policy */
 	struct rte_pci_device_list device_list;  /**< List of PCI devices */
 	struct rte_pci_driver_list driver_list;  /**< List of PCI drivers */
 };
diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c
index dc69113..358e232 100644
--- a/drivers/bus/pci/pci_common.c
+++ b/drivers/bus/pci/pci_common.c
@@ -370,9 +370,12 @@  rte_pci_probe(void)
 	struct rte_pci_device *dev = NULL;
 	size_t probed = 0, failed = 0;
 	struct rte_devargs *devargs;
-	int probe_all = 1;
+	int probe_all = 0;
 	int ret = 0;
 
+	if (rte_pci_bus.probe_mode != RTE_BUS_PROBE_WHITELIST)
+		probe_all = 1;
+
 	FOREACH_DEVICE_ON_PCIBUS(dev) {
 		probed++;
 
@@ -515,6 +518,51 @@  pci_unplug(struct rte_device *dev)
 	return ret;
 }
 
+static int
+pci_probe_mode_get(void *_mode)
+{
+	enum rte_bus_probe_mode *mode = _mode;
+
+	*mode = rte_pci_bus.probe_mode;
+	return 0;
+}
+
+static int
+pci_probe_mode_set(void *_mode)
+{
+	enum rte_bus_probe_mode *mode = _mode;
+	static int conf_done;
+
+	if (conf_done &&
+	    *mode != rte_pci_bus.probe_mode) {
+		RTE_LOG(ERR, EAL, "Cannot set PCI to %s mode, bus is already configured.\n",
+			 (*mode == RTE_BUS_PROBE_BLACKLIST) ?
+			 "blacklist" : "whitelist");
+		return -1;
+	}
+	rte_pci_bus.probe_mode = *mode;
+	conf_done = 1;
+	return 0;
+}
+
+static rte_bus_ctrl_t pci_ctrl_ops[][RTE_BUS_CTRL_OP_MAX] = {
+	[RTE_BUS_CTRL_PROBE_MODE] = {
+		[RTE_BUS_CTRL_GET] = pci_probe_mode_get,
+		[RTE_BUS_CTRL_SET] = pci_probe_mode_set,
+	},
+};
+
+static rte_bus_ctrl_t
+pci_ctrl(enum rte_bus_ctrl_op op,
+	 enum rte_bus_ctrl_item item)
+{
+	if (item > RTE_DIM(pci_ctrl_ops))
+		return NULL;
+	if (op > RTE_DIM(pci_ctrl_ops[item]))
+		return NULL;
+	return pci_ctrl_ops[item][op];
+}
+
 struct rte_pci_bus rte_pci_bus = {
 	.bus = {
 		.scan = rte_pci_scan,
@@ -524,7 +572,9 @@  struct rte_pci_bus rte_pci_bus = {
 		.unplug = pci_unplug,
 		.parse = pci_parse,
 		.get_iommu_class = rte_pci_get_iommu_class,
+		.ctrl = pci_ctrl,
 	},
+	.probe_mode = RTE_BUS_PROBE_BLACKLIST,
 	.device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list),
 	.driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list),
 };