blob: 1c6f08782d4317953c29285209c738f5a0bd257f [file] [log] [blame]
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* @defgroup
* @{
*/
#include "sw.h"
#include "fal_bm.h"
#include "hppe_bm_reg.h"
#include "hppe_bm.h"
#include "hppe_portctrl_reg.h"
#include "hppe_portctrl.h"
#include "adpt.h"
#ifndef IN_BM_MINI
sw_error_t
adpt_hppe_port_bufgroup_map_get(a_uint32_t dev_id, fal_port_t port,
a_uint8_t *group)
{
sw_error_t rv = SW_OK;
union port_group_id_u port_group_id;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(group);
memset(&port_group_id, 0, sizeof(port_group_id));
rv = hppe_port_group_id_get(dev_id, port, &port_group_id);
if( rv != SW_OK )
return rv;
*group = port_group_id.bf.port_shared_group_id;
return SW_OK;
}
sw_error_t
adpt_hppe_bm_port_reserved_buffer_get(a_uint32_t dev_id, fal_port_t port,
a_uint16_t *prealloc_buff, a_uint16_t *react_buff)
{
sw_error_t rv = SW_OK;
union port_fc_cfg_u port_fc_cfg;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(prealloc_buff);
ADPT_NULL_POINT_CHECK(react_buff);
memset(&port_fc_cfg, 0, sizeof(port_fc_cfg));
rv = hppe_port_fc_cfg_get(dev_id, port, &port_fc_cfg);
if (rv)
return rv;
*prealloc_buff = port_fc_cfg.bf.port_pre_alloc;
*react_buff = port_fc_cfg.bf.port_react_limit;
return SW_OK;
}
sw_error_t
adpt_hppe_bm_bufgroup_buffer_get(a_uint32_t dev_id, a_uint8_t group,
a_uint16_t *buff_num)
{
sw_error_t rv = SW_OK;
union shared_group_cfg_u shared_group_cfg;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(buff_num);
memset(&shared_group_cfg, 0, sizeof(shared_group_cfg));
rv = hppe_shared_group_cfg_get(dev_id, group, &shared_group_cfg);
if( rv != SW_OK )
return rv;
*buff_num = shared_group_cfg.bf.shared_group_limit;
return SW_OK;
}
sw_error_t
adpt_hppe_bm_port_dynamic_thresh_get(a_uint32_t dev_id, fal_port_t port,
fal_bm_dynamic_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union port_fc_cfg_u port_fc_cfg;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
memset(&port_fc_cfg, 0, sizeof(port_fc_cfg));
rv = hppe_port_fc_cfg_get(dev_id, port, &port_fc_cfg);
if( rv != SW_OK )
return rv;
if (!port_fc_cfg.bf.port_shared_dynamic)
return SW_FAIL;
cfg->weight = port_fc_cfg.bf.port_shared_weight;
cfg->shared_ceiling = port_fc_cfg.bf.port_shared_ceiling_0 |
port_fc_cfg.bf.port_shared_ceiling_1 << 3;
cfg->resume_off = port_fc_cfg.bf.port_resume_offset;
cfg->resume_min_thresh = port_fc_cfg.bf.port_resume_floor_th;
return SW_OK;
}
sw_error_t
adpt_hppe_port_bm_ctrl_get(a_uint32_t dev_id, fal_port_t port, a_bool_t *enable)
{
sw_error_t rv = SW_OK;
union port_fc_mode_u port_fc_mode;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(enable);
memset(&port_fc_mode, 0, sizeof(port_fc_mode));
rv = hppe_port_fc_mode_get(dev_id, port, &port_fc_mode);
if( rv != SW_OK )
return rv;
*enable = port_fc_mode.bf.fc_en;
return SW_OK;
}
#endif
sw_error_t
adpt_hppe_bm_bufgroup_buffer_set(a_uint32_t dev_id, a_uint8_t group,
a_uint16_t buff_num)
{
sw_error_t rv = SW_OK;
union shared_group_cfg_u shared_group_cfg;
ADPT_DEV_ID_CHECK(dev_id);
memset(&shared_group_cfg, 0, sizeof(shared_group_cfg));
shared_group_cfg.bf.shared_group_limit = buff_num;
rv = hppe_shared_group_cfg_set(dev_id, group, &shared_group_cfg);
if( rv != SW_OK )
return rv;
return SW_OK;
}
sw_error_t
adpt_hppe_port_bufgroup_map_set(a_uint32_t dev_id, fal_port_t port,
a_uint8_t group)
{
sw_error_t rv = SW_OK;
union port_group_id_u port_group_id;
ADPT_DEV_ID_CHECK(dev_id);
memset(&port_group_id, 0, sizeof(port_group_id));
port_group_id.bf.port_shared_group_id = group;
rv = hppe_port_group_id_set(dev_id, port, &port_group_id);
if( rv != SW_OK )
return rv;
return SW_OK;
}
#ifndef IN_BM_MINI
sw_error_t
adpt_hppe_bm_port_static_thresh_get(a_uint32_t dev_id, fal_port_t port,
fal_bm_static_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union port_fc_cfg_u port_fc_cfg;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
memset(&port_fc_cfg, 0, sizeof(port_fc_cfg));
rv = hppe_port_fc_cfg_get(dev_id, port, &port_fc_cfg);
if( rv != SW_OK )
return rv;
if (port_fc_cfg.bf.port_shared_dynamic)
return SW_FAIL;
cfg->resume_off = port_fc_cfg.bf.port_resume_offset;
cfg->max_thresh = port_fc_cfg.bf.port_shared_ceiling_0 |
port_fc_cfg.bf.port_shared_ceiling_1 << 3;
return SW_OK;
}
#endif
sw_error_t
adpt_hppe_bm_port_reserved_buffer_set(a_uint32_t dev_id, fal_port_t port,
a_uint16_t prealloc_buff, a_uint16_t react_buff)
{
sw_error_t rv = SW_OK;
union port_fc_cfg_u port_fc_cfg;
ADPT_DEV_ID_CHECK(dev_id);
memset(&port_fc_cfg, 0, sizeof(port_fc_cfg));
rv = hppe_port_fc_cfg_get(dev_id, port, &port_fc_cfg);
if (rv)
return rv;
port_fc_cfg.bf.port_pre_alloc = prealloc_buff;
port_fc_cfg.bf.port_react_limit = react_buff;
return hppe_port_fc_cfg_set(dev_id, port, &port_fc_cfg);
}
sw_error_t
adpt_hppe_bm_port_static_thresh_set(a_uint32_t dev_id, fal_port_t port,
fal_bm_static_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union port_fc_cfg_u port_fc_cfg;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
memset(&port_fc_cfg, 0, sizeof(port_fc_cfg));
rv = hppe_port_fc_cfg_get(dev_id, port, &port_fc_cfg);
if( rv != SW_OK )
return rv;
port_fc_cfg.bf.port_resume_offset = cfg->resume_off;
port_fc_cfg.bf.port_shared_ceiling_0 = cfg->max_thresh;
port_fc_cfg.bf.port_shared_ceiling_1 = cfg->max_thresh >> 3;
port_fc_cfg.bf.port_shared_dynamic = 0;
return hppe_port_fc_cfg_set(dev_id, port, &port_fc_cfg);;
}
sw_error_t
adpt_hppe_bm_port_dynamic_thresh_set(a_uint32_t dev_id, fal_port_t port,
fal_bm_dynamic_cfg_t *cfg)
{
sw_error_t rv = SW_OK;
union port_fc_cfg_u port_fc_cfg;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(cfg);
memset(&port_fc_cfg, 0, sizeof(port_fc_cfg));
rv = hppe_port_fc_cfg_get(dev_id, port, &port_fc_cfg);
if( rv != SW_OK )
return rv;
port_fc_cfg.bf.port_shared_weight = cfg->weight;
port_fc_cfg.bf.port_shared_ceiling_0 = cfg->shared_ceiling;
port_fc_cfg.bf.port_shared_ceiling_1 = cfg->shared_ceiling >> 3;
port_fc_cfg.bf.port_resume_offset = cfg->resume_off;
port_fc_cfg.bf.port_resume_floor_th = cfg->resume_min_thresh;
port_fc_cfg.bf.port_shared_dynamic = 1;
return hppe_port_fc_cfg_set(dev_id, port, &port_fc_cfg);;
}
sw_error_t
adpt_hppe_port_bm_ctrl_set(a_uint32_t dev_id, fal_port_t port, a_bool_t enable)
{
union port_fc_mode_u port_fc_mode;
ADPT_DEV_ID_CHECK(dev_id);
memset(&port_fc_mode, 0, sizeof(port_fc_mode));
port_fc_mode.bf.fc_en = enable;
return hppe_port_fc_mode_set(dev_id, port, &port_fc_mode);
}
sw_error_t
adpt_hppe_port_tdm_ctrl_set(a_uint32_t dev_id, fal_port_tdm_ctrl_t *ctrl)
{
union tdm_ctrl_u tdm_ctrl;
ADPT_DEV_ID_CHECK(dev_id);
memset(&tdm_ctrl, 0, sizeof(tdm_ctrl));
tdm_ctrl.bf.tdm_en = ctrl->enable;
tdm_ctrl.bf.tdm_offset = ctrl->offset;
tdm_ctrl.bf.tdm_depth = ctrl->depth;
return hppe_tdm_ctrl_set(dev_id, &tdm_ctrl);
}
sw_error_t
adpt_hppe_port_tdm_tick_cfg_set(a_uint32_t dev_id, a_uint32_t tick_index,
fal_port_tdm_tick_cfg_t *cfg)
{
union tdm_cfg_u tdm_cfg;
ADPT_DEV_ID_CHECK(dev_id);
memset(&tdm_cfg, 0, sizeof(tdm_cfg));
tdm_cfg.bf.valid = cfg->valid;
tdm_cfg.bf.dir = cfg->direction;
tdm_cfg.bf.port_num = cfg->port;
return hppe_tdm_cfg_set(dev_id, tick_index, &tdm_cfg);
}
#ifndef IN_BM_MINI
sw_error_t
adpt_hppe_bm_port_counter_get(a_uint32_t dev_id, fal_port_t port,
fal_bm_port_counter_t *counter)
{
sw_error_t rv = SW_OK;
union port_cnt_u port_cnt;
union port_reacted_cnt_u reacted_cnt;
union drop_stat_u drop_stat;
a_uint32_t index = FAL_PORT_ID_VALUE(port);
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(counter);
memset(&port_cnt, 0, sizeof(port_cnt));
memset(&reacted_cnt, 0, sizeof(reacted_cnt));
rv = hppe_port_cnt_get(dev_id, index, &port_cnt);
if( rv != SW_OK )
return rv;
counter->used_counter = port_cnt.bf.port_cnt;
rv = hppe_port_reacted_cnt_get(dev_id, index, &reacted_cnt);
if( rv != SW_OK )
return rv;
counter->react_counter = reacted_cnt.bf.port_reacted_cnt;
rv = hppe_drop_stat_get(dev_id, index, &drop_stat);
if( rv != SW_OK )
return rv;
counter->drop_byte_counter = drop_stat.bf.bytes_0 | ((a_uint64_t)drop_stat.bf.bytes_1 << 32);
counter->drop_packet_counter = drop_stat.bf.pkts;
rv = hppe_drop_stat_get(dev_id, index + 15, &drop_stat);
if( rv != SW_OK )
return rv;
counter->fc_drop_byte_counter = drop_stat.bf.bytes_0 | ((a_uint64_t)drop_stat.bf.bytes_1 << 32);
counter->fc_drop_packet_counter = drop_stat.bf.pkts;
return SW_OK;
}
#endif
void adpt_hppe_bm_func_bitmap_init(a_uint32_t dev_id)
{
adpt_api_t *p_adpt_api = NULL;
p_adpt_api = adpt_api_ptr_get(dev_id);
if(p_adpt_api == NULL)
return;
p_adpt_api->adpt_bm_func_bitmap = ((1 << FUNC_PORT_BUFGROUP_MAP_GET) |
(1 << FUNC_BM_PORT_RESERVED_BUFFER_GET) |
(1 << FUNC_BM_BUFGROUP_BUFFER_GET) |
(1 << FUNC_BM_PORT_DYNAMIC_THRESH_GET) |
(1 << FUNC_PORT_BM_CTRL_GET) |
(1 << FUNC_BM_BUFGROUP_BUFFER_SET) |
(1 << FUNC_PORT_BUFGROUP_MAP_SET) |
(1 << FUNC_BM_PORT_STATIC_THRESH_GET) |
(1 << FUNC_BM_PORT_RESERVED_BUFFER_SET) |
(1 << FUNC_BM_PORT_STATIC_THRESH_SET) |
(1 << FUNC_BM_PORT_DYNAMIC_THRESH_SET) |
(1 << FUNC_PORT_BM_CTRL_SET) |
(1 << FUNC_PORT_TDM_CTRL_SET) |
(1 << FUNC_PORT_TDM_TICK_CFG_SET) |
(1 << FUNC_BM_PORT_COUNTER_GET));
return;
}
static void adpt_hppe_bm_func_unregister(a_uint32_t dev_id, adpt_api_t *p_adpt_api)
{
if(p_adpt_api == NULL)
return;
p_adpt_api->adpt_port_bufgroup_map_get = NULL;
p_adpt_api->adpt_bm_port_reserved_buffer_get = NULL;
p_adpt_api->adpt_bm_bufgroup_buffer_get = NULL;
p_adpt_api->adpt_bm_port_dynamic_thresh_get = NULL;
p_adpt_api->adpt_port_bm_ctrl_get = NULL;
p_adpt_api->adpt_bm_bufgroup_buffer_set = NULL;
p_adpt_api->adpt_port_bufgroup_map_set = NULL;
p_adpt_api->adpt_bm_port_static_thresh_get = NULL;
p_adpt_api->adpt_bm_port_reserved_buffer_set = NULL;
p_adpt_api->adpt_bm_port_static_thresh_set = NULL;
p_adpt_api->adpt_bm_port_dynamic_thresh_set = NULL;
p_adpt_api->adpt_port_bm_ctrl_set = NULL;
p_adpt_api->adpt_port_tdm_ctrl_set = NULL;
p_adpt_api->adpt_port_tdm_tick_cfg_set = NULL;
p_adpt_api->adpt_bm_port_counter_get = NULL;
return;
}
sw_error_t adpt_hppe_bm_init(a_uint32_t dev_id)
{
adpt_api_t *p_adpt_api = NULL;
p_adpt_api = adpt_api_ptr_get(dev_id);
if(p_adpt_api == NULL)
return SW_FAIL;
adpt_hppe_bm_func_unregister(dev_id, p_adpt_api);
#ifndef IN_BM_MINI
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_PORT_BUFGROUP_MAP_GET))
p_adpt_api->adpt_port_bufgroup_map_get = adpt_hppe_port_bufgroup_map_get;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_RESERVED_BUFFER_GET))
p_adpt_api->adpt_bm_port_reserved_buffer_get = adpt_hppe_bm_port_reserved_buffer_get;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_BUFGROUP_BUFFER_GET))
p_adpt_api->adpt_bm_bufgroup_buffer_get = adpt_hppe_bm_bufgroup_buffer_get;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_DYNAMIC_THRESH_GET))
p_adpt_api->adpt_bm_port_dynamic_thresh_get = adpt_hppe_bm_port_dynamic_thresh_get;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_PORT_BM_CTRL_GET))
p_adpt_api->adpt_port_bm_ctrl_get = adpt_hppe_port_bm_ctrl_get;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_STATIC_THRESH_GET))
p_adpt_api->adpt_bm_port_static_thresh_get = adpt_hppe_bm_port_static_thresh_get;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_COUNTER_GET))
p_adpt_api->adpt_bm_port_counter_get = adpt_hppe_bm_port_counter_get;
#endif
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_BUFGROUP_BUFFER_SET))
p_adpt_api->adpt_bm_bufgroup_buffer_set = adpt_hppe_bm_bufgroup_buffer_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_PORT_BUFGROUP_MAP_SET))
p_adpt_api->adpt_port_bufgroup_map_set = adpt_hppe_port_bufgroup_map_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_RESERVED_BUFFER_SET))
p_adpt_api->adpt_bm_port_reserved_buffer_set = adpt_hppe_bm_port_reserved_buffer_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_STATIC_THRESH_SET))
p_adpt_api->adpt_bm_port_static_thresh_set = adpt_hppe_bm_port_static_thresh_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_BM_PORT_DYNAMIC_THRESH_SET))
p_adpt_api->adpt_bm_port_dynamic_thresh_set = adpt_hppe_bm_port_dynamic_thresh_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_PORT_BM_CTRL_SET))
p_adpt_api->adpt_port_bm_ctrl_set = adpt_hppe_port_bm_ctrl_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_PORT_TDM_CTRL_SET))
p_adpt_api->adpt_port_tdm_ctrl_set = adpt_hppe_port_tdm_ctrl_set;
if (p_adpt_api->adpt_bm_func_bitmap & (1 << FUNC_PORT_TDM_TICK_CFG_SET))
p_adpt_api->adpt_port_tdm_tick_cfg_set = adpt_hppe_port_tdm_tick_cfg_set;
return SW_OK;
}
/**
* @}
*/