Lines Matching +full:node +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0
39 put_unaligned_be64(pci_get_dsn(pf->pdev), dsn); in ice_info_get_dsn()
41 snprintf(ctx->buf, sizeof(ctx->buf), "%8phD", dsn); in ice_info_get_dsn()
46 struct ice_hw *hw = &pf->hw; in ice_info_pba()
49 status = ice_read_pba_string(hw, (u8 *)ctx->buf, sizeof(ctx->buf)); in ice_info_pba()
58 struct ice_hw *hw = &pf->hw; in ice_info_fw_mgmt()
60 snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u", in ice_info_fw_mgmt()
61 hw->fw_maj_ver, hw->fw_min_ver, hw->fw_patch); in ice_info_fw_mgmt()
66 struct ice_hw *hw = &pf->hw; in ice_info_fw_api()
68 snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u", hw->api_maj_ver, in ice_info_fw_api()
69 hw->api_min_ver, hw->api_patch); in ice_info_fw_api()
74 struct ice_hw *hw = &pf->hw; in ice_info_fw_build()
76 snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", hw->fw_build); in ice_info_fw_build()
81 struct ice_orom_info *orom = &pf->hw.flash.orom; in ice_info_orom_ver()
83 snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u", in ice_info_orom_ver()
84 orom->major, orom->build, orom->patch); in ice_info_orom_ver()
91 struct ice_orom_info *orom = &ctx->pending_orom; in ice_info_pending_orom_ver()
93 if (ctx->dev_caps.common_cap.nvm_update_pending_orom) in ice_info_pending_orom_ver()
94 snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u", in ice_info_pending_orom_ver()
95 orom->major, orom->build, orom->patch); in ice_info_pending_orom_ver()
100 struct ice_nvm_info *nvm = &pf->hw.flash.nvm; in ice_info_nvm_ver()
102 snprintf(ctx->buf, sizeof(ctx->buf), "%x.%02x", nvm->major, nvm->minor); in ice_info_nvm_ver()
109 struct ice_nvm_info *nvm = &ctx->pending_nvm; in ice_info_pending_nvm_ver()
111 if (ctx->dev_caps.common_cap.nvm_update_pending_nvm) in ice_info_pending_nvm_ver()
112 snprintf(ctx->buf, sizeof(ctx->buf), "%x.%02x", in ice_info_pending_nvm_ver()
113 nvm->major, nvm->minor); in ice_info_pending_nvm_ver()
118 struct ice_nvm_info *nvm = &pf->hw.flash.nvm; in ice_info_eetrack()
120 snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", nvm->eetrack); in ice_info_eetrack()
126 struct ice_nvm_info *nvm = &ctx->pending_nvm; in ice_info_pending_eetrack()
128 if (ctx->dev_caps.common_cap.nvm_update_pending_nvm) in ice_info_pending_eetrack()
129 snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", nvm->eetrack); in ice_info_pending_eetrack()
134 struct ice_hw *hw = &pf->hw; in ice_info_ddp_pkg_name()
136 snprintf(ctx->buf, sizeof(ctx->buf), "%s", hw->active_pkg_name); in ice_info_ddp_pkg_name()
142 struct ice_pkg_ver *pkg = &pf->hw.active_pkg_ver; in ice_info_ddp_pkg_version()
144 snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u.%u", in ice_info_ddp_pkg_version()
145 pkg->major, pkg->minor, pkg->update, pkg->draft); in ice_info_ddp_pkg_version()
151 snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", pf->hw.active_track_id); in ice_info_ddp_pkg_bundle_id()
156 struct ice_netlist_info *netlist = &pf->hw.flash.netlist; in ice_info_netlist_ver()
159 snprintf(ctx->buf, sizeof(ctx->buf), "%x.%x.%x-%x.%x.%x", in ice_info_netlist_ver()
160 netlist->major, netlist->minor, in ice_info_netlist_ver()
161 netlist->type >> 16, netlist->type & 0xFFFF, in ice_info_netlist_ver()
162 netlist->rev, netlist->cust_ver); in ice_info_netlist_ver()
167 struct ice_netlist_info *netlist = &pf->hw.flash.netlist; in ice_info_netlist_build()
169 snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", netlist->hash); in ice_info_netlist_build()
176 struct ice_netlist_info *netlist = &ctx->pending_netlist; in ice_info_pending_netlist_ver()
179 if (ctx->dev_caps.common_cap.nvm_update_pending_netlist) in ice_info_pending_netlist_ver()
180 snprintf(ctx->buf, sizeof(ctx->buf), "%x.%x.%x-%x.%x.%x", in ice_info_pending_netlist_ver()
181 netlist->major, netlist->minor, in ice_info_pending_netlist_ver()
182 netlist->type >> 16, netlist->type & 0xFFFF, in ice_info_pending_netlist_ver()
183 netlist->rev, netlist->cust_ver); in ice_info_pending_netlist_ver()
190 struct ice_netlist_info *netlist = &ctx->pending_netlist; in ice_info_pending_netlist_build()
192 if (ctx->dev_caps.common_cap.nvm_update_pending_netlist) in ice_info_pending_netlist_build()
193 snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", netlist->hash); in ice_info_pending_netlist_build()
198 u32 id, cfg_ver, fw_ver; in ice_info_cgu_fw_build() local
202 if (ice_aq_get_cgu_info(&pf->hw, &id, &cfg_ver, &fw_ver)) in ice_info_cgu_fw_build()
204 snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u", id, cfg_ver, fw_ver); in ice_info_cgu_fw_build()
211 snprintf(ctx->buf, sizeof(ctx->buf), "%u", pf->hw.cgu_part_number); in ice_info_cgu_id()
256 fixed("cgu.id", ice_info_cgu_id),
261 * ice_devlink_info_get - .info_get devlink handler
277 struct ice_hw *hw = &pf->hw; in ice_devlink_info_get()
290 return -ENOMEM; in ice_devlink_info_get()
293 err = ice_discover_dev_caps(hw, &ctx->dev_caps); in ice_devlink_info_get()
296 err, libie_aq_str(hw->adminq.sq_last_status)); in ice_devlink_info_get()
301 if (ctx->dev_caps.common_cap.nvm_update_pending_orom) { in ice_devlink_info_get()
302 err = ice_get_inactive_orom_ver(hw, &ctx->pending_orom); in ice_devlink_info_get()
305 err, libie_aq_str(hw->adminq.sq_last_status)); in ice_devlink_info_get()
308 ctx->dev_caps.common_cap.nvm_update_pending_orom = false; in ice_devlink_info_get()
312 if (ctx->dev_caps.common_cap.nvm_update_pending_nvm) { in ice_devlink_info_get()
313 err = ice_get_inactive_nvm_ver(hw, &ctx->pending_nvm); in ice_devlink_info_get()
316 err, libie_aq_str(hw->adminq.sq_last_status)); in ice_devlink_info_get()
319 ctx->dev_caps.common_cap.nvm_update_pending_nvm = false; in ice_devlink_info_get()
323 if (ctx->dev_caps.common_cap.nvm_update_pending_netlist) { in ice_devlink_info_get()
324 err = ice_get_inactive_netlist_ver(hw, &ctx->pending_netlist); in ice_devlink_info_get()
327 err, libie_aq_str(hw->adminq.sq_last_status)); in ice_devlink_info_get()
330 ctx->dev_caps.common_cap.nvm_update_pending_netlist = false; in ice_devlink_info_get()
336 err = devlink_info_serial_number_put(req, ctx->buf); in ice_devlink_info_get()
346 memset(ctx->buf, 0, sizeof(ctx->buf)); in ice_devlink_info_get()
355 if (ctx->buf[0] == '\0' && ice_devlink_versions[i].fallback) in ice_devlink_info_get()
359 if (ctx->buf[0] == '\0') in ice_devlink_info_get()
364 err = devlink_info_version_fixed_put(req, key, ctx->buf); in ice_devlink_info_get()
372 ctx->buf, in ice_devlink_info_get()
381 ctx->buf, in ice_devlink_info_get()
397 * ice_devlink_reload_empr_start - Start EMP reset to activate new firmware
415 struct ice_hw *hw = &pf->hw; in ice_devlink_reload_empr_start()
430 return -ECANCELED; in ice_devlink_reload_empr_start()
433 if (pf->fw_emp_reset_disabled) { in ice_devlink_reload_empr_start()
435 return -ECANCELED; in ice_devlink_reload_empr_start()
443 err, libie_aq_str(hw->adminq.sq_last_status)); in ice_devlink_reload_empr_start()
452 * ice_devlink_reinit_down - unload given PF
463 ice_deinit_hw(&pf->hw); in ice_devlink_reinit_down()
468 * ice_devlink_reload_down - prepare for reload
488 return -EOPNOTSUPP; in ice_devlink_reload_down()
493 return -EOPNOTSUPP; in ice_devlink_reload_down()
498 return -EOPNOTSUPP; in ice_devlink_reload_down()
506 return -EOPNOTSUPP; in ice_devlink_reload_down()
511 * ice_devlink_reload_empr_finish - Wait for EMP reset to finish
535 * ice_get_tx_topo_user_sel - Read user's choice from flash
546 struct ice_hw *hw = &pf->hw; in ice_get_tx_topo_user_sel()
570 * ice_update_tx_topo_user_sel - Save user's preference in flash
583 struct ice_hw *hw = &pf->hw; in ice_update_tx_topo_user_sel()
610 * ice_devlink_tx_sched_layers_get - Get tx_scheduling_layers parameter
612 * @id: the parameter ID to set
618 static int ice_devlink_tx_sched_layers_get(struct devlink *devlink, u32 id, in ice_devlink_tx_sched_layers_get() argument
625 err = ice_get_tx_topo_user_sel(pf, &ctx->val.vu8); in ice_devlink_tx_sched_layers_get()
633 * ice_devlink_tx_sched_layers_set - Set tx_scheduling_layers parameter
635 * @id: the parameter ID to set
641 static int ice_devlink_tx_sched_layers_set(struct devlink *devlink, u32 id, in ice_devlink_tx_sched_layers_set() argument
648 err = ice_update_tx_topo_user_sel(pf, ctx->val.vu8); in ice_devlink_tx_sched_layers_set()
659 * ice_devlink_tx_sched_layers_validate - Validate passed tx_scheduling_layers
662 * @id: the parameter ID to validate
667 * - 5 - five layers Tx Scheduler Topology Tree
668 * - 9 - nine layers Tx Scheduler Topology Tree
673 static int ice_devlink_tx_sched_layers_validate(struct devlink *devlink, u32 id, in ice_devlink_tx_sched_layers_validate() argument
677 if (val->vu8 != ICE_SCHED_5_LAYERS && val->vu8 != ICE_SCHED_9_LAYERS) { in ice_devlink_tx_sched_layers_validate()
680 return -EINVAL; in ice_devlink_tx_sched_layers_validate()
687 * ice_tear_down_devlink_rate_tree - removes devlink-rate exported tree
701 mutex_lock(&pf->vfs.table_lock); in ice_tear_down_devlink_rate_tree()
703 if (vf->devlink_port.devlink_rate) in ice_tear_down_devlink_rate_tree()
704 devl_rate_leaf_destroy(&vf->devlink_port); in ice_tear_down_devlink_rate_tree()
706 mutex_unlock(&pf->vfs.table_lock); in ice_tear_down_devlink_rate_tree()
713 * ice_enable_custom_tx - try to enable custom Tx feature
721 struct ice_port_info *pi = ice_get_main_vsi(pf)->port_info; in ice_enable_custom_tx()
724 if (pi->is_custom_tx_enabled) in ice_enable_custom_tx()
738 pi->is_custom_tx_enabled = true; in ice_enable_custom_tx()
744 * ice_traverse_tx_tree - traverse Tx scheduler tree
746 * @node: current node, used for recursion
751 * entire structure to the devlink-rate.
753 static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node *node, in ice_traverse_tx_tree() argument
761 if (node->rate_node) in ice_traverse_tx_tree()
765 if (node->parent == tc_node) { in ice_traverse_tx_tree()
766 /* create root node */ in ice_traverse_tx_tree()
767 rate_node = devl_rate_node_create(devlink, node, node->name, NULL); in ice_traverse_tx_tree()
768 } else if (node->vsi_handle && in ice_traverse_tx_tree()
769 pf->vsi[node->vsi_handle]->type == ICE_VSI_VF && in ice_traverse_tx_tree()
770 pf->vsi[node->vsi_handle]->vf) { in ice_traverse_tx_tree()
771 vf = pf->vsi[node->vsi_handle]->vf; in ice_traverse_tx_tree()
772 if (!vf->devlink_port.devlink_rate) in ice_traverse_tx_tree()
776 devl_rate_leaf_create(&vf->devlink_port, node, in ice_traverse_tx_tree()
777 node->parent->rate_node); in ice_traverse_tx_tree()
778 } else if (node->vsi_handle && in ice_traverse_tx_tree()
779 pf->vsi[node->vsi_handle]->type == ICE_VSI_SF && in ice_traverse_tx_tree()
780 pf->vsi[node->vsi_handle]->sf) { in ice_traverse_tx_tree()
781 sf = pf->vsi[node->vsi_handle]->sf; in ice_traverse_tx_tree()
782 if (!sf->devlink_port.devlink_rate) in ice_traverse_tx_tree()
786 devl_rate_leaf_create(&sf->devlink_port, node, in ice_traverse_tx_tree()
787 node->parent->rate_node); in ice_traverse_tx_tree()
788 } else if (node->info.data.elem_type != ICE_AQC_ELEM_TYPE_LEAF && in ice_traverse_tx_tree()
789 node->parent->rate_node) { in ice_traverse_tx_tree()
790 rate_node = devl_rate_node_create(devlink, node, node->name, in ice_traverse_tx_tree()
791 node->parent->rate_node); in ice_traverse_tx_tree()
795 node->rate_node = rate_node; in ice_traverse_tx_tree()
798 for (i = 0; i < node->num_children; i++) in ice_traverse_tx_tree()
799 ice_traverse_tx_tree(devlink, node->children[i], tc_node, pf); in ice_traverse_tx_tree()
803 * ice_devlink_rate_init_tx_topology - export Tx scheduler tree to devlink rate
807 * This function finds a root node, then calls ice_traverse_tx tree, which
812 struct ice_port_info *pi = vsi->port_info; in ice_devlink_rate_init_tx_topology()
814 struct ice_pf *pf = vsi->back; in ice_devlink_rate_init_tx_topology()
817 tc_node = pi->root->children[0]; in ice_devlink_rate_init_tx_topology()
818 mutex_lock(&pi->sched_lock); in ice_devlink_rate_init_tx_topology()
819 for (i = 0; i < tc_node->num_children; i++) in ice_devlink_rate_init_tx_topology()
820 ice_traverse_tx_tree(devlink, tc_node->children[i], tc_node, pf); in ice_devlink_rate_init_tx_topology()
821 mutex_unlock(&pi->sched_lock); in ice_devlink_rate_init_tx_topology()
826 static void ice_clear_rate_nodes(struct ice_sched_node *node) in ice_clear_rate_nodes() argument
828 node->rate_node = NULL; in ice_clear_rate_nodes()
830 for (int i = 0; i < node->num_children; i++) in ice_clear_rate_nodes()
831 ice_clear_rate_nodes(node->children[i]); in ice_clear_rate_nodes()
835 * ice_devlink_rate_clear_tx_topology - clear node->rate_node
843 struct ice_port_info *pi = vsi->port_info; in ice_devlink_rate_clear_tx_topology()
845 mutex_lock(&pi->sched_lock); in ice_devlink_rate_clear_tx_topology()
846 ice_clear_rate_nodes(pi->root->children[0]); in ice_devlink_rate_clear_tx_topology()
847 mutex_unlock(&pi->sched_lock); in ice_devlink_rate_clear_tx_topology()
851 * ice_set_object_tx_share - sets node scheduling parameter
853 * @node: node struct instance
859 static int ice_set_object_tx_share(struct ice_port_info *pi, struct ice_sched_node *node, in ice_set_object_tx_share() argument
864 mutex_lock(&pi->sched_lock); in ice_set_object_tx_share()
866 node->tx_share = div_u64(bw, 125); in ice_set_object_tx_share()
867 status = ice_sched_set_node_bw_lmt(pi, node, ICE_MIN_BW, node->tx_share); in ice_set_object_tx_share()
868 mutex_unlock(&pi->sched_lock); in ice_set_object_tx_share()
871 NL_SET_ERR_MSG_MOD(extack, "Can't set scheduling node tx_share"); in ice_set_object_tx_share()
877 * ice_set_object_tx_max - sets node scheduling parameter
879 * @node: node struct instance
885 static int ice_set_object_tx_max(struct ice_port_info *pi, struct ice_sched_node *node, in ice_set_object_tx_max() argument
890 mutex_lock(&pi->sched_lock); in ice_set_object_tx_max()
892 node->tx_max = div_u64(bw, 125); in ice_set_object_tx_max()
893 status = ice_sched_set_node_bw_lmt(pi, node, ICE_MAX_BW, node->tx_max); in ice_set_object_tx_max()
894 mutex_unlock(&pi->sched_lock); in ice_set_object_tx_max()
897 NL_SET_ERR_MSG_MOD(extack, "Can't set scheduling node tx_max"); in ice_set_object_tx_max()
903 * ice_set_object_tx_priority - sets node scheduling parameter
905 * @node: node struct instance
909 * This function sets priority of node among siblings.
911 static int ice_set_object_tx_priority(struct ice_port_info *pi, struct ice_sched_node *node, in ice_set_object_tx_priority() argument
918 return -EINVAL; in ice_set_object_tx_priority()
921 mutex_lock(&pi->sched_lock); in ice_set_object_tx_priority()
922 node->tx_priority = priority; in ice_set_object_tx_priority()
923 status = ice_sched_set_node_priority(pi, node, node->tx_priority); in ice_set_object_tx_priority()
924 mutex_unlock(&pi->sched_lock); in ice_set_object_tx_priority()
927 NL_SET_ERR_MSG_MOD(extack, "Can't set scheduling node tx_priority"); in ice_set_object_tx_priority()
933 * ice_set_object_tx_weight - sets node scheduling parameter
935 * @node: node struct instance
939 * This function sets node weight for WFQ algorithm.
941 static int ice_set_object_tx_weight(struct ice_port_info *pi, struct ice_sched_node *node, in ice_set_object_tx_weight() argument
948 return -EINVAL; in ice_set_object_tx_weight()
951 mutex_lock(&pi->sched_lock); in ice_set_object_tx_weight()
952 node->tx_weight = weight; in ice_set_object_tx_weight()
953 status = ice_sched_set_node_weight(pi, node, node->tx_weight); in ice_set_object_tx_weight()
954 mutex_unlock(&pi->sched_lock); in ice_set_object_tx_weight()
957 NL_SET_ERR_MSG_MOD(extack, "Can't set scheduling node tx_weight"); in ice_set_object_tx_weight()
963 * ice_get_pi_from_dev_rate - get port info from devlink_rate
970 struct ice_pf *pf = devlink_priv(rate_node->devlink); in ice_get_pi_from_dev_rate()
972 return ice_get_main_vsi(pf)->port_info; in ice_get_pi_from_dev_rate()
978 struct ice_sched_node *node; in ice_devlink_rate_node_new() local
983 if (!ice_enable_custom_tx(devlink_priv(rate_node->devlink))) in ice_devlink_rate_node_new()
984 return -EBUSY; in ice_devlink_rate_node_new()
987 node = devm_kzalloc(ice_hw_to_dev(pi->hw), sizeof(*node), GFP_KERNEL); in ice_devlink_rate_node_new()
988 if (!node) in ice_devlink_rate_node_new()
989 return -ENOMEM; in ice_devlink_rate_node_new()
991 *priv = node; in ice_devlink_rate_node_new()
999 struct ice_sched_node *node, *tc_node; in ice_devlink_rate_node_del() local
1003 tc_node = pi->root->children[0]; in ice_devlink_rate_node_del()
1004 node = priv; in ice_devlink_rate_node_del()
1006 if (!rate_node->parent || !node || tc_node == node || !extack) in ice_devlink_rate_node_del()
1009 if (!ice_enable_custom_tx(devlink_priv(rate_node->devlink))) in ice_devlink_rate_node_del()
1010 return -EBUSY; in ice_devlink_rate_node_del()
1012 /* can't allow to delete a node with children */ in ice_devlink_rate_node_del()
1013 if (node->num_children) in ice_devlink_rate_node_del()
1014 return -EINVAL; in ice_devlink_rate_node_del()
1016 mutex_lock(&pi->sched_lock); in ice_devlink_rate_node_del()
1017 ice_free_sched_node(pi, node); in ice_devlink_rate_node_del()
1018 mutex_unlock(&pi->sched_lock); in ice_devlink_rate_node_del()
1026 struct ice_sched_node *node = priv; in ice_devlink_rate_leaf_tx_max_set() local
1028 if (!ice_enable_custom_tx(devlink_priv(rate_leaf->devlink))) in ice_devlink_rate_leaf_tx_max_set()
1029 return -EBUSY; in ice_devlink_rate_leaf_tx_max_set()
1031 if (!node) in ice_devlink_rate_leaf_tx_max_set()
1035 node, tx_max, extack); in ice_devlink_rate_leaf_tx_max_set()
1041 struct ice_sched_node *node = priv; in ice_devlink_rate_leaf_tx_share_set() local
1043 if (!ice_enable_custom_tx(devlink_priv(rate_leaf->devlink))) in ice_devlink_rate_leaf_tx_share_set()
1044 return -EBUSY; in ice_devlink_rate_leaf_tx_share_set()
1046 if (!node) in ice_devlink_rate_leaf_tx_share_set()
1049 return ice_set_object_tx_share(ice_get_pi_from_dev_rate(rate_leaf), node, in ice_devlink_rate_leaf_tx_share_set()
1056 struct ice_sched_node *node = priv; in ice_devlink_rate_leaf_tx_priority_set() local
1058 if (!ice_enable_custom_tx(devlink_priv(rate_leaf->devlink))) in ice_devlink_rate_leaf_tx_priority_set()
1059 return -EBUSY; in ice_devlink_rate_leaf_tx_priority_set()
1061 if (!node) in ice_devlink_rate_leaf_tx_priority_set()
1064 return ice_set_object_tx_priority(ice_get_pi_from_dev_rate(rate_leaf), node, in ice_devlink_rate_leaf_tx_priority_set()
1071 struct ice_sched_node *node = priv; in ice_devlink_rate_leaf_tx_weight_set() local
1073 if (!ice_enable_custom_tx(devlink_priv(rate_leaf->devlink))) in ice_devlink_rate_leaf_tx_weight_set()
1074 return -EBUSY; in ice_devlink_rate_leaf_tx_weight_set()
1076 if (!node) in ice_devlink_rate_leaf_tx_weight_set()
1079 return ice_set_object_tx_weight(ice_get_pi_from_dev_rate(rate_leaf), node, in ice_devlink_rate_leaf_tx_weight_set()
1086 struct ice_sched_node *node = priv; in ice_devlink_rate_node_tx_max_set() local
1088 if (!ice_enable_custom_tx(devlink_priv(rate_node->devlink))) in ice_devlink_rate_node_tx_max_set()
1089 return -EBUSY; in ice_devlink_rate_node_tx_max_set()
1091 if (!node) in ice_devlink_rate_node_tx_max_set()
1095 node, tx_max, extack); in ice_devlink_rate_node_tx_max_set()
1101 struct ice_sched_node *node = priv; in ice_devlink_rate_node_tx_share_set() local
1103 if (!ice_enable_custom_tx(devlink_priv(rate_node->devlink))) in ice_devlink_rate_node_tx_share_set()
1104 return -EBUSY; in ice_devlink_rate_node_tx_share_set()
1106 if (!node) in ice_devlink_rate_node_tx_share_set()
1110 node, tx_share, extack); in ice_devlink_rate_node_tx_share_set()
1116 struct ice_sched_node *node = priv; in ice_devlink_rate_node_tx_priority_set() local
1118 if (!ice_enable_custom_tx(devlink_priv(rate_node->devlink))) in ice_devlink_rate_node_tx_priority_set()
1119 return -EBUSY; in ice_devlink_rate_node_tx_priority_set()
1121 if (!node) in ice_devlink_rate_node_tx_priority_set()
1125 node, tx_priority, extack); in ice_devlink_rate_node_tx_priority_set()
1131 struct ice_sched_node *node = priv; in ice_devlink_rate_node_tx_weight_set() local
1133 if (!ice_enable_custom_tx(devlink_priv(rate_node->devlink))) in ice_devlink_rate_node_tx_weight_set()
1134 return -EBUSY; in ice_devlink_rate_node_tx_weight_set()
1136 if (!node) in ice_devlink_rate_node_tx_weight_set()
1140 node, tx_weight, extack); in ice_devlink_rate_node_tx_weight_set()
1149 struct ice_sched_node *tc_node, *node, *parent_node; in ice_devlink_set_parent() local
1155 tc_node = pi->root->children[0]; in ice_devlink_set_parent()
1156 node = priv; in ice_devlink_set_parent()
1161 if (!ice_enable_custom_tx(devlink_priv(devlink_rate->devlink))) in ice_devlink_set_parent()
1162 return -EBUSY; in ice_devlink_set_parent()
1165 if (!node || tc_node == node || node->num_children) in ice_devlink_set_parent()
1166 return -EINVAL; in ice_devlink_set_parent()
1168 mutex_lock(&pi->sched_lock); in ice_devlink_set_parent()
1169 ice_free_sched_node(pi, node); in ice_devlink_set_parent()
1170 mutex_unlock(&pi->sched_lock); in ice_devlink_set_parent()
1177 /* if the node doesn't exist, create it */ in ice_devlink_set_parent()
1178 if (!node->parent) { in ice_devlink_set_parent()
1179 mutex_lock(&pi->sched_lock); in ice_devlink_set_parent()
1181 parent_node->tx_sched_layer + 1, in ice_devlink_set_parent()
1183 &node); in ice_devlink_set_parent()
1184 mutex_unlock(&pi->sched_lock); in ice_devlink_set_parent()
1187 NL_SET_ERR_MSG_MOD(extack, "Can't add a new node"); in ice_devlink_set_parent()
1191 if (devlink_rate->tx_share) in ice_devlink_set_parent()
1192 ice_set_object_tx_share(pi, node, devlink_rate->tx_share, extack); in ice_devlink_set_parent()
1193 if (devlink_rate->tx_max) in ice_devlink_set_parent()
1194 ice_set_object_tx_max(pi, node, devlink_rate->tx_max, extack); in ice_devlink_set_parent()
1195 if (devlink_rate->tx_priority) in ice_devlink_set_parent()
1196 ice_set_object_tx_priority(pi, node, devlink_rate->tx_priority, extack); in ice_devlink_set_parent()
1197 if (devlink_rate->tx_weight) in ice_devlink_set_parent()
1198 ice_set_object_tx_weight(pi, node, devlink_rate->tx_weight, extack); in ice_devlink_set_parent()
1200 node_teid = le32_to_cpu(node->info.node_teid); in ice_devlink_set_parent()
1201 mutex_lock(&pi->sched_lock); in ice_devlink_set_parent()
1203 mutex_unlock(&pi->sched_lock); in ice_devlink_set_parent()
1206 NL_SET_ERR_MSG_MOD(extack, "Can't move existing node to a new parent"); in ice_devlink_set_parent()
1222 pf->msix.min = val.vu32; in ice_set_min_max_msix()
1228 pf->msix.max = val.vu32; in ice_set_min_max_msix()
1232 * ice_devlink_reinit_up - do reinit of the given PF
1242 err = ice_init_hw(&pf->hw); in ice_devlink_reinit_up()
1250 /* load MSI-X values */ in ice_devlink_reinit_up()
1263 vsi->flags = ICE_VSI_FLAG_INIT; in ice_devlink_reinit_up()
1287 ice_deinit_hw(&pf->hw); in ice_devlink_reinit_up()
1294 * ice_devlink_reload_up - do reload up after reinit
1319 return -EOPNOTSUPP; in ice_devlink_reload_up()
1356 ice_devlink_enable_roce_get(struct devlink *devlink, u32 id, in ice_devlink_enable_roce_get() argument
1363 cdev = pf->cdev_info; in ice_devlink_enable_roce_get()
1365 return -EOPNOTSUPP; in ice_devlink_enable_roce_get()
1367 ctx->val.vbool = !!(cdev->rdma_protocol & IIDC_RDMA_PROTOCOL_ROCEV2); in ice_devlink_enable_roce_get()
1372 static int ice_devlink_enable_roce_set(struct devlink *devlink, u32 id, in ice_devlink_enable_roce_set() argument
1378 bool roce_ena = ctx->val.vbool; in ice_devlink_enable_roce_set()
1381 cdev = pf->cdev_info; in ice_devlink_enable_roce_set()
1383 return -ENODEV; in ice_devlink_enable_roce_set()
1387 cdev->rdma_protocol &= ~IIDC_RDMA_PROTOCOL_ROCEV2; in ice_devlink_enable_roce_set()
1391 cdev->rdma_protocol |= IIDC_RDMA_PROTOCOL_ROCEV2; in ice_devlink_enable_roce_set()
1394 cdev->rdma_protocol &= ~IIDC_RDMA_PROTOCOL_ROCEV2; in ice_devlink_enable_roce_set()
1400 ice_devlink_enable_roce_validate(struct devlink *devlink, u32 id, in ice_devlink_enable_roce_validate() argument
1407 cdev = pf->cdev_info; in ice_devlink_enable_roce_validate()
1409 return -ENODEV; in ice_devlink_enable_roce_validate()
1411 if (!test_bit(ICE_FLAG_RDMA_ENA, pf->flags)) in ice_devlink_enable_roce_validate()
1412 return -EOPNOTSUPP; in ice_devlink_enable_roce_validate()
1414 if (cdev->rdma_protocol & IIDC_RDMA_PROTOCOL_IWARP) { in ice_devlink_enable_roce_validate()
1416 return -EOPNOTSUPP; in ice_devlink_enable_roce_validate()
1423 ice_devlink_enable_iw_get(struct devlink *devlink, u32 id, in ice_devlink_enable_iw_get() argument
1430 cdev = pf->cdev_info; in ice_devlink_enable_iw_get()
1432 return -EOPNOTSUPP; in ice_devlink_enable_iw_get()
1434 ctx->val.vbool = !!(cdev->rdma_protocol & IIDC_RDMA_PROTOCOL_IWARP); in ice_devlink_enable_iw_get()
1439 static int ice_devlink_enable_iw_set(struct devlink *devlink, u32 id, in ice_devlink_enable_iw_set() argument
1445 bool iw_ena = ctx->val.vbool; in ice_devlink_enable_iw_set()
1448 cdev = pf->cdev_info; in ice_devlink_enable_iw_set()
1450 return -ENODEV; in ice_devlink_enable_iw_set()
1454 cdev->rdma_protocol &= ~IIDC_RDMA_PROTOCOL_IWARP; in ice_devlink_enable_iw_set()
1458 cdev->rdma_protocol |= IIDC_RDMA_PROTOCOL_IWARP; in ice_devlink_enable_iw_set()
1461 cdev->rdma_protocol &= ~IIDC_RDMA_PROTOCOL_IWARP; in ice_devlink_enable_iw_set()
1467 ice_devlink_enable_iw_validate(struct devlink *devlink, u32 id, in ice_devlink_enable_iw_validate() argument
1473 if (!test_bit(ICE_FLAG_RDMA_ENA, pf->flags)) in ice_devlink_enable_iw_validate()
1474 return -EOPNOTSUPP; in ice_devlink_enable_iw_validate()
1476 if (pf->cdev_info->rdma_protocol & IIDC_RDMA_PROTOCOL_ROCEV2) { in ice_devlink_enable_iw_validate()
1478 return -EOPNOTSUPP; in ice_devlink_enable_iw_validate()
1489 * ice_devlink_local_fwd_mode_to_str - Get string for local_fwd mode.
1510 * ice_devlink_local_fwd_str_to_mode - Get local_fwd mode from string name.
1524 return -EINVAL; in ice_devlink_local_fwd_str_to_mode()
1528 * ice_devlink_local_fwd_get - Get local_fwd parameter.
1530 * @id: The parameter ID to set.
1536 static int ice_devlink_local_fwd_get(struct devlink *devlink, u32 id, in ice_devlink_local_fwd_get() argument
1544 pi = pf->hw.port_info; in ice_devlink_local_fwd_get()
1545 mode_str = ice_devlink_local_fwd_mode_to_str(pi->local_fwd_mode); in ice_devlink_local_fwd_get()
1546 snprintf(ctx->val.vstr, sizeof(ctx->val.vstr), "%s", mode_str); in ice_devlink_local_fwd_get()
1552 * ice_devlink_local_fwd_set - Set local_fwd parameter.
1554 * @id: The parameter ID to set.
1560 static int ice_devlink_local_fwd_set(struct devlink *devlink, u32 id, in ice_devlink_local_fwd_set() argument
1564 int new_local_fwd_mode = ice_devlink_local_fwd_str_to_mode(ctx->val.vstr); in ice_devlink_local_fwd_set()
1569 pi = pf->hw.port_info; in ice_devlink_local_fwd_set()
1570 if (pi->local_fwd_mode != new_local_fwd_mode) { in ice_devlink_local_fwd_set()
1571 pi->local_fwd_mode = new_local_fwd_mode; in ice_devlink_local_fwd_set()
1572 dev_info(dev, "Setting local_fwd to %s\n", ctx->val.vstr); in ice_devlink_local_fwd_set()
1580 * ice_devlink_local_fwd_validate - Validate passed local_fwd parameter value.
1582 * @id: The parameter ID to validate.
1587 * "enabled" - local_fwd is enabled, "disabled" - local_fwd is disabled
1588 * "prioritized" - local_fwd traffic is prioritized in scheduling.
1593 static int ice_devlink_local_fwd_validate(struct devlink *devlink, u32 id, in ice_devlink_local_fwd_validate() argument
1597 if (ice_devlink_local_fwd_str_to_mode(val->vstr) < 0) { in ice_devlink_local_fwd_validate()
1599 return -EINVAL; in ice_devlink_local_fwd_validate()
1606 ice_devlink_msix_max_pf_validate(struct devlink *devlink, u32 id, in ice_devlink_msix_max_pf_validate() argument
1612 if (val->vu32 > pf->hw.func_caps.common_cap.num_msix_vectors) in ice_devlink_msix_max_pf_validate()
1613 return -EINVAL; in ice_devlink_msix_max_pf_validate()
1619 ice_devlink_msix_min_pf_validate(struct devlink *devlink, u32 id, in ice_devlink_msix_min_pf_validate() argument
1623 if (val->vu32 < ICE_MIN_MSIX) in ice_devlink_msix_min_pf_validate()
1624 return -EINVAL; in ice_devlink_msix_min_pf_validate()
1629 static int ice_devlink_enable_rdma_validate(struct devlink *devlink, u32 id, in ice_devlink_enable_rdma_validate() argument
1634 bool new_state = val->vbool; in ice_devlink_enable_rdma_validate()
1636 if (new_state && !test_bit(ICE_FLAG_RDMA_ENA, pf->flags)) in ice_devlink_enable_rdma_validate()
1637 return -EOPNOTSUPP; in ice_devlink_enable_rdma_validate()
1692 * ice_allocate_pf - Allocate devlink and return PF structure pointer
1715 * ice_allocate_sf - Allocate devlink and return SF structure pointer
1731 return ERR_PTR(-ENOMEM); in ice_allocate_sf()
1743 * ice_devlink_register - Register devlink interface for this PF
1758 * ice_devlink_unregister - Unregister devlink resources for this PF.
1772 struct ice_hw *hw = &pf->hw; in ice_devlink_register_params()
1785 if (hw->func_caps.common_cap.tx_sched_topo_comp_mode_en) in ice_devlink_register_params()
1791 value.vu32 = pf->msix.max; in ice_devlink_register_params()
1795 value.vu32 = pf->msix.min; in ice_devlink_register_params()
1800 value.vbool = test_bit(ICE_FLAG_RDMA_ENA, pf->flags); in ice_devlink_register_params()
1819 struct ice_hw *hw = &pf->hw; in ice_devlink_unregister_params()
1826 if (hw->func_caps.common_cap.tx_sched_topo_comp_mode_en) in ice_devlink_unregister_params()
1837 * ice_devlink_nvm_snapshot - Capture a snapshot of the NVM flash contents
1844 * the nvm-flash or shadow-ram region.
1850 * @returns zero on success, and updates the data pointer. Returns a non-zero
1859 struct ice_hw *hw = &pf->hw; in ice_devlink_nvm_snapshot()
1868 nvm_size = hw->flash.flash_size; in ice_devlink_nvm_snapshot()
1871 nvm_size = hw->flash.sr_words * 2u; in ice_devlink_nvm_snapshot()
1874 return -EOPNOTSUPP; in ice_devlink_nvm_snapshot()
1879 return -ENOMEM; in ice_devlink_nvm_snapshot()
1903 return -EIO; in ice_devlink_nvm_snapshot()
1907 left -= read_sz; in ice_devlink_nvm_snapshot()
1916 * ice_devlink_nvm_read - Read a portion of NVM flash contents
1927 * It reads from either the nvm-flash or shadow-ram region contents.
1929 * @returns zero on success, and updates the data pointer. Returns a non-zero
1940 struct ice_hw *hw = &pf->hw; in ice_devlink_nvm_read()
1947 nvm_size = hw->flash.flash_size; in ice_devlink_nvm_read()
1950 nvm_size = hw->flash.sr_words * 2u; in ice_devlink_nvm_read()
1953 return -EOPNOTSUPP; in ice_devlink_nvm_read()
1958 return -ERANGE; in ice_devlink_nvm_read()
1967 return -EIO; in ice_devlink_nvm_read()
1974 * ice_devlink_devcaps_snapshot - Capture snapshot of device capabilities
1981 * the device-caps devlink region. It captures a snapshot of the device
1984 * @returns zero on success, and updates the data pointer. Returns a non-zero
1994 struct ice_hw *hw = &pf->hw; in ice_devlink_devcaps_snapshot()
2000 return -ENOMEM; in ice_devlink_devcaps_snapshot()
2006 status, hw->adminq.sq_last_status); in ice_devlink_devcaps_snapshot()
2018 .name = "nvm-flash",
2025 .name = "shadow-ram",
2032 .name = "device-caps",
2038 * ice_devlink_init_regions - Initialize devlink regions
2050 nvm_size = pf->hw.flash.flash_size; in ice_devlink_init_regions()
2051 pf->nvm_region = devl_region_create(devlink, &ice_nvm_region_ops, 1, in ice_devlink_init_regions()
2053 if (IS_ERR(pf->nvm_region)) { in ice_devlink_init_regions()
2055 PTR_ERR(pf->nvm_region)); in ice_devlink_init_regions()
2056 pf->nvm_region = NULL; in ice_devlink_init_regions()
2059 sram_size = pf->hw.flash.sr_words * 2u; in ice_devlink_init_regions()
2060 pf->sram_region = devl_region_create(devlink, &ice_sram_region_ops, in ice_devlink_init_regions()
2062 if (IS_ERR(pf->sram_region)) { in ice_devlink_init_regions()
2063 dev_err(dev, "failed to create shadow-ram devlink region, err %ld\n", in ice_devlink_init_regions()
2064 PTR_ERR(pf->sram_region)); in ice_devlink_init_regions()
2065 pf->sram_region = NULL; in ice_devlink_init_regions()
2068 pf->devcaps_region = devl_region_create(devlink, in ice_devlink_init_regions()
2071 if (IS_ERR(pf->devcaps_region)) { in ice_devlink_init_regions()
2072 dev_err(dev, "failed to create device-caps devlink region, err %ld\n", in ice_devlink_init_regions()
2073 PTR_ERR(pf->devcaps_region)); in ice_devlink_init_regions()
2074 pf->devcaps_region = NULL; in ice_devlink_init_regions()
2079 * ice_devlink_destroy_regions - Destroy devlink regions
2086 if (pf->nvm_region) in ice_devlink_destroy_regions()
2087 devl_region_destroy(pf->nvm_region); in ice_devlink_destroy_regions()
2089 if (pf->sram_region) in ice_devlink_destroy_regions()
2090 devl_region_destroy(pf->sram_region); in ice_devlink_destroy_regions()
2092 if (pf->devcaps_region) in ice_devlink_destroy_regions()
2093 devl_region_destroy(pf->devcaps_region); in ice_devlink_destroy_regions()