162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci/* Copyright (C) 2017 Netronome Systems, Inc. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "../nfpcore/nfp_cpp.h"
562306a36Sopenharmony_ci#include "../nfpcore/nfp_nsp.h"
662306a36Sopenharmony_ci#include "../nfp_app.h"
762306a36Sopenharmony_ci#include "../nfp_main.h"
862306a36Sopenharmony_ci#include "../nfp_net.h"
962306a36Sopenharmony_ci#include "main.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic int nfp_nic_init(struct nfp_app *app)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	struct nfp_pf *pf = app->pf;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	if (pf->eth_tbl && pf->max_data_vnics != pf->eth_tbl->count) {
1662306a36Sopenharmony_ci		nfp_err(pf->cpp, "ETH entries don't match vNICs (%d vs %d)\n",
1762306a36Sopenharmony_ci			pf->max_data_vnics, pf->eth_tbl->count);
1862306a36Sopenharmony_ci		return -EINVAL;
1962306a36Sopenharmony_ci	}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	return 0;
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic int nfp_nic_sriov_enable(struct nfp_app *app, int num_vfs)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return 0;
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic void nfp_nic_sriov_disable(struct nfp_app *app)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic int nfp_nic_vnic_init(struct nfp_app *app, struct nfp_net *nn)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	return nfp_nic_dcb_init(nn);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic void nfp_nic_vnic_clean(struct nfp_app *app, struct nfp_net *nn)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	nfp_nic_dcb_clean(nn);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic int nfp_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
4462306a36Sopenharmony_ci			      unsigned int id)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	struct nfp_app_nic_private *app_pri = nn->app_priv;
4762306a36Sopenharmony_ci	int err;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	err = nfp_app_nic_vnic_alloc(app, nn, id);
5062306a36Sopenharmony_ci	if (err)
5162306a36Sopenharmony_ci		return err;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	if (sizeof(*app_pri)) {
5462306a36Sopenharmony_ci		nn->app_priv = kzalloc(sizeof(*app_pri), GFP_KERNEL);
5562306a36Sopenharmony_ci		if (!nn->app_priv)
5662306a36Sopenharmony_ci			return -ENOMEM;
5762306a36Sopenharmony_ci	}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return 0;
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic void nfp_nic_vnic_free(struct nfp_app *app, struct nfp_net *nn)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	kfree(nn->app_priv);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciconst struct nfp_app_type app_nic = {
6862306a36Sopenharmony_ci	.id		= NFP_APP_CORE_NIC,
6962306a36Sopenharmony_ci	.name		= "nic",
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	.init		= nfp_nic_init,
7262306a36Sopenharmony_ci	.vnic_alloc	= nfp_nic_vnic_alloc,
7362306a36Sopenharmony_ci	.vnic_free	= nfp_nic_vnic_free,
7462306a36Sopenharmony_ci	.sriov_enable	= nfp_nic_sriov_enable,
7562306a36Sopenharmony_ci	.sriov_disable	= nfp_nic_sriov_disable,
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	.vnic_init      = nfp_nic_vnic_init,
7862306a36Sopenharmony_ci	.vnic_clean     = nfp_nic_vnic_clean,
7962306a36Sopenharmony_ci};
80