From 2c502225c64c79b070997ff72e7963b1da7b2ec3 Mon Sep 17 00:00:00 2001 From: Intel Date: Wed, 18 Sep 2013 12:00:00 +0200 Subject: [PATCH] eal: introduce non-pci devices This type of pseudo-device is needed for ring and pcap PMDs. They are compatible with whitelist and are initialized in rte_eal_init(). Signed-off-by: Intel --- .../common/eal_common_nonpci_devs.c | 66 +++++++++++++++++++ lib/librte_eal/common/eal_common_whitelist.c | 13 ++++ lib/librte_eal/common/include/eal_private.h | 7 ++ lib/librte_eal/linuxapp/eal/Makefile | 1 + lib/librte_eal/linuxapp/eal/eal.c | 3 + 5 files changed, 90 insertions(+) create mode 100644 lib/librte_eal/common/eal_common_nonpci_devs.c diff --git a/lib/librte_eal/common/eal_common_nonpci_devs.c b/lib/librte_eal/common/eal_common_nonpci_devs.c new file mode 100644 index 0000000000..ecce5b9aff --- /dev/null +++ b/lib/librte_eal/common/eal_common_nonpci_devs.c @@ -0,0 +1,66 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include "eal_private.h" + +struct device_init { + const char *dev_prefix; + int (*init_fn)(const char*, const char *); +}; + +#define NUM_DEV_TYPES (sizeof(dev_types)/sizeof(dev_types[0])) +struct device_init dev_types[] = { + { + .dev_prefix = "-nodev-", + .init_fn = NULL + } +}; + +int +rte_eal_non_pci_ethdev_init(void) +{ + uint8_t i, j; + for (i = 0; i < NUM_DEV_TYPES; i++) { + for (j = 0; j < RTE_MAX_ETHPORTS; j++) { + const char *params; + char buf[16]; + rte_snprintf(buf, sizeof(buf), "%s%"PRIu8, + dev_types[i].dev_prefix, j); + if (eal_dev_is_whitelisted(buf, ¶ms)) + dev_types[i].init_fn(buf, params); + } + } + return 0; +} diff --git a/lib/librte_eal/common/eal_common_whitelist.c b/lib/librte_eal/common/eal_common_whitelist.c index beb26e8ddf..ddd4a6f2c8 100644 --- a/lib/librte_eal/common/eal_common_whitelist.c +++ b/lib/librte_eal/common/eal_common_whitelist.c @@ -89,6 +89,11 @@ eal_dev_whitelist_exists(void) static int is_valid_wl_entry(const char *device_str, size_t dev_buf_len) { +#define NUM_PREFIXES (sizeof(non_pci_prefixes)/sizeof(non_pci_prefixes[0])) + static const char *non_pci_prefixes[] = { + "-nodev-" /* dummy value to prevent compiler warnings */ + }; + static uint8_t prefix_counts[NUM_PREFIXES] = {0}; char buf[16]; unsigned i; struct rte_pci_addr pci_addr = { .domain = 0 }; @@ -103,6 +108,14 @@ is_valid_wl_entry(const char *device_str, size_t dev_buf_len) pci_addr.bus, pci_addr.devid, pci_addr.function); return (n == dev_buf_len) && (!strncmp(buf, device_str, dev_buf_len)); } + for (i = 0; i < NUM_PREFIXES; i++) { + size_t n = rte_snprintf(buf, sizeof(buf), "%s%u", + non_pci_prefixes[i], prefix_counts[i]); + if ((n == dev_buf_len) && (!strncmp(buf, device_str, dev_buf_len))) { + prefix_counts[i]++; + return 1; + } + } return 0; } diff --git a/lib/librte_eal/common/include/eal_private.h b/lib/librte_eal/common/include/eal_private.h index 7553bd9c73..11f60a1e79 100644 --- a/lib/librte_eal/common/include/eal_private.h +++ b/lib/librte_eal/common/include/eal_private.h @@ -212,4 +212,11 @@ int eal_dev_is_whitelisted(const char *device_str, const char **params); */ void eal_dev_whitelist_clear(void); +/** + * This function initialises any non-PCI i.e. dummy ethernet devices + * + * This function is private to the EAL. + */ +int rte_eal_non_pci_ethdev_init(void); + #endif /* _EAL_PRIVATE_H_ */ diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile index 8a9bca22ea..306b6ad0fe 100644 --- a/lib/librte_eal/linuxapp/eal/Makefile +++ b/lib/librte_eal/linuxapp/eal/Makefile @@ -67,6 +67,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_errno.c SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_cpuflags.c SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_hexdump.c SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_whitelist.c +SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_nonpci_devs.c CFLAGS_eal.o := -D_GNU_SOURCE CFLAGS_eal_thread.o := -D_GNU_SOURCE diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index 8640e55bb8..46a0139285 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -916,6 +916,9 @@ rte_eal_init(int argc, char **argv) rte_eal_mcfg_complete(); + if (rte_eal_non_pci_ethdev_init() < 0) + rte_panic("Cannot init non-PCI eth_devs\n"); + RTE_LCORE_FOREACH_SLAVE(i) { /* -- 2.20.1