From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from wes1-so2.wedos.net (wes1-so2.wedos.net [46.28.106.16]) by dpdk.org (Postfix) with ESMTP id 3FDC85962 for ; Fri, 6 May 2016 15:50:10 +0200 (CEST) Received: from pcviktorin.fit.vutbr.cz (pcviktorin.fit.vutbr.cz [147.229.13.147]) by wes1-so2.wedos.net (Postfix) with ESMTPSA id 3r1Y7Q03wyz7DN; Fri, 6 May 2016 15:50:09 +0200 (CEST) From: Jan Viktorin To: dev@dpdk.org Cc: Jan Viktorin , David Marchand , Thomas Monjalon , Bruce Richardson , Declan Doherty , jianbo.liu@linaro.org, jerin.jacob@caviumnetworks.com, Keith Wiles , Stephen Hemminger Date: Fri, 6 May 2016 15:47:57 +0200 Message-Id: <1462542490-15556-16-git-send-email-viktorin@rehivetech.com> X-Mailer: git-send-email 2.8.0 In-Reply-To: <1462542490-15556-1-git-send-email-viktorin@rehivetech.com> References: <1462542490-15556-1-git-send-email-viktorin@rehivetech.com> In-Reply-To: <1451682326-5834-1-git-send-email-viktorin@rehivetech.com> References: <1451682326-5834-1-git-send-email-viktorin@rehivetech.com> Subject: [dpdk-dev] [PATCH v1 15/28] eal/soc: map/unmap resources X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 May 2016 13:50:10 -0000 Signed-off-by: Jan Viktorin --- lib/librte_eal/bsdapp/eal/eal_soc.c | 12 ++++++ lib/librte_eal/bsdapp/eal/rte_eal_version.map | 2 + lib/librte_eal/common/eal_common_soc.c | 13 +++++++ lib/librte_eal/common/include/rte_soc.h | 50 +++++++++++++++++++++++++ lib/librte_eal/linuxapp/eal/eal_soc.c | 30 +++++++++++++++ lib/librte_eal/linuxapp/eal/rte_eal_version.map | 2 + 6 files changed, 109 insertions(+) diff --git a/lib/librte_eal/bsdapp/eal/eal_soc.c b/lib/librte_eal/bsdapp/eal/eal_soc.c index f84aae9..687d37b 100644 --- a/lib/librte_eal/bsdapp/eal/eal_soc.c +++ b/lib/librte_eal/bsdapp/eal/eal_soc.c @@ -32,9 +32,21 @@ */ #include +#include int rte_eal_soc_scan(void) { return 0; } + +int +rte_eal_soc_map_device(struct rte_soc_device *dev __rte_unused) +{ + return 0; +} + +void +rte_eal_soc_unmap_device(struct rte_soc_device *dev __rte_unused) +{ +} diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map index bd3dd11..b33282a 100644 --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map @@ -166,5 +166,7 @@ DPDK_16.07 { rte_eal_soc_detach; rte_eal_soc_probe; rte_eal_soc_probe_one; + rte_eal_soc_map_device; + rte_eal_soc_unmap_device; } DPDK_16.04; diff --git a/lib/librte_eal/common/eal_common_soc.c b/lib/librte_eal/common/eal_common_soc.c index 75a7a97..d0e5351 100644 --- a/lib/librte_eal/common/eal_common_soc.c +++ b/lib/librte_eal/common/eal_common_soc.c @@ -119,6 +119,11 @@ rte_eal_soc_probe_one_driver(struct rte_soc_driver *dr, return 1; } + /* map resources */ + ret = rte_eal_soc_map_device(dev); + if (ret) + return ret; + dev->driver = dr; RTE_VERIFY(dr->devinit != NULL); return dr->devinit(dr, dev); @@ -168,6 +173,8 @@ rte_eal_soc_detach_dev(struct rte_soc_driver *dr, /* clear driver structure */ dev->driver = NULL; + /* unmap resources for devices */ + rte_eal_soc_unmap_device(dev); return 0; } @@ -313,6 +320,12 @@ soc_dump_one_device(FILE *f, struct rte_soc_device *dev) for (i = 0; dev->id && dev->id[i].compatible; ++i) fprintf(f, " %s\n", dev->id[i].compatible); + for (i = 0; i < SOC_MAX_RESOURCE; i++) { + fprintf(f, " %16.16"PRIx64" %16.16"PRIx64"\n", + dev->mem_resource[i].phys_addr, + dev->mem_resource[i].len); + } + return 0; } diff --git a/lib/librte_eal/common/include/rte_soc.h b/lib/librte_eal/common/include/rte_soc.h index 206244a..3192121 100644 --- a/lib/librte_eal/common/include/rte_soc.h +++ b/lib/librte_eal/common/include/rte_soc.h @@ -50,6 +50,7 @@ extern "C" { #include #include #include +#include #include #include @@ -64,6 +65,14 @@ extern struct soc_device_list soc_device_list; /**< Global list of SoC devices. /** Return SoC scan path of the sysfs root. */ const char *soc_get_sysfs_path(void); +#define SOC_MAX_RESOURCE 6 + +struct rte_soc_resource { + uint64_t phys_addr; + uint64_t len; + void *addr; +}; + struct rte_soc_id { const char *compatible; /**< OF compatible specification */ }; @@ -82,6 +91,7 @@ struct rte_soc_device { TAILQ_ENTRY(rte_soc_device) next; /**< Next probed SoC device */ struct rte_soc_addr addr; /**< SoC device Location */ struct rte_soc_id *id; /**< SoC device ID list */ + struct rte_soc_resource mem_resource[SOC_MAX_RESOURCE]; struct rte_soc_driver *driver; /**< Associated driver */ struct rte_devargs *devargs; /**< Device user arguments */ enum rte_kernel_driver kdrv; /**< Kernel driver */ @@ -111,6 +121,34 @@ struct rte_soc_driver { }; /** + * A structure describing a SoC mapping. + */ +struct soc_map { + void *addr; + char *path; + uint64_t offset; + uint64_t size; + uint64_t phaddr; +}; + +/** + * A structure describing a mapped SoC resource. + * For multi-process we need to reproduce all SoC mappings in secondary + * processes, so save them in a tailq. + */ +struct mapped_soc_resource { + TAILQ_ENTRY(mapped_soc_resource) next; + + struct rte_soc_addr soc_addr; + char path[PATH_MAX]; + int nb_maps; + struct soc_map maps[SOC_MAX_RESOURCE]; +}; + +/** mapped SoC resource list */ +TAILQ_HEAD(mapped_soc_res_list, mapped_soc_resource); + +/** * Utility function to write a SoC device name, this device name can later be * used to retrieve the corresponding rte_soc_addr using above functions. * @@ -202,6 +240,18 @@ int rte_eal_soc_probe_one(const struct rte_soc_addr *addr); int rte_eal_soc_detach(const struct rte_soc_addr *addr); /** + * Map SoC device resources into userspace. + * + * This is called by the EAL if (drv_flags & RTE_SOC_DRV_NEED_MAPPING). + */ +int rte_eal_soc_map_device(struct rte_soc_device *dev); + +/** + * Unmap the device resources. + */ +void rte_eal_soc_unmap_device(struct rte_soc_device *dev); + +/** * Dump discovered SoC devices. */ void rte_eal_soc_dump(FILE *f); diff --git a/lib/librte_eal/linuxapp/eal/eal_soc.c b/lib/librte_eal/linuxapp/eal/eal_soc.c index 4f9070e..f57486a 100644 --- a/lib/librte_eal/linuxapp/eal/eal_soc.c +++ b/lib/librte_eal/linuxapp/eal/eal_soc.c @@ -47,6 +47,34 @@ #include "eal_internal_cfg.h" #include "eal_private.h" +int +rte_eal_soc_map_device(struct rte_soc_device *dev) +{ + int ret = -1; + + /* try mapping the NIC resources using VFIO if it exists */ + switch (dev->kdrv) { + default: + RTE_LOG(DEBUG, EAL, + " Not managed by a supported kernel driver, skipped\n"); + ret = 1; + break; + } + + return ret; +} + +void +rte_eal_soc_unmap_device(struct rte_soc_device *dev) +{ + switch (dev->kdrv) { + default: + RTE_LOG(DEBUG, EAL, + " Not managed by a supported kernel driver, skipped\n"); + break; + } +} + static char * dev_read_uevent(const char *dirname) { @@ -259,6 +287,8 @@ soc_scan_one(const char *dirname, const char *name) TAILQ_INSERT_BEFORE(dev2, dev, next); } else { /* already registered */ dev2->kdrv = dev->kdrv; + memmove(dev2->mem_resource, dev->mem_resource, + sizeof(dev->mem_resource)); dev_content_free(dev2); dev2->addr.fdt_path = dev->addr.fdt_path; diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map index 811cbf8..8e95a41 100644 --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map @@ -171,5 +171,7 @@ DPDK_16.07 { rte_eal_soc_detach; rte_eal_soc_probe; rte_eal_soc_probe_one; + rte_eal_soc_map_device; + rte_eal_soc_unmap_device; } DPDK_16.04; -- 2.8.0