Hi,

> -----Original Message-----
> From: Huang, Wei <wei.hu...@intel.com>
> Sent: Friday, June 17, 2022 15:20
> To: dev@dpdk.org; tho...@monjalon.net; nipun.gu...@nxp.com;
> hemant.agra...@nxp.com
> Cc: sta...@dpdk.org; Xu, Rosen <rosen...@intel.com>; Zhang, Tianfei
> <tianfei.zh...@intel.com>; Zhang, Qi Z <qi.z.zh...@intel.com>; Huang, Wei
> <wei.hu...@intel.com>
> Subject: [PATCH v3 2/4] raw/ifpga/base: update board information
> 
> N6000 ADP platform has different definition of board information, they can
> be recognized after this patch.
> 
> Signed-off-by: Wei Huang <wei.hu...@intel.com>
> ---
>  drivers/raw/ifpga/base/ifpga_defines.h    | 101 +++++++++++++++----------
>  drivers/raw/ifpga/base/ifpga_fme.c        | 121 ++++++++++++++++++++-----
> -----
>  drivers/raw/ifpga/base/ifpga_fme_error.c  |   2 +
>  drivers/raw/ifpga/base/ifpga_port_error.c |   2 +-
>  drivers/raw/ifpga/base/opae_intel_max10.c |  45 +++++++++++
>  drivers/raw/ifpga/base/opae_intel_max10.h |   3 +
>  6 files changed, 194 insertions(+), 80 deletions(-)
> 
> diff --git a/drivers/raw/ifpga/base/ifpga_defines.h
> b/drivers/raw/ifpga/base/ifpga_defines.h
> index f84ed1d..7c8fa89 100644
> --- a/drivers/raw/ifpga/base/ifpga_defines.h
> +++ b/drivers/raw/ifpga/base/ifpga_defines.h
> @@ -268,6 +268,24 @@ struct feature_fme_bitstream_id {
>       union {
>               u64 csr;
>               struct {
> +                     u8 build_patch:8;
> +                     u8 build_minor:8;
> +                     u8 build_major:8;
> +                     u8 fvl_bypass:1;
> +                     u8 mac_lightweight:1;
> +                     u8 disagregate:1;
> +                     u8 lightweiht:1;
> +                     u8 seu:1;
> +                     u8 ptp:1;
> +                     u8 reserve:2;
> +                     u8 interface:4;
> +                     u32 afu_revision:12;
> +                     u8 patch:4;
> +                     u8 minor:4;
> +                     u8 major:4;
> +                     u8 reserved:4;
> +             } v1;
> +             struct {
>                       u32 gitrepo_hash:32;    /* GIT repository hash */
>                       /*
>                        * HSSI configuration identifier:
> @@ -276,7 +294,8 @@ struct feature_fme_bitstream_id {
>                        * 2 - Ethernet
>                        */
>                       u8  hssi_id:4;
> -                     u16 rsvd1:12;           /* Reserved */
> +                     u8  rsvd1:4;
> +                     u8  fim_type:8;
>                       /* Bitstream version patch number */
>                       u8  bs_verpatch:4;
>                       /* Bitstream version minor number */ @@ -285,7
> +304,7 @@ struct feature_fme_bitstream_id {
>                       u8  bs_vermajor:4;
>                       /* Bitstream version debug number */
>                       u8  bs_verdebug:4;
> -             };
> +             } v2;
>       };
>  };
> 
> @@ -1672,31 +1691,6 @@ struct bts_header {
> 
>  #define check_support(n) (n == 1 ? "support" : "no")
> 
> -/* bitstream id definition */
> -struct fme_bitstream_id {
> -     union {
> -             u64 id;
> -             struct {
> -                     u8 build_patch:8;
> -                     u8 build_minor:8;
> -                     u8 build_major:8;
> -                     u8 fvl_bypass:1;
> -                     u8 mac_lightweight:1;
> -                     u8 disagregate:1;
> -                     u8 lightweiht:1;
> -                     u8 seu:1;
> -                     u8 ptp:1;
> -                     u8 reserve:2;
> -                     u8 interface:4;
> -                     u32 afu_revision:12;
> -                     u8 patch:4;
> -                     u8 minor:4;
> -                     u8 major:4;
> -                     u8 reserved:4;
> -             };
> -     };
> -};
> -
>  enum board_interface {
>       VC_8_10G = 0,
>       VC_4_25G = 1,
> @@ -1705,10 +1699,30 @@ enum board_interface {
>       VC_2_2_25G = 4,
>  };
> 
> +enum fim_type {
> +     BASE_ADP = 0,
> +     BASE_FDK,
> +     BASE_X16_ADP,
> +     BASE_X16_FDK,
> +     FIMA_10G_ADP,
> +     FIMA_25G_ADP,
> +     FIMA_100G_ADP,
> +     FIMB_ADP,
> +     FIMC_ADP
> +};
> +
> +enum hssi_id {
> +     NO_HSSI = 0,
> +     PCIE_RP,
> +     ETHER_NET
> +};
> +
>  enum pac_major {
>       VISTA_CREEK = 0,
>       RUSH_CREEK = 1,
>       DARBY_CREEK = 2,
> +     LIGHTNING_CREEK = 3,
> +     ARROW_CREEK = 5,
>  };
> 
>  enum pac_minor {
> @@ -1720,23 +1734,30 @@ enum pac_minor {  struct opae_board_info {
>       enum pac_major major;
>       enum pac_minor minor;
> -     enum board_interface type;
> -
> -     /* PAC features */
> -     u8 fvl_bypass;
> -     u8 mac_lightweight;
> -     u8 disaggregate;
> -     u8 lightweight;
> -     u8 seu;
> -     u8 ptp;
> 
>       u32 boot_page;
>       u32 max10_version;
>       u32 nios_fw_version;
> -     u32 nums_of_retimer;
> -     u32 ports_per_retimer;
> -     u32 nums_of_fvl;
> -     u32 ports_per_fvl;
> +
> +     union {
> +             struct {  /* N3000 specific */
> +                     enum board_interface type;
> +                     u8 fvl_bypass;
> +                     u8 mac_lightweight;
> +                     u8 disaggregate;
> +                     u8 lightweight;
> +                     u8 seu;
> +                     u8 ptp;
> +                     u32 nums_of_retimer;
> +                     u32 ports_per_retimer;
> +                     u32 nums_of_fvl;
> +                     u32 ports_per_fvl;
> +             };
> +             struct {
> +                     enum fim_type n6000_fim_type;
> +                     enum hssi_id n6000_hssi_id;
> +             };
> +     };
>  };
> 
>  #pragma pack(pop)
> diff --git a/drivers/raw/ifpga/base/ifpga_fme.c
> b/drivers/raw/ifpga/base/ifpga_fme.c
> index 4d089d2..608a352 100644
> --- a/drivers/raw/ifpga/base/ifpga_fme.c
> +++ b/drivers/raw/ifpga/base/ifpga_fme.c
> @@ -790,19 +790,32 @@ struct ifpga_feature_ops fme_emif_ops = {
>       .uinit = fme_emif_uinit,
>  };
> 
> -static const char *board_type_to_string(u32 type) -{
> -     switch (type) {
> -     case VC_8_10G:
> -             return "VC_8x10G";
> -     case VC_4_25G:
> -             return "VC_4x25G";
> -     case VC_2_1_25:
> -             return "VC_2x1x25G";
> -     case VC_4_25G_2_25G:
> -             return "VC_4x25G+2x25G";
> -     case VC_2_2_25G:
> -             return "VC_2x2x25G";
> +static const char *board_type_to_string(u32 board, u32 type) {
> +     if (board == VISTA_CREEK) {
> +             switch (type) {
> +             case VC_8_10G:
> +                     return "8x10G";
> +             case VC_4_25G:
> +                     return "4x25G";
> +             case VC_2_1_25:
> +                     return "2x1x25G";
> +             case VC_4_25G_2_25G:
> +                     return "4x25G+2x25G";
> +             case VC_2_2_25G:
> +                     return "2x2x25G";
> +             break;
> +             }
> +     } else {
> +             switch (type) {
> +             case FIMA_10G_ADP:
> +                     return "2x4x10G";
> +             case FIMA_25G_ADP:
> +                     return "2x2x25G";
> +             case FIMA_100G_ADP:
> +                     return "2x100G";
> +             break;
> +             }
>       }
> 
>       return "unknown";
> @@ -817,6 +830,12 @@ static const char *board_major_to_string(u32 major)
>               return "RUSH_CREEK";
>       case DARBY_CREEK:
>               return "DARBY_CREEK";
> +     case LIGHTNING_CREEK:
> +             return "LIGHTNING_CREEK";
> +     case ARROW_CREEK:
> +             return "ARROW_CREEK";
> +     default:
> +             break;
>       }
> 
>       return "unknown";
> @@ -859,35 +878,56 @@ static int board_type_to_info(u32 type,
> 
>  static int fme_get_board_interface(struct ifpga_fme_hw *fme)  {
> -     struct fme_bitstream_id id;
> +     struct feature_fme_bitstream_id id;
>       struct ifpga_hw *hw;
>       u32 val;
> +     const char *type = NULL;
> +     int ret;
> 
>       hw = fme->parent;
>       if (!hw)
>               return -ENODEV;
> 
> -     if (fme_hdr_get_bitstream_id(fme, &id.id))
> +     if (fme_hdr_get_bitstream_id(fme, &id.csr))
>               return -EINVAL;
> 
> -     fme->board_info.major = id.major;
> -     fme->board_info.minor = id.minor;
> -     fme->board_info.type = id.interface;
> -     fme->board_info.fvl_bypass = id.fvl_bypass;
> -     fme->board_info.mac_lightweight = id.mac_lightweight;
> -     fme->board_info.lightweight = id.lightweiht;
> -     fme->board_info.disaggregate = id.disagregate;
> -     fme->board_info.seu = id.seu;
> -     fme->board_info.ptp = id.ptp;
> +     if (id.v1.major == ARROW_CREEK) {
> +             fme->board_info.major = id.v2.bs_vermajor;
> +             fme->board_info.minor = id.v2.bs_verminor;
> +             fme->board_info.n6000_fim_type = id.v2.fim_type;
> +             fme->board_info.n6000_hssi_id = id.v2.hssi_id;
> +             type = board_type_to_string(fme->board_info.major,
> +                             fme->board_info.n6000_fim_type);
> +     } else {
> +             fme->board_info.major = id.v1.major;
> +             fme->board_info.minor = id.v1.minor;
> +             fme->board_info.type = id.v1.interface;
> +             fme->board_info.fvl_bypass = id.v1.fvl_bypass;
> +             fme->board_info.mac_lightweight = id.v1.mac_lightweight;
> +             fme->board_info.lightweight = id.v1.lightweiht;
> +             fme->board_info.disaggregate = id.v1.disagregate;
> +             fme->board_info.seu = id.v1.seu;
> +             fme->board_info.ptp = id.v1.ptp;
> +             type = board_type_to_string(fme->board_info.major,
> +                             fme->board_info.type);
> +     }
> 
>       dev_info(fme, "found: PCI dev: %02x:%02x:%x board: %s
> type: %s\n",
>                       hw->pci_data->bus,
>                       hw->pci_data->devid,
>                       hw->pci_data->function,
>                       board_major_to_string(fme->board_info.major),
> -                     board_type_to_string(fme->board_info.type));
> +                     type);
> 
> -     dev_info(fme, "support feature:\n"
> +     ret = max10_get_fpga_load_info(fme->max10_dev, &val);
> +     if (ret)
> +             return ret;
> +     fme->board_info.boot_page = val;
> +
> +     if (fme->board_info.major == VISTA_CREEK) {
> +             dev_info(dev, "FPGA loaded from %s Image\n",
> +                     val ? "User" : "Factory");
> +             dev_info(fme, "support feature:\n"
>                       "fvl_bypass:%s\n"
>                       "mac_lightweight:%s\n"
>                       "lightweight:%s\n"
> @@ -901,26 +941,29 @@ static int fme_get_board_interface(struct
> ifpga_fme_hw *fme)
>                       check_support(fme->board_info.seu),
>                       check_support(fme->board_info.ptp));
> 
> +             if (board_type_to_info(fme->board_info.type, &fme-
> >board_info))
> +                     return -EINVAL;
> 
> -     if (board_type_to_info(fme->board_info.type, &fme->board_info))
> -             return -EINVAL;
> -
> -     dev_info(fme, "get board info: nums_retimers %d
> ports_per_retimer %d nums_fvl %d ports_per_fvl %d\n",
> +             dev_info(fme, "get board info: nums_retimers %d "
> +                     "ports_per_retimer %d nums_fvl %d "
> +                     "ports_per_fvl %d\n",
>                       fme->board_info.nums_of_retimer,
>                       fme->board_info.ports_per_retimer,
>                       fme->board_info.nums_of_fvl,
>                       fme->board_info.ports_per_fvl);
> +     } else {
> +             dev_info(dev, "FPGA loaded from %s Image\n",
> +                     val ? (val == 1 ? "User1" : "User2") : "Factory");
> +     }
> 
> -     if (max10_sys_read(fme->max10_dev, FPGA_PAGE_INFO, &val))
> -             return -EINVAL;
> -     fme->board_info.boot_page = val & 0x7;
> -
> -     if (max10_sys_read(fme->max10_dev, MAX10_BUILD_VER, &val))
> -             return -EINVAL;
> +     ret = max10_get_bmc_version(fme->max10_dev, &val);
> +     if (ret)
> +             return ret;
>       fme->board_info.max10_version = val;
> 
> -     if (max10_sys_read(fme->max10_dev, NIOS2_FW_VERSION, &val))
> -             return -EINVAL;
> +     ret = max10_get_bmcfw_version(fme->max10_dev, &val);
> +     if (ret)
> +             return ret;
>       fme->board_info.nios_fw_version = val;
> 
>       dev_info(fme, "max10 version 0x%x, nios fw version 0x%x\n", @@ -
> 1023,7 +1066,7 @@ static int fme_spi_init(struct ifpga_feature *feature)
>       opae_free(max10);
>  release_dev:
>       altera_spi_release(spi_master);
> -     return ret;
> +     return -ENODEV;
>  }
> 
>  static void fme_spi_uinit(struct ifpga_feature *feature) diff --git
> a/drivers/raw/ifpga/base/ifpga_fme_error.c
> b/drivers/raw/ifpga/base/ifpga_fme_error.c
> index 5905eac..c5bed28 100644
> --- a/drivers/raw/ifpga/base/ifpga_fme_error.c
> +++ b/drivers/raw/ifpga/base/ifpga_fme_error.c
> @@ -224,6 +224,8 @@ static int fme_global_error_init(struct ifpga_feature
> *feature)  {
>       struct ifpga_fme_hw *fme = feature->parent;
> 
> +     dev_info(NULL, "FME error_module Init.\n");
> +
>       fme_error_enable(fme);
> 
>       if (feature->ctx_num)
> diff --git a/drivers/raw/ifpga/base/ifpga_port_error.c
> b/drivers/raw/ifpga/base/ifpga_port_error.c
> index 189f762..6c8a7d7 100644
> --- a/drivers/raw/ifpga/base/ifpga_port_error.c
> +++ b/drivers/raw/ifpga/base/ifpga_port_error.c
> @@ -88,7 +88,7 @@ static int port_error_init(struct ifpga_feature *feature)
> {
>       struct ifpga_port_hw *port = feature->parent;
> 
> -     dev_info(NULL, "port error Init.\n");
> +     dev_info(NULL, "port error_module Init.\n");
> 
>       spinlock_lock(&port->lock);
>       port_err_mask(port, false);
> diff --git a/drivers/raw/ifpga/base/opae_intel_max10.c
> b/drivers/raw/ifpga/base/opae_intel_max10.c
> index 901a258..26f323c 100644
> --- a/drivers/raw/ifpga/base/opae_intel_max10.c
> +++ b/drivers/raw/ifpga/base/opae_intel_max10.c
> @@ -766,6 +766,51 @@ static int max10_staging_area_init(struct
> intel_max10_device *dev)
>       return 0;
>  }
> 
> +int max10_get_fpga_load_info(struct intel_max10_device *dev, unsigned
> +int *val) {
> +     int ret;
> +     unsigned int value;
> +
> +     /* read FPGA loading information */
> +     ret = max10_sys_read(dev, dev->csr->fpga_page_info, &value);
> +     if (ret) {
> +             dev_err(dev, "fail to get FPGA loading info\n");
> +             return ret;
> +     }
> +
> +     if (dev->type == M10_N3000)
> +             *val = value & 0x7;
> +     else if (dev->type == M10_N6000) {
> +             if (!GET_FIELD(PMCI_FPGA_CONFIGURED, value))
> +                     return -EINVAL;
> +             *val = GET_FIELD(PMCI_FPGA_BOOT_PAGE, value);
> +     }
> +
> +     return 0;
> +}
> +
> +int max10_get_bmc_version(struct intel_max10_device *dev, unsigned int
> +*val) {
> +     int ret;
> +
> +     ret = max10_sys_read(dev, dev->csr->build_version, val);
> +     if (ret)
> +             return ret;
> +
> +     return 0;
> +}
> +
> +int max10_get_bmcfw_version(struct intel_max10_device *dev, unsigned
> +int *val) {
> +     int ret;
> +
> +     ret = max10_sys_read(dev, dev->csr->fw_version, val);
> +     if (ret)
> +             return ret;
> +
> +     return 0;
> +}
> +
>  static const struct m10bmc_csr m10bmc_spi_csr = {
>       .base = MAX10_SEC_BASE_ADDR,
>       .build_version = MAX10_BUILD_VER,
> diff --git a/drivers/raw/ifpga/base/opae_intel_max10.h
> b/drivers/raw/ifpga/base/opae_intel_max10.h
> index 0d31196..6a1b122 100644
> --- a/drivers/raw/ifpga/base/opae_intel_max10.h
> +++ b/drivers/raw/ifpga/base/opae_intel_max10.h
> @@ -336,6 +336,9 @@ int max10_reg_write(struct intel_max10_device *dev,
>       unsigned int offset, unsigned int val);  int
> max10_sys_update_bits(struct intel_max10_device *dev,
>       unsigned int offset, unsigned int msk, unsigned int val);
> +int max10_get_bmcfw_version(struct intel_max10_device *dev, unsigned
> +int *val); int max10_get_bmc_version(struct intel_max10_device *dev,
> +unsigned int *val); int max10_get_fpga_load_info(struct
> +intel_max10_device *dev, unsigned int *val);
>  int intel_max10_device_init(struct intel_max10_device *dev);  int
> intel_max10_device_remove(struct intel_max10_device *dev);
> 
> --
> 1.8.3.1

Reviewed-by: Rosen Xu <rosen...@intel.com>

Reply via email to