Introduction: ============= This patch set is direct derivative of Jan's original series [1],[2].
- 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. - This v3 version is based on the rte_driver/device patchset v9 [10]. That series introduced device structures (rte_driver/rte_device) 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 - Patch 0015 adds support for SoC driver/devices, along with probe/remove functions for Cryptodev devices. 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. - No cryptodriver currently uses SoC framework - probably a example driver can be created to demonstrate usage. [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 [10] http://dpdk.org/ml/archives/dev/2016-September/046256.html Changes since v2: - Rebasing over rte_driver/device patchset v9 [10] - Added cryptodev support for SoC - Default match function for SoC device<=>Driver - Some variables renamed to reflect 'drv' rather than 'dr' 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 (15): 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 eal/crypto: Support rte_soc_driver/device for cryptodev app/test/Makefile | 1 + app/test/test_soc.c | 337 +++++++++++++++++++++++ lib/librte_cryptodev/rte_cryptodev.c | 122 ++++++++- lib/librte_cryptodev/rte_cryptodev.h | 3 + lib/librte_cryptodev/rte_cryptodev_pmd.h | 18 +- lib/librte_cryptodev/rte_cryptodev_version.map | 3 + 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 | 10 + 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 | 350 ++++++++++++++++++++++++ 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 | 260 ++++++++++++++++++ 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 | 9 + lib/librte_ether/rte_ethdev.c | 165 ++++++++++- lib/librte_ether/rte_ethdev.h | 33 ++- 26 files changed, 1501 insertions(+), 19 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