From 8f108170db1a0edbc1455c7865b91eaaad00268c Mon Sep 17 00:00:00 2001 From: Grzegorz Daniluk <grzegorz.daniluk@cern.ch> Date: Mon, 1 Aug 2016 16:44:35 +0200 Subject: [PATCH] wrsw_nic: adding enable bit for b/w throttling --- modules/wrsw_nic/nic_bw_throttling.vhd | 8 +++++++- modules/wrsw_nic/nic_rx_fsm.vhd | 2 ++ modules/wrsw_nic/nic_wbgen2_pkg.vhd | 4 +++- modules/wrsw_nic/nic_wishbone_slave.vhd | 9 +++++++-- modules/wrsw_nic/wr_nic.wb | 9 +++++++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/modules/wrsw_nic/nic_bw_throttling.vhd b/modules/wrsw_nic/nic_bw_throttling.vhd index 22c3da7a..dafa31c5 100644 --- a/modules/wrsw_nic/nic_bw_throttling.vhd +++ b/modules/wrsw_nic/nic_bw_throttling.vhd @@ -56,6 +56,7 @@ entity nic_bw_throttling is src_o : out t_wrf_source_out; src_i : in t_wrf_source_in; + en_i : in std_logic; new_limit_i : in std_logic; bwmax_kbps_i : in unsigned(15 downto 0); bw_bps_o : out std_logic_vector(31 downto 0)); @@ -127,7 +128,7 @@ begin thr_step_kbps <= shift_right(bwmax_kbps_i - bwmin_kbps, 3); -- both max and min b/w we divide by 8 (because we want 8 steps like with -- c_DROP_STEP = 64 for range 0-255) - else + elsif en_i = '1' then if (bwcur_kbps > last_thr_kbps and drop_thr < c_DROP_THR_MAX) then -- current b/w is larger than the last crossed threshold -- we increase the probability of drop @@ -141,6 +142,11 @@ begin last_thr_kbps <= last_thr_kbps - thr_step_kbps; end if; + else + -- If the module is disabled, keep drop_thr at 0 so that we don't drop + -- any frames. + drop_thr <= (others=>'0'); + end if; end if; end process; diff --git a/modules/wrsw_nic/nic_rx_fsm.vhd b/modules/wrsw_nic/nic_rx_fsm.vhd index 111ca235..3f21cc2a 100644 --- a/modules/wrsw_nic/nic_rx_fsm.vhd +++ b/modules/wrsw_nic/nic_rx_fsm.vhd @@ -133,6 +133,7 @@ architecture behavioral of NIC_RX_FSM is snk_o : out t_wrf_sink_out; src_o : out t_wrf_source_out; src_i : in t_wrf_source_in; + en_i : in std_logic; new_limit_i : in std_logic; bwmax_kbps_i : in unsigned(15 downto 0); bw_bps_o : out std_logic_vector(31 downto 0)); @@ -181,6 +182,7 @@ begin snk_o => snk_o, src_o => bw_src_out, src_i => bw_src_in, + en_i => regs_i.cr_rxthr_en_o, new_limit_i => regs_i.maxrxbw_load_o, bwmax_kbps_i => unsigned(regs_i.maxrxbw_o), bw_bps_o => regs_o.rxbw_i); diff --git a/modules/wrsw_nic/nic_wbgen2_pkg.vhd b/modules/wrsw_nic/nic_wbgen2_pkg.vhd index 1fddc14d..a58a93c7 100644 --- a/modules/wrsw_nic/nic_wbgen2_pkg.vhd +++ b/modules/wrsw_nic/nic_wbgen2_pkg.vhd @@ -3,7 +3,7 @@ --------------------------------------------------------------------------------------- -- File : nic_wbgen2_pkg.vhd -- Author : auto-generated by wbgen2 from wr_nic.wb --- Created : Mon Aug 1 16:03:57 2016 +-- Created : Mon Aug 1 16:26:56 2016 -- Standard : VHDL'87 --------------------------------------------------------------------------------------- -- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE wr_nic.wb @@ -47,6 +47,7 @@ package nic_wbgen2_pkg is type t_nic_out_registers is record cr_rx_en_o : std_logic; cr_tx_en_o : std_logic; + cr_rxthr_en_o : std_logic; cr_sw_rst_o : std_logic; sr_rec_o : std_logic; sr_rec_load_o : std_logic; @@ -61,6 +62,7 @@ package nic_wbgen2_pkg is constant c_nic_out_registers_init_value: t_nic_out_registers := ( cr_rx_en_o => '0', cr_tx_en_o => '0', + cr_rxthr_en_o => '0', cr_sw_rst_o => '0', sr_rec_o => '0', sr_rec_load_o => '0', diff --git a/modules/wrsw_nic/nic_wishbone_slave.vhd b/modules/wrsw_nic/nic_wishbone_slave.vhd index 9de19b32..02f5698a 100644 --- a/modules/wrsw_nic/nic_wishbone_slave.vhd +++ b/modules/wrsw_nic/nic_wishbone_slave.vhd @@ -3,7 +3,7 @@ --------------------------------------------------------------------------------------- -- File : nic_wishbone_slave.vhd -- Author : auto-generated by wbgen2 from wr_nic.wb --- Created : Mon Aug 1 16:03:57 2016 +-- Created : Mon Aug 1 16:26:56 2016 -- Standard : VHDL'87 --------------------------------------------------------------------------------------- -- THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE wr_nic.wb @@ -69,6 +69,7 @@ architecture syn of nic_wishbone_slave is signal nic_cr_rx_en_int : std_logic ; signal nic_cr_tx_en_int : std_logic ; +signal nic_cr_rxthr_en_int : std_logic ; signal nic_cr_sw_rst_dly0 : std_logic ; signal nic_cr_sw_rst_int : std_logic ; signal nic_dtx_rddata_int : std_logic_vector(31 downto 0); @@ -116,6 +117,7 @@ begin rddata_reg <= "00000000000000000000000000000000"; nic_cr_rx_en_int <= '0'; nic_cr_tx_en_int <= '0'; + nic_cr_rxthr_en_int <= '0'; nic_cr_sw_rst_int <= '0'; regs_o.sr_rec_load_o <= '0'; regs_o.sr_tx_done_load_o <= '0'; @@ -154,12 +156,13 @@ begin if (wb_we_i = '1') then nic_cr_rx_en_int <= wrdata_reg(0); nic_cr_tx_en_int <= wrdata_reg(1); + nic_cr_rxthr_en_int <= wrdata_reg(2); nic_cr_sw_rst_int <= wrdata_reg(31); end if; rddata_reg(0) <= nic_cr_rx_en_int; rddata_reg(1) <= nic_cr_tx_en_int; + rddata_reg(2) <= nic_cr_rxthr_en_int; rddata_reg(31) <= '0'; - rddata_reg(2) <= 'X'; rddata_reg(3) <= 'X'; rddata_reg(4) <= 'X'; rddata_reg(5) <= 'X'; @@ -470,6 +473,8 @@ begin regs_o.cr_rx_en_o <= nic_cr_rx_en_int; -- Transmit enable regs_o.cr_tx_en_o <= nic_cr_tx_en_int; +-- Rx bandwidth throttling enable + regs_o.cr_rxthr_en_o <= nic_cr_rxthr_en_int; -- Software Reset process (clk_sys_i, rst_n_i) begin diff --git a/modules/wrsw_nic/wr_nic.wb b/modules/wrsw_nic/wr_nic.wb index 8791d441..b4d1318a 100644 --- a/modules/wrsw_nic/wr_nic.wb +++ b/modules/wrsw_nic/wr_nic.wb @@ -63,6 +63,15 @@ top = peripheral { access_bus = READ_WRITE; access_dev = READ_ONLY; }; + field { + name = "Rx bandwidth throttling enable"; + description = "Enables bandwidth throttling for received traffic. \ + This is to prevent blocking ARM CPU with interrupts coming from NIC"; + prefix = "rxthr_en"; + type = BIT; + access_bus = READ_WRITE; + access_dev = READ_ONLY; + }; field { name = "Software Reset"; -- GitLab