Skip to content

Commit

Permalink
ice: add support detecting features based on netlist
Browse files Browse the repository at this point in the history
Add new functions to check netlist of a given board for:
- Recovered Clock device,
- Clock Generation Unit,
- Clock Multiplexer,

Initialize feature bits depending on detected components.

Signed-off-by: Maciej Machnikowski <maciej.machnikowski@intel.com>
  • Loading branch information
Maciej Machnikowski authored and intel-lab-lkp committed Oct 28, 2021
1 parent 911e3a4 commit e515f55
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 2 deletions.
2 changes: 2 additions & 0 deletions drivers/net/ethernet/intel/ice/ice.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@

enum ice_feature {
ICE_F_DSCP,
ICE_F_CGU,
ICE_F_PHY_RCLK,
ICE_F_SMA_CTRL,
ICE_F_MAX
};
Expand Down
7 changes: 6 additions & 1 deletion drivers/net/ethernet/intel/ice/ice_adminq_cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -1295,6 +1295,8 @@ struct ice_aqc_link_topo_params {
#define ICE_AQC_LINK_TOPO_NODE_TYPE_CAGE 6
#define ICE_AQC_LINK_TOPO_NODE_TYPE_MEZZ 7
#define ICE_AQC_LINK_TOPO_NODE_TYPE_ID_EEPROM 8
#define ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL 9
#define ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_MUX 10
#define ICE_AQC_LINK_TOPO_NODE_CTX_S 4
#define ICE_AQC_LINK_TOPO_NODE_CTX_M \
(0xF << ICE_AQC_LINK_TOPO_NODE_CTX_S)
Expand Down Expand Up @@ -1331,7 +1333,10 @@ struct ice_aqc_link_topo_addr {
struct ice_aqc_get_link_topo {
struct ice_aqc_link_topo_addr addr;
u8 node_part_num;
#define ICE_AQC_GET_LINK_TOPO_NODE_NR_PCA9575 0x21
#define ICE_AQC_GET_LINK_TOPO_NODE_NR_PCA9575 0x21
#define ICE_ACQ_GET_LINK_TOPO_NODE_NR_ZL30632_80032 0x24
#define ICE_ACQ_GET_LINK_TOPO_NODE_NR_PKVL 0x31
#define ICE_ACQ_GET_LINK_TOPO_NODE_NR_GEN_CLK_MUX 0x47
u8 rsvd[9];
};

Expand Down
73 changes: 73 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,79 @@ ice_aq_get_link_topo_handle(struct ice_port_info *pi, u8 node_type,
return ice_aq_send_cmd(pi->hw, &desc, NULL, 0, cd);
}

/**
* ice_aq_get_netlist_node
* @hw: pointer to the hw struct
* @cmd: get_link_topo AQ structure
* @node_part_number: output node part number if node found
* @node_handle: output node handle parameter if node found
*/
enum ice_status
ice_aq_get_netlist_node(struct ice_hw *hw, struct ice_aqc_get_link_topo *cmd,
u8 *node_part_number, u16 *node_handle)
{
struct ice_aq_desc desc;

ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_link_topo);
desc.params.get_link_topo = *cmd;

if (ice_aq_send_cmd(hw, &desc, NULL, 0, NULL))
return ICE_ERR_NOT_SUPPORTED;

if (node_handle)
*node_handle =
le16_to_cpu(desc.params.get_link_topo.addr.handle);
if (node_part_number)
*node_part_number = desc.params.get_link_topo.node_part_num;

return ICE_SUCCESS;
}

#define MAX_NETLIST_SIZE 10
/**
* ice_find_netlist_node
* @hw: pointer to the hw struct
* @node_type_ctx: type of netlist node to look for
* @node_part_number: node part number to look for
* @node_handle: output parameter if node found - optional
*
* Find and return the node handle for a given node type and part number in the
* netlist. When found ICE_SUCCESS is returned, ICE_ERR_DOES_NOT_EXIST
* otherwise. If @node_handle provided, it would be set to found node handle.
*/
enum ice_status
ice_find_netlist_node(struct ice_hw *hw, u8 node_type_ctx, u8 node_part_number,
u16 *node_handle)
{
struct ice_aqc_get_link_topo cmd;
u8 rec_node_part_number;
enum ice_status status;
u16 rec_node_handle;
u8 idx;

for (idx = 0; idx < MAX_NETLIST_SIZE; idx++) {
memset(&cmd, 0, sizeof(cmd));

cmd.addr.topo_params.node_type_ctx =
(node_type_ctx << ICE_AQC_LINK_TOPO_NODE_TYPE_S);
cmd.addr.topo_params.index = idx;

status = ice_aq_get_netlist_node(hw, &cmd,
&rec_node_part_number,
&rec_node_handle);
if (status)
return status;

if (rec_node_part_number == node_part_number) {
if (node_handle)
*node_handle = rec_node_handle;
return ICE_SUCCESS;
}
}

return ICE_ERR_DOES_NOT_EXIST;
}

/**
* ice_is_media_cage_present
* @pi: port information structure
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@ ice_aq_get_phy_caps(struct ice_port_info *pi, bool qual_mods, u8 report_mode,
struct ice_aqc_get_phy_caps_data *caps,
struct ice_sq_cd *cd);
enum ice_status
ice_aq_get_netlist_node(struct ice_hw *hw, struct ice_aqc_get_link_topo *cmd,
u8 *node_part_number, u16 *node_handle);
enum ice_status
ice_find_netlist_node(struct ice_hw *hw, u8 node_type_ctx, u8 node_part_number,
u16 *node_handle);
enum ice_status
ice_aq_list_caps(struct ice_hw *hw, void *buf, u16 buf_size, u32 *cap_count,
enum ice_adminq_opc opc, struct ice_sq_cd *cd);
enum ice_status
Expand Down
6 changes: 5 additions & 1 deletion drivers/net/ethernet/intel/ice/ice_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -4185,8 +4185,12 @@ void ice_init_feature_support(struct ice_pf *pf)
case ICE_DEV_ID_E810C_QSFP:
case ICE_DEV_ID_E810C_SFP:
ice_set_feature_support(pf, ICE_F_DSCP);
if (ice_is_e810t(&pf->hw))
if (ice_is_clock_mux_present_e810t(&pf->hw))
ice_set_feature_support(pf, ICE_F_SMA_CTRL);
if (ice_is_phy_rclk_present_e810t(&pf->hw))
ice_set_feature_support(pf, ICE_F_PHY_RCLK);
if (ice_is_cgu_present_e810t(&pf->hw))
ice_set_feature_support(pf, ICE_F_CGU);
break;
default:
break;
Expand Down
50 changes: 50 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_ptp_hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -800,3 +800,53 @@ bool ice_is_pca9575_present(struct ice_hw *hw)

return !status && handle;
}

/**
* ice_is_phy_rclk_present_e810t
* @hw: pointer to the hw struct
*
* Check if the PHY Recovered Clock device is present in the netlist
*/
bool ice_is_phy_rclk_present_e810t(struct ice_hw *hw)
{
if (ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL,
ICE_ACQ_GET_LINK_TOPO_NODE_NR_PKVL, NULL))
return false;

return true;
}

/**
* ice_is_cgu_present_e810t
* @hw: pointer to the hw struct
*
* Check if the Clock Generation Unit (CGU) device is present in the netlist
*/
bool ice_is_cgu_present_e810t(struct ice_hw *hw)
{
if (!ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_CTRL,
ICE_ACQ_GET_LINK_TOPO_NODE_NR_ZL30632_80032,
NULL)) {
hw->cgu_part_number =
ICE_ACQ_GET_LINK_TOPO_NODE_NR_ZL30632_80032;
return true;
}
return false;
}

/**
* ice_is_clock_mux_present_e810t
* @hw: pointer to the hw struct
*
* Check if the Clock Multiplexer device is present in the netlist
*/
bool ice_is_clock_mux_present_e810t(struct ice_hw *hw)
{
if (ice_find_netlist_node(hw, ICE_AQC_LINK_TOPO_NODE_TYPE_CLK_MUX,
ICE_ACQ_GET_LINK_TOPO_NODE_NR_GEN_CLK_MUX,
NULL))
return false;

return true;
}

3 changes: 3 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_ptp_hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ int ice_ptp_init_phy_e810(struct ice_hw *hw);
int ice_read_sma_ctrl_e810t(struct ice_hw *hw, u8 *data);
int ice_write_sma_ctrl_e810t(struct ice_hw *hw, u8 data);
bool ice_is_pca9575_present(struct ice_hw *hw);
bool ice_is_phy_rclk_present_e810t(struct ice_hw *hw);
bool ice_is_cgu_present_e810t(struct ice_hw *hw);
bool ice_is_clock_mux_present_e810t(struct ice_hw *hw);

#define PFTSYN_SEM_BYTES 4

Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/intel/ice/ice_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -920,6 +920,7 @@ struct ice_hw {
struct list_head rss_list_head;
struct ice_mbx_snapshot mbx_snapshot;
u16 io_expander_handle;
u8 cgu_part_number;
};

/* Statistics collected by each port, VSI, VEB, and S-channel */
Expand Down

0 comments on commit e515f55

Please sign in to comment.