/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.


********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
*******************************************************************************/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/capability.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>

#include "gbe/mvNeta.h"
#include "bm/mvBm.h"

#include "net_dev/mv_netdev.h"

typedef struct {
	int             pool_pkt_size[MV_BM_POOLS];
	MV_BM_CONFIG	port_config[CONFIG_MV_ETH_PORTS_NUM];
} MV_ETH_BM_CONFIG;

static MV_ETH_BM_CONFIG mv_eth_bm_config;

int mv_eth_bm_config_pkt_size_get(int pool)
{
	if (mvNetaMaxCheck(pool, MV_BM_POOLS))
		return -EINVAL;

	return mv_eth_bm_config.pool_pkt_size[pool];
}

int mv_eth_bm_config_pkt_size_set(int pool, int pkt_size)
{
	if (mvNetaMaxCheck(pool, MV_BM_POOLS))
		return -EINVAL;

	mv_eth_bm_config.pool_pkt_size[pool] = pkt_size;
	return 0;
}

int mv_eth_bm_config_long_pool_get(int port)
{
	if (mvNetaPortCheck(port))
		return -EINVAL;

	return mv_eth_bm_config.port_config[port].longPool;
}

int mv_eth_bm_config_long_buf_num_get(int port)
{
	if (mvNetaPortCheck(port))
		return -EINVAL;

	return mv_eth_bm_config.port_config[port].longBufNum;
}

int mv_eth_bm_config_short_pool_get(int port)
{
	if (mvNetaPortCheck(port))
		return -EINVAL;

	return mv_eth_bm_config.port_config[port].shortPool;
}

int mv_eth_bm_config_short_buf_num_get(int port)
{
	if (mvNetaPortCheck(port))
		return -EINVAL;

	return mv_eth_bm_config.port_config[port].shortBufNum;
}

int mv_eth_bm_config_buf_num_set(int port, int longBufNum, int shortBufNum)
{
	if (mvNetaPortCheck(port))
		return -EINVAL;

	mv_eth_bm_config.port_config[port].shortBufNum = shortBufNum;
	mv_eth_bm_config.port_config[port].longBufNum = longBufNum;
	return 0;
}

/* Once time call: init configuration structure accordingly with compile time parameters */
MV_STATUS mv_eth_bm_config_get(void)
{
	MV_BM_CONFIG *bmConfig;
	int           port;

	mv_eth_bm_config.pool_pkt_size[0] = CONFIG_MV_ETH_BM_0_PKT_SIZE;
	mv_eth_bm_config.pool_pkt_size[1] = CONFIG_MV_ETH_BM_1_PKT_SIZE;
	mv_eth_bm_config.pool_pkt_size[2] = CONFIG_MV_ETH_BM_2_PKT_SIZE;
	mv_eth_bm_config.pool_pkt_size[3] = CONFIG_MV_ETH_BM_3_PKT_SIZE;

#ifdef CONFIG_MV_ETH_BM_PORT_0
	port = 0;
	bmConfig = &mv_eth_bm_config.port_config[port];
	memset(bmConfig, 0, sizeof(MV_BM_CONFIG));
	bmConfig->valid = 1;
	bmConfig->longPool = CONFIG_MV_ETH_BM_PORT_0_LONG_POOL;
	bmConfig->shortPool = CONFIG_MV_ETH_BM_PORT_0_SHORT_POOL;
	bmConfig->longBufNum = CONFIG_MV_ETH_BM_PORT_0_LONG_BUF_NUM;

#if (CONFIG_MV_ETH_BM_PORT_0_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_0_LONG_POOL)
	bmConfig->shortBufNum = CONFIG_MV_ETH_BM_PORT_0_SHORT_BUF_NUM;
#endif /* CONFIG_MV_ETH_BM_PORT_0_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_0_LONG_POOL */
#endif /* CONFIG_MV_ETH_BM_PORT_0 */

#ifdef CONFIG_MV_ETH_BM_PORT_1
	port = 1;
	bmConfig = &mv_eth_bm_config.port_config[port];
	memset(bmConfig, 0, sizeof(MV_BM_CONFIG));
	bmConfig->valid = 1;
	bmConfig->longPool = CONFIG_MV_ETH_BM_PORT_1_LONG_POOL;
	bmConfig->shortPool = CONFIG_MV_ETH_BM_PORT_1_SHORT_POOL;
	bmConfig->longBufNum = CONFIG_MV_ETH_BM_PORT_1_LONG_BUF_NUM;

#if (CONFIG_MV_ETH_BM_PORT_1_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_1_LONG_POOL)
	bmConfig->shortBufNum = CONFIG_MV_ETH_BM_PORT_1_SHORT_BUF_NUM;
#endif /* CONFIG_MV_ETH_BM_PORT_1_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_1_LONG_POOL */
#endif /* CONFIG_MV_ETH_BM_PORT_1 */

#ifdef CONFIG_MV_ETH_BM_PORT_2
	port = 2;
	bmConfig = &mv_eth_bm_config.port_config[port];
	memset(bmConfig, 0, sizeof(MV_BM_CONFIG));
	bmConfig->valid = 1;
	bmConfig->longPool = CONFIG_MV_ETH_BM_PORT_2_LONG_POOL;
	bmConfig->shortPool = CONFIG_MV_ETH_BM_PORT_2_SHORT_POOL;
	bmConfig->longBufNum = CONFIG_MV_ETH_BM_PORT_2_LONG_BUF_NUM;

#if (CONFIG_MV_ETH_BM_PORT_2_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_2_LONG_POOL)
	bmConfig->shortBufNum = CONFIG_MV_ETH_BM_PORT_2_SHORT_BUF_NUM;
#endif /* CONFIG_MV_ETH_BM_PORT_2_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_2_LONG_POOL */
#endif /* CONFIG_MV_ETH_BM_PORT_2 */

	#ifdef CONFIG_MV_ETH_BM_PORT_3
	port = 3;
	bmConfig = &mv_eth_bm_config.port_config[port];
	memset(bmConfig, 0, sizeof(MV_BM_CONFIG));
	bmConfig->valid = 1;
	bmConfig->longPool = CONFIG_MV_ETH_BM_PORT_3_LONG_POOL;
	bmConfig->shortPool = CONFIG_MV_ETH_BM_PORT_3_SHORT_POOL;
	bmConfig->longBufNum = CONFIG_MV_ETH_BM_PORT_3_LONG_BUF_NUM;

#if (CONFIG_MV_ETH_BM_PORT_3_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_3_LONG_POOL)
	bmConfig->shortBufNum = CONFIG_MV_ETH_BM_PORT_3_SHORT_BUF_NUM;
#endif /* CONFIG_MV_ETH_BM_PORT_3_SHORT_POOL != CONFIG_MV_ETH_BM_PORT_3_LONG_POOL */
#endif /* CONFIG_MV_ETH_BM_PORT_3 */

	return MV_OK;
}

void mv_eth_bm_config_print(void)
{
	int           i;
	MV_BM_CONFIG *bmConfig;

	mvOsPrintf("BM compile time configuration\n");
	for (i = 0; i < MV_BM_POOLS; i++)
		mvOsPrintf("pool %d: pkt_size = %d bytes\n", i, mv_eth_bm_config.pool_pkt_size[i]);

	mvOsPrintf("\n");
	mvOsPrintf("port:  longPool  shortPool  longBufNum  shortBufNum\n");
	for (i = 0; i < CONFIG_MV_ETH_PORTS_NUM; i++) {
		bmConfig = &mv_eth_bm_config.port_config[i];
		if (bmConfig->valid)
			mvOsPrintf("  %2d:   %4d       %4d        %4d         %4d\n",
				i, bmConfig->longPool, bmConfig->shortPool,
				bmConfig->longBufNum, bmConfig->shortBufNum);
	}
	mvOsPrintf("\n");
}

