linux/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
   2/* Copyright (C) 2015-2018 Netronome Systems, Inc. */
   3
   4#ifndef NSP_NSP_H
   5#define NSP_NSP_H 1
   6
   7#include <linux/types.h>
   8#include <linux/if_ether.h>
   9
  10struct firmware;
  11struct nfp_cpp;
  12struct nfp_nsp;
  13
  14struct nfp_nsp *nfp_nsp_open(struct nfp_cpp *cpp);
  15void nfp_nsp_close(struct nfp_nsp *state);
  16u16 nfp_nsp_get_abi_ver_major(struct nfp_nsp *state);
  17u16 nfp_nsp_get_abi_ver_minor(struct nfp_nsp *state);
  18int nfp_nsp_wait(struct nfp_nsp *state);
  19int nfp_nsp_device_soft_reset(struct nfp_nsp *state);
  20int nfp_nsp_load_fw(struct nfp_nsp *state, const struct firmware *fw);
  21int nfp_nsp_write_flash(struct nfp_nsp *state, const struct firmware *fw);
  22int nfp_nsp_mac_reinit(struct nfp_nsp *state);
  23int nfp_nsp_load_stored_fw(struct nfp_nsp *state);
  24int nfp_nsp_hwinfo_lookup(struct nfp_nsp *state, void *buf, unsigned int size);
  25int nfp_nsp_hwinfo_lookup_optional(struct nfp_nsp *state, void *buf,
  26                                   unsigned int size, const char *default_val);
  27int nfp_nsp_hwinfo_set(struct nfp_nsp *state, void *buf, unsigned int size);
  28int nfp_nsp_fw_loaded(struct nfp_nsp *state);
  29int nfp_nsp_read_module_eeprom(struct nfp_nsp *state, int eth_index,
  30                               unsigned int offset, void *data,
  31                               unsigned int len, unsigned int *read_len);
  32
  33static inline bool nfp_nsp_has_mac_reinit(struct nfp_nsp *state)
  34{
  35        return nfp_nsp_get_abi_ver_minor(state) > 20;
  36}
  37
  38static inline bool nfp_nsp_has_stored_fw_load(struct nfp_nsp *state)
  39{
  40        return nfp_nsp_get_abi_ver_minor(state) > 23;
  41}
  42
  43static inline bool nfp_nsp_has_hwinfo_lookup(struct nfp_nsp *state)
  44{
  45        return nfp_nsp_get_abi_ver_minor(state) > 24;
  46}
  47
  48static inline bool nfp_nsp_has_hwinfo_set(struct nfp_nsp *state)
  49{
  50        return nfp_nsp_get_abi_ver_minor(state) > 25;
  51}
  52
  53static inline bool nfp_nsp_has_fw_loaded(struct nfp_nsp *state)
  54{
  55        return nfp_nsp_get_abi_ver_minor(state) > 25;
  56}
  57
  58static inline bool nfp_nsp_has_versions(struct nfp_nsp *state)
  59{
  60        return nfp_nsp_get_abi_ver_minor(state) > 27;
  61}
  62
  63static inline bool nfp_nsp_has_read_module_eeprom(struct nfp_nsp *state)
  64{
  65        return nfp_nsp_get_abi_ver_minor(state) > 28;
  66}
  67
  68enum nfp_eth_interface {
  69        NFP_INTERFACE_NONE      = 0,
  70        NFP_INTERFACE_SFP       = 1,
  71        NFP_INTERFACE_SFPP      = 10,
  72        NFP_INTERFACE_SFP28     = 28,
  73        NFP_INTERFACE_QSFP      = 40,
  74        NFP_INTERFACE_RJ45      = 45,
  75        NFP_INTERFACE_CXP       = 100,
  76        NFP_INTERFACE_QSFP28    = 112,
  77};
  78
  79enum nfp_eth_media {
  80        NFP_MEDIA_DAC_PASSIVE = 0,
  81        NFP_MEDIA_DAC_ACTIVE,
  82        NFP_MEDIA_FIBRE,
  83};
  84
  85enum nfp_eth_aneg {
  86        NFP_ANEG_AUTO = 0,
  87        NFP_ANEG_SEARCH,
  88        NFP_ANEG_25G_CONSORTIUM,
  89        NFP_ANEG_25G_IEEE,
  90        NFP_ANEG_DISABLED,
  91};
  92
  93enum nfp_eth_fec {
  94        NFP_FEC_AUTO_BIT = 0,
  95        NFP_FEC_BASER_BIT,
  96        NFP_FEC_REED_SOLOMON_BIT,
  97        NFP_FEC_DISABLED_BIT,
  98};
  99
 100#define NFP_FEC_AUTO            BIT(NFP_FEC_AUTO_BIT)
 101#define NFP_FEC_BASER           BIT(NFP_FEC_BASER_BIT)
 102#define NFP_FEC_REED_SOLOMON    BIT(NFP_FEC_REED_SOLOMON_BIT)
 103#define NFP_FEC_DISABLED        BIT(NFP_FEC_DISABLED_BIT)
 104
 105/* Defines the valid values of the 'abi_drv_reset' hwinfo key */
 106#define NFP_NSP_DRV_RESET_DISK                  0
 107#define NFP_NSP_DRV_RESET_ALWAYS                1
 108#define NFP_NSP_DRV_RESET_NEVER                 2
 109#define NFP_NSP_DRV_RESET_DEFAULT               "0"
 110
 111/* Defines the valid values of the 'app_fw_from_flash' hwinfo key */
 112#define NFP_NSP_APP_FW_LOAD_DISK                0
 113#define NFP_NSP_APP_FW_LOAD_FLASH               1
 114#define NFP_NSP_APP_FW_LOAD_PREF                2
 115#define NFP_NSP_APP_FW_LOAD_DEFAULT             "2"
 116
 117/* Define the default value for the 'abi_drv_load_ifc' key */
 118#define NFP_NSP_DRV_LOAD_IFC_DEFAULT            "0x10ff"
 119
 120/**
 121 * struct nfp_eth_table - ETH table information
 122 * @count:      number of table entries
 123 * @max_index:  max of @index fields of all @ports
 124 * @ports:      table of ports
 125 *
 126 * @ports.eth_index:    port index according to legacy ethX numbering
 127 * @ports.index:        chip-wide first channel index
 128 * @ports.nbi:          NBI index
 129 * @ports.base:         first channel index (within NBI)
 130 * @ports.lanes:        number of channels
 131 * @ports.speed:        interface speed (in Mbps)
 132 * @ports.interface:    interface (module) plugged in
 133 * @ports.media:        media type of the @interface
 134 * @ports.fec:          forward error correction mode
 135 * @ports.aneg:         auto negotiation mode
 136 * @ports.mac_addr:     interface MAC address
 137 * @ports.label_port:   port id
 138 * @ports.label_subport:  id of interface within port (for split ports)
 139 * @ports.enabled:      is enabled?
 140 * @ports.tx_enabled:   is TX enabled?
 141 * @ports.rx_enabled:   is RX enabled?
 142 * @ports.override_changed: is media reconfig pending?
 143 *
 144 * @ports.port_type:    one of %PORT_* defines for ethtool
 145 * @ports.port_lanes:   total number of lanes on the port (sum of lanes of all
 146 *                      subports)
 147 * @ports.is_split:     is interface part of a split port
 148 * @ports.fec_modes_supported:  bitmap of FEC modes supported
 149 */
 150struct nfp_eth_table {
 151        unsigned int count;
 152        unsigned int max_index;
 153        struct nfp_eth_table_port {
 154                unsigned int eth_index;
 155                unsigned int index;
 156                unsigned int nbi;
 157                unsigned int base;
 158                unsigned int lanes;
 159                unsigned int speed;
 160
 161                unsigned int interface;
 162                enum nfp_eth_media media;
 163
 164                enum nfp_eth_fec fec;
 165                enum nfp_eth_aneg aneg;
 166
 167                u8 mac_addr[ETH_ALEN];
 168
 169                u8 label_port;
 170                u8 label_subport;
 171
 172                bool enabled;
 173                bool tx_enabled;
 174                bool rx_enabled;
 175
 176                bool override_changed;
 177
 178                /* Computed fields */
 179                u8 port_type;
 180
 181                unsigned int port_lanes;
 182
 183                bool is_split;
 184
 185                unsigned int fec_modes_supported;
 186        } ports[];
 187};
 188
 189struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
 190struct nfp_eth_table *
 191__nfp_eth_read_ports(struct nfp_cpp *cpp, struct nfp_nsp *nsp);
 192
 193int nfp_eth_set_mod_enable(struct nfp_cpp *cpp, unsigned int idx, bool enable);
 194int nfp_eth_set_configured(struct nfp_cpp *cpp, unsigned int idx,
 195                           bool configed);
 196int
 197nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode);
 198
 199static inline bool nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port)
 200{
 201        return !!eth_port->fec_modes_supported;
 202}
 203
 204static inline unsigned int
 205nfp_eth_supported_fec_modes(struct nfp_eth_table_port *eth_port)
 206{
 207        return eth_port->fec_modes_supported;
 208}
 209
 210struct nfp_nsp *nfp_eth_config_start(struct nfp_cpp *cpp, unsigned int idx);
 211int nfp_eth_config_commit_end(struct nfp_nsp *nsp);
 212void nfp_eth_config_cleanup_end(struct nfp_nsp *nsp);
 213
 214int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode);
 215int __nfp_eth_set_speed(struct nfp_nsp *nsp, unsigned int speed);
 216int __nfp_eth_set_split(struct nfp_nsp *nsp, unsigned int lanes);
 217
 218/**
 219 * struct nfp_nsp_identify - NSP static information
 220 * @version:      opaque version string
 221 * @flags:        version flags
 222 * @br_primary:   branch id of primary bootloader
 223 * @br_secondary: branch id of secondary bootloader
 224 * @br_nsp:       branch id of NSP
 225 * @primary:      version of primarary bootloader
 226 * @secondary:    version id of secondary bootloader
 227 * @nsp:          version id of NSP
 228 * @sensor_mask:  mask of present sensors available on NIC
 229 */
 230struct nfp_nsp_identify {
 231        char version[40];
 232        u8 flags;
 233        u8 br_primary;
 234        u8 br_secondary;
 235        u8 br_nsp;
 236        u16 primary;
 237        u16 secondary;
 238        u16 nsp;
 239        u64 sensor_mask;
 240};
 241
 242struct nfp_nsp_identify *__nfp_nsp_identify(struct nfp_nsp *nsp);
 243
 244enum nfp_nsp_sensor_id {
 245        NFP_SENSOR_CHIP_TEMPERATURE,
 246        NFP_SENSOR_ASSEMBLY_POWER,
 247        NFP_SENSOR_ASSEMBLY_12V_POWER,
 248        NFP_SENSOR_ASSEMBLY_3V3_POWER,
 249};
 250
 251int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id,
 252                          long *val);
 253
 254#define NFP_NSP_VERSION_BUFSZ   1024 /* reasonable size, not in the ABI */
 255
 256enum nfp_nsp_versions {
 257        NFP_VERSIONS_BSP,
 258        NFP_VERSIONS_CPLD,
 259        NFP_VERSIONS_APP,
 260        NFP_VERSIONS_BUNDLE,
 261        NFP_VERSIONS_UNDI,
 262        NFP_VERSIONS_NCSI,
 263        NFP_VERSIONS_CFGR,
 264};
 265
 266int nfp_nsp_versions(struct nfp_nsp *state, void *buf, unsigned int size);
 267const char *nfp_nsp_versions_get(enum nfp_nsp_versions id, bool flash,
 268                                 const u8 *buf, unsigned int size);
 269#endif
 270