Re: [dpdk-dev] [PATCH v2 1/7] net/fm10k: add i2c sbus registers definition
This is not a generic i2c bus, but rather an indirect access to i2c devices through FM10k registers. It's only purpose is to support the fm10k chip. Also there's currently no i2c bus support framework in DPDK. -Original Message- From: Jerin Jacob [mailto:jerinjac...@gmail.com] Sent: Wednesday, December 11, 2019 11:48 PM To: Xiaojun Liu Cc: xiao.w.w...@intel.com; qi.z.zh...@intel.com; ngai-mint.k...@intel.com; jakub.for...@intel.co; jacob.e.kel...@intel.com; dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH v2 1/7] net/fm10k: add i2c sbus registers definition On Wed, Dec 11, 2019 at 3:22 PM Xiaojun Liu wrote: > > To support switch management, add the following files: > Add fm10k/switch/fm10k_debug.h(define log Macros). > Add fm10k/switch/fm10k_regs.h(define all the registers). > Add fm10k/switch/fm10k_switch.h(define switch Macros and APIs). > Add fm10k/switch/fm10k_i2c.h(define I2C interfaces). > Add fm10k/switch/fm10k_i2c.c(support I2C access). > Add fm10k/switch/fm10k_sbus.h(define SBUS interface). > Add fm10k/switch/fm10k_sbus.c(support SBUS access). > and modify fm10k/Makefile(add ENABLE_FM10K_MANAGEMENT support, > add fm10k_i2c.c and fm10k_sbus.c). Integrating NIC with the integrated or onboard switches over i2c or sbus is a common problem. Instead of polluting ethdev driver with i2c and sbus _bus_ code, Why not add new i2c bus and move this code to driver/bus/i2c// > > To avoid configuration for both kernel driver > and userspace SDK outside DPDK, we add switch > management in FM10K DPDK PMD driver. > To enable switch management, you need add > CONFIG_RTE_FM10K_MANAGEMENT=y in > config/common_linux when building. > > Signed-off-by: Xiaojun Liu
Re: [dpdk-dev] [PATCH v2 1/7] net/fm10k: add i2c sbus registers definition
1. FM10K is the i2c master, the PCA9545/PCA9505/PCA9538 are the slave. 2. All the i2c slave connect on board to FM10K SoC. 3. To control the PHY and LED -Original Message- From: Jerin Jacob [mailto:jerinjac...@gmail.com] Sent: Friday, December 13, 2019 1:12 AM To: Xiaojun Liu Cc: xiao.w.w...@intel.com; qi.z.zh...@intel.com; ngai-mint.k...@intel.com; jakub.for...@intel.co; jacob.e.kel...@intel.com; dev@dpdk.org; Jeff Zheng; Eyal Cohen Subject: Re: [dpdk-dev] [PATCH v2 1/7] net/fm10k: add i2c sbus registers definition On Thu, Dec 12, 2019 at 3:05 PM Xiaojun Liu wrote: > > This is not a generic i2c bus, but rather an indirect access to i2c devices > through FM10k registers. It's only purpose is to support the fm10k chip. Also > there's currently no i2c bus support framework in DPDK. To understand it better: # Who are the i2c master and i2c slave here? # Is i2c slave connected on board or in-built to FM10K SoC? # What is the purpose of the i2c API in the ethdev driver? > > -Original Message- > From: Jerin Jacob [mailto:jerinjac...@gmail.com] > Sent: Wednesday, December 11, 2019 11:48 PM > To: Xiaojun Liu > Cc: xiao.w.w...@intel.com; qi.z.zh...@intel.com; ngai-mint.k...@intel.com; > jakub.for...@intel.co; jacob.e.kel...@intel.com; dev@dpdk.org > Subject: Re: [dpdk-dev] [PATCH v2 1/7] net/fm10k: add i2c sbus registers > definition > > On Wed, Dec 11, 2019 at 3:22 PM Xiaojun Liu wrote: > > > > To support switch management, add the following files: > > Add fm10k/switch/fm10k_debug.h(define log Macros). > > Add fm10k/switch/fm10k_regs.h(define all the registers). > > Add fm10k/switch/fm10k_switch.h(define switch Macros and APIs). > > Add fm10k/switch/fm10k_i2c.h(define I2C interfaces). > > Add fm10k/switch/fm10k_i2c.c(support I2C access). > > Add fm10k/switch/fm10k_sbus.h(define SBUS interface). > > Add fm10k/switch/fm10k_sbus.c(support SBUS access). > > and modify fm10k/Makefile(add ENABLE_FM10K_MANAGEMENT support, > > add fm10k_i2c.c and fm10k_sbus.c). > > Integrating NIC with the integrated or onboard switches over i2c or > sbus is a common problem. > Instead of polluting ethdev driver with i2c and sbus _bus_ code, Why > not add new i2c bus > and move this code to driver/bus/i2c// > > > > > To avoid configuration for both kernel driver > > and userspace SDK outside DPDK, we add switch > > management in FM10K DPDK PMD driver. > > To enable switch management, you need add > > CONFIG_RTE_FM10K_MANAGEMENT=y in > > config/common_linux when building. > > > > Signed-off-by: Xiaojun Liu
Re: [dpdk-dev] [PATCH v2 0/7] support switch management
Hi Xiao, Thank you! I will update the commit log and prepare a document to describe the design and implementation. Best regards, Xiaojun -Original Message- From: Wang, Xiao W [mailto:xiao.w.w...@intel.com] Sent: Tuesday, January 21, 2020 10:53 AM To: Xiaojun Liu Cc: dev@dpdk.org; Zhang, Qi Z; Kwan, Ngai-mint; jakub.for...@intel.co; Keller, Jacob E Subject: RE: [PATCH v2 0/7] support switch management Hi Xiaojun, Could you please help to improve the commit logs of all the 7 patches? They look very similar, and info like below is not very helpful for reviewer, since we already know which file you are adding. "To support switch management, add the following files: Add fm10k/switch/fm10k_debug.h(define log Macros). Add fm10k/switch/fm10k_regs.h(define all the registers)." Please talk more about the design and implementation details in the commit log. Refer to history patches if you need a sample. Also please help to address the compile error reported by automation in link http://patches.dpdk.org/patch/63742/: "ci/Intel-compilation failCompilation issues" I would look deeper into your change, and you can address above comments simultaneously. Best Regards, Xiao > -Original Message----- > From: Xiaojun Liu > Sent: Wednesday, December 11, 2019 5:52 PM > To: Wang, Xiao W ; Zhang, Qi Z > ; Kwan, Ngai-mint ; > jakub.for...@intel.co; Keller, Jacob E > Cc: dev@dpdk.org; Xiaojun Liu > Subject: [PATCH v2 0/7] support switch management > > To avoid configuration for both kernel driver > and userspace SDK outside DPDK, we add switch > management in FM10K DPDK PMD driver. > To enable switch management, you need add > CONFIG_RTE_FM10K_MANAGEMENT=y in > config/common_linux when building. > > > Xiaojun Liu (7): > net/fm10k: add i2c sbus registers definition > net/fm10k: add some modules of port > net/fm10k: add config ffu statistics support > net/fm10k: add flow and switch management > net/fm10k: add switch initialization > net/fm10k: add mirror and filter ctrl > net/fm10k: add dpdk port mapping > > drivers/net/fm10k/Makefile | 22 + > drivers/net/fm10k/fm10k_ethdev.c| 580 +- > drivers/net/fm10k/switch/fm10k_config.c | 855 > drivers/net/fm10k/switch/fm10k_config.h | 171 ++ > drivers/net/fm10k/switch/fm10k_debug.h | 19 + > drivers/net/fm10k/switch/fm10k_ext_port.c | 841 > drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++ > drivers/net/fm10k/switch/fm10k_ffu.c| 1209 +++ > drivers/net/fm10k/switch/fm10k_ffu.h| 31 + > drivers/net/fm10k/switch/fm10k_flow.c | 872 > drivers/net/fm10k/switch/fm10k_flow.h | 26 + > drivers/net/fm10k/switch/fm10k_i2c.c| 310 +++ > drivers/net/fm10k/switch/fm10k_i2c.h| 54 + > drivers/net/fm10k/switch/fm10k_regs.h | 2202 > drivers/net/fm10k/switch/fm10k_sbus.c | 292 +++ > drivers/net/fm10k/switch/fm10k_sbus.h | 40 + > drivers/net/fm10k/switch/fm10k_serdes.c | 1886 + > drivers/net/fm10k/switch/fm10k_serdes.h | 32 + > drivers/net/fm10k/switch/fm10k_sm.c | 182 ++ > drivers/net/fm10k/switch/fm10k_sm.h | 78 + > drivers/net/fm10k/switch/fm10k_spico_code.c | 2966 > +++ > drivers/net/fm10k/switch/fm10k_spico_code.h | 21 + > drivers/net/fm10k/switch/fm10k_stats.c | 1242 +++ > drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ > drivers/net/fm10k/switch/fm10k_switch.c | 2562 > +++ > drivers/net/fm10k/switch/fm10k_switch.h | 336 +++ > 26 files changed, 17188 insertions(+), 34 deletions(-) > create mode 100644 drivers/net/fm10k/switch/fm10k_config.c > create mode 100644 drivers/net/fm10k/switch/fm10k_config.h > create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h > create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.c > create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.h > create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c > create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h > create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c > create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h > create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c > create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h > create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h > create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c > create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h > create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.c > create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.h > create mode 100644 drivers/net/fm10k/switch/fm10k_sm.c
Re: [dpdk-dev] [PATCH v4 0/5] support fm10k switch management
Hi Ferruh, Thanks! I checked the building by "devtools/test-build.sh x86_64-native-linux-gcc+next+shared", I didn't see any error. Could you tell me how do you build it and what's the error ? Best regards, Xiaojun -Original Message- From: Ye Xiaolong [mailto:xiaolong...@intel.com] Sent: Monday, April 20, 2020 12:56 PM To: Ferruh Yigit Cc: Xiaojun Liu; xiao.w.w...@intel.com; qi.z.zh...@intel.com; ngai-mint.k...@intel.com; jacob.e.kel...@intel.com; dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH v4 0/5] support fm10k switch management On 04/17, Ferruh Yigit wrote: >On 4/9/2020 7:26 AM, Xiaojun Liu wrote: >> V4: >> * Add I2C to control the inside LED and PHY. >> * Add SBUS to communicate with spico. >> * Add registers defination. >> * Add switch management log API. >> * Add switch management structures. >> * Add epl serdes include loading spico, >> controlling pcsl, dma, dfe, ical. >> * Add spico code. >> * Add state machine for epl lane and port. >> * Add external port management. >> * Add ffu to support offload flow into HW. >> It supports forward, mirror, push VLAN, pop VLAN. >> * Add config file to configure debug log, port speed, >> epl port mapping dpdk port, flowset. >> * Add statistics includes epl port, ffu rule, dpdk port. >> * Add flow interface to support offload flow into HW. >> * Add switch management, includes initialization, >> port mapping, epl port link, LED controller, interrupt handler. >> * Split dev_init to 2 parts in ethdev. First only register >> the port in switch management; second init hook will be >> called after all the pf are registered. >> * Add switch interrupt support. >> * Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset. >> * Add fm10k_dev_filter_ctrl to support flow operation. >> * Add dpdk port and pf mapping. >> * Modify Makefile to add new files building >> >> Xiaojun Liu (5): >> net/fm10k: add basic functions for switch management >> net/fm10k: add epl serdes and port control functions >> net/fm10k: add ffu and statistics and config file functions >> net/fm10k: add flow interface and switch management >> net/fm10k: add switch management support >> > >With 'CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y' I am getting following build >errors, >can you please check them? > Thanks Ferruh for catching the build error, forgot to build test with CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y when applying it :( Thanks, Xiaolong
Re: [dpdk-dev] [PATCH v4 0/5] support fm10k switch management
Hi Xiaolong, Thank you! My gcc version is 4.8.5. I will try 7.5.0. Best regards, Xiaojun -Original Message- From: Ye Xiaolong [mailto:xiaolong...@intel.com] Sent: Monday, April 20, 2020 4:15 PM To: Xiaojun Liu Cc: Ferruh Yigit; xiao.w.w...@intel.com; qi.z.zh...@intel.com; ngai-mint.k...@intel.com; jacob.e.kel...@intel.com; dev@dpdk.org Subject: Re: [dpdk-dev] [PATCH v4 0/5] support fm10k switch management On 04/20, Xiaojun Liu wrote: >Hi Ferruh, > >Thanks! I checked the building by "devtools/test-build.sh >x86_64-native-linux-gcc+next+shared", I didn't see any error. >Could you tell me how do you build it and what's the error ? Which gcc are you system using? I can reproduce the build error with gcc 7.5.0 via ./devtools/test-build.sh x86_64-native-linux-gcc+next+shared. Thanks, Xiaolong > >Best regards, >Xiaojun > >-Original Message- >From: Ye Xiaolong [mailto:xiaolong...@intel.com] >Sent: Monday, April 20, 2020 12:56 PM >To: Ferruh Yigit >Cc: Xiaojun Liu; xiao.w.w...@intel.com; qi.z.zh...@intel.com; >ngai-mint.k...@intel.com; jacob.e.kel...@intel.com; dev@dpdk.org >Subject: Re: [dpdk-dev] [PATCH v4 0/5] support fm10k switch management > >On 04/17, Ferruh Yigit wrote: >>On 4/9/2020 7:26 AM, Xiaojun Liu wrote: >>> V4: >>> * Add I2C to control the inside LED and PHY. >>> * Add SBUS to communicate with spico. >>> * Add registers defination. >>> * Add switch management log API. >>> * Add switch management structures. >>> * Add epl serdes include loading spico, >>> controlling pcsl, dma, dfe, ical. >>> * Add spico code. >>> * Add state machine for epl lane and port. >>> * Add external port management. >>> * Add ffu to support offload flow into HW. >>> It supports forward, mirror, push VLAN, pop VLAN. >>> * Add config file to configure debug log, port speed, >>> epl port mapping dpdk port, flowset. >>> * Add statistics includes epl port, ffu rule, dpdk port. >>> * Add flow interface to support offload flow into HW. >>> * Add switch management, includes initialization, >>> port mapping, epl port link, LED controller, interrupt handler. >>> * Split dev_init to 2 parts in ethdev. First only register >>> the port in switch management; second init hook will be >>> called after all the pf are registered. >>> * Add switch interrupt support. >>> * Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset. >>> * Add fm10k_dev_filter_ctrl to support flow operation. >>> * Add dpdk port and pf mapping. >>> * Modify Makefile to add new files building >>> >>> Xiaojun Liu (5): >>> net/fm10k: add basic functions for switch management >>> net/fm10k: add epl serdes and port control functions >>> net/fm10k: add ffu and statistics and config file functions >>> net/fm10k: add flow interface and switch management >>> net/fm10k: add switch management support >>> >> >>With 'CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y' I am getting following build >>errors, >>can you please check them? >> > >Thanks Ferruh for catching the build error, forgot to build test with >CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y >when applying it :( > >Thanks, >Xiaolong
Re: [dpdk-dev] [PATCH v3 1/5] net/fm10k: add basic functions for switch management
Hi Xiao, Please check the source file. It not looks align in patch file because the patch add "+" for each new line. Best regards, Xiaojun -Original Message- From: Wang, Xiao W [mailto:xiao.w.w...@intel.com] Sent: Thursday, April 02, 2020 4:42 PM To: Xiaojun Liu; Zhang, Qi Z; Kwan, Ngai-mint; Keller, Jacob E Cc: dev@dpdk.org Subject: RE: [PATCH v3 1/5] net/fm10k: add basic functions for switch management Hi Xiaojun, Just comments on the alignment issue, things like below looks not nice. If you are using vim, I recommend " set tabstop=8 " setting. +#define FM10K_SW_BIST_CTRL_BIST_RUN_PCIE(p_) (1ULL << (p_)) +#define FM10K_SW_BIST_CTRL_BIST_RUN_EPL(1ULL << 9) +#define FM10K_SW_BIST_CTRL_BIST_RUN_FABRIC (1ULL << 10) +#define FM10K_SW_BIST_CTRL_BIST_RUN_TUNNEL (1ULL << 11) +#define FM10K_SW_BIST_CTRL_BIST_RUN_BSM(1ULL << 12) +#define FM10K_SW_BIST_CTRL_BIST_RUN_CRM(1ULL << 13) +#define FM10K_SW_BIST_CTRL_BIST_RUN_FIBM (1ULL << 14) +#define FM10K_SW_BIST_CTRL_BIST_RUN_SBM(1ULL << 15) +#define FM10K_SW_SCAN_DATA_IN_SHIFT_IN (1 << 25) +#define FM10K_SW_SCAN_DATA_IN_SHIFT_OUT(1 << 26) +#define FM10K_SW_SCAN_DATA_IN_UPDATE_NODES (1 << 27) Check more at http://patches.dpdk.org/patch/66973/. Please take care for next version. I'm wondering if we could have a tool for automatically check this kind of alignment issue. Best Regards, Xiao > -Original Message- > From: Xiaojun Liu > Sent: Friday, March 20, 2020 2:59 PM > To: Wang, Xiao W ; Zhang, Qi Z > ; Kwan, Ngai-mint ; Keller, > Jacob E > Cc: dev@dpdk.org; Xiaojun Liu > Subject: [PATCH v3 1/5] net/fm10k: add basic functions for switch management > > Add I2C to control the inside LED and PHY. > All the operations of I2C are using fm10k I2C register. > Add SBUS to communicate with spico(micro code in serdes) > by using fm10k SBUS register. This is like I2C operations. > Add registers defination, which include all the registers > will be used in the driver. Add switch management log API. > Add switch management structures. Modify Makefile to add > new files building. Add CONFIG_RTE_FM10K_MANAGEMENT=n > in config/common_linux. > > Signed-off-by: Xiaojun Liu > --- > config/common_linux |5 + > drivers/net/fm10k/Makefile | 11 + > drivers/net/fm10k/switch/fm10k_debug.h | 19 + > drivers/net/fm10k/switch/fm10k_i2c.c| 309 + > drivers/net/fm10k/switch/fm10k_i2c.h| 55 + > drivers/net/fm10k/switch/fm10k_regs.h | 2302 > +++ > drivers/net/fm10k/switch/fm10k_sbus.c | 291 > drivers/net/fm10k/switch/fm10k_sbus.h | 40 + > drivers/net/fm10k/switch/fm10k_switch.h | 335 + > 9 files changed, 3367 insertions(+) > create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h > create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c > create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h > create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h > create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c > create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h > create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h > > diff --git a/config/common_linux b/config/common_linux > index 8168106..6e62b99 100644 > --- a/config/common_linux > +++ b/config/common_linux > @@ -66,3 +66,8 @@ CONFIG_RTE_LIBRTE_HINIC_PMD=y > # Hisilicon HNS3 PMD driver > # > CONFIG_RTE_LIBRTE_HNS3_PMD=y > + [...]
Re: [dpdk-dev] [PATCH v3 4/5] net/fm10k: add flow interface and switch management
Hi Xiao, OK. I will check the two empty lines carefully and check the patch by "git am". Best regards, Xiaojun -Original Message- From: Wang, Xiao W [mailto:xiao.w.w...@intel.com] Sent: Thursday, April 02, 2020 4:56 PM To: Xiaojun Liu; Zhang, Qi Z; Kwan, Ngai-mint; Keller, Jacob E Cc: dev@dpdk.org Subject: RE: [PATCH v3 4/5] net/fm10k: add flow interface and switch management Hi, Applying: net/fm10k: add flow interface and switch management .git/rebase-apply/patch:915: new blank line at EOF. + warning: 1 line adds whitespace errors. Besides, I see that you use two empty lines to delimit two functions in some places, please align to 1 empty line. Please understand upstreaming may mean burden of maintenance, so let's make the big patch in better shape. 😊 Best Regards, Xiao > -Original Message----- > From: Xiaojun Liu > Sent: Friday, March 20, 2020 2:59 PM > To: Wang, Xiao W ; Zhang, Qi Z > ; Kwan, Ngai-mint ; Keller, > Jacob E > Cc: dev@dpdk.org; Xiaojun Liu > Subject: [PATCH v3 4/5] net/fm10k: add flow interface and switch management > > Add flow interface to support offload flow into HW. > It supports parse vlan and parse mpls, all these > data will be transferred to ffu data. > Add switch management, includes initialization, > port mapping, epl port link, LED controller, interrupt handler. > It create 3 threads. One for interrupt handler, one for > LED controller, one for statistics. > > Signed-off-by: Xiaojun Liu > --- > drivers/net/fm10k/Makefile |2 + > drivers/net/fm10k/base/fm10k_type.h |1 + > drivers/net/fm10k/switch/fm10k_flow.c | 872 +++ > drivers/net/fm10k/switch/fm10k_flow.h | 26 + > drivers/net/fm10k/switch/fm10k_stats.c | 128 ++ > drivers/net/fm10k/switch/fm10k_switch.c | 2382 > +++ [...]
[dpdk-dev] [PATCH v4 0/5] support fm10k switch management
V4: * Add I2C to control the inside LED and PHY. * Add SBUS to communicate with spico. * Add registers defination. * Add switch management log API. * Add switch management structures. * Add epl serdes include loading spico, controlling pcsl, dma, dfe, ical. * Add spico code. * Add state machine for epl lane and port. * Add external port management. * Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. * Add config file to configure debug log, port speed, epl port mapping dpdk port, flowset. * Add statistics includes epl port, ffu rule, dpdk port. * Add flow interface to support offload flow into HW. * Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. * Split dev_init to 2 parts in ethdev. First only register the port in switch management; second init hook will be called after all the pf are registered. * Add switch interrupt support. * Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset. * Add fm10k_dev_filter_ctrl to support flow operation. * Add dpdk port and pf mapping. * Modify Makefile to add new files building Xiaojun Liu (5): net/fm10k: add basic functions for switch management net/fm10k: add epl serdes and port control functions net/fm10k: add ffu and statistics and config file functions net/fm10k: add flow interface and switch management net/fm10k: add switch management support config/common_linux |5 + doc/guides/nics/fm10k.rst |5 + doc/guides/rel_notes/release_20_05.rst |7 + drivers/net/fm10k/Makefile | 20 + drivers/net/fm10k/base/fm10k_type.h |1 + drivers/net/fm10k/fm10k_ethdev.c| 555 - drivers/net/fm10k/switch/fm10k_config.c | 854 drivers/net/fm10k/switch/fm10k_config.h | 176 ++ drivers/net/fm10k/switch/fm10k_debug.h | 18 + drivers/net/fm10k/switch/fm10k_ext_port.c | 837 drivers/net/fm10k/switch/fm10k_ext_port.h | 134 ++ drivers/net/fm10k/switch/fm10k_ffu.c| 1239 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 30 + drivers/net/fm10k/switch/fm10k_flow.c | 864 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_i2c.c| 309 +++ drivers/net/fm10k/switch/fm10k_i2c.h| 55 + drivers/net/fm10k/switch/fm10k_regs.h | 2298 + drivers/net/fm10k/switch/fm10k_sbus.c | 291 +++ drivers/net/fm10k/switch/fm10k_sbus.h | 38 + drivers/net/fm10k/switch/fm10k_serdes.c | 1929 + drivers/net/fm10k/switch/fm10k_serdes.h | 30 + drivers/net/fm10k/switch/fm10k_sm.c | 188 ++ drivers/net/fm10k/switch/fm10k_sm.h | 79 + drivers/net/fm10k/switch/fm10k_spico_code.c | 2963 +++ drivers/net/fm10k/switch/fm10k_spico_code.h | 21 + drivers/net/fm10k/switch/fm10k_stats.c | 1226 +++ drivers/net/fm10k/switch/fm10k_stats.h | 253 +++ drivers/net/fm10k/switch/fm10k_switch.c | 2362 + drivers/net/fm10k/switch/fm10k_switch.h | 465 + 30 files changed, 17242 insertions(+), 36 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.c create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.c create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.h create mode 100644 drivers/net/fm10k/switch/fm10k_sm.c create mode 100644 drivers/net/fm10k/switch/fm10k_sm.h create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.c create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h -- 1.8.3.1
[dpdk-dev] [PATCH v4 1/5] net/fm10k: add basic functions for switch management
Add I2C to control the inside LED and PHY. All the operations of I2C are using fm10k I2C register. Add SBUS to communicate with spico(micro code in serdes) by using fm10k SBUS register. This is like I2C operations. Add registers defination, which include all the registers will be used in the driver. Add switch management log API. Add switch management structures. Modify Makefile to add new files building. Add CONFIG_RTE_FM10K_MANAGEMENT=n in config/common_linux. Signed-off-by: Xiaojun Liu --- config/common_linux |5 + drivers/net/fm10k/switch/fm10k_debug.h | 18 + drivers/net/fm10k/switch/fm10k_i2c.c| 309 + drivers/net/fm10k/switch/fm10k_i2c.h| 55 + drivers/net/fm10k/switch/fm10k_regs.h | 2298 +++ drivers/net/fm10k/switch/fm10k_sbus.c | 291 drivers/net/fm10k/switch/fm10k_sbus.h | 38 + drivers/net/fm10k/switch/fm10k_switch.h | 465 +++ 8 files changed, 3479 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h diff --git a/config/common_linux b/config/common_linux index 8168106..159ea9b 100644 --- a/config/common_linux +++ b/config/common_linux @@ -66,3 +66,8 @@ CONFIG_RTE_LIBRTE_HINIC_PMD=y # Hisilicon HNS3 PMD driver # CONFIG_RTE_LIBRTE_HNS3_PMD=y + +# +## FM10K switch management +## +CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=n diff --git a/drivers/net/fm10k/switch/fm10k_debug.h b/drivers/net/fm10k/switch/fm10k_debug.h new file mode 100644 index 000..6cd3cda --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_debug.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#ifndef _FM10K_DEBUG_H_ +#define _FM10K_DEBUG_H_ + +#define FM10K_SW_ERR(...) PMD_INIT_LOG(ERR, __VA_ARGS__) +#define FM10K_SW_INFO(...) PMD_INIT_LOG(INFO, __VA_ARGS__) +#define FM10K_SW_TRACE(...)PMD_INIT_LOG(DEBUG, __VA_ARGS__) + +#define FM10K_SW_ASSERT(...) do {} while (0) + +#define FM10K_SW_STATS_TRACE_ENABLE1 +#define FM10K_SW_FFU_CONF_TRACE_ENABLE 0 +#define FM10K_SW_MIRROR_TRACE_ENABLE 0 + +#endif /* _FM10K_DEBUG_H_ */ diff --git a/drivers/net/fm10k/switch/fm10k_i2c.c b/drivers/net/fm10k/switch/fm10k_i2c.c new file mode 100644 index 000..7d64899 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_i2c.c @@ -0,0 +1,309 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_debug.h" +#include "fm10k_i2c.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" + +static void fm10k_i2c_init(struct fm10k_i2c *); + +struct fm10k_i2c * +fm10k_i2c_attach(struct fm10k_switch *sw) +{ + struct fm10k_i2c *i2c; + + FM10K_SW_TRACE("i2c: attaching"); + + i2c = (struct fm10k_i2c *)rte_zmalloc("fm10k_i2c", + sizeof(struct fm10k_i2c), 0); + if (i2c == NULL) { + FM10K_SW_INFO("i2c: failed to allocate context"); + goto fail; + } + + i2c->sw = sw; + pthread_mutex_init(&i2c->req_lock, NULL); + pthread_mutex_init(&i2c->bus_lock, NULL); + sem_init(&i2c->req_cv, 0, 0); + + fm10k_i2c_init(i2c); + + FM10K_SW_TRACE("i2c: attach successful"); + return i2c; +fail: + if (i2c) + fm10k_i2c_detach(i2c); + return NULL; +} + +void +fm10k_i2c_detach(struct fm10k_i2c *i2c) +{ + FM10K_SW_TRACE("i2c: detaching"); + + rte_free(i2c); +} + +static void +fm10k_i2c_init(struct fm10k_i2c *i2c) +{ + struct fm10k_switch *sw = i2c->sw; + struct fm10k_device_info *cfg = sw->info; + uint32_t freq = FM10K_SW_I2C_CFG_DIVIDER_400_KHZ; + uint32_t data; + + if (FM10K_SW_CARD_ID(cfg->subvendor, cfg->subdevice) == + FM10K_SW_CARD(SILICOM, PE3100G2DQIRM_QXSL4)) + freq = FM10K_SW_I2C_CFG_DIVIDER_100_KHZ; + + /* clear any pending interrupt */ + fm10k_write_switch_reg(sw, FM10K_SW_I2C_CTRL, + FM10K_SW_I2C_CTRL_INTERRUPT_PENDING); + + /* 400 KHz, master mode, unmask interrupt */ + data = fm10k_read_switch_reg(sw, FM10K_SW_I2C_CFG); + data &= ~FM10K_SW_I2C_CFG_SLAVE_ENABLE; + if (FM10K_SW_CARD_ID(cfg->subvendor, cfg->subdevice) == + FM10K_SW_CARD(SILICOM, PE3100G2DQIRM_QXSL4)) + FM10K_SW_REPLACE_REG_FIELD(data, I2C_CFG_DIVIDER,
[dpdk-dev] [PATCH v4 3/5] net/fm10k: add ffu and statistics and config file functions
Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. It also supports flowset for a group flow definition. The config file can configure debug log, port speed, epl port mapping dpdk port, flowset. All these configuration will be used by switch management. Statistics includes epl port, ffu rule, dpdk port, and error. All these statistics data are read from HW. Modify switch header file to support getting logical port and glort and device info. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |3 + drivers/net/fm10k/switch/fm10k_config.c | 854 + drivers/net/fm10k/switch/fm10k_config.h | 176 + drivers/net/fm10k/switch/fm10k_ffu.c| 1239 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 30 + drivers/net/fm10k/switch/fm10k_stats.c | 1097 +++ drivers/net/fm10k/switch/fm10k_stats.h | 253 +++ 7 files changed, 3652 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 6f5ae60..68a72d5 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -85,6 +85,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ext_port.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_serdes.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sm.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_config.c b/drivers/net/fm10k/switch/fm10k_config.c new file mode 100644 index 000..1eaa65b --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_config.c @@ -0,0 +1,854 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../base/fm10k_type.h" +#include "../base/fm10k_osdep.h" +#include "../fm10k.h" +#include "../fm10k_logs.h" +#include "fm10k_debug.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" +#include "fm10k_config.h" + +#define FM10K_CONFIG_WORD_MAX 10 +#define FM10K_CONFIG_WORD_LEN 20 +#define FM10K_CONFIG_STR_MAX 100 + +/* used for store the key strings */ +struct fm10k_cfg_key_item { + const char *key_str[FM10K_CONFIG_WORD_MAX]; + uint8_t type; +}; + +/* configuration file path */ +static const char *fm10k_config_dpdk_conf_file = "/etc/dpdk_fm10k.conf"; +/* configuration structure */ +static struct fm10k_dpdk_cfg fm10k_config_dpdk_cfg; + +/* configuration key strings */ +static struct fm10k_cfg_key_item fm10k_config_key_items[] = { + /* enable debug print */ + { {"debug", "print", "enable"}, + FM10K_CONFIG_DEBUG_ENABLE}, + { {"debug", "print", "config"}, + FM10K_CONFIG_DEBUG_CONFIG}, + { {"debug", "print", "ffu", "init"}, + FM10K_CONFIG_DEBUG_FFU_INIT}, + { {"debug", "print", "ffu", "register"}, + FM10K_CONFIG_DEBUG_FFU_REG}, + { {"debug", "print", "ffu", "rule"}, + FM10K_CONFIG_DEBUG_FFU_RULE}, + { {"debug", "print", "stats", "port"}, + FM10K_CONFIG_DEBUG_STATS_PORT}, + { {"debug", "print", "stats", "queue"}, + FM10K_CONFIG_DEBUG_STATS_QUEUE}, + { {"debug", "print", "stats", "rule"}, + FM10K_CONFIG_DEBUG_STATS_FFU}, + { {"debug", "print", "stats", "detail"}, + FM10K_CONFIG_DEBUG_STATS_MORE}, + { {"debug", "print", "stats", "interval"}, + FM10K_CONFIG_DEBUG_STATS_INTERVAL}, + /* general configuration */ + { {"dpdk", "bind", "pf", "number"}, +
[dpdk-dev] [PATCH v4 5/5] net/fm10k: add switch management support
Split dev init to 2 parts. First only register the port in switch management; second init hook will be called after all the pf are registered and switch initialization. It will finish dev init. Also add switch interrupt support. Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset to support mirror operation. Add fm10k_dev_filter_ctrl to support flow operation. Add dpdk port and pf mapping, so the dpdk port can map to a specific pf and 1 dpdk port can map to 2 pf to get total 100G throughput. Update fm10k.rst. Update release_20_05.rst. Signed-off-by: Xiaojun Liu --- doc/guides/nics/fm10k.rst | 5 + doc/guides/rel_notes/release_20_05.rst | 7 + drivers/net/fm10k/fm10k_ethdev.c | 555 ++--- 3 files changed, 531 insertions(+), 36 deletions(-) diff --git a/doc/guides/nics/fm10k.rst b/doc/guides/nics/fm10k.rst index 4e178c2..75f9929 100644 --- a/doc/guides/nics/fm10k.rst +++ b/doc/guides/nics/fm10k.rst @@ -124,6 +124,11 @@ FM1 PMD driver. The switch driver can be acquired from Intel support. Only Testpoint is validated with DPDK, the latest version that has been validated with DPDK is 4.1.6. +To avoid loading other switch driver from outside of DPDK, there is another +way to load switch driver in DPDK. If you want to use the inline switch driver, +you need to set ''CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y'' in the configure file. +The inline switch driver supports mirror and some flow forward rules. + Support for Switch Restart ~~ diff --git a/doc/guides/rel_notes/release_20_05.rst b/doc/guides/rel_notes/release_20_05.rst index 000bbf5..58edcbf 100644 --- a/doc/guides/rel_notes/release_20_05.rst +++ b/doc/guides/rel_notes/release_20_05.rst @@ -62,6 +62,13 @@ New Features * Added support for matching on IPv4 Time To Live and IPv6 Hop Limit. +* **Updated Intel fm10k driver.** + + Updated Intel fm10k driver with new features and improvements, including: + + * Added support for switch management. + * Added support for flow operation. + * Added support for mirror operation. Removed Items - diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 581c690..754f78c 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -13,6 +13,10 @@ #include "fm10k.h" #include "base/fm10k_api.h" +#ifdef RTE_FM10K_SWITCH_MANAGEMENT +#include "switch/fm10k_regs.h" +#include "switch/fm10k_switch.h" +#endif /* Default delay to acquire mailbox lock */ #define FM10K_MBXLOCK_DELAY_US 20 @@ -512,6 +516,15 @@ struct fm10k_xstats_name_off { struct rte_eth_conf *dev_conf = &dev->data->dev_conf; uint32_t mrqc, *key, i, reta, j; uint64_t hf; +#ifdef RTE_FM10K_SWITCH_MANAGEMENT + uint16_t nb_rx_queues = dev->data->nb_rx_queues; + int mapped_num; + struct fm10k_hw *mapped_hws[FM10K_SW_PEP_MAP_NUM_MAX]; + + mapped_num = fm10k_switch_dpdk_mapped_hw_get(hw, mapped_hws); + if (mapped_num == 2) + nb_rx_queues /= 2; +#endif #define RSS_KEY_SIZE 40 static uint8_t rss_intel_key[RSS_KEY_SIZE] = { @@ -642,26 +655,44 @@ struct fm10k_xstats_name_off { fm10k_dev_tx_init(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); +#ifdef RTE_FM10K_SWITCH_MANAGEMENT + struct fm10k_hw *unmap_hw = hw; + uint32_t data; +#endif int i, ret; + uint16_t hw_queue_id; struct fm10k_tx_queue *txq; uint64_t base_addr; uint32_t size; +#ifndef RTE_FM10K_SWITCH_MANAGEMENT /* Disable TXINT to avoid possible interrupt */ for (i = 0; i < hw->mac.max_queues; i++) FM10K_WRITE_REG(hw, FM10K_TXINT(i), 3 << FM10K_TXINT_TIMER_SHIFT); +#else + fm10k_switch_dpdk_tx_queue_num_set(unmap_hw, + dev->data->nb_tx_queues); +#endif /* Setup TX queue */ for (i = 0; i < dev->data->nb_tx_queues; ++i) { + hw_queue_id = i; +#ifdef RTE_FM10K_SWITCH_MANAGEMENT + fm10k_switch_dpdk_hw_queue_map(unmap_hw, + i, dev->data->nb_tx_queues, + &hw, &hw_queue_id); +#endif txq = dev->data->tx_queues[i]; base_addr = txq->hw_ring_phys_addr; size = txq->nb_desc * sizeof(struct fm10k_tx_desc); /* disable queue to avoid issues while updating state */ - ret = tx_queue_disable(hw, i); + ret = tx_queue_disable(hw, hw_queue_id); if (ret) { - PMD_INIT_LOG(ERR, "failed to disable queue %d", i); + PMD_INIT_LOG(ERR, + "failed to disable queue %d", +
[dpdk-dev] [PATCH v4 4/5] net/fm10k: add flow interface and switch management
Add flow interface to support offload flow into HW. It supports parse vlan and parse mpls, all these data will be transferred to ffu data. Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. It create 3 threads. One for interrupt handler, one for LED controller, one for statistics. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |2 + drivers/net/fm10k/base/fm10k_type.h |1 + drivers/net/fm10k/switch/fm10k_flow.c | 864 +++ drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_stats.c | 129 ++ drivers/net/fm10k/switch/fm10k_switch.c | 2362 +++ 6 files changed, 3384 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 68a72d5..5a8d227 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -88,6 +88,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_flow.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_switch.c endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/base/fm10k_type.h b/drivers/net/fm10k/base/fm10k_type.h index 84781ba..810e5ee 100644 --- a/drivers/net/fm10k/base/fm10k_type.h +++ b/drivers/net/fm10k/base/fm10k_type.h @@ -717,6 +717,7 @@ struct fm10k_hw { u16 subsystem_vendor_id; u8 revision_id; u32 flags; + bool switch_ready; #define FM10K_HW_FLAG_CLOCK_OWNER BIT(0) }; diff --git a/drivers/net/fm10k/switch/fm10k_flow.c b/drivers/net/fm10k/switch/fm10k_flow.c new file mode 100644 index 000..d9ba2b4 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_flow.c @@ -0,0 +1,864 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_flow.h" +#include "fm10k_switch.h" +#include "fm10k_ffu.h" +#include "fm10k_config.h" + +static int fm10k_flow_validate(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); +static struct rte_flow *fm10k_flow_create(struct rte_eth_dev *dev, +const struct rte_flow_attr *attr, +const struct rte_flow_item pattern[], +const struct rte_flow_action actions[], +struct rte_flow_error *error); +static int fm10k_flow_destroy(struct rte_eth_dev *dev, +struct rte_flow *flow, +struct rte_flow_error *error); +static int fm10k_flow_flush(struct rte_eth_dev *dev, + struct rte_flow_error *error); +static int fm10k_flow_parse_attr(const struct rte_flow_attr *attr, + struct rte_flow_error *error); + +const struct rte_flow_ops fm10k_flow_ops = { + .validate = fm10k_flow_validate, + .create = fm10k_flow_create, + .destroy = fm10k_flow_destroy, + .flush = fm10k_flow_flush, +}; + +union fm10k_filter_t cons_filter; +enum rte_filter_type fm10k_cons_filter_type = RTE_ETH_FILTER_NONE; + +/** + * MPLS filter configuration. + */ +enum fm10k_mpls_type { + FM10K_MPLS_TYPE_UNI, + FM10K_MPLS_TYPE_MULTI, +}; + +enum fm10k_mpls_action { + FM10K_MPLS_ACTION_DROP, + FM10K_MPLS_ACTION_QUEUE, +}; + +struct fm10k_mpls_filter_conf { + enum fm10k_mpls_type mpls_type; /**< mandatory for MPLS */ + uint32_t mpls_header; /**< MPLS header */ + uint32_t mpls_header_mask; /**< MPLS header mask */ + enum fm10k_mpls_action mpls_action; + uint16_t queue; + uint8_t ffu_id; + uint8_t ffu_prio; +}; + +/** + * VLAN filter configuration. + */ +struct fm10k_vlan_filter_conf { + int ffu_id; + uint8_t ffu_prio; + uint8_t is_ingress; + uint8_t port; + uint8_t in_ext_port; + uint8_t out_ext_port; + uint16_t in_vlan; + uint16_t out_vlan; +}; + +union fm10k_filter_t { + struct fm10k_mpls_filter_conf mpls_filter; + struct fm10k_vlan_filter_conf vlan_filter; +}; + +type
Re: [dpdk-dev] [PATCH v3 5/5] net/fm10k: add switch management support
Hi Xiao, Thank you! I add release note and remove the DEV_RX_OFFLOAD_RSS_HASH modification(It may be a mistake). I submit the new patch again:) Best regards, Xiaojun -Original Message- From: Wang, Xiao W [mailto:xiao.w.w...@intel.com] Sent: Thursday, April 02, 2020 5:12 PM To: Xiaojun Liu; Zhang, Qi Z; Kwan, Ngai-mint; Keller, Jacob E Cc: dev@dpdk.org Subject: RE: [PATCH v3 5/5] net/fm10k: add switch management support Hi, This is a feature-add patch, so you need to add release note in doc/guides/rel_notes/release_20_05.rst, that can be included as part of this 5/5 patch. Another issue, why delete DEV_RX_OFFLOAD_RSS_HASH unconditionally? I think it would impact the existing usage. @@ -1808,8 +2044,7 @@ static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev) DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_JUMBO_FRAME | - DEV_RX_OFFLOAD_HEADER_SPLIT | - DEV_RX_OFFLOAD_RSS_HASH); + DEV_RX_OFFLOAD_HEADER_SPLIT); Also some comments on the feature description are inlined below. Best Regards, Xiao > -Original Message- > From: Xiaojun Liu > Sent: Friday, March 20, 2020 2:59 PM > To: Wang, Xiao W ; Zhang, Qi Z > ; Kwan, Ngai-mint ; Keller, > Jacob E > Cc: dev@dpdk.org; Xiaojun Liu > Subject: [PATCH v3 5/5] net/fm10k: add switch management support > > Split dev init to 2 parts. > First only register the port in switch > management; second init hook will be > called after all the pf are registered > and switch initialization. It will finish > dev init. Also add switch interrupt support. > Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset > to support mirror operation. Add fm10k_dev_filter_ctrl > to support flow operation. > Add dpdk port and pf mapping, so > the dpdk port can map to a specific pf > and 1 dpdk port can map to 2 pf to get > total 100G throughput. Update fm10k.rst. > > Signed-off-by: Xiaojun Liu > --- > doc/guides/nics/fm10k.rst| 5 + > drivers/net/fm10k/fm10k_ethdev.c | 559 > --- > 2 files changed, 525 insertions(+), 39 deletions(-) > > diff --git a/doc/guides/nics/fm10k.rst b/doc/guides/nics/fm10k.rst > index 4e178c2..75f9929 100644 > --- a/doc/guides/nics/fm10k.rst > +++ b/doc/guides/nics/fm10k.rst > @@ -124,6 +124,11 @@ FM1 PMD driver. The switch driver can be > acquired from Intel support. > Only Testpoint is validated with DPDK, the latest version that has been > validated with DPDK is 4.1.6. > > +To avoid loading other switch driver from outside of DPDK, there is another > +way to load switch driver in DPDK. If you want to use the inline switch > driver, "There is a way to load..." Since what you do is the only way to load switch driver inside DPDK. > +you need to set ''CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y'' in the > configure file. Configuration file. > +The inline switch driver supports mirror and some flow forward rules. Please be clear on what forwarding rules are supported. Any doc reader will be confused by "some". > + > Support for Switch Restart > ~~ [...]
Re: [dpdk-dev] [PATCH v2 0/7] support switch management
hi Xiao, Thanks for your comments! I will fix them ASAP. Best regards, Xiaojun From: Wang, Xiao W Sent: Tuesday, February 11, 2020 6:31 PM To: Xiaojun Liu Cc: dev@dpdk.org ; Zhang, Qi Z ; Kwan, Ngai-mint ; Fornal, Jakub ; Keller, Jacob E ; Jeff Zheng ; Eyal Cohen Subject: RE: [PATCH v2 0/7] support switch management Since this is a big code change, so just some general comments/suggestions for your next version patch set: - please clean up comments like "XXX" in the code. - It's better to define MACRO for all register addrs and bit shift, please try to avoid magic number (e.g. in the serdes part). - There're threads created for handling events and timers, we'd better use pthread_join() to recycle them in fm10k_sm_detach(). - set "tapstop" and "shiftwidth" to 8 in vimrc, then recheck the macros and keep them aligned. - There're some "printf" for debugging, please use dpdk logging API instead. Best Regards, Xiao > -Original Message- > From: Xiaojun Liu > Sent: Tuesday, January 21, 2020 2:15 PM > To: Wang, Xiao W > Cc: dev@dpdk.org; Zhang, Qi Z ; Kwan, Ngai-mint > ; jakub.for...@intel.co; Keller, Jacob E > ; Jeff Zheng ; Eyal > Cohen > Subject: RE: [PATCH v2 0/7] support switch management > > Hi Xiao, > > Thank you! I will update the commit log and prepare a document to describe > the design and implementation. > > Best regards, > Xiaojun > > -Original Message- > From: Wang, Xiao W [mailto:xiao.w.w...@intel.com] > Sent: Tuesday, January 21, 2020 10:53 AM > To: Xiaojun Liu > Cc: dev@dpdk.org; Zhang, Qi Z; Kwan, Ngai-mint; jakub.for...@intel.co; > Keller, Jacob E > Subject: RE: [PATCH v2 0/7] support switch management > > Hi Xiaojun, > > Could you please help to improve the commit logs of all the 7 patches? They > look very similar, and info like below is not very helpful for reviewer, since > we already know which file you are adding. > "To support switch management, add the following files: > Add fm10k/switch/fm10k_debug.h(define log Macros). > Add fm10k/switch/fm10k_regs.h(define all the registers)." > > Please talk more about the design and implementation details in the commit > log. Refer to history patches if you need a sample. > > Also please help to address the compile error reported by automation in link > http://patches.dpdk.org/patch/63742/: > "ci/Intel-compilation failCompilation issues" > > I would look deeper into your change, and you can address above comments > simultaneously. > > Best Regards, > Xiao > > > -----Original Message- > > From: Xiaojun Liu > > Sent: Wednesday, December 11, 2019 5:52 PM > > To: Wang, Xiao W ; Zhang, Qi Z > > ; Kwan, Ngai-mint ; > > jakub.for...@intel.co; Keller, Jacob E > > Cc: dev@dpdk.org; Xiaojun Liu > > Subject: [PATCH v2 0/7] support switch management > > > > To avoid configuration for both kernel driver > > and userspace SDK outside DPDK, we add switch > > management in FM10K DPDK PMD driver. > > To enable switch management, you need add > > CONFIG_RTE_FM10K_MANAGEMENT=y in > > config/common_linux when building. > > > > > > Xiaojun Liu (7): > > net/fm10k: add i2c sbus registers definition > > net/fm10k: add some modules of port > > net/fm10k: add config ffu statistics support > > net/fm10k: add flow and switch management > > net/fm10k: add switch initialization > > net/fm10k: add mirror and filter ctrl > > net/fm10k: add dpdk port mapping > > > > drivers/net/fm10k/Makefile | 22 + > > drivers/net/fm10k/fm10k_ethdev.c| 580 +- > > drivers/net/fm10k/switch/fm10k_config.c | 855 > > drivers/net/fm10k/switch/fm10k_config.h | 171 ++ > > drivers/net/fm10k/switch/fm10k_debug.h | 19 + > > drivers/net/fm10k/switch/fm10k_ext_port.c | 841 > > drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++ > > drivers/net/fm10k/switch/fm10k_ffu.c| 1209 +++ > > drivers/net/fm10k/switch/fm10k_ffu.h| 31 + > > drivers/net/fm10k/switch/fm10k_flow.c | 872 > > drivers/net/fm10k/switch/fm10k_flow.h | 26 + > > drivers/net/fm10k/switch/fm10k_i2c.c| 310 +++ > > drivers/net/fm10k/switch/fm10k_i2c.h| 54 + > > drivers/net/fm10k/switch/fm10k_regs.h | 2202 > > > drivers/net/fm10k/switch/fm10k_sbus.c | 292 +++ > > drivers/net/fm10k/switch/fm10k_sbus.h | 40 + > > drivers/net/fm10k/switch/fm10k_serdes.c | 1886 +++
Re: [dpdk-dev] [PATCH v2 0/7] support switch management
Hi Xiao, I have already finished the fixing. Thank you for your helping so much. I still have some questions. 1. Shall I generate the patch based on old patches ? 2. I used checkpatches.sh+check-git-log.sh+test-build.sh to check the patch, is that enough ? 3. May I send the patch to you first ? So you can help checking it before I submit. Best regards, Xiaojun From: dev on behalf of Xiaojun Liu Sent: Friday, February 14, 2020 10:46 AM To: Wang, Xiao W Cc: dev@dpdk.org ; Zhang, Qi Z ; Kwan, Ngai-mint ; Fornal, Jakub ; Keller, Jacob E ; Jeff Zheng ; Eyal Cohen Subject: Re: [dpdk-dev] [PATCH v2 0/7] support switch management hi Xiao, Thanks for your comments! I will fix them ASAP. Best regards, Xiaojun From: Wang, Xiao W Sent: Tuesday, February 11, 2020 6:31 PM To: Xiaojun Liu Cc: dev@dpdk.org ; Zhang, Qi Z ; Kwan, Ngai-mint ; Fornal, Jakub ; Keller, Jacob E ; Jeff Zheng ; Eyal Cohen Subject: RE: [PATCH v2 0/7] support switch management Since this is a big code change, so just some general comments/suggestions for your next version patch set: - please clean up comments like "XXX" in the code. - It's better to define MACRO for all register addrs and bit shift, please try to avoid magic number (e.g. in the serdes part). - There're threads created for handling events and timers, we'd better use pthread_join() to recycle them in fm10k_sm_detach(). - set "tapstop" and "shiftwidth" to 8 in vimrc, then recheck the macros and keep them aligned. - There're some "printf" for debugging, please use dpdk logging API instead. Best Regards, Xiao > -Original Message- > From: Xiaojun Liu > Sent: Tuesday, January 21, 2020 2:15 PM > To: Wang, Xiao W > Cc: dev@dpdk.org; Zhang, Qi Z ; Kwan, Ngai-mint > ; jakub.for...@intel.co; Keller, Jacob E > ; Jeff Zheng ; Eyal > Cohen > Subject: RE: [PATCH v2 0/7] support switch management > > Hi Xiao, > > Thank you! I will update the commit log and prepare a document to describe > the design and implementation. > > Best regards, > Xiaojun > > -Original Message- > From: Wang, Xiao W [mailto:xiao.w.w...@intel.com] > Sent: Tuesday, January 21, 2020 10:53 AM > To: Xiaojun Liu > Cc: dev@dpdk.org; Zhang, Qi Z; Kwan, Ngai-mint; jakub.for...@intel.co; > Keller, Jacob E > Subject: RE: [PATCH v2 0/7] support switch management > > Hi Xiaojun, > > Could you please help to improve the commit logs of all the 7 patches? They > look very similar, and info like below is not very helpful for reviewer, since > we already know which file you are adding. > "To support switch management, add the following files: > Add fm10k/switch/fm10k_debug.h(define log Macros). > Add fm10k/switch/fm10k_regs.h(define all the registers)." > > Please talk more about the design and implementation details in the commit > log. Refer to history patches if you need a sample. > > Also please help to address the compile error reported by automation in link > http://patches.dpdk.org/patch/63742/: > "ci/Intel-compilation failCompilation issues" > > I would look deeper into your change, and you can address above comments > simultaneously. > > Best Regards, > Xiao > > > -----Original Message- > > From: Xiaojun Liu > > Sent: Wednesday, December 11, 2019 5:52 PM > > To: Wang, Xiao W ; Zhang, Qi Z > > ; Kwan, Ngai-mint ; > > jakub.for...@intel.co; Keller, Jacob E > > Cc: dev@dpdk.org; Xiaojun Liu > > Subject: [PATCH v2 0/7] support switch management > > > > To avoid configuration for both kernel driver > > and userspace SDK outside DPDK, we add switch > > management in FM10K DPDK PMD driver. > > To enable switch management, you need add > > CONFIG_RTE_FM10K_MANAGEMENT=y in > > config/common_linux when building. > > > > > > Xiaojun Liu (7): > > net/fm10k: add i2c sbus registers definition > > net/fm10k: add some modules of port > > net/fm10k: add config ffu statistics support > > net/fm10k: add flow and switch management > > net/fm10k: add switch initialization > > net/fm10k: add mirror and filter ctrl > > net/fm10k: add dpdk port mapping > > > > drivers/net/fm10k/Makefile | 22 + > > drivers/net/fm10k/fm10k_ethdev.c| 580 +- > > drivers/net/fm10k/switch/fm10k_config.c | 855 > > drivers/net/fm10k/switch/fm10k_config.h | 171 ++ > > drivers/net/fm10k/switch/fm10k_debug.h | 19 + > > drivers/net/fm10k/switch/fm10k_ext_port.c | 841 > > drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++
[dpdk-dev] [PATCH v2 0/5] support switch management
To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. Split dev init to 2 parts. First only register the port in switch management; second init hook will be called after all the pf are registered and switch initialization. It will finish dev init. Also add switch interrupt support. Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset to support mirror operation. Add fm10k_dev_filter_ctrl to support flow operation. Add dpdk port and pf mapping, so the dpdk port can map to a specific pf and 1 dpdk port can map to 2 pf to get total 100G throughput. Add flow interface to support offload flow into HW. It supports parse vlan and parse mpls, all these data will be transffered to ffu data. Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. It create 3 threads. One for interrupt handler, one for LED controller, one for statistics. Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. It also supports flowset for a group flow definition. The config file can configure debug log, port speed, epl port mapping dpdk port, flowset. All these configuration will be used by switch management. Statistics includes epl port, ffu rule, dpdk port, and error. All these statistics data are read from HW. Modify switch header file to support getting logical port and glort and device info. Add epl serdes include loading spico, controling pcsl, dma, dfe, ical. Add spico code. Add state machine for epl lane and port, it creates a pthread to handle the state changing event. Add external port management, which will use state machine to handle the event from lane and port. The lane state will change between DOWN, WAIT_PLL_LOCK, WAIT_SIGNAL_OK, WAIT_DFE_ICAL, WAIT_DFE_PCAL, UP. The port state will change between DOWN, WAIT_LANE_UP, UP. Add I2C to control the inside LED and PHY. All the operations of I2C are using fm10k I2C register. Add SBUS to communicate with spico(micro code in serdes) by using fm10k SBUS register. This is like I2C operations. Add registers defination, which include all the registers will be used in the driver. Add switch management log API. Add switch management structures. Modify Makefile to add new files building Xiaojun Liu (5): net/fm10k: add basic functions for switch management net/fm10k: add epl serdes and port control functions net/fm10k: add ffu and statistics and config file functions net/fm10k: add flow interface and switch management net/fm10k: add switch management support drivers/net/fm10k/Makefile | 25 + drivers/net/fm10k/fm10k_ethdev.c| 587 +- drivers/net/fm10k/switch/fm10k_config.c | 863 drivers/net/fm10k/switch/fm10k_config.h | 178 ++ drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_ext_port.c | 841 drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++ drivers/net/fm10k/switch/fm10k_ffu.c| 1253 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_flow.c | 872 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_i2c.c| 310 +++ drivers/net/fm10k/switch/fm10k_i2c.h| 54 + drivers/net/fm10k/switch/fm10k_regs.h | 2302 + drivers/net/fm10k/switch/fm10k_sbus.c | 292 +++ drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_serdes.c | 1936 + drivers/net/fm10k/switch/fm10k_serdes.h | 32 + drivers/net/fm10k/switch/fm10k_sm.c | 190 ++ drivers/net/fm10k/switch/fm10k_sm.h | 81 + drivers/net/fm10k/switch/fm10k_spico_code.c | 2966 +++ drivers/net/fm10k/switch/fm10k_spico_code.h | 21 + drivers/net/fm10k/switch/fm10k_stats.c | 1242 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.c | 2376 + drivers/net/fm10k/switch/fm10k_switch.h | 475 + 26 files changed, 17364 insertions(+), 41 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.c create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net
[dpdk-dev] [PATCH v2 4/5] net/fm10k: add flow interface and switch management
Add flow interface to support offload flow into HW. It supports parse vlan and parse mpls, all these data will be transffered to ffu data. Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. It create 3 threads. One for interrupt handler, one for LED controller, one for statistics. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |2 + drivers/net/fm10k/switch/fm10k_flow.c | 872 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_stats.c | 128 ++ drivers/net/fm10k/switch/fm10k_switch.c | 2376 +++ 5 files changed, 3404 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 86a7635..a9d6b5c 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -92,6 +92,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ext_port.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_flow.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_switch.c endif SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_flow.c b/drivers/net/fm10k/switch/fm10k_flow.c new file mode 100644 index 000..353f021 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_flow.c @@ -0,0 +1,872 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_flow.h" +#include "fm10k_switch.h" +#include "fm10k_ffu.h" +#include "fm10k_config.h" + + +static int fm10k_flow_validate(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); +static struct rte_flow *fm10k_flow_create(struct rte_eth_dev *dev, +const struct rte_flow_attr *attr, +const struct rte_flow_item pattern[], +const struct rte_flow_action actions[], +struct rte_flow_error *error); +static int fm10k_flow_destroy(struct rte_eth_dev *dev, +struct rte_flow *flow, +struct rte_flow_error *error); +static int fm10k_flow_flush(struct rte_eth_dev *dev, + struct rte_flow_error *error); +static int fm10k_flow_parse_attr(const struct rte_flow_attr *attr, + struct rte_flow_error *error); + +const struct rte_flow_ops fm10k_flow_ops = { + .validate = fm10k_flow_validate, + .create = fm10k_flow_create, + .destroy = fm10k_flow_destroy, + .flush = fm10k_flow_flush, +}; + +union fm10k_filter_t cons_filter; +enum rte_filter_type fm10k_cons_filter_type = RTE_ETH_FILTER_NONE; + +/** + * MPLS filter configuration. + */ +enum fm10k_mpls_type { + FM10K_MPLS_TYPE_UNI, + FM10K_MPLS_TYPE_MULTI, +}; + +enum fm10k_mpls_action { + FM10K_MPLS_ACTION_DROP, + FM10K_MPLS_ACTION_QUEUE, +}; + +struct fm10k_mpls_filter_conf { + enum fm10k_mpls_type mpls_type; /**< mandatory for MPLS */ + uint32_t mpls_header; /**< MPLS header */ + uint32_t mpls_header_mask; /**< MPLS header mask */ + enum fm10k_mpls_action mpls_action; + uint16_t queue; + uint8_t ffu_id; + uint8_t ffu_prio; +}; + +/** + * VLAN filter configuration. + */ +struct fm10k_vlan_filter_conf { + int ffu_id; + uint8_t ffu_prio; + uint8_t is_ingress; + uint8_t port; + uint8_t in_ext_port; + uint8_t out_ext_port; + uint16_t in_vlan; + uint16_t out_vlan; +}; + + +union fm10k_filter_t { + struct fm10k_mpls_filter_conf mpls_filter; + struct fm10k_vlan_filter_conf vlan_filter; +}; + +typedef int (*parse_filter_t)(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error, + union fm10k_filter_t *filt
[dpdk-dev] [PATCH v2 1/5] net/fm10k: add basic functions for switch management
Add I2C to control the inside LED and PHY. All the operations of I2C are using fm10k I2C register. Add SBUS to communicate with spico(micro code in serdes) by using fm10k SBUS register. This is like I2C operations. Add registers defination, which include all the registers will be used in the driver. Add switch management log API. Add switch management structures. Modify Makefile to add new files building To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile | 16 + drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_i2c.c| 310 + drivers/net/fm10k/switch/fm10k_i2c.h| 54 + drivers/net/fm10k/switch/fm10k_regs.h | 2302 +++ drivers/net/fm10k/switch/fm10k_sbus.c | 292 drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_switch.h | 335 + 8 files changed, 3368 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 0271bcb..a628e2d 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -11,6 +11,9 @@ LIB = librte_pmd_fm10k.a CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) CFLAGS += -DALLOW_EXPERIMENTAL_API +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +CFLAGS += -DENABLE_FM10K_MANAGEMENT +endif EXPORT_MAP := rte_pmd_fm10k_version.map @@ -49,6 +52,9 @@ endif LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash LDLIBS += -lrte_bus_pci +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +LDLIBS += -lpthread +endif # # Add extra flags for base driver source files to disable warnings in them @@ -58,6 +64,10 @@ $(foreach obj, $(BASE_DRIVER_OBJS), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)) VPATH += $(SRCDIR)/base +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +VPATH += $(SRCDIR)/switch +endif + # # all source are stored in SRCS-y # base driver is based on the package of cid-fm10k.2017.01.24.tar.gz @@ -71,6 +81,12 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_common.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c + +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sbus.c +endif + SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/net/fm10k/switch/fm10k_debug.h b/drivers/net/fm10k/switch/fm10k_debug.h new file mode 100644 index 000..f7b5c06 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_debug.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#ifndef _FM10K_DEBUG_H_ +#define _FM10K_DEBUG_H_ + + +#define FM10K_SW_ERR(...) PMD_INIT_LOG(ERR, __VA_ARGS__) +#define FM10K_SW_INFO(...) PMD_INIT_LOG(INFO, __VA_ARGS__) +#define FM10K_SW_TRACE(...)PMD_INIT_LOG(DEBUG, __VA_ARGS__) + +#define FM10K_SW_ASSERT(...) do {} while (0) + +#define FM10K_SW_STATS_TRACE_ENABLE1 +#define FM10K_SW_FFU_CONF_TRACE_ENABLE 0 +#define FM10K_SW_MIRROR_TRACE_ENABLE 0 + +#endif /* _FM10K_DEBUG_H_ */ diff --git a/drivers/net/fm10k/switch/fm10k_i2c.c b/drivers/net/fm10k/switch/fm10k_i2c.c new file mode 100644 index 000..28b0c34 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_i2c.c @@ -0,0 +1,310 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "fm10k_debug.h" +#include "fm10k_i2c.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" + +static void fm10k_i2c_init(struct fm10k_i2c *); + +struct fm10k_i2c * +fm10k_i2c_attach(struct fm10k_switch *sw) +{ + struct fm10k_i2c *i2c; + + FM10K_SW_TRACE("i2c: attaching"); + + i2c = (struct fm10k_i2c *)rte_zmalloc("fm10k_i2c", + sizeof(struct fm10k_i2c), 0); + if (i2c == NULL) { + FM10K_SW_INFO("i2c: failed to allocate context"); + goto fail; + } + + i2c->sw = sw; + pthread_mutex_init(&i2c->req_lock, NULL); + pthread_mutex_init(&i2c->bus_lock, NULL); + sem_init(&i2c->req_cv, 0, 0); + + fm10
[dpdk-dev] [PATCH v2 3/5] net/fm10k: add ffu and statistics and config file functions
Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. It also supports flowset for a group flow definition. The config file can configure debug log, port speed, epl port mapping dpdk port, flowset. All these configuration will be used by switch management. Statistics includes epl port, ffu rule, dpdk port, and error. All these statistics data are read from HW. Modify switch header file to support getting logical port and glort and device info. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |3 + drivers/net/fm10k/switch/fm10k_config.c | 863 + drivers/net/fm10k/switch/fm10k_config.h | 178 + drivers/net/fm10k/switch/fm10k_ffu.c| 1253 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_stats.c | 1114 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.h | 158 +++- 8 files changed, 3848 insertions(+), 9 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index ac2d96f..86a7635 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -89,6 +89,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_serdes.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sm.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ext_port.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c endif SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_config.c b/drivers/net/fm10k/switch/fm10k_config.c new file mode 100644 index 000..e958663 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_config.c @@ -0,0 +1,863 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "../base/fm10k_type.h" +#include "../base/fm10k_osdep.h" + +#include "../fm10k.h" +#include "../fm10k_logs.h" +#include "fm10k_debug.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" +#include "fm10k_config.h" + + +#define FM10K_CONFIG_WORD_MAX 10 +#define FM10K_CONFIG_WORD_LEN 20 +#define FM10K_CONFIG_STR_MAX 100 + +/* used for store the key strings */ +struct fm10k_cfg_key_item { + const char *key_str[FM10K_CONFIG_WORD_MAX]; + uint8_t type; +}; + +/* configuration file path */ +static const char *fm10k_config_dpdk_conf_file = "/etc/dpdk_fm10k.conf"; +/* configuration structure */ +static struct fm10k_dpdk_cfg fm10k_config_dpdk_cfg; + +/* configuration key strings */ +static struct fm10k_cfg_key_item fm10k_config_key_items[] = { + /* enable debug print */ + { {"debug", "print", "enable"}, + FM10K_CONFIG_DEBUG_ENABLE}, + { {"debug", "print", "config"}, + FM10K_CONFIG_DEBUG_CONFIG}, + { {"debug", "print", "ffu", "init"}, + FM10K_CONFIG_DEBUG_FFU_INIT}, + { {"debug", "print", "ffu", "register"}, + FM10K_CONFIG_DEBUG_FFU_REG}, + { {"debug", "print", "ffu", "rule"}, + FM10K_CONFIG_DEBUG_FFU_RULE}, + { {"debug", "print", "stats", "port"}, + FM10K_CONFIG_DEBUG_STATS_PORT}, + { {"debug", "print", "stats", "queue"}, + FM10K_CONFIG_DEBUG_STATS_QUEUE}, + { {"debug", "print", "stats", "rule"}, + FM10K_CONFIG_DEBUG_STATS_FFU}, + { {"debug", "print", "stats", "detail"}, + FM10K_CONFIG_DEBUG_STATS_MORE}, + { {"debug", "print", "stats", "interval"}, + FM10K_CONFIG_DEBUG_STATS_INTERVAL
[dpdk-dev] [PATCH v2 5/5] net/fm10k: add switch management support
Split dev init to 2 parts. First only register the port in switch management; second init hook will be called after all the pf are registered and switch initialization. It will finish dev init. Also add switch interrupt support. Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset to support mirror operation. Add fm10k_dev_filter_ctrl to support flow operation. Add dpdk port and pf mapping, so the dpdk port can map to a specific pf and 1 dpdk port can map to 2 pf to get total 100G throughput. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/fm10k_ethdev.c | 587 --- 1 file changed, 546 insertions(+), 41 deletions(-) diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 581c690..16b41fd 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -13,6 +13,10 @@ #include "fm10k.h" #include "base/fm10k_api.h" +#ifdef ENABLE_FM10K_MANAGEMENT +#include "switch/fm10k_regs.h" +#include "switch/fm10k_switch.h" +#endif /* Default delay to acquire mailbox lock */ #define FM10K_MBXLOCK_DELAY_US 20 @@ -39,6 +43,10 @@ #define GLORT_PF_MASK0xFFC0 #define GLORT_FD_MASKGLORT_PF_MASK #define GLORT_FD_INDEX GLORT_FD_Q_BASE +#ifdef ENABLE_FM10K_MANAGEMENT +/* When the switch is ready, the status will be changed */ +static int fm10k_switch_ready; +#endif int fm10k_logtype_init; int fm10k_logtype_driver; @@ -461,9 +469,6 @@ struct fm10k_xstats_name_off { PMD_INIT_FUNC_TRACE(); - if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) - dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH; - /* multipe queue mode checking */ ret = fm10k_check_mq_mode(dev); if (ret != 0) { @@ -512,6 +517,15 @@ struct fm10k_xstats_name_off { struct rte_eth_conf *dev_conf = &dev->data->dev_conf; uint32_t mrqc, *key, i, reta, j; uint64_t hf; +#ifdef ENABLE_FM10K_MANAGEMENT + uint16_t nb_rx_queues = dev->data->nb_rx_queues; + int mapped_num; + struct fm10k_hw *mapped_hws[2]; + + mapped_num = fm10k_switch_dpdk_mapped_hw_get(hw, mapped_hws); + if (mapped_num == 2) + nb_rx_queues /= 2; +#endif #define RSS_KEY_SIZE 40 static uint8_t rss_intel_key[RSS_KEY_SIZE] = { @@ -641,27 +655,48 @@ struct fm10k_xstats_name_off { static int fm10k_dev_tx_init(struct rte_eth_dev *dev) { +#ifndef ENABLE_FM10K_MANAGEMENT struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); +#else + struct fm10k_hw *hw; + struct fm10k_hw *unmap_hw = + FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); + uint32_t data; +#endif int i, ret; + uint16_t hw_queue_id; struct fm10k_tx_queue *txq; uint64_t base_addr; uint32_t size; +#ifndef ENABLE_FM10K_MANAGEMENT /* Disable TXINT to avoid possible interrupt */ for (i = 0; i < hw->mac.max_queues; i++) FM10K_WRITE_REG(hw, FM10K_TXINT(i), 3 << FM10K_TXINT_TIMER_SHIFT); +#else + fm10k_switch_dpdk_tx_queue_num_set(unmap_hw, + dev->data->nb_tx_queues); +#endif /* Setup TX queue */ for (i = 0; i < dev->data->nb_tx_queues; ++i) { + hw_queue_id = i; +#ifdef ENABLE_FM10K_MANAGEMENT + fm10k_switch_dpdk_hw_queue_map(unmap_hw, + i, dev->data->nb_tx_queues, + &hw, &hw_queue_id); +#endif txq = dev->data->tx_queues[i]; base_addr = txq->hw_ring_phys_addr; size = txq->nb_desc * sizeof(struct fm10k_tx_desc); /* disable queue to avoid issues while updating state */ - ret = tx_queue_disable(hw, i); + ret = tx_queue_disable(hw, hw_queue_id); if (ret) { - PMD_INIT_LOG(ERR, "failed to disable queue %d", i); + PMD_INIT_LOG(ERR, + "failed to disable queue %d", + hw_queue_id); return -1; } /* Enable use of FTAG bit in TX descriptor, PFVTCTL @@ -669,7 +704,7 @@ struct fm10k_xstats_name_off { */ if (fm10k_check_ftag(dev->device->devargs)) { if (hw->mac.type == fm10k_mac_pf) { - FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i), + FM10K_WRITE_REG(hw, FM10K_PFVTCTL(hw_queue_id), FM10K_PFVTCTL_FTAG_DESC_ENA
Re: [dpdk-dev] [PATCH v2 5/5] net/fm10k: add switch management support
Hi Xiao, Thank you! I will follow your comments. Best regards, Xiaojun From: Wang, Xiao W Sent: Tuesday, February 25, 2020 7:28 PM To: Xiaojun Liu ; Zhang, Qi Z ; Kwan, Ngai-mint ; Keller, Jacob E Cc: dev@dpdk.org ; Ye, Xiaolong Subject: RE: [PATCH v2 5/5] net/fm10k: add switch management support Hi Xiaojun, Gather some comments about the code changes to original file: Based on the latest dpdk, "git am" will fail with the Makefile. Add CONFIG_RTE_FM10K_MANAGEMENT=n as a default option into ./config is better. If user wants to turn on this switch feature, it's easier to just change "n" to "y". No need to introduce another macro ENABLE_FM10K_MANAGEMENT, just use RTE_FM10K_MANAGEMENT to wrap your code. For ethdev.c: static int fm10k_switch_ready; This should be a per device value, right? I assume we may have >1 fm10k devices, then cannot share one state value. DEV_RX_OFFLOAD_RSS_HASH is removed, it may affect current usage. Log some debug info before return -EIO. How about moving the commonly used variables like "struct fm10k_hw *hw" out of "ifdef else". Put fm10k_link_update() at the end of dev_start(). For fm10k_stats_get(), it looks there's little code shared between #if and #else, you can just write a whole new function. There's comment "It may not work for VF", have you addressed this uncertainty? We'd better not to leave this in upstream version. BTW, when sending new versions, you need to document what has changed from last version in your cover letter, in below format: V2: * Fix what * Fix what Best Regards, Xiao > -Original Message- > From: Xiaojun Liu > Sent: Thursday, February 20, 2020 10:00 PM > To: Wang, Xiao W ; Zhang, Qi Z > ; Kwan, Ngai-mint ; > Keller, Jacob E > Cc: dev@dpdk.org; Xiaojun Liu > Subject: [PATCH v2 5/5] net/fm10k: add switch management support > > Split dev init to 2 parts. > First only register the port in switch > management; second init hook will be > called after all the pf are registered > and switch initialization. It will finish > dev init. Also add switch interrupt support. > Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset > to support mirror operation. Add fm10k_dev_filter_ctrl > to support flow operation. > Add dpdk port and pf mapping, so > the dpdk port can map to a specific pf > and 1 dpdk port can map to 2 pf to get > total 100G throughput. > > To enable the switch management, you need add > CONFIG_RTE_FM10K_MANAGEMENT=y in > config/common_linux when building. > > Signed-off-by: Xiaojun Liu > --- [...]
[dpdk-dev] [PATCH v1 0/5] support fm10k switch management
V1: * Add I2C to control the inside LED and PHY. * Add SBUS to communicate with spico. * Add registers defination. * Add switch management log API. * Add switch management structures. * Add epl serdes include loading spico, controlling pcsl, dma, dfe, ical. * Add spico code. * Add state machine for epl lane and port. * Add external port management. * Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. * Add config file to configure debug log, port speed, epl port mapping dpdk port, flowset. * Add statistics includes epl port, ffu rule, dpdk port. * Add flow interface to support offload flow into HW. * Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. * Split dev_init to 2 parts in ethdev. First only register the port in switch management; second init hook will be called after all the pf are registered. * Add switch interrupt support. * Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset. * Add fm10k_dev_filter_ctrl to support flow operation. * Add dpdk port and pf mapping. * Modify Makefile to add new files building Xiaojun Liu (5): net/fm10k: add basic functions for switch management net/fm10k: add epl serdes and port control functions net/fm10k: add ffu and statistics and config file functions net/fm10k: add flow interface and switch management net/fm10k: add switch management support config/common_linux |7 + drivers/net/fm10k/Makefile | 23 + drivers/net/fm10k/base/fm10k_type.h |1 + drivers/net/fm10k/fm10k_ethdev.c| 562 - drivers/net/fm10k/switch/fm10k_config.c | 863 drivers/net/fm10k/switch/fm10k_config.h | 178 ++ drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_ext_port.c | 840 drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++ drivers/net/fm10k/switch/fm10k_ffu.c| 1253 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_flow.c | 872 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_i2c.c| 310 +++ drivers/net/fm10k/switch/fm10k_i2c.h| 54 + drivers/net/fm10k/switch/fm10k_regs.h | 2302 + drivers/net/fm10k/switch/fm10k_sbus.c | 292 +++ drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_serdes.c | 1936 + drivers/net/fm10k/switch/fm10k_serdes.h | 32 + drivers/net/fm10k/switch/fm10k_sm.c | 190 ++ drivers/net/fm10k/switch/fm10k_sm.h | 81 + drivers/net/fm10k/switch/fm10k_spico_code.c | 2966 +++ drivers/net/fm10k/switch/fm10k_spico_code.h | 21 + drivers/net/fm10k/switch/fm10k_stats.c | 1242 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.c | 2394 + drivers/net/fm10k/switch/fm10k_switch.h | 476 + 28 files changed, 17362 insertions(+), 42 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.c create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.c create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.h create mode 100644 drivers/net/fm10k/switch/fm10k_sm.c create mode 100644 drivers/net/fm10k/switch/fm10k_sm.h create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.c create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h -- 1.8.3.1
[dpdk-dev] [PATCH v1 3/5] net/fm10k: add ffu and statistics and config file functions
Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. It also supports flowset for a group flow definition. The config file can configure debug log, port speed, epl port mapping dpdk port, flowset. All these configuration will be used by switch management. Statistics includes epl port, ffu rule, dpdk port, and error. All these statistics data are read from HW. Modify switch header file to support getting logical port and glort and device info. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |3 + drivers/net/fm10k/switch/fm10k_config.c | 863 + drivers/net/fm10k/switch/fm10k_config.h | 178 + drivers/net/fm10k/switch/fm10k_ffu.c| 1253 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_stats.c | 1114 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.h | 158 +++- 8 files changed, 3848 insertions(+), 9 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 0d3b688..d4d2037 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -88,6 +88,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ext_port.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_serdes.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sm.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_config.c b/drivers/net/fm10k/switch/fm10k_config.c new file mode 100644 index 000..e958663 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_config.c @@ -0,0 +1,863 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "../base/fm10k_type.h" +#include "../base/fm10k_osdep.h" + +#include "../fm10k.h" +#include "../fm10k_logs.h" +#include "fm10k_debug.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" +#include "fm10k_config.h" + + +#define FM10K_CONFIG_WORD_MAX 10 +#define FM10K_CONFIG_WORD_LEN 20 +#define FM10K_CONFIG_STR_MAX 100 + +/* used for store the key strings */ +struct fm10k_cfg_key_item { + const char *key_str[FM10K_CONFIG_WORD_MAX]; + uint8_t type; +}; + +/* configuration file path */ +static const char *fm10k_config_dpdk_conf_file = "/etc/dpdk_fm10k.conf"; +/* configuration structure */ +static struct fm10k_dpdk_cfg fm10k_config_dpdk_cfg; + +/* configuration key strings */ +static struct fm10k_cfg_key_item fm10k_config_key_items[] = { + /* enable debug print */ + { {"debug", "print", "enable"}, + FM10K_CONFIG_DEBUG_ENABLE}, + { {"debug", "print", "config"}, + FM10K_CONFIG_DEBUG_CONFIG}, + { {"debug", "print", "ffu", "init"}, + FM10K_CONFIG_DEBUG_FFU_INIT}, + { {"debug", "print", "ffu", "register"}, + FM10K_CONFIG_DEBUG_FFU_REG}, + { {"debug", "print", "ffu", "rule"}, + FM10K_CONFIG_DEBUG_FFU_RULE}, + { {"debug", "print", "stats", "port"}, + FM10K_CONFIG_DEBUG_STATS_PORT}, + { {"debug", "print", "stats", "queue"}, + FM10K_CONFIG_DEBUG_STATS_QUEUE}, + { {"debug", "print", "stats", "rule"}, + FM10K_CONFIG_DEBUG_STATS_FFU}, + { {"debug", "print", "stats", "detail"}, + FM10K_CONFIG_DEBUG_STATS_MORE}, + { {"debug", "print", "stats", "interval"}, + FM10K_C
[dpdk-dev] [PATCH v1 4/5] net/fm10k: add flow interface and switch management
Add flow interface to support offload flow into HW. It supports parse vlan and parse mpls, all these data will be transferred to ffu data. Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. It create 3 threads. One for interrupt handler, one for LED controller, one for statistics. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |2 + drivers/net/fm10k/switch/fm10k_flow.c | 872 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_stats.c | 128 ++ drivers/net/fm10k/switch/fm10k_switch.c | 2376 +++ 5 files changed, 3404 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index d4d2037..9a245c9 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -91,6 +91,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_flow.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_switch.c endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_flow.c b/drivers/net/fm10k/switch/fm10k_flow.c new file mode 100644 index 000..353f021 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_flow.c @@ -0,0 +1,872 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_flow.h" +#include "fm10k_switch.h" +#include "fm10k_ffu.h" +#include "fm10k_config.h" + + +static int fm10k_flow_validate(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); +static struct rte_flow *fm10k_flow_create(struct rte_eth_dev *dev, +const struct rte_flow_attr *attr, +const struct rte_flow_item pattern[], +const struct rte_flow_action actions[], +struct rte_flow_error *error); +static int fm10k_flow_destroy(struct rte_eth_dev *dev, +struct rte_flow *flow, +struct rte_flow_error *error); +static int fm10k_flow_flush(struct rte_eth_dev *dev, + struct rte_flow_error *error); +static int fm10k_flow_parse_attr(const struct rte_flow_attr *attr, + struct rte_flow_error *error); + +const struct rte_flow_ops fm10k_flow_ops = { + .validate = fm10k_flow_validate, + .create = fm10k_flow_create, + .destroy = fm10k_flow_destroy, + .flush = fm10k_flow_flush, +}; + +union fm10k_filter_t cons_filter; +enum rte_filter_type fm10k_cons_filter_type = RTE_ETH_FILTER_NONE; + +/** + * MPLS filter configuration. + */ +enum fm10k_mpls_type { + FM10K_MPLS_TYPE_UNI, + FM10K_MPLS_TYPE_MULTI, +}; + +enum fm10k_mpls_action { + FM10K_MPLS_ACTION_DROP, + FM10K_MPLS_ACTION_QUEUE, +}; + +struct fm10k_mpls_filter_conf { + enum fm10k_mpls_type mpls_type; /**< mandatory for MPLS */ + uint32_t mpls_header; /**< MPLS header */ + uint32_t mpls_header_mask; /**< MPLS header mask */ + enum fm10k_mpls_action mpls_action; + uint16_t queue; + uint8_t ffu_id; + uint8_t ffu_prio; +}; + +/** + * VLAN filter configuration. + */ +struct fm10k_vlan_filter_conf { + int ffu_id; + uint8_t ffu_prio; + uint8_t is_ingress; + uint8_t port; + uint8_t in_ext_port; + uint8_t out_ext_port; + uint16_t in_vlan; + uint16_t out_vlan; +}; + + +union fm10k_filter_t { + struct fm10k_mpls_filter_conf mpls_filter; + struct fm10k_vlan_filter_conf vlan_filter; +}; + +typedef int (*parse_filter_t)(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error, +
[dpdk-dev] [PATCH v1 1/5] net/fm10k: add basic functions for switch management
Add I2C to control the inside LED and PHY. All the operations of I2C are using fm10k I2C register. Add SBUS to communicate with spico(micro code in serdes) by using fm10k SBUS register. This is like I2C operations. Add registers defination, which include all the registers will be used in the driver. Add switch management log API. Add switch management structures. Modify Makefile to add new files building. Add CONFIG_RTE_FM10K_MANAGEMENT=n in config/common_linux. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- config/common_linux |7 + drivers/net/fm10k/Makefile | 14 + drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_i2c.c| 310 + drivers/net/fm10k/switch/fm10k_i2c.h| 54 + drivers/net/fm10k/switch/fm10k_regs.h | 2302 +++ drivers/net/fm10k/switch/fm10k_sbus.c | 292 drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_switch.h | 335 + 9 files changed, 3373 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h diff --git a/config/common_linux b/config/common_linux index 8168106..75a4fa8 100644 --- a/config/common_linux +++ b/config/common_linux @@ -66,3 +66,10 @@ CONFIG_RTE_LIBRTE_HINIC_PMD=y # Hisilicon HNS3 PMD driver # CONFIG_RTE_LIBRTE_HNS3_PMD=y + +# +# FM10K switch management +# +CONFIG_RTE_FM10K_MANAGEMENT=n + + diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 29e659d..15ea187 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -11,6 +11,9 @@ LIB = librte_pmd_fm10k.a CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) CFLAGS += -DALLOW_EXPERIMENTAL_API +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +CFLAGS += -DENABLE_FM10K_MANAGEMENT +endif EXPORT_MAP := rte_pmd_fm10k_version.map @@ -49,6 +52,9 @@ endif LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash LDLIBS += -lrte_bus_pci +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +LDLIBS += -lpthread +endif # # Add extra flags for base driver source files to disable warnings in them @@ -58,6 +64,10 @@ $(foreach obj, $(BASE_DRIVER_OBJS), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)) VPATH += $(SRCDIR)/base +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +VPATH += $(SRCDIR)/switch +endif + # # all source are stored in SRCS-y # base driver is based on the package of cid-fm10k.2017.01.24.tar.gz @@ -71,6 +81,10 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_common.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sbus.c +endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c endif diff --git a/drivers/net/fm10k/switch/fm10k_debug.h b/drivers/net/fm10k/switch/fm10k_debug.h new file mode 100644 index 000..f7b5c06 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_debug.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#ifndef _FM10K_DEBUG_H_ +#define _FM10K_DEBUG_H_ + + +#define FM10K_SW_ERR(...) PMD_INIT_LOG(ERR, __VA_ARGS__) +#define FM10K_SW_INFO(...) PMD_INIT_LOG(INFO, __VA_ARGS__) +#define FM10K_SW_TRACE(...)PMD_INIT_LOG(DEBUG, __VA_ARGS__) + +#define FM10K_SW_ASSERT(...) do {} while (0) + +#define FM10K_SW_STATS_TRACE_ENABLE1 +#define FM10K_SW_FFU_CONF_TRACE_ENABLE 0 +#define FM10K_SW_MIRROR_TRACE_ENABLE 0 + +#endif /* _FM10K_DEBUG_H_ */ diff --git a/drivers/net/fm10k/switch/fm10k_i2c.c b/drivers/net/fm10k/switch/fm10k_i2c.c new file mode 100644 index 000..28b0c34 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_i2c.c @@ -0,0 +1,310 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "fm10k_debug.h" +#include "fm10k_i2c.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" + +static void fm10k_i2c_init(struct fm10k_i2c *); + +struct fm10k_i2c * +fm10k_i2c_attach(struct fm10k_switch *sw) +{ + struct fm10k_i2c *i2c; + + FM10K_SW_TRACE("i2c: attaching"); + + i2c = (struct fm10k_i2c *)rte_zmalloc(
[dpdk-dev] [PATCH v1 5/5] net/fm10k: add switch management support
Split dev init to 2 parts. First only register the port in switch management; second init hook will be called after all the pf are registered and switch initialization. It will finish dev init. Also add switch interrupt support. Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset to support mirror operation. Add fm10k_dev_filter_ctrl to support flow operation. Add dpdk port and pf mapping, so the dpdk port can map to a specific pf and 1 dpdk port can map to 2 pf to get total 100G throughput. To enable the switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/base/fm10k_type.h | 1 + drivers/net/fm10k/fm10k_ethdev.c| 562 +--- drivers/net/fm10k/switch/fm10k_switch.c | 20 +- drivers/net/fm10k/switch/fm10k_switch.h | 1 + 4 files changed, 541 insertions(+), 43 deletions(-) diff --git a/drivers/net/fm10k/base/fm10k_type.h b/drivers/net/fm10k/base/fm10k_type.h index 84781ba..810e5ee 100644 --- a/drivers/net/fm10k/base/fm10k_type.h +++ b/drivers/net/fm10k/base/fm10k_type.h @@ -717,6 +717,7 @@ struct fm10k_hw { u16 subsystem_vendor_id; u8 revision_id; u32 flags; + bool switch_ready; #define FM10K_HW_FLAG_CLOCK_OWNER BIT(0) }; diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 581c690..f11fa53 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -13,6 +13,10 @@ #include "fm10k.h" #include "base/fm10k_api.h" +#ifdef RTE_FM10K_MANAGEMENT +#include "switch/fm10k_regs.h" +#include "switch/fm10k_switch.h" +#endif /* Default delay to acquire mailbox lock */ #define FM10K_MBXLOCK_DELAY_US 20 @@ -461,9 +465,6 @@ struct fm10k_xstats_name_off { PMD_INIT_FUNC_TRACE(); - if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) - dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH; - /* multipe queue mode checking */ ret = fm10k_check_mq_mode(dev); if (ret != 0) { @@ -512,6 +513,15 @@ struct fm10k_xstats_name_off { struct rte_eth_conf *dev_conf = &dev->data->dev_conf; uint32_t mrqc, *key, i, reta, j; uint64_t hf; +#ifdef RTE_FM10K_MANAGEMENT + uint16_t nb_rx_queues = dev->data->nb_rx_queues; + int mapped_num; + struct fm10k_hw *mapped_hws[FM10K_SW_PEP_MAP_NUM_MAX]; + + mapped_num = fm10k_switch_dpdk_mapped_hw_get(hw, mapped_hws); + if (mapped_num == 2) + nb_rx_queues /= 2; +#endif #define RSS_KEY_SIZE 40 static uint8_t rss_intel_key[RSS_KEY_SIZE] = { @@ -642,26 +652,44 @@ struct fm10k_xstats_name_off { fm10k_dev_tx_init(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); +#ifdef RTE_FM10K_MANAGEMENT + struct fm10k_hw *unmap_hw = hw; + uint32_t data; +#endif int i, ret; + uint16_t hw_queue_id; struct fm10k_tx_queue *txq; uint64_t base_addr; uint32_t size; +#ifndef RTE_FM10K_MANAGEMENT /* Disable TXINT to avoid possible interrupt */ for (i = 0; i < hw->mac.max_queues; i++) FM10K_WRITE_REG(hw, FM10K_TXINT(i), 3 << FM10K_TXINT_TIMER_SHIFT); +#else + fm10k_switch_dpdk_tx_queue_num_set(unmap_hw, + dev->data->nb_tx_queues); +#endif /* Setup TX queue */ for (i = 0; i < dev->data->nb_tx_queues; ++i) { + hw_queue_id = i; +#ifdef RTE_FM10K_MANAGEMENT + fm10k_switch_dpdk_hw_queue_map(unmap_hw, + i, dev->data->nb_tx_queues, + &hw, &hw_queue_id); +#endif txq = dev->data->tx_queues[i]; base_addr = txq->hw_ring_phys_addr; size = txq->nb_desc * sizeof(struct fm10k_tx_desc); /* disable queue to avoid issues while updating state */ - ret = tx_queue_disable(hw, i); + ret = tx_queue_disable(hw, hw_queue_id); if (ret) { - PMD_INIT_LOG(ERR, "failed to disable queue %d", i); + PMD_INIT_LOG(ERR, + "failed to disable queue %d", + hw_queue_id); return -1; } /* Enable use of FTAG bit in TX descriptor, PFVTCTL @@ -669,7 +697,7 @@ struct fm10k_xstats_name_off { */ if (fm10k_check_ftag(dev->device->devargs)) { if (hw->mac.type == fm10k_mac_pf) { - FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i), + FM10K_WRITE_REG(hw, FM10K_PFVTCTL(
Re: [dpdk-dev] [PATCH v2 5/5] net/fm10k: add switch management support
Hi Xiao, Thank you! Did you received my new patches last weekend? BTW, I updated to the latest dpdk as the code base. Best regards, Xiaojun From: Wang, Xiao W Sent: Tuesday, February 25, 2020 7:28 PM To: Xiaojun Liu ; Zhang, Qi Z ; Kwan, Ngai-mint ; Keller, Jacob E Cc: dev@dpdk.org ; Ye, Xiaolong Subject: RE: [PATCH v2 5/5] net/fm10k: add switch management support Hi Xiaojun, Gather some comments about the code changes to original file: Based on the latest dpdk, "git am" will fail with the Makefile. Add CONFIG_RTE_FM10K_MANAGEMENT=n as a default option into ./config is better. If user wants to turn on this switch feature, it's easier to just change "n" to "y". No need to introduce another macro ENABLE_FM10K_MANAGEMENT, just use RTE_FM10K_MANAGEMENT to wrap your code. For ethdev.c: static int fm10k_switch_ready; This should be a per device value, right? I assume we may have >1 fm10k devices, then cannot share one state value. DEV_RX_OFFLOAD_RSS_HASH is removed, it may affect current usage. Log some debug info before return -EIO. How about moving the commonly used variables like "struct fm10k_hw *hw" out of "ifdef else". Put fm10k_link_update() at the end of dev_start(). For fm10k_stats_get(), it looks there's little code shared between #if and #else, you can just write a whole new function. There's comment "It may not work for VF", have you addressed this uncertainty? We'd better not to leave this in upstream version. BTW, when sending new versions, you need to document what has changed from last version in your cover letter, in below format: V2: * Fix what * Fix what Best Regards, Xiao > -Original Message- > From: Xiaojun Liu > Sent: Thursday, February 20, 2020 10:00 PM > To: Wang, Xiao W ; Zhang, Qi Z > ; Kwan, Ngai-mint ; > Keller, Jacob E > Cc: dev@dpdk.org; Xiaojun Liu > Subject: [PATCH v2 5/5] net/fm10k: add switch management support > > Split dev init to 2 parts. > First only register the port in switch > management; second init hook will be > called after all the pf are registered > and switch initialization. It will finish > dev init. Also add switch interrupt support. > Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset > to support mirror operation. Add fm10k_dev_filter_ctrl > to support flow operation. > Add dpdk port and pf mapping, so > the dpdk port can map to a specific pf > and 1 dpdk port can map to 2 pf to get > total 100G throughput. > > To enable the switch management, you need add > CONFIG_RTE_FM10K_MANAGEMENT=y in > config/common_linux when building. > > Signed-off-by: Xiaojun Liu > --- [...]
[dpdk-dev] [PATCH v3 1/5] net/fm10k: add basic functions for switch management
Add I2C to control the inside LED and PHY. All the operations of I2C are using fm10k I2C register. Add SBUS to communicate with spico(micro code in serdes) by using fm10k SBUS register. This is like I2C operations. Add registers defination, which include all the registers will be used in the driver. Add switch management log API. Add switch management structures. Modify Makefile to add new files building. Add CONFIG_RTE_FM10K_MANAGEMENT=n in config/common_linux. Signed-off-by: Xiaojun Liu --- config/common_linux |5 + drivers/net/fm10k/Makefile | 11 + drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_i2c.c| 309 + drivers/net/fm10k/switch/fm10k_i2c.h| 55 + drivers/net/fm10k/switch/fm10k_regs.h | 2302 +++ drivers/net/fm10k/switch/fm10k_sbus.c | 291 drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_switch.h | 335 + 9 files changed, 3367 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h diff --git a/config/common_linux b/config/common_linux index 8168106..6e62b99 100644 --- a/config/common_linux +++ b/config/common_linux @@ -66,3 +66,8 @@ CONFIG_RTE_LIBRTE_HINIC_PMD=y # Hisilicon HNS3 PMD driver # CONFIG_RTE_LIBRTE_HNS3_PMD=y + +# +# FM10K switch management +# +CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=n diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 29e659d..49bb554 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -49,6 +49,9 @@ endif LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash LDLIBS += -lrte_bus_pci +ifeq ($(CONFIG_RTE_FM10K_SWITCH_MANAGEMENT),y) +LDLIBS += -lpthread +endif # # Add extra flags for base driver source files to disable warnings in them @@ -58,6 +61,10 @@ $(foreach obj, $(BASE_DRIVER_OBJS), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)) VPATH += $(SRCDIR)/base +ifeq ($(CONFIG_RTE_FM10K_SWITCH_MANAGEMENT),y) +VPATH += $(SRCDIR)/switch +endif + # # all source are stored in SRCS-y # base driver is based on the package of cid-fm10k.2017.01.24.tar.gz @@ -71,6 +78,10 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_common.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c +ifeq ($(CONFIG_RTE_FM10K_SWITCH_MANAGEMENT),y) +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sbus.c +endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c endif diff --git a/drivers/net/fm10k/switch/fm10k_debug.h b/drivers/net/fm10k/switch/fm10k_debug.h new file mode 100644 index 000..f7b5c06 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_debug.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#ifndef _FM10K_DEBUG_H_ +#define _FM10K_DEBUG_H_ + + +#define FM10K_SW_ERR(...) PMD_INIT_LOG(ERR, __VA_ARGS__) +#define FM10K_SW_INFO(...) PMD_INIT_LOG(INFO, __VA_ARGS__) +#define FM10K_SW_TRACE(...)PMD_INIT_LOG(DEBUG, __VA_ARGS__) + +#define FM10K_SW_ASSERT(...) do {} while (0) + +#define FM10K_SW_STATS_TRACE_ENABLE1 +#define FM10K_SW_FFU_CONF_TRACE_ENABLE 0 +#define FM10K_SW_MIRROR_TRACE_ENABLE 0 + +#endif /* _FM10K_DEBUG_H_ */ diff --git a/drivers/net/fm10k/switch/fm10k_i2c.c b/drivers/net/fm10k/switch/fm10k_i2c.c new file mode 100644 index 000..7d64899 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_i2c.c @@ -0,0 +1,309 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_debug.h" +#include "fm10k_i2c.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" + +static void fm10k_i2c_init(struct fm10k_i2c *); + +struct fm10k_i2c * +fm10k_i2c_attach(struct fm10k_switch *sw) +{ + struct fm10k_i2c *i2c; + + FM10K_SW_TRACE("i2c: attaching"); + + i2c = (struct fm10k_i2c *)rte_zmalloc("fm10k_i2c", + sizeof(struct fm10k_i2c), 0); + if (i2c == NULL) { + FM10K_SW_INFO("i2c: failed to allocate context"); + goto fail; + } + + i2c->sw = sw; + pthread_mutex_init(&i2c->req_lock, NULL); + pthread_mutex_init(&i2c-
[dpdk-dev] [PATCH v3 0/5] support fm10k switch management
V3: * Add I2C to control the inside LED and PHY. * Add SBUS to communicate with spico. * Add registers defination. * Add switch management log API. * Add switch management structures. * Add epl serdes include loading spico, controlling pcsl, dma, dfe, ical. * Add spico code. * Add state machine for epl lane and port. * Add external port management. * Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. * Add config file to configure debug log, port speed, epl port mapping dpdk port, flowset. * Add statistics includes epl port, ffu rule, dpdk port. * Add flow interface to support offload flow into HW. * Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. * Split dev_init to 2 parts in ethdev. First only register the port in switch management; second init hook will be called after all the pf are registered. * Add switch interrupt support. * Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset. * Add fm10k_dev_filter_ctrl to support flow operation. * Add dpdk port and pf mapping. * Modify Makefile to add new files building Xiaojun Liu (5): net/fm10k: add basic functions for switch management net/fm10k: add epl serdes and port control functions net/fm10k: add ffu and statistics and config file functions net/fm10k: add flow interface and switch management net/fm10k: add switch management support config/common_linux |5 + doc/guides/nics/fm10k.rst |5 + drivers/net/fm10k/Makefile | 20 + drivers/net/fm10k/base/fm10k_type.h |1 + drivers/net/fm10k/fm10k_ethdev.c| 559 - drivers/net/fm10k/switch/fm10k_config.c | 857 drivers/net/fm10k/switch/fm10k_config.h | 178 ++ drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_ext_port.c | 839 drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++ drivers/net/fm10k/switch/fm10k_ffu.c| 1250 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_flow.c | 872 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_i2c.c| 309 +++ drivers/net/fm10k/switch/fm10k_i2c.h| 55 + drivers/net/fm10k/switch/fm10k_regs.h | 2302 + drivers/net/fm10k/switch/fm10k_sbus.c | 291 +++ drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_serdes.c | 1936 + drivers/net/fm10k/switch/fm10k_serdes.h | 32 + drivers/net/fm10k/switch/fm10k_sm.c | 190 ++ drivers/net/fm10k/switch/fm10k_sm.h | 80 + drivers/net/fm10k/switch/fm10k_spico_code.c | 2966 +++ drivers/net/fm10k/switch/fm10k_spico_code.h | 21 + drivers/net/fm10k/switch/fm10k_stats.c | 1233 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.c | 2382 + drivers/net/fm10k/switch/fm10k_switch.h | 476 + 29 files changed, 17329 insertions(+), 39 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.c create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.c create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.h create mode 100644 drivers/net/fm10k/switch/fm10k_sm.c create mode 100644 drivers/net/fm10k/switch/fm10k_sm.h create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.c create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h -- 1.8.3.1
[dpdk-dev] [PATCH v3 3/5] net/fm10k: add ffu and statistics and config file functions
Add ffu to support offload flow into HW. It supports forward, mirror, push VLAN, pop VLAN. It also supports flowset for a group flow definition. The config file can configure debug log, port speed, epl port mapping dpdk port, flowset. All these configuration will be used by switch management. Statistics includes epl port, ffu rule, dpdk port, and error. All these statistics data are read from HW. Modify switch header file to support getting logical port and glort and device info. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |3 + drivers/net/fm10k/switch/fm10k_config.c | 857 + drivers/net/fm10k/switch/fm10k_config.h | 178 + drivers/net/fm10k/switch/fm10k_ffu.c| 1250 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_stats.c | 1105 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.h | 158 +++- 8 files changed, 3830 insertions(+), 9 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 6f5ae60..68a72d5 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -85,6 +85,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ext_port.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_serdes.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sm.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_config.c b/drivers/net/fm10k/switch/fm10k_config.c new file mode 100644 index 000..6fb9bab --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_config.c @@ -0,0 +1,857 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../base/fm10k_type.h" +#include "../base/fm10k_osdep.h" +#include "../fm10k.h" +#include "../fm10k_logs.h" +#include "fm10k_debug.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" +#include "fm10k_config.h" + + +#define FM10K_CONFIG_WORD_MAX 10 +#define FM10K_CONFIG_WORD_LEN 20 +#define FM10K_CONFIG_STR_MAX 100 + +/* used for store the key strings */ +struct fm10k_cfg_key_item { + const char *key_str[FM10K_CONFIG_WORD_MAX]; + uint8_t type; +}; + +/* configuration file path */ +static const char *fm10k_config_dpdk_conf_file = "/etc/dpdk_fm10k.conf"; +/* configuration structure */ +static struct fm10k_dpdk_cfg fm10k_config_dpdk_cfg; + +/* configuration key strings */ +static struct fm10k_cfg_key_item fm10k_config_key_items[] = { + /* enable debug print */ + { {"debug", "print", "enable"}, + FM10K_CONFIG_DEBUG_ENABLE}, + { {"debug", "print", "config"}, + FM10K_CONFIG_DEBUG_CONFIG}, + { {"debug", "print", "ffu", "init"}, + FM10K_CONFIG_DEBUG_FFU_INIT}, + { {"debug", "print", "ffu", "register"}, + FM10K_CONFIG_DEBUG_FFU_REG}, + { {"debug", "print", "ffu", "rule"}, + FM10K_CONFIG_DEBUG_FFU_RULE}, + { {"debug", "print", "stats", "port"}, + FM10K_CONFIG_DEBUG_STATS_PORT}, + { {"debug", "print", "stats", "queue"}, + FM10K_CONFIG_DEBUG_STATS_QUEUE}, + { {"debug", "print", "stats", "rule"}, + FM10K_CONFIG_DEBUG_STATS_FFU}, + { {"debug", "print", "stats", "detail"}, + FM10K_CONFIG_DEBUG_STATS_MORE}, + { {"debug", "print", "stats", "interval"}, + FM10K_CONFIG_DEBUG_STATS_INTERVAL}, + /* general configuration */ + { {"dpdk", "bind&
[dpdk-dev] [PATCH v3 4/5] net/fm10k: add flow interface and switch management
Add flow interface to support offload flow into HW. It supports parse vlan and parse mpls, all these data will be transferred to ffu data. Add switch management, includes initialization, port mapping, epl port link, LED controller, interrupt handler. It create 3 threads. One for interrupt handler, one for LED controller, one for statistics. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |2 + drivers/net/fm10k/base/fm10k_type.h |1 + drivers/net/fm10k/switch/fm10k_flow.c | 872 +++ drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_stats.c | 128 ++ drivers/net/fm10k/switch/fm10k_switch.c | 2382 +++ drivers/net/fm10k/switch/fm10k_switch.h |1 + 7 files changed, 3412 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 68a72d5..5a8d227 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -88,6 +88,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_flow.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_switch.c endif ifeq ($(CONFIG_RTE_ARCH_X86), y) SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/base/fm10k_type.h b/drivers/net/fm10k/base/fm10k_type.h index 84781ba..810e5ee 100644 --- a/drivers/net/fm10k/base/fm10k_type.h +++ b/drivers/net/fm10k/base/fm10k_type.h @@ -717,6 +717,7 @@ struct fm10k_hw { u16 subsystem_vendor_id; u8 revision_id; u32 flags; + bool switch_ready; #define FM10K_HW_FLAG_CLOCK_OWNER BIT(0) }; diff --git a/drivers/net/fm10k/switch/fm10k_flow.c b/drivers/net/fm10k/switch/fm10k_flow.c new file mode 100644 index 000..353f021 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_flow.c @@ -0,0 +1,872 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_flow.h" +#include "fm10k_switch.h" +#include "fm10k_ffu.h" +#include "fm10k_config.h" + + +static int fm10k_flow_validate(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); +static struct rte_flow *fm10k_flow_create(struct rte_eth_dev *dev, +const struct rte_flow_attr *attr, +const struct rte_flow_item pattern[], +const struct rte_flow_action actions[], +struct rte_flow_error *error); +static int fm10k_flow_destroy(struct rte_eth_dev *dev, +struct rte_flow *flow, +struct rte_flow_error *error); +static int fm10k_flow_flush(struct rte_eth_dev *dev, + struct rte_flow_error *error); +static int fm10k_flow_parse_attr(const struct rte_flow_attr *attr, + struct rte_flow_error *error); + +const struct rte_flow_ops fm10k_flow_ops = { + .validate = fm10k_flow_validate, + .create = fm10k_flow_create, + .destroy = fm10k_flow_destroy, + .flush = fm10k_flow_flush, +}; + +union fm10k_filter_t cons_filter; +enum rte_filter_type fm10k_cons_filter_type = RTE_ETH_FILTER_NONE; + +/** + * MPLS filter configuration. + */ +enum fm10k_mpls_type { + FM10K_MPLS_TYPE_UNI, + FM10K_MPLS_TYPE_MULTI, +}; + +enum fm10k_mpls_action { + FM10K_MPLS_ACTION_DROP, + FM10K_MPLS_ACTION_QUEUE, +}; + +struct fm10k_mpls_filter_conf { + enum fm10k_mpls_type mpls_type; /**< mandatory for MPLS */ + uint32_t mpls_header; /**< MPLS header */ + uint32_t mpls_header_mask; /**< MPLS header mask */ + enum fm10k_mpls_action mpls_action; + uint16_t queue; + uint8_t ffu_id; + uint8_t ffu_prio; +}; + +/** + * VLAN filter configuration. + */ +struct fm10k_vlan_filter_conf { + int ffu_id; + uint8_t ffu_prio; + uint8_t is_ingress; + uint8_t port; + uint8_t in_ext_port; + uint8_t out_ext_port; + uint16_t in_vlan; + uint16_t out_vlan; +}; + + +union fm10k_filter_t { + struct fm10k_mpls_filter_conf mpls_filter; + struct fm10k
[dpdk-dev] [PATCH v3 5/5] net/fm10k: add switch management support
Split dev init to 2 parts. First only register the port in switch management; second init hook will be called after all the pf are registered and switch initialization. It will finish dev init. Also add switch interrupt support. Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset to support mirror operation. Add fm10k_dev_filter_ctrl to support flow operation. Add dpdk port and pf mapping, so the dpdk port can map to a specific pf and 1 dpdk port can map to 2 pf to get total 100G throughput. Update fm10k.rst. Signed-off-by: Xiaojun Liu --- doc/guides/nics/fm10k.rst| 5 + drivers/net/fm10k/fm10k_ethdev.c | 559 --- 2 files changed, 525 insertions(+), 39 deletions(-) diff --git a/doc/guides/nics/fm10k.rst b/doc/guides/nics/fm10k.rst index 4e178c2..75f9929 100644 --- a/doc/guides/nics/fm10k.rst +++ b/doc/guides/nics/fm10k.rst @@ -124,6 +124,11 @@ FM1 PMD driver. The switch driver can be acquired from Intel support. Only Testpoint is validated with DPDK, the latest version that has been validated with DPDK is 4.1.6. +To avoid loading other switch driver from outside of DPDK, there is another +way to load switch driver in DPDK. If you want to use the inline switch driver, +you need to set ''CONFIG_RTE_FM10K_SWITCH_MANAGEMENT=y'' in the configure file. +The inline switch driver supports mirror and some flow forward rules. + Support for Switch Restart ~~ diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 581c690..77dc5b0 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -13,6 +13,10 @@ #include "fm10k.h" #include "base/fm10k_api.h" +#ifdef RTE_FM10K_SWITCH_MANAGEMENT +#include "switch/fm10k_regs.h" +#include "switch/fm10k_switch.h" +#endif /* Default delay to acquire mailbox lock */ #define FM10K_MBXLOCK_DELAY_US 20 @@ -512,6 +516,15 @@ struct fm10k_xstats_name_off { struct rte_eth_conf *dev_conf = &dev->data->dev_conf; uint32_t mrqc, *key, i, reta, j; uint64_t hf; +#ifdef RTE_FM10K_SWITCH_MANAGEMENT + uint16_t nb_rx_queues = dev->data->nb_rx_queues; + int mapped_num; + struct fm10k_hw *mapped_hws[FM10K_SW_PEP_MAP_NUM_MAX]; + + mapped_num = fm10k_switch_dpdk_mapped_hw_get(hw, mapped_hws); + if (mapped_num == 2) + nb_rx_queues /= 2; +#endif #define RSS_KEY_SIZE 40 static uint8_t rss_intel_key[RSS_KEY_SIZE] = { @@ -642,26 +655,44 @@ struct fm10k_xstats_name_off { fm10k_dev_tx_init(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); +#ifdef RTE_FM10K_SWITCH_MANAGEMENT + struct fm10k_hw *unmap_hw = hw; + uint32_t data; +#endif int i, ret; + uint16_t hw_queue_id; struct fm10k_tx_queue *txq; uint64_t base_addr; uint32_t size; +#ifndef RTE_FM10K_SWITCH_MANAGEMENT /* Disable TXINT to avoid possible interrupt */ for (i = 0; i < hw->mac.max_queues; i++) FM10K_WRITE_REG(hw, FM10K_TXINT(i), 3 << FM10K_TXINT_TIMER_SHIFT); +#else + fm10k_switch_dpdk_tx_queue_num_set(unmap_hw, + dev->data->nb_tx_queues); +#endif /* Setup TX queue */ for (i = 0; i < dev->data->nb_tx_queues; ++i) { + hw_queue_id = i; +#ifdef RTE_FM10K_SWITCH_MANAGEMENT + fm10k_switch_dpdk_hw_queue_map(unmap_hw, + i, dev->data->nb_tx_queues, + &hw, &hw_queue_id); +#endif txq = dev->data->tx_queues[i]; base_addr = txq->hw_ring_phys_addr; size = txq->nb_desc * sizeof(struct fm10k_tx_desc); /* disable queue to avoid issues while updating state */ - ret = tx_queue_disable(hw, i); + ret = tx_queue_disable(hw, hw_queue_id); if (ret) { - PMD_INIT_LOG(ERR, "failed to disable queue %d", i); + PMD_INIT_LOG(ERR, + "failed to disable queue %d", + hw_queue_id); return -1; } /* Enable use of FTAG bit in TX descriptor, PFVTCTL @@ -669,7 +700,7 @@ struct fm10k_xstats_name_off { */ if (fm10k_check_ftag(dev->device->devargs)) { if (hw->mac.type == fm10k_mac_pf) { - FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i), + FM10K_WRITE_REG(hw, FM10K_PFVTCTL(hw_queue_id), FM10K_PFVTCTL_FTAG_DESC_ENABLE); PMD_INIT_LOG(DEBUG, "FTAG mode is ena
[dpdk-dev] [PATCH v2 0/7] support switch management
To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Xiaojun Liu (7): net/fm10k: add i2c sbus registers definition net/fm10k: add some modules of port net/fm10k: add config ffu statistics support net/fm10k: add flow and switch management net/fm10k: add switch initialization net/fm10k: add mirror and filter ctrl net/fm10k: add dpdk port mapping drivers/net/fm10k/Makefile | 22 + drivers/net/fm10k/fm10k_ethdev.c| 580 +- drivers/net/fm10k/switch/fm10k_config.c | 855 drivers/net/fm10k/switch/fm10k_config.h | 171 ++ drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_ext_port.c | 841 drivers/net/fm10k/switch/fm10k_ext_port.h | 136 ++ drivers/net/fm10k/switch/fm10k_ffu.c| 1209 +++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_flow.c | 872 drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_i2c.c| 310 +++ drivers/net/fm10k/switch/fm10k_i2c.h| 54 + drivers/net/fm10k/switch/fm10k_regs.h | 2202 drivers/net/fm10k/switch/fm10k_sbus.c | 292 +++ drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_serdes.c | 1886 + drivers/net/fm10k/switch/fm10k_serdes.h | 32 + drivers/net/fm10k/switch/fm10k_sm.c | 182 ++ drivers/net/fm10k/switch/fm10k_sm.h | 78 + drivers/net/fm10k/switch/fm10k_spico_code.c | 2966 +++ drivers/net/fm10k/switch/fm10k_spico_code.h | 21 + drivers/net/fm10k/switch/fm10k_stats.c | 1242 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ drivers/net/fm10k/switch/fm10k_switch.c | 2562 +++ drivers/net/fm10k/switch/fm10k_switch.h | 336 +++ 26 files changed, 17188 insertions(+), 34 deletions(-) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.c create mode 100644 drivers/net/fm10k/switch/fm10k_ext_port.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.c create mode 100644 drivers/net/fm10k/switch/fm10k_serdes.h create mode 100644 drivers/net/fm10k/switch/fm10k_sm.c create mode 100644 drivers/net/fm10k/switch/fm10k_sm.h create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.c create mode 100644 drivers/net/fm10k/switch/fm10k_spico_code.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h -- 1.8.3.1
[dpdk-dev] [PATCH v2 5/7] net/fm10k: add switch initialization
Modify fm10k/fm10k_ethdev.c. Split dev init to 2 parts. First only register the port in switch management; second init hook will be called after all the pf are registered and switch initialization. It will finish dev init. Also add switch interrupt support. To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/fm10k_ethdev.c | 182 +-- 1 file changed, 176 insertions(+), 6 deletions(-) diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 99c4366..4c81952 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -13,6 +13,10 @@ #include "fm10k.h" #include "base/fm10k_api.h" +#ifdef ENABLE_FM10K_MANAGEMENT +#include "switch/fm10k_regs.h" +#include "switch/fm10k_switch.h" +#endif /* Default delay to acquire mailbox lock */ #define FM10K_MBXLOCK_DELAY_US 20 @@ -39,6 +43,10 @@ #define GLORT_PF_MASK0xFFC0 #define GLORT_FD_MASKGLORT_PF_MASK #define GLORT_FD_INDEX GLORT_FD_Q_BASE +#ifdef ENABLE_FM10K_MANAGEMENT +/* When the switch is ready, the status will be changed */ +static int fm10k_switch_ready; +#endif int fm10k_logtype_init; int fm10k_logtype_driver; @@ -2588,6 +2596,9 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private); int status_mbx; s32 err; +#ifdef ENABLE_FM10K_MANAGEMENT + uint32_t writeback = 0; +#endif if (hw->mac.type != fm10k_mac_pf) return; @@ -2601,11 +2612,20 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) } /* Handle switch up/down */ - if (cause & FM10K_EICR_SWITCHNOTREADY) - PMD_INIT_LOG(ERR, "INT: Switch is not ready"); + if (cause & FM10K_EICR_SWITCHNOTREADY) { + PMD_INIT_LOG(INFO, "INT: Switch is not ready"); +#ifdef ENABLE_FM10K_MANAGEMENT + fm10k_switch_ready = 0; + writeback |= FM10K_EICR_SWITCHNOTREADY; +#endif + } if (cause & FM10K_EICR_SWITCHREADY) { PMD_INIT_LOG(INFO, "INT: Switch is ready"); +#ifdef ENABLE_FM10K_MANAGEMENT + fm10k_switch_ready = 1; + writeback |= FM10K_EICR_SWITCHREADY; +#endif if (dev_info->sm_down == 1) { fm10k_mbx_lock(hw); @@ -2656,6 +2676,7 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) } /* Handle mailbox message */ +#ifndef ENABLE_FM10K_MANAGEMENT fm10k_mbx_lock(hw); err = hw->mbx.ops.process(hw, &hw->mbx); fm10k_mbx_unlock(hw); @@ -2663,10 +2684,33 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) if (err == FM10K_ERR_RESET_REQUESTED) { PMD_INIT_LOG(INFO, "INT: Switch is down"); dev_info->sm_down = 1; - _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, + _rte_eth_dev_callback_process + (dev, + RTE_ETH_EVENT_INTR_LSC, NULL); } +#else + if (cause & FM10K_EICR_MAILBOX) { + fm10k_mbx_lock(hw); + err = hw->mbx.ops.process(hw, &hw->mbx); + fm10k_mbx_unlock(hw); + writeback |= FM10K_EICR_MAILBOX; + if (err == FM10K_ERR_RESET_REQUESTED) { + PMD_INIT_LOG(INFO, "INT: Switch is down"); + dev_info->sm_down = 1; + _rte_eth_dev_callback_process + (dev, + RTE_ETH_EVENT_INTR_LSC, + NULL); + } + } + + /* Handle switch interrupt */ + if (cause & FM10K_SW_EICR_SWITCH_INT) + fm10k_switch_intr(hw); +#endif + /* Handle SRAM error */ if (cause & FM10K_EICR_SRAMERROR) { PMD_INIT_LOG(ERR, "INT: SRAM error on PEP"); @@ -2678,15 +2722,27 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) /* Todo: print out error message after shared code updates */ } +#ifndef ENABLE_FM10K_MANAGEMENT /* Clear these 3 events if having any */ cause &= FM10K_EICR_SWITCHNOTREADY | FM10K_EICR_MAILBOX | FM10K_EICR_SWITCHREADY; if (cause) FM10K_WRITE_REG(hw, FM10K_EICR, cause); +#else + if (writeback) +
[dpdk-dev] [PATCH v2 1/7] net/fm10k: add i2c sbus registers definition
To support switch management, add the following files: Add fm10k/switch/fm10k_debug.h(define log Macros). Add fm10k/switch/fm10k_regs.h(define all the registers). Add fm10k/switch/fm10k_switch.h(define switch Macros and APIs). Add fm10k/switch/fm10k_i2c.h(define I2C interfaces). Add fm10k/switch/fm10k_i2c.c(support I2C access). Add fm10k/switch/fm10k_sbus.h(define SBUS interface). Add fm10k/switch/fm10k_sbus.c(support SBUS access). and modify fm10k/Makefile(add ENABLE_FM10K_MANAGEMENT support, add fm10k_i2c.c and fm10k_sbus.c). To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile | 13 + drivers/net/fm10k/switch/fm10k_debug.h | 19 + drivers/net/fm10k/switch/fm10k_i2c.c| 310 + drivers/net/fm10k/switch/fm10k_i2c.h| 54 + drivers/net/fm10k/switch/fm10k_regs.h | 2202 +++ drivers/net/fm10k/switch/fm10k_sbus.c | 292 drivers/net/fm10k/switch/fm10k_sbus.h | 40 + drivers/net/fm10k/switch/fm10k_switch.h | 336 + 8 files changed, 3266 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_debug.h create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.c create mode 100644 drivers/net/fm10k/switch/fm10k_i2c.h create mode 100644 drivers/net/fm10k/switch/fm10k_regs.h create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.c create mode 100644 drivers/net/fm10k/switch/fm10k_sbus.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 55e9cd5..aca6bfb 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -11,6 +11,9 @@ LIB = librte_pmd_fm10k.a CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) CFLAGS += -DALLOW_EXPERIMENTAL_API +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +CFLAGS += -DENABLE_FM10K_MANAGEMENT +endif EXPORT_MAP := rte_pmd_fm10k_version.map @@ -62,6 +65,10 @@ $(foreach obj, $(BASE_DRIVER_OBJS), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)) VPATH += $(SRCDIR)/base +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +VPATH += $(SRCDIR)/switch +endif + # # all source are stored in SRCS-y # base driver is based on the package of cid-fm10k.2017.01.24.tar.gz @@ -75,6 +82,12 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_common.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c + +ifeq ($(CONFIG_RTE_FM10K_MANAGEMENT),y) +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_i2c.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sbus.c +endif + SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/net/fm10k/switch/fm10k_debug.h b/drivers/net/fm10k/switch/fm10k_debug.h new file mode 100644 index 000..6bf72a8 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_debug.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#ifndef _FM10K_DEBUG_H_ +#define _FM10K_DEBUG_H_ + + +#define FM10K_SW_ERR(...) PMD_INIT_LOG(ERR, __VA_ARGS__) +#define FM10K_SW_INFO(...) PMD_INIT_LOG(INFO, __VA_ARGS__) +#define FM10K_SW_TRACE(...)PMD_INIT_LOG(DEBUG, __VA_ARGS__) + +#define FM10K_SW_ASSERT(...) do {} while (0) + +#define FM10K_SW_STATS_TRACE_ENABLE1 +#define FM10K_SW_FFU_CONF_TRACE_ENABLE 0 +#define FM10K_SW_MIRROR_TRACE_ENABLE 0 + +#endif /* _FM10K_DEBUG_H_ */ diff --git a/drivers/net/fm10k/switch/fm10k_i2c.c b/drivers/net/fm10k/switch/fm10k_i2c.c new file mode 100644 index 000..28b0c34 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_i2c.c @@ -0,0 +1,310 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "fm10k_debug.h" +#include "fm10k_i2c.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" + +static void fm10k_i2c_init(struct fm10k_i2c *); + +struct fm10k_i2c * +fm10k_i2c_attach(struct fm10k_switch *sw) +{ + struct fm10k_i2c *i2c; + + FM10K_SW_TRACE("i2c: attaching"); + + i2c = (struct fm10k_i2c *)rte_zmalloc("fm10k_i2c", + sizeof(struct fm10k_i2c), 0); + if (i2c == NULL) { + FM10K_SW_INFO("i2c: failed to allocate context"); + goto fail; + } + + i2c->sw = sw; + pthread_mutex_init(&i2c->req_lock, NULL); + pthread_mutex_init(&i2c->bus_lock, NULL); + sem_init(&i2c->req_cv, 0, 0); + + fm10k_i2c_init(i2c); + + FM10K_SW_TRACE("i2c: attach successful&q
[dpdk-dev] [PATCH v2 4/7] net/fm10k: add flow and switch management
To support switch management, add the following new files: Add fm10k/switch/fm10k_flow.h. Add fm10k/switch/fm10k_flow.c(support dpdk flow operations) Add fm10k/switch/fm10k_switch.c(support switch management) Modify fm10k/Makefile(add fm10k_flow.c and fm10k_switch.c). To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |2 + drivers/net/fm10k/switch/fm10k_flow.c | 872 +++ drivers/net/fm10k/switch/fm10k_flow.h | 26 + drivers/net/fm10k/switch/fm10k_switch.c | 2562 +++ 4 files changed, 3462 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_flow.c create mode 100644 drivers/net/fm10k/switch/fm10k_flow.h create mode 100644 drivers/net/fm10k/switch/fm10k_switch.c diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index ed73251..ab263c5 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -93,6 +93,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_switch.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_flow.c endif SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_flow.c b/drivers/net/fm10k/switch/fm10k_flow.c new file mode 100644 index 000..353f021 --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_flow.c @@ -0,0 +1,872 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "fm10k_flow.h" +#include "fm10k_switch.h" +#include "fm10k_ffu.h" +#include "fm10k_config.h" + + +static int fm10k_flow_validate(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error); +static struct rte_flow *fm10k_flow_create(struct rte_eth_dev *dev, +const struct rte_flow_attr *attr, +const struct rte_flow_item pattern[], +const struct rte_flow_action actions[], +struct rte_flow_error *error); +static int fm10k_flow_destroy(struct rte_eth_dev *dev, +struct rte_flow *flow, +struct rte_flow_error *error); +static int fm10k_flow_flush(struct rte_eth_dev *dev, + struct rte_flow_error *error); +static int fm10k_flow_parse_attr(const struct rte_flow_attr *attr, + struct rte_flow_error *error); + +const struct rte_flow_ops fm10k_flow_ops = { + .validate = fm10k_flow_validate, + .create = fm10k_flow_create, + .destroy = fm10k_flow_destroy, + .flush = fm10k_flow_flush, +}; + +union fm10k_filter_t cons_filter; +enum rte_filter_type fm10k_cons_filter_type = RTE_ETH_FILTER_NONE; + +/** + * MPLS filter configuration. + */ +enum fm10k_mpls_type { + FM10K_MPLS_TYPE_UNI, + FM10K_MPLS_TYPE_MULTI, +}; + +enum fm10k_mpls_action { + FM10K_MPLS_ACTION_DROP, + FM10K_MPLS_ACTION_QUEUE, +}; + +struct fm10k_mpls_filter_conf { + enum fm10k_mpls_type mpls_type; /**< mandatory for MPLS */ + uint32_t mpls_header; /**< MPLS header */ + uint32_t mpls_header_mask; /**< MPLS header mask */ + enum fm10k_mpls_action mpls_action; + uint16_t queue; + uint8_t ffu_id; + uint8_t ffu_prio; +}; + +/** + * VLAN filter configuration. + */ +struct fm10k_vlan_filter_conf { + int ffu_id; + uint8_t ffu_prio; + uint8_t is_ingress; + uint8_t port; + uint8_t in_ext_port; + uint8_t out_ext_port; + uint16_t in_vlan; + uint16_t out_vlan; +}; + + +union fm10k_filter_t { + struct fm10k_mpls_filter_conf mpls_filter; + struct fm10k_vlan_filter_conf vlan_filter; +}; + +typedef int (*parse_filter_t)(struct rte_eth_dev *dev, + const struct rte_flow_attr *attr, + const struct rte_flow_item pattern[], + const struct rte_flow_action actions[], + struct rte_flow_error *error, + union fm10k_filter_t *filt
[dpdk-dev] [PATCH v2 6/7] net/fm10k: add mirror and filter ctrl
Modify fm10k/fm10k_ethdev.c. Add fm10k_mirror_rule_set/fm10k_mirror_rule_reset to support mirror operation. Add fm10k_dev_filter_ctrl to support flow operation. To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/fm10k_ethdev.c | 76 1 file changed, 76 insertions(+) diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 4c81952..1c01684 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -2288,6 +2288,77 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) return 0; } +#ifdef ENABLE_FM10K_MANAGEMENT +static int +fm10k_mirror_rule_set(struct rte_eth_dev *dev, + struct rte_eth_mirror_conf *mirror_conf, + uint8_t sw_id, uint8_t on) +{ + struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + PMD_INIT_LOG(DEBUG, + "Mirror set, switch %d to port %d attach vlan %d on %d", + sw_id, mirror_conf->dst_pool, + mirror_conf->vlan.vlan_id[0], on); + + if (on) { + if (fm10k_switch_mirror_set(hw, + mirror_conf->dst_pool, + mirror_conf->vlan.vlan_id[0]) < 0) { + PMD_INIT_LOG(ERR, "Input wrong port!!!"); + return -1; + } + } else { + if (fm10k_switch_mirror_reset(hw) < 0) { + PMD_INIT_LOG(ERR, "Input wrong port!!!"); + return -1; + } + } + + return 0; +} + + +static int +fm10k_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t sw_id) +{ + struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + PMD_INIT_LOG(DEBUG, "Mirror reset, switch %d", sw_id); + + fm10k_switch_mirror_reset(hw); + + return 0; +} + +static int +fm10k_dev_filter_ctrl(struct rte_eth_dev *dev, +enum rte_filter_type filter_type, +enum rte_filter_op filter_op, +void *arg) +{ + int ret = 0; + + if (dev == NULL) + return -EINVAL; + + switch (filter_type) { + case RTE_ETH_FILTER_GENERIC: + if (filter_op != RTE_ETH_FILTER_GET) + return -EINVAL; + *(const void **)arg = fm10k_flow_ops_get(); + break; + default: + PMD_DRV_LOG(WARNING, "Filter type (%d) not supported", + filter_type); + ret = -EINVAL; + break; + } + + return ret; +} +#endif + static void fm10k_dev_enable_intr_pf(struct rte_eth_dev *dev) { @@ -2949,6 +3020,11 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev) .reta_query = fm10k_reta_query, .rss_hash_update= fm10k_rss_hash_update, .rss_hash_conf_get = fm10k_rss_hash_conf_get, +#ifdef ENABLE_FM10K_MANAGEMENT + .mirror_rule_set= fm10k_mirror_rule_set, + .mirror_rule_reset = fm10k_mirror_rule_reset, + .filter_ctrl= fm10k_dev_filter_ctrl, +#endif }; static int ftag_check_handler(__rte_unused const char *key, -- 1.8.3.1
[dpdk-dev] [PATCH v2 3/7] net/fm10k: add config ffu statistics support
To support switch management, add the following new files: Add fm10k/switch/fm10k_config.h. Add fm10k/switch/fm10k_config.c(support switch configuration) Add fm10k/switch/fm10k_ffu.h Add fm10k/switch/fm10k_ffu.c(support switch ffu rule) Add fm10k/switch/fm10k_stats.h Add fm10k/switch/fm10k_stats.c(support switch statistics) and modify fm10k/Makefile(add fm10k_config.c, fm10k_ffu.c, and fm10k_stats.c). To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/Makefile |3 + drivers/net/fm10k/switch/fm10k_config.c | 855 + drivers/net/fm10k/switch/fm10k_config.h | 171 + drivers/net/fm10k/switch/fm10k_ffu.c| 1209 ++ drivers/net/fm10k/switch/fm10k_ffu.h| 31 + drivers/net/fm10k/switch/fm10k_stats.c | 1242 +++ drivers/net/fm10k/switch/fm10k_stats.h | 257 +++ 7 files changed, 3768 insertions(+) create mode 100644 drivers/net/fm10k/switch/fm10k_config.c create mode 100644 drivers/net/fm10k/switch/fm10k_config.h create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.c create mode 100644 drivers/net/fm10k/switch/fm10k_ffu.h create mode 100644 drivers/net/fm10k/switch/fm10k_stats.c create mode 100644 drivers/net/fm10k/switch/fm10k_stats.h diff --git a/drivers/net/fm10k/Makefile b/drivers/net/fm10k/Makefile index 4ec2a80..ed73251 100644 --- a/drivers/net/fm10k/Makefile +++ b/drivers/net/fm10k/Makefile @@ -90,6 +90,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sbus.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_serdes.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_sm.c SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_spico_code.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_stats.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ffu.c +SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_config.c endif SRCS-$(CONFIG_RTE_LIBRTE_FM10K_INC_VECTOR) += fm10k_rxtx_vec.c diff --git a/drivers/net/fm10k/switch/fm10k_config.c b/drivers/net/fm10k/switch/fm10k_config.c new file mode 100644 index 000..46c3fae --- /dev/null +++ b/drivers/net/fm10k/switch/fm10k_config.c @@ -0,0 +1,855 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2019 Silicom Ltd. Connectivity Solutions + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "../base/fm10k_type.h" +#include "../base/fm10k_osdep.h" + +#include "../fm10k.h" +#include "../fm10k_logs.h" +#include "fm10k_debug.h" +#include "fm10k_regs.h" +#include "fm10k_switch.h" +#include "fm10k_config.h" + +#define FM10K_CONFIG_WORD_MAX 10 +#define FM10K_CONFIG_WORD_LEN 20 +#define FM10K_CONFIG_STR_MAX 100 + +struct fm10k_cfg_key_item { + const char *key_str[FM10K_CONFIG_WORD_MAX]; + uint8_t type; +}; + +static const char *fm10k_config_dpdk_conf_file = "/etc/dpdk_fm10k.conf"; +static struct fm10k_dpdk_cfg fm10k_config_dpdk_cfg; + +static struct fm10k_cfg_key_item fm10k_config_key_items[] = { + /* debug configuration */ + { {"debug", "print", "enable"}, + FM10K_CONFIG_DEBUG_ENABLE}, + { {"debug", "print", "config"}, + FM10K_CONFIG_DEBUG_CONFIG}, + { {"debug", "print", "ffu", "init"}, + FM10K_CONFIG_DEBUG_FFU_INIT}, + { {"debug", "print", "ffu", "register"}, + FM10K_CONFIG_DEBUG_FFU_REG}, + { {"debug", "print", "ffu", "rule"}, + FM10K_CONFIG_DEBUG_FFU_RULE}, + { {"debug", "print", "stats", "port"}, + FM10K_CONFIG_DEBUG_STATS_PORT}, + { {"debug", "print", "stats", "queue"}, + FM10K_CONFIG_DEBUG_STATS_QUEUE}, + { {"debug", "print", "stats", "rule"}, + FM10K_CONFIG_DEBUG_STATS_FFU}, + { {"debug", "print", "stats", "detail"}, + FM10K_CONFIG_DEBUG_STATS_MORE}, + { {"debug", "print", "stats", "interval"}, + FM10K_CONFIG_DEBUG_STATS_INTERVAL}, + /* general configuration */ + { {"dpdk", "bind", "pf", "number"}, +
[dpdk-dev] [PATCH v2 7/7] net/fm10k: add dpdk port mapping
Modify fm10k/fm10k_ethdev.c. Add dpdk port and pf mapping, so the dpdk port can map to a specific pf and 1 dpdk port can map to 2 pf to get total 100G throughput. To avoid configuration for both kernel driver and userspace SDK outside DPDK, we add switch management in FM10K DPDK PMD driver. To enable switch management, you need add CONFIG_RTE_FM10K_MANAGEMENT=y in config/common_linux when building. Signed-off-by: Xiaojun Liu --- drivers/net/fm10k/fm10k_ethdev.c | 322 +++ 1 file changed, 294 insertions(+), 28 deletions(-) diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index 1c01684..8af97a7 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -517,6 +517,15 @@ struct fm10k_xstats_name_off { struct rte_eth_conf *dev_conf = &dev->data->dev_conf; uint32_t mrqc, *key, i, reta, j; uint64_t hf; +#ifdef ENABLE_FM10K_MANAGEMENT + uint16_t nb_rx_queues = dev->data->nb_rx_queues; + int mapped_num; + struct fm10k_hw *mapped_hws[2]; + + mapped_num = fm10k_switch_dpdk_mapped_hw_get(hw, mapped_hws); + if (mapped_num == 2) + nb_rx_queues /= 2; +#endif #define RSS_KEY_SIZE 40 static uint8_t rss_intel_key[RSS_KEY_SIZE] = { @@ -646,27 +655,48 @@ struct fm10k_xstats_name_off { static int fm10k_dev_tx_init(struct rte_eth_dev *dev) { +#ifndef ENABLE_FM10K_MANAGEMENT struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); +#else + struct fm10k_hw *hw; + struct fm10k_hw *unmap_hw = + FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); + uint32_t data; +#endif int i, ret; + uint16_t hw_queue_id; struct fm10k_tx_queue *txq; uint64_t base_addr; uint32_t size; +#ifndef ENABLE_FM10K_MANAGEMENT /* Disable TXINT to avoid possible interrupt */ for (i = 0; i < hw->mac.max_queues; i++) FM10K_WRITE_REG(hw, FM10K_TXINT(i), 3 << FM10K_TXINT_TIMER_SHIFT); +#else + fm10k_switch_dpdk_tx_queue_num_set(unmap_hw, + dev->data->nb_tx_queues); +#endif /* Setup TX queue */ for (i = 0; i < dev->data->nb_tx_queues; ++i) { + hw_queue_id = i; +#ifdef ENABLE_FM10K_MANAGEMENT + fm10k_switch_dpdk_hw_queue_map(unmap_hw, + i, dev->data->nb_tx_queues, + &hw, &hw_queue_id); +#endif txq = dev->data->tx_queues[i]; base_addr = txq->hw_ring_phys_addr; size = txq->nb_desc * sizeof(struct fm10k_tx_desc); /* disable queue to avoid issues while updating state */ - ret = tx_queue_disable(hw, i); + ret = tx_queue_disable(hw, hw_queue_id); if (ret) { - PMD_INIT_LOG(ERR, "failed to disable queue %d", i); + PMD_INIT_LOG(ERR, + "failed to disable queue %d", + hw_queue_id); return -1; } /* Enable use of FTAG bit in TX descriptor, PFVTCTL @@ -674,7 +704,7 @@ struct fm10k_xstats_name_off { */ if (fm10k_check_ftag(dev->device->devargs)) { if (hw->mac.type == fm10k_mac_pf) { - FM10K_WRITE_REG(hw, FM10K_PFVTCTL(i), + FM10K_WRITE_REG(hw, FM10K_PFVTCTL(hw_queue_id), FM10K_PFVTCTL_FTAG_DESC_ENABLE); PMD_INIT_LOG(DEBUG, "FTAG mode is enabled"); } else { @@ -684,15 +714,25 @@ struct fm10k_xstats_name_off { } /* set location and size for descriptor ring */ - FM10K_WRITE_REG(hw, FM10K_TDBAL(i), + FM10K_WRITE_REG(hw, FM10K_TDBAL(hw_queue_id), base_addr & UINT64_LOWER_32BITS_MASK); - FM10K_WRITE_REG(hw, FM10K_TDBAH(i), + FM10K_WRITE_REG(hw, FM10K_TDBAH(hw_queue_id), base_addr >> (CHAR_BIT * sizeof(uint32_t))); - FM10K_WRITE_REG(hw, FM10K_TDLEN(i), size); + FM10K_WRITE_REG(hw, FM10K_TDLEN(hw_queue_id), size); /* assign default SGLORT for each TX queue by PF */ +#ifndef ENABLE_FM10K_MANAGEMENT if (hw->mac.type == fm10k_mac_pf) - FM10K_WRITE_REG(hw, FM10K_TX_SGLORT(i), hw->mac.dglort_map); + FM10K_WRITE_REG(hw, + FM10K_TX_SGLORT(hw_queue_id), +