From: Danylo Vodopianov <dvo-...@napatech.com> RPF and GFG modules initialization were added.
Signed-off-by: Danylo Vodopianov <dvo-...@napatech.com> --- drivers/net/ntnic/include/nt4ga_link.h | 2 + drivers/net/ntnic/include/nthw_gfg.h | 33 ++ .../link_agx_100g/nt4ga_agx_link_100g.c | 24 ++ drivers/net/ntnic/meson.build | 1 + drivers/net/ntnic/nthw/core/nthw_gfg.c | 340 ++++++++++++++++++ drivers/net/ntnic/nthw/nthw_drv.h | 10 + 6 files changed, 410 insertions(+) create mode 100644 drivers/net/ntnic/include/nthw_gfg.h create mode 100644 drivers/net/ntnic/nthw/core/nthw_gfg.c diff --git a/drivers/net/ntnic/include/nt4ga_link.h b/drivers/net/ntnic/include/nt4ga_link.h index af7ea4a9f2..e3dc3d4d5d 100644 --- a/drivers/net/ntnic/include/nt4ga_link.h +++ b/drivers/net/ntnic/include/nt4ga_link.h @@ -8,6 +8,7 @@ #include "ntos_drv.h" #include "ntnic_nim.h" +#include "nthw_gfg.h" enum nt_link_state_e { NT_LINK_STATE_UNKNOWN = 0, /* The link state has not been read yet */ @@ -84,6 +85,7 @@ typedef struct adapter_100g_s { typedef struct adapter_agx_100g_s { nim_i2c_ctx_t nim_ctx[NUM_ADAPTER_PORTS_MAX]; /* should be the first field */ + nthw_gfg_t gfg[NUM_ADAPTER_PORTS_MAX]; } adapter_agx_100g_t; typedef union adapter_var_s { diff --git a/drivers/net/ntnic/include/nthw_gfg.h b/drivers/net/ntnic/include/nthw_gfg.h new file mode 100644 index 0000000000..4583fd9ebd --- /dev/null +++ b/drivers/net/ntnic/include/nthw_gfg.h @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Napatech A/S + */ + +#ifndef NTHW_GFG_H_ +#define NTHW_GFG_H_ + +#include "nthw_fpga_model.h" +struct nthw_gfg { + nthw_fpga_t *mp_fpga; + nthw_module_t *mp_mod_gfg; + int mn_instance; + + int mn_param_gfg_present; + + nthw_field_t *mpa_fld_ctrl_enable[8]; + nthw_field_t *mpa_fld_ctrl_mode[8]; + nthw_field_t *mpa_fld_ctrl_prbs_en[8]; + nthw_field_t *mpa_fld_ctrl_size[8]; + nthw_field_t *mpa_fld_stream_id_val[8]; + nthw_field_t *mpa_fld_run_run[8]; + nthw_field_t *mpa_fld_size_mask[8]; + nthw_field_t *mpa_fld_burst_size_val[8]; +}; + +typedef struct nthw_gfg nthw_gfg_t; + +int nthw_gfg_init(nthw_gfg_t *p, nthw_fpga_t *p_fpga, int n_instance); + +int nthw_gfg_stop(nthw_gfg_t *p, const int n_intf_no); + +#endif /* NTHW_GFG_H_ */ diff --git a/drivers/net/ntnic/link_mgmt/link_agx_100g/nt4ga_agx_link_100g.c b/drivers/net/ntnic/link_mgmt/link_agx_100g/nt4ga_agx_link_100g.c index 369b9b601f..9db32443fc 100644 --- a/drivers/net/ntnic/link_mgmt/link_agx_100g/nt4ga_agx_link_100g.c +++ b/drivers/net/ntnic/link_mgmt/link_agx_100g/nt4ga_agx_link_100g.c @@ -11,6 +11,7 @@ #include <string.h> #include "ntnic_mod_reg.h" #include "nim_defines.h" +#include "nthw_gfg.h" static int nt4ga_agx_link_100g_ports_init(struct adapter_info_s *p_adapter_info, nthw_fpga_t *fpga); @@ -134,11 +135,34 @@ static uint32_t nt4ga_agx_link_100g_mon(void *data) int nt4ga_agx_link_100g_ports_init(struct adapter_info_s *p_adapter_info, nthw_fpga_t *fpga) { (void)fpga; + nt4ga_link_t *nt4ga_link = &p_adapter_info->nt4ga_link; const int adapter_no = p_adapter_info->adapter_no; int res = 0; NT_LOG(DBG, NTNIC, "%s: Initializing ports", p_adapter_info->mp_adapter_id_str); + if (!nt4ga_link->variables_initialized) { + nthw_gfg_t *gfg_mod = p_adapter_info->nt4ga_link.u.var_a100g.gfg; + nthw_agx_t *p_nthw_agx = &p_adapter_info->fpga_info.mp_nthw_agx; + + p_nthw_agx->p_rpf = nthw_rpf_new(); + res = nthw_rpf_init(p_nthw_agx->p_rpf, fpga, adapter_no); + + if (res != 0) { + NT_LOG(ERR, NTNIC, "%s: Failed to initialize RPF module (%u)", + p_adapter_info->mp_adapter_id_str, res); + return res; + } + + res = nthw_gfg_init(&gfg_mod[adapter_no], fpga, 0 /* Only one instance */); + + if (res != 0) { + NT_LOG(ERR, NTNIC, "%s: Failed to initialize GFG module (%u)", + p_adapter_info->mp_adapter_id_str, res); + return res; + } + } + /* * Create state-machine thread */ diff --git a/drivers/net/ntnic/meson.build b/drivers/net/ntnic/meson.build index 7e4f47b1e6..68d7fdafd4 100644 --- a/drivers/net/ntnic/meson.build +++ b/drivers/net/ntnic/meson.build @@ -47,6 +47,7 @@ sources = files( 'nthw/core/nt200a0x/reset/nthw_fpga_rst_nt200a0x.c', 'nthw/core/nthw_fpga.c', 'nthw/core/nthw_gmf.c', + 'nthw/core/nthw_gfg.c', 'nthw/core/nthw_tsm.c', 'nthw/core/nthw_gpio_phy.c', 'nthw/core/nthw_hif.c', diff --git a/drivers/net/ntnic/nthw/core/nthw_gfg.c b/drivers/net/ntnic/nthw/core/nthw_gfg.c new file mode 100644 index 0000000000..aa71624457 --- /dev/null +++ b/drivers/net/ntnic/nthw/core/nthw_gfg.c @@ -0,0 +1,340 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Napatech A/S + */ + +#include "ntlog.h" + +#include "nthw_drv.h" +#include "nthw_register.h" + +#include "nt_util.h" +#include "nthw_gfg.h" + +int nthw_gfg_init(nthw_gfg_t *p, nthw_fpga_t *p_fpga, int n_instance) +{ + nthw_module_t *mod = nthw_fpga_query_module(p_fpga, MOD_GFG, n_instance); + const char *const p_adapter_id_str = p_fpga->p_fpga_info->mp_adapter_id_str; + nthw_register_t *p_reg; + + if (p == NULL) + return mod == NULL ? -1 : 0; + + if (mod == NULL) { + NT_LOG(ERR, NTHW, "%s: GFG %d: no such instance", p_adapter_id_str, n_instance); + return -1; + } + + p->mp_fpga = p_fpga; + p->mn_instance = n_instance; + p->mp_mod_gfg = mod; + + p->mn_param_gfg_present = nthw_fpga_get_product_param(p_fpga, NT_GFG_PRESENT, 0); + + if (!p->mn_param_gfg_present) { + NT_LOG(ERR, + NTHW, + "%s: %s: GFG %d module found - but logically not present - failing", + __func__, + p_adapter_id_str, + p->mn_instance); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL0); + + if (p_reg) { + p->mpa_fld_ctrl_enable[0] = nthw_register_query_field(p_reg, GFG_CTRL0_ENABLE); + p->mpa_fld_ctrl_mode[0] = nthw_register_query_field(p_reg, GFG_CTRL0_MODE); + p->mpa_fld_ctrl_prbs_en[0] = nthw_register_query_field(p_reg, GFG_CTRL0_PRBS_EN); + p->mpa_fld_ctrl_size[0] = nthw_register_query_field(p_reg, GFG_CTRL0_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL1); + + if (p_reg) { + p->mpa_fld_ctrl_enable[1] = nthw_register_query_field(p_reg, GFG_CTRL1_ENABLE); + p->mpa_fld_ctrl_mode[1] = nthw_register_query_field(p_reg, GFG_CTRL1_MODE); + p->mpa_fld_ctrl_prbs_en[1] = nthw_register_query_field(p_reg, GFG_CTRL1_PRBS_EN); + p->mpa_fld_ctrl_size[1] = nthw_register_query_field(p_reg, GFG_CTRL1_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL2); + + if (p_reg) { + p->mpa_fld_ctrl_enable[2] = nthw_register_query_field(p_reg, GFG_CTRL2_ENABLE); + p->mpa_fld_ctrl_mode[2] = nthw_register_query_field(p_reg, GFG_CTRL2_MODE); + p->mpa_fld_ctrl_prbs_en[2] = nthw_register_query_field(p_reg, GFG_CTRL2_PRBS_EN); + p->mpa_fld_ctrl_size[2] = nthw_register_query_field(p_reg, GFG_CTRL2_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL3); + + if (p_reg) { + p->mpa_fld_ctrl_enable[3] = nthw_register_query_field(p_reg, GFG_CTRL3_ENABLE); + p->mpa_fld_ctrl_mode[3] = nthw_register_query_field(p_reg, GFG_CTRL3_MODE); + p->mpa_fld_ctrl_prbs_en[3] = nthw_register_query_field(p_reg, GFG_CTRL3_PRBS_EN); + p->mpa_fld_ctrl_size[3] = nthw_register_query_field(p_reg, GFG_CTRL3_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL4); + + if (p_reg) { + p->mpa_fld_ctrl_enable[4] = nthw_register_query_field(p_reg, GFG_CTRL4_ENABLE); + p->mpa_fld_ctrl_mode[4] = nthw_register_query_field(p_reg, GFG_CTRL4_MODE); + p->mpa_fld_ctrl_prbs_en[4] = nthw_register_query_field(p_reg, GFG_CTRL4_PRBS_EN); + p->mpa_fld_ctrl_size[4] = nthw_register_query_field(p_reg, GFG_CTRL4_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL5); + + if (p_reg) { + p->mpa_fld_ctrl_enable[5] = nthw_register_query_field(p_reg, GFG_CTRL5_ENABLE); + p->mpa_fld_ctrl_mode[5] = nthw_register_query_field(p_reg, GFG_CTRL5_MODE); + p->mpa_fld_ctrl_prbs_en[5] = nthw_register_query_field(p_reg, GFG_CTRL5_PRBS_EN); + p->mpa_fld_ctrl_size[5] = nthw_register_query_field(p_reg, GFG_CTRL5_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL6); + + if (p_reg) { + p->mpa_fld_ctrl_enable[6] = nthw_register_query_field(p_reg, GFG_CTRL6_ENABLE); + p->mpa_fld_ctrl_mode[6] = nthw_register_query_field(p_reg, GFG_CTRL6_MODE); + p->mpa_fld_ctrl_prbs_en[6] = nthw_register_query_field(p_reg, GFG_CTRL6_PRBS_EN); + p->mpa_fld_ctrl_size[6] = nthw_register_query_field(p_reg, GFG_CTRL6_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_CTRL7); + + if (p_reg) { + p->mpa_fld_ctrl_enable[7] = nthw_register_query_field(p_reg, GFG_CTRL7_ENABLE); + p->mpa_fld_ctrl_mode[7] = nthw_register_query_field(p_reg, GFG_CTRL7_MODE); + p->mpa_fld_ctrl_prbs_en[7] = nthw_register_query_field(p_reg, GFG_CTRL7_PRBS_EN); + p->mpa_fld_ctrl_size[7] = nthw_register_query_field(p_reg, GFG_CTRL7_SIZE); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN0); + + if (p_reg) + p->mpa_fld_run_run[0] = nthw_register_query_field(p_reg, GFG_RUN0_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN1); + + if (p_reg) + p->mpa_fld_run_run[1] = nthw_register_query_field(p_reg, GFG_RUN1_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN2); + + if (p_reg) + p->mpa_fld_run_run[2] = nthw_register_query_field(p_reg, GFG_RUN2_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN3); + + if (p_reg) + p->mpa_fld_run_run[3] = nthw_register_query_field(p_reg, GFG_RUN3_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN4); + + if (p_reg) + p->mpa_fld_run_run[4] = nthw_register_query_field(p_reg, GFG_RUN4_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN5); + + if (p_reg) + p->mpa_fld_run_run[5] = nthw_register_query_field(p_reg, GFG_RUN5_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN6); + + if (p_reg) + p->mpa_fld_run_run[6] = nthw_register_query_field(p_reg, GFG_RUN6_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_RUN7); + + if (p_reg) + p->mpa_fld_run_run[7] = nthw_register_query_field(p_reg, GFG_RUN7_RUN); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID0); + + if (p_reg) + p->mpa_fld_stream_id_val[0] = nthw_register_query_field(p_reg, GFG_STREAMID0_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID1); + + if (p_reg) + p->mpa_fld_stream_id_val[1] = nthw_register_query_field(p_reg, GFG_STREAMID1_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID2); + + if (p_reg) + p->mpa_fld_stream_id_val[2] = nthw_register_query_field(p_reg, GFG_STREAMID2_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID3); + + if (p_reg) + p->mpa_fld_stream_id_val[3] = nthw_register_query_field(p_reg, GFG_STREAMID3_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID4); + + if (p_reg) + p->mpa_fld_stream_id_val[4] = nthw_register_query_field(p_reg, GFG_STREAMID4_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID5); + + if (p_reg) + p->mpa_fld_stream_id_val[5] = nthw_register_query_field(p_reg, GFG_STREAMID5_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID6); + + if (p_reg) + p->mpa_fld_stream_id_val[6] = nthw_register_query_field(p_reg, GFG_STREAMID6_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_STREAMID7); + + if (p_reg) + p->mpa_fld_stream_id_val[7] = nthw_register_query_field(p_reg, GFG_STREAMID7_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK0); + + if (p_reg) + p->mpa_fld_size_mask[0] = nthw_register_query_field(p_reg, GFG_SIZEMASK0_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK1); + + if (p_reg) + p->mpa_fld_size_mask[1] = nthw_register_query_field(p_reg, GFG_SIZEMASK1_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK2); + + if (p_reg) + p->mpa_fld_size_mask[2] = nthw_register_query_field(p_reg, GFG_SIZEMASK2_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK3); + + if (p_reg) + p->mpa_fld_size_mask[3] = nthw_register_query_field(p_reg, GFG_SIZEMASK3_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK4); + + if (p_reg) + p->mpa_fld_size_mask[4] = nthw_register_query_field(p_reg, GFG_SIZEMASK4_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK5); + + if (p_reg) + p->mpa_fld_size_mask[5] = nthw_register_query_field(p_reg, GFG_SIZEMASK5_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK6); + + if (p_reg) + p->mpa_fld_size_mask[6] = nthw_register_query_field(p_reg, GFG_SIZEMASK6_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_SIZEMASK7); + + if (p_reg) + p->mpa_fld_size_mask[7] = nthw_register_query_field(p_reg, GFG_SIZEMASK7_VAL); + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE0); + + if (p_reg) { + p->mpa_fld_burst_size_val[0] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE0_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE1); + + if (p_reg) { + p->mpa_fld_burst_size_val[1] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE1_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE2); + + if (p_reg) { + p->mpa_fld_burst_size_val[2] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE2_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE3); + + if (p_reg) { + p->mpa_fld_burst_size_val[3] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE3_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE4); + + if (p_reg) { + p->mpa_fld_burst_size_val[4] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE4_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE5); + + if (p_reg) { + p->mpa_fld_burst_size_val[5] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE5_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE6); + + if (p_reg) { + p->mpa_fld_burst_size_val[6] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE6_VAL); + } + + p_reg = nthw_module_query_register(p->mp_mod_gfg, GFG_BURSTSIZE7); + + if (p_reg) { + p->mpa_fld_burst_size_val[7] = + nthw_register_query_field(p_reg, GFG_BURSTSIZE7_VAL); + } + + return 0; +} + +static int nthw_gfg_setup(nthw_gfg_t *p, + const size_t n_intf_no, + const int n_enable, + const int n_frame_count, + const int n_frame_size, + const int n_frame_fill_mode, + const int n_frame_stream_id) +{ + if ((size_t)n_intf_no >= ARRAY_SIZE(p->mpa_fld_ctrl_enable) || + n_intf_no >= ARRAY_SIZE(p->mpa_fld_ctrl_mode) || + (size_t)n_intf_no >= ARRAY_SIZE(p->mpa_fld_ctrl_size) || + n_intf_no >= ARRAY_SIZE(p->mpa_fld_stream_id_val) || + (size_t)n_intf_no >= ARRAY_SIZE(p->mpa_fld_burst_size_val)) { + assert(false); + return -1; + } + + if (p->mpa_fld_ctrl_enable[n_intf_no] == NULL || p->mpa_fld_ctrl_mode[n_intf_no] == NULL || + p->mpa_fld_ctrl_size[n_intf_no] == NULL || + p->mpa_fld_stream_id_val[n_intf_no] == NULL || + p->mpa_fld_burst_size_val[n_intf_no] == NULL) { + assert(false); + return -1; + } + + nthw_field_set_val_flush32(p->mpa_fld_stream_id_val[n_intf_no], n_frame_stream_id); + nthw_field_set_val_flush32(p->mpa_fld_burst_size_val[n_intf_no], n_frame_count); + + if (p->mpa_fld_size_mask[n_intf_no]) + nthw_field_set_val_flush32(p->mpa_fld_size_mask[n_intf_no], 0); + + nthw_field_set_val32(p->mpa_fld_ctrl_mode[n_intf_no], n_frame_fill_mode); + nthw_field_set_val32(p->mpa_fld_ctrl_size[n_intf_no], n_frame_size); + + if (p->mpa_fld_ctrl_prbs_en[n_intf_no]) + nthw_field_set_val32(p->mpa_fld_ctrl_prbs_en[n_intf_no], 0); + + nthw_field_set_val_flush32(p->mpa_fld_ctrl_enable[n_intf_no], + n_enable); /* write enable and flush */ + + return 0; +} + +int nthw_gfg_stop(nthw_gfg_t *p, const int n_intf_no) +{ + return nthw_gfg_setup(p, n_intf_no, 0, 1, 0x666, 0, n_intf_no); +} diff --git a/drivers/net/ntnic/nthw/nthw_drv.h b/drivers/net/ntnic/nthw/nthw_drv.h index 69e0360f5f..9dc839c83c 100644 --- a/drivers/net/ntnic/nthw/nthw_drv.h +++ b/drivers/net/ntnic/nthw/nthw_drv.h @@ -9,6 +9,15 @@ #include "nthw_core.h" #include "ntnic_dbs.h" +#include "nthw_rpf.h" + +/* + * Structs for controlling Agilex based NT400DXX adapter + */ +typedef struct nthw_agx_s { + nthw_rpf_t *p_rpf; +} nthw_agx_t; + typedef enum nt_meta_port_type_e { PORT_TYPE_PHYSICAL, PORT_TYPE_VIRTUAL, @@ -88,6 +97,7 @@ typedef struct fpga_info_s { nthw_adapter_id_t n_nthw_adapter_id; + nthw_agx_t mp_nthw_agx; /* For the Agilex based NT400DXX */ } fpga_info_t; -- 2.45.0