From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shreyansh Jain Subject: [PATCH v2 00/14] Introduce SoC device/driver framework for EAL Date: Wed, 31 Aug 2016 16:30:21 +0530 Message-ID: <1472641235-23626-1-git-send-email-shreyansh.jain@nxp.com> References: <1451682326-5834-1-git-send-email-viktorin@rehivetech.com> Mime-Version: 1.0 Content-Type: text/plain Cc: Shreyansh Jain To: Return-path: Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0057.outbound.protection.outlook.com [104.47.33.57]) by dpdk.org (Postfix) with ESMTP id 12D29F72 for ; Wed, 31 Aug 2016 13:00:53 +0200 (CEST) In-Reply-To: <1451682326-5834-1-git-send-email-viktorin@rehivetech.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Introduction: ============= This patch set is direct derivative of Jan's original series [1],[2]. (Confirmed offline with Jan before posting.) - As this deviates substantially from original series, if need be I can post it as a separate patch rather than v2. Please suggest. - Also, there are comments on original v1 ([4]) which are _not_ incorporated in this series as they refer to section no more in new version. - Initial set also contains certain patches to generalize some PCI specific structures and function to common EAL ([6,7,8,9]. Those patches I'll post separately as they are good changes (in my opinion) and not related to SoC framework. It is built over the series [3] which introduces device structures for rte_driver/rte_device for generalizing devices into PCI, VDEV, XXX. For the purpose of this patchset, XXX=>SOC. Aim: ==== As of now EAL is primarly focused on PCI initialization/probing. rte_eal_init() |- rte_eal_pci_init(): Find PCI devices from sysfs |- ... |- rte_eal_memzone_init() |- ... `- rte_eal_pci_probe(): Driver<=>Device initialization This patchset introduces SoC framework which would enable SoC drivers and drivers to be plugged into EAL, very similar to how PCI drivers/devices are done today. This is a stripped down version of PCI framework which allows the SoC PMDs to implement their own routines for detecting devices and linking devices to drivers. 1) Changes to EAL rte_eal_init() |- rte_eal_pci_init(): Find PCI devices from sysfs |- rte_eal_soc_init(): Calls PMDs->scan_fn |- ... |- rte_eal_memzone_init() |- ... |- rte_eal_pci_probe(): Driver<=>Device initialization, PMD->devinit() `- rte_eal_soc_probe(): Calls PMDs->match_fn and PMDs->devinit(); 2) New device/driver structures: - rte_soc_driver (inheriting rte_driver) - rte_soc_device (inheriting rte_device) - rte_eth_dev and eth_driver embedded rte_soc_device and rte_soc_driver, respectively. 3) The SoC PMDs need to: - define rte_soc_driver with necessary scan and match callbacks - Register themselves using DRIVER_REGISTER_SOC() - Implement respective bus scanning in the scan callbacks to add necessary devices to SoC device list - Implement necessary eth_dev_init/uninint for ethernet instances 4) Design considerations that are same as PCI: - SoC initialization is being done through rte_eal_init(), just after PCI initialization is done. - As in case of PCI, probe is done after rte_eal_pci_probe() to link the devices detected with the drivers registered. - Device attach/detach functions are available and have been designed on the lines of PCI framework. - PMDs register using DRIVER_REGISTER_SOC, very similar to DRIVER_REGISTER_PCI for PCI devices. - Linked list of SoC driver and devices exists independent of the other driver/device list, but inheriting rte_driver/rte_driver, these are also part of a global list. 5) Design considerations that are different from PCI: - Each driver implements its own scan and match function. PCI uses the BDF format to read the device from sysfs, but this _may_not_ be a case for a SoC ethernet device. = This is an important change from initial proposal by Jan in [2]. Unlike his attempt to use /sys/bus/platform, this patch relies on the PMD to detect the devices. This is because SoC may require specific or additional info for device detection. Further, SoC may have embedded devices/MACs which require initialization which cannot be covered through sysfs parsing. = PCI based PMDs rely on EAL's capability to detect devices. This proposal puts the onus on PMD to detect devices, add to soc_device_list and wait for Probe. Matching, of device<=>driver is again PMD's callback. Patchset Overview: ================== - Patches 0001~0003 introduce the base infrastructure and test case - Patch 0004 is for command line support for no-soc, on lines of no-pci - Patch 0005 enables EAL to handle SoC type devices - Patch 0006 adds support for scan and probe callbacks and updates the test framework with relevant test case. - Patch 0007~0009 enable device argument, driver specific flags and interrupt handling related basic infra. Subsequent patches build up on them. - Patch 0010~0013 makes changes to PCI as well as ethdev code to remove assumption that eth_driver is a PCI driver. - Patch 0014 adds necessary ethdev probe/remove functions for PMDs to use Future/Pending Changes: ======================= - Device whitelisting/blacklist still relies on command line '-b' and '-c' which are internally implemented using OPT_PCI_BLACKLIST/OPT_PCI_WHITELIST. This needs to be changed to a generic form - OPT_DEV_*LIST - probably. [1] http://dpdk.org/ml/archives/dev/2016-January/030915.html [2] http://www.dpdk.org/ml/archives/dev/2016-May/038486.html [3] http://dpdk.org/ml/archives/dev/2016-August/045707.html [4] http://dpdk.org/ml/archives/dev/2016-May/038948.html [5] http://dpdk.org/ml/archives/dev/2016-May/038953.html [6] http://dpdk.org/ml/archives/dev/2016-May/038487.html [7] http://dpdk.org/ml/archives/dev/2016-May/038488.html [8] http://dpdk.org/ml/archives/dev/2016-May/038489.html [9] http://dpdk.org/ml/archives/dev/2016-May/038491.html Change since v1: [2] - Removed patch 1-5 which were for generalizing some PCI specific routines into EAL. These patches are good-to-have but not directly linked to SoC and hence would be proposed separately. - Removed support for sysfs parsing (patches 6~9) - Rebasing over the recent (v8) version of rte_driver/device patchset - Rebasing over master (16.07) - Changes to various map file to change API intro to 16.11 from 16.07 Shreyansh Jain (14): eal/soc: introduce very essential SoC infra definitions eal/soc: add rte_eal_soc_register/unregister logic eal/soc: Implement SoC device list and dump eal: introduce --no-soc option eal/soc: init SoC infra from EAL eal/soc: implement probing of drivers eal/soc: extend and utilize devargs eal/soc: add drv_flags eal/soc: add intr_handle ether: utilize container_of for pci_drv ether: verify we copy info from a PCI device ether: extract function eth_dev_get_intr_handle ether: extract function eth_dev_get_driver_name ether: Support rte_soc_driver/device for etherdev app/test/Makefile | 1 + app/test/test_soc.c | 337 ++++++++++++++++++++++++ lib/librte_eal/bsdapp/eal/Makefile | 1 + lib/librte_eal/bsdapp/eal/eal.c | 4 + lib/librte_eal/bsdapp/eal/eal_soc.c | 46 ++++ lib/librte_eal/bsdapp/eal/rte_eal_version.map | 9 + lib/librte_eal/common/Makefile | 2 +- lib/librte_eal/common/eal_common_dev.c | 27 +- lib/librte_eal/common/eal_common_devargs.c | 17 ++ lib/librte_eal/common/eal_common_options.c | 5 + lib/librte_eal/common/eal_common_soc.c | 326 +++++++++++++++++++++++ lib/librte_eal/common/eal_internal_cfg.h | 1 + lib/librte_eal/common/eal_options.h | 2 + lib/librte_eal/common/eal_private.h | 14 + lib/librte_eal/common/include/rte_devargs.h | 8 + lib/librte_eal/common/include/rte_soc.h | 246 +++++++++++++++++ lib/librte_eal/linuxapp/eal/Makefile | 2 + lib/librte_eal/linuxapp/eal/eal.c | 8 + lib/librte_eal/linuxapp/eal/eal_soc.c | 72 +++++ lib/librte_eal/linuxapp/eal/rte_eal_version.map | 8 + lib/librte_ether/rte_ethdev.c | 165 +++++++++++- lib/librte_ether/rte_ethdev.h | 33 ++- 22 files changed, 1320 insertions(+), 14 deletions(-) create mode 100644 app/test/test_soc.c create mode 100644 lib/librte_eal/bsdapp/eal/eal_soc.c create mode 100644 lib/librte_eal/common/eal_common_soc.c create mode 100644 lib/librte_eal/common/include/rte_soc.h create mode 100644 lib/librte_eal/linuxapp/eal/eal_soc.c -- 2.7.4