brintos

brintos / linux-shallow public Read only

0
0
Text · 4.5 KiB · 53f14aa Raw
193 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Marvell RVU PF/VF Netdev Devlink3 *4 * Copyright (C) 2021 Marvell.5 */6 7#include "otx2_common.h"8 9/* Devlink Params APIs */10static int otx2_dl_mcam_count_validate(struct devlink *devlink, u32 id,11				       union devlink_param_value val,12				       struct netlink_ext_ack *extack)13{14	struct otx2_devlink *otx2_dl = devlink_priv(devlink);15	struct otx2_nic *pfvf = otx2_dl->pfvf;16	struct otx2_flow_config *flow_cfg;17 18	if (!pfvf->flow_cfg) {19		NL_SET_ERR_MSG_MOD(extack,20				   "pfvf->flow_cfg not initialized");21		return -EINVAL;22	}23 24	flow_cfg = pfvf->flow_cfg;25	if (flow_cfg && flow_cfg->nr_flows) {26		NL_SET_ERR_MSG_MOD(extack,27				   "Cannot modify count when there are active rules");28		return -EINVAL;29	}30 31	return 0;32}33 34static int otx2_dl_mcam_count_set(struct devlink *devlink, u32 id,35				  struct devlink_param_gset_ctx *ctx,36				  struct netlink_ext_ack *extack)37{38	struct otx2_devlink *otx2_dl = devlink_priv(devlink);39	struct otx2_nic *pfvf = otx2_dl->pfvf;40 41	if (!pfvf->flow_cfg)42		return 0;43 44	otx2_alloc_mcam_entries(pfvf, ctx->val.vu16);45 46	return 0;47}48 49static int otx2_dl_mcam_count_get(struct devlink *devlink, u32 id,50				  struct devlink_param_gset_ctx *ctx)51{52	struct otx2_devlink *otx2_dl = devlink_priv(devlink);53	struct otx2_nic *pfvf = otx2_dl->pfvf;54	struct otx2_flow_config *flow_cfg;55 56	if (!pfvf->flow_cfg) {57		ctx->val.vu16 = 0;58		return 0;59	}60 61	flow_cfg = pfvf->flow_cfg;62	ctx->val.vu16 = flow_cfg->max_flows;63 64	return 0;65}66 67static int otx2_dl_ucast_flt_cnt_set(struct devlink *devlink, u32 id,68				     struct devlink_param_gset_ctx *ctx,69				     struct netlink_ext_ack *extack)70{71	struct otx2_devlink *otx2_dl = devlink_priv(devlink);72	struct otx2_nic *pfvf = otx2_dl->pfvf;73	int err;74 75	pfvf->flow_cfg->ucast_flt_cnt = ctx->val.vu8;76 77	otx2_mcam_flow_del(pfvf);78	err = otx2_mcam_entry_init(pfvf);79	if (err)80		return err;81 82	return 0;83}84 85static int otx2_dl_ucast_flt_cnt_get(struct devlink *devlink, u32 id,86				     struct devlink_param_gset_ctx *ctx)87{88	struct otx2_devlink *otx2_dl = devlink_priv(devlink);89	struct otx2_nic *pfvf = otx2_dl->pfvf;90 91	ctx->val.vu8 = pfvf->flow_cfg ? pfvf->flow_cfg->ucast_flt_cnt : 0;92 93	return 0;94}95 96static int otx2_dl_ucast_flt_cnt_validate(struct devlink *devlink, u32 id,97					  union devlink_param_value val,98					  struct netlink_ext_ack *extack)99{100	struct otx2_devlink *otx2_dl = devlink_priv(devlink);101	struct otx2_nic *pfvf = otx2_dl->pfvf;102 103	/* Check for UNICAST filter support*/104	if (!(pfvf->flags & OTX2_FLAG_UCAST_FLTR_SUPPORT)) {105		NL_SET_ERR_MSG_MOD(extack,106				   "Unicast filter not enabled");107		return -EINVAL;108	}109 110	if (!pfvf->flow_cfg) {111		NL_SET_ERR_MSG_MOD(extack,112				   "pfvf->flow_cfg not initialized");113		return -EINVAL;114	}115 116	if (pfvf->flow_cfg->nr_flows) {117		NL_SET_ERR_MSG_MOD(extack,118				   "Cannot modify count when there are active rules");119		return -EINVAL;120	}121 122	return 0;123}124 125enum otx2_dl_param_id {126	OTX2_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,127	OTX2_DEVLINK_PARAM_ID_MCAM_COUNT,128	OTX2_DEVLINK_PARAM_ID_UCAST_FLT_CNT,129};130 131static const struct devlink_param otx2_dl_params[] = {132	DEVLINK_PARAM_DRIVER(OTX2_DEVLINK_PARAM_ID_MCAM_COUNT,133			     "mcam_count", DEVLINK_PARAM_TYPE_U16,134			     BIT(DEVLINK_PARAM_CMODE_RUNTIME),135			     otx2_dl_mcam_count_get, otx2_dl_mcam_count_set,136			     otx2_dl_mcam_count_validate),137	DEVLINK_PARAM_DRIVER(OTX2_DEVLINK_PARAM_ID_UCAST_FLT_CNT,138			     "unicast_filter_count", DEVLINK_PARAM_TYPE_U8,139			     BIT(DEVLINK_PARAM_CMODE_RUNTIME),140			     otx2_dl_ucast_flt_cnt_get, otx2_dl_ucast_flt_cnt_set,141			     otx2_dl_ucast_flt_cnt_validate),142};143 144static const struct devlink_ops otx2_devlink_ops = {145};146 147int otx2_register_dl(struct otx2_nic *pfvf)148{149	struct otx2_devlink *otx2_dl;150	struct devlink *dl;151	int err;152 153	dl = devlink_alloc(&otx2_devlink_ops,154			   sizeof(struct otx2_devlink), pfvf->dev);155	if (!dl) {156		dev_warn(pfvf->dev, "devlink_alloc failed\n");157		return -ENOMEM;158	}159 160	otx2_dl = devlink_priv(dl);161	otx2_dl->dl = dl;162	otx2_dl->pfvf = pfvf;163	pfvf->dl = otx2_dl;164 165	err = devlink_params_register(dl, otx2_dl_params,166				      ARRAY_SIZE(otx2_dl_params));167	if (err) {168		dev_err(pfvf->dev,169			"devlink params register failed with error %d", err);170		goto err_dl;171	}172 173	devlink_register(dl);174	return 0;175 176err_dl:177	devlink_free(dl);178	return err;179}180EXPORT_SYMBOL(otx2_register_dl);181 182void otx2_unregister_dl(struct otx2_nic *pfvf)183{184	struct otx2_devlink *otx2_dl = pfvf->dl;185	struct devlink *dl = otx2_dl->dl;186 187	devlink_unregister(dl);188	devlink_params_unregister(dl, otx2_dl_params,189				  ARRAY_SIZE(otx2_dl_params));190	devlink_free(dl);191}192EXPORT_SYMBOL(otx2_unregister_dl);193