blob: cf6191a1b9d0e9d5376127fc61e772f756c92e28 [file] [log] [blame]
/*
* Copyright (c) 2016-2017, 2021, 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 "hppe_policer_reg.h"
#include "hppe_policer.h"
#include "adpt.h"
#define NR_ADPT_HPPE_POLICER_METER_UNIT 2
#define NR_ADPT_HPPE_POLICER_METER_TOKEN_UNIT 8
#define ADPT_HPPE_POLICER_METER_UNIT_BYTE 0
#define ADPT_HPPE_POLICER_METER_UNIT_FRAME 1
#define ADPT_HPPE_FREQUENCY 300 /*MHZ*/
#define ADPT_HPPE_POLICER_BURST_SIZE_UNIT 65536
#define ADPT_HPPE_POLICER_REFRESH_BITS 18
#define ADPT_HPPE_POLICER_BUCKET_SIZE_BITS 16
#define ADPT_HPPE_POLICER_REFRESH_MAX ((1 << ADPT_HPPE_POLICER_REFRESH_BITS) - 1)
#define ADPT_HPPE_POLICER_BUCKET_SIZE_MAX ((1 << ADPT_HPPE_POLICER_BUCKET_SIZE_BITS) - 1)
#define BYTE_POLICER_MAX_RATE 10000000
#define BYTE_POLICER_MIN_RATE 64
#define FRAME_POLICER_MAX_RATE 14881000
#define FRAME_POLICER_MIN_RATE 6
static a_uint32_t hppe_policer_token_unit[NR_ADPT_HPPE_POLICER_METER_UNIT]
[NR_ADPT_HPPE_POLICER_METER_TOKEN_UNIT] = {{2048 * 8,
512 * 8,128 * 8,32 * 8,8 * 8,2 * 8, 4, 1},
{2097152,524288,131072,32768,8192,2048,512,128}};
typedef struct
{
a_uint64_t rate_1bit;
a_uint64_t rate_max;
} adpt_hppe_policer_rate_t;
typedef struct
{
a_uint64_t burst_size_1bit;
a_uint64_t burst_size_max;
} adpt_hppe_policer_burst_size_t;
static adpt_hppe_policer_rate_t
hppe_policer_rate[NR_ADPT_HPPE_POLICER_METER_UNIT][NR_ADPT_HPPE_POLICER_METER_TOKEN_UNIT] =
{
/* byte based*/
{
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
},
/*frame based */
{
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
},
};
static adpt_hppe_policer_burst_size_t
hppe_policer_burst_size[NR_ADPT_HPPE_POLICER_METER_UNIT][NR_ADPT_HPPE_POLICER_METER_TOKEN_UNIT] =
{
{ {0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
},
{ {0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
{0,0},
},
};
#ifndef IN_POLICER_MINI
sw_error_t
adpt_hppe_acl_policer_counter_get(a_uint32_t dev_id, a_uint32_t index,
fal_policer_counter_t *counter)
{
union in_acl_meter_cnt_tbl_u in_acl_meter_cnt_tbl;
memset(&in_acl_meter_cnt_tbl, 0, sizeof(in_acl_meter_cnt_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(counter);
if (index < 0 || index > 511)
return SW_BAD_PARAM;
hppe_in_acl_meter_cnt_tbl_get(dev_id, index * 3, &in_acl_meter_cnt_tbl);
counter->green_packet_counter = in_acl_meter_cnt_tbl.bf.pkt_cnt;
counter->green_byte_counter = in_acl_meter_cnt_tbl.bf.byte_cnt_1;
counter->green_byte_counter = (counter->green_byte_counter << 32) | in_acl_meter_cnt_tbl.bf.byte_cnt_0;
hppe_in_acl_meter_cnt_tbl_get(dev_id, index * 3 + 1, &in_acl_meter_cnt_tbl);
counter->yellow_packet_counter = in_acl_meter_cnt_tbl.bf.pkt_cnt;
counter->yellow_byte_counter = in_acl_meter_cnt_tbl.bf.byte_cnt_1;
counter->yellow_byte_counter = (counter->yellow_byte_counter << 32) | in_acl_meter_cnt_tbl.bf.byte_cnt_0;
hppe_in_acl_meter_cnt_tbl_get(dev_id, index * 3 + 2, &in_acl_meter_cnt_tbl);
counter->red_packet_counter = in_acl_meter_cnt_tbl.bf.pkt_cnt;
counter->red_byte_counter = in_acl_meter_cnt_tbl.bf.byte_cnt_1;
counter->red_byte_counter = (counter->red_byte_counter << 32) | in_acl_meter_cnt_tbl.bf.byte_cnt_0;
return SW_OK;
}
sw_error_t
adpt_hppe_port_policer_counter_get(a_uint32_t dev_id, fal_port_t port_id,
fal_policer_counter_t *counter)
{
union in_port_meter_cnt_tbl_u in_port_meter_cnt_tbl;
memset(&in_port_meter_cnt_tbl, 0, sizeof(in_port_meter_cnt_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(counter);
if (port_id < 0 || port_id > 7)
return SW_BAD_PARAM;
hppe_in_port_meter_cnt_tbl_get(dev_id, port_id * 3, &in_port_meter_cnt_tbl);
counter->green_packet_counter = in_port_meter_cnt_tbl.bf.pkt_cnt;
counter->green_byte_counter = in_port_meter_cnt_tbl.bf.byte_cnt_1;
counter->green_byte_counter = (counter->green_byte_counter << 32) | in_port_meter_cnt_tbl.bf.byte_cnt_0;
hppe_in_port_meter_cnt_tbl_get(dev_id, port_id * 3 + 1, &in_port_meter_cnt_tbl);
counter->yellow_packet_counter = in_port_meter_cnt_tbl.bf.pkt_cnt;
counter->yellow_byte_counter = in_port_meter_cnt_tbl.bf.byte_cnt_1;
counter->yellow_byte_counter = (counter->yellow_byte_counter << 32) | in_port_meter_cnt_tbl.bf.byte_cnt_0;
hppe_in_port_meter_cnt_tbl_get(dev_id, port_id * 3 + 2, &in_port_meter_cnt_tbl);
counter->red_packet_counter = in_port_meter_cnt_tbl.bf.pkt_cnt;
counter->red_byte_counter = in_port_meter_cnt_tbl.bf.byte_cnt_1;
counter->red_byte_counter = (counter->red_byte_counter << 32) | in_port_meter_cnt_tbl.bf.byte_cnt_0;
return SW_OK;
}
sw_error_t
adpt_hppe_port_compensation_byte_get(a_uint32_t dev_id, fal_port_t port_id,
a_uint32_t *length)
{
sw_error_t rv = SW_OK;
union meter_cmpst_length_reg_u meter_cmpst_length_reg;
memset(&meter_cmpst_length_reg, 0, sizeof(meter_cmpst_length_reg));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(length);
if (port_id < 0 || port_id > 7)
return SW_BAD_PARAM;
rv = hppe_meter_cmpst_length_reg_get(dev_id, port_id, &meter_cmpst_length_reg);
if( rv != SW_OK )
return rv;
*length = meter_cmpst_length_reg.bf.cmpst_length;
return SW_OK;
}
static sw_error_t
__adpt_hppe_policer_rate_to_refresh(a_uint32_t rate,
a_uint32_t *refresh,
a_bool_t meter_unit,
a_uint32_t token_unit)
{
a_uint32_t temp_refresh;
a_uint64_t temp_rate;
if(hppe_policer_rate[meter_unit][token_unit].rate_1bit > 0)
{
temp_rate = ((a_uint64_t)rate) * 1000;
do_div(temp_rate, hppe_policer_rate[meter_unit][token_unit].rate_1bit);
temp_refresh = temp_rate;
}
else
{
return SW_BAD_PARAM;;
}
if (temp_refresh > ADPT_HPPE_POLICER_REFRESH_MAX)
{
temp_refresh = ADPT_HPPE_POLICER_REFRESH_MAX;
}
*refresh = temp_refresh;
return SW_OK;
}
static sw_error_t
__adpt_hppe_policer_burst_size_to_bucket_size(a_uint32_t burst_size,
a_uint32_t *bucket_size,
a_bool_t meter_unit,
a_uint32_t token_unit)
{
a_uint32_t temp_bucket_size;
a_uint64_t temp_burst_size;
if(hppe_policer_burst_size[meter_unit][token_unit].burst_size_1bit > 0)
{
temp_burst_size = ((a_uint64_t)burst_size) * 1000;
do_div(temp_burst_size, hppe_policer_burst_size[meter_unit][token_unit].burst_size_1bit);
temp_bucket_size = temp_burst_size;
}
else
{
return SW_BAD_PARAM;
}
if(temp_bucket_size > ADPT_HPPE_POLICER_BUCKET_SIZE_MAX)
{
temp_bucket_size = ADPT_HPPE_POLICER_BUCKET_SIZE_MAX;
}
*bucket_size = temp_bucket_size;
return SW_OK;
}
static sw_error_t
__adpt_hppe_policer_refresh_to_rate(a_uint32_t refresh,
a_uint32_t *rate,
a_bool_t meter_unit,
a_uint32_t token_unit)
{
a_uint32_t temp_rate;
a_uint64_t temp_refresh;
if(hppe_policer_rate[meter_unit][token_unit].rate_1bit > 0)
{
temp_refresh = ((a_uint64_t)refresh) * hppe_policer_rate[meter_unit][token_unit].rate_1bit;
do_div(temp_refresh, 1000);
temp_rate = temp_refresh;
}
else
{
return SW_BAD_PARAM;;
}
*rate = temp_rate;
return SW_OK;
}
static sw_error_t
__adpt_hppe_policer_bucket_size_to_burst_size(a_uint32_t bucket_size,
a_uint32_t *burst_size,
a_bool_t meter_unit,
a_uint32_t token_unit)
{
a_uint32_t temp_burst_size;
a_uint64_t temp_bucket_size;
if(hppe_policer_burst_size[meter_unit][token_unit].burst_size_1bit > 0)
{
temp_bucket_size = ((a_uint64_t)bucket_size) * hppe_policer_burst_size[meter_unit][token_unit].burst_size_1bit;
do_div(temp_bucket_size, 1000);
temp_burst_size = temp_bucket_size;
}
else
{
return SW_BAD_PARAM;
}
*burst_size = temp_burst_size;
return SW_OK;
}
#endif
static sw_error_t
__adpt_hppe_policer_max_rate(a_uint32_t time_slot)
{
a_uint32_t i = 0, j = 0;
a_uint32_t time_cycle = 0;
a_uint64_t temp = 0, temp1 = 0, temp2 = 0;
/* time_cycle is ns*/
time_cycle = ( time_slot * 8)/ ADPT_HPPE_FREQUENCY;
for (j = 0; j < 8; j++)
{
/*max rate is bps*/
temp1 = (a_uint64_t)(ADPT_HPPE_POLICER_REFRESH_MAX * 1000 * 8) * 1000;
temp2 = hppe_policer_token_unit[i][j] * time_cycle;
do_div(temp1, temp2);
hppe_policer_rate[i][j].rate_max= temp1;
temp = temp1;
do_div(temp, ADPT_HPPE_POLICER_REFRESH_MAX);
hppe_policer_rate[i][j].rate_1bit = temp;
// printk("hppe policer byte max_rate generating =%llu\n", hppe_policer_rate[i][j].rate_max);
// printk("hppe policer byte based step =%llu\n", hppe_policer_rate[i][j].rate_1bit);
}
i = i + 1;
for (j = 0; j < 8; j++)
{
/* max rate unit is 1/1000 pps*/
temp1 = (a_uint64_t)(ADPT_HPPE_POLICER_REFRESH_MAX * 1000) * 1000 * 1000;
temp2 = (a_uint64_t)hppe_policer_token_unit[i][j] * time_cycle;
do_div(temp1, temp2);
hppe_policer_rate[i][j].rate_max = temp1;
temp = temp1;
do_div(temp, ADPT_HPPE_POLICER_REFRESH_MAX);
hppe_policer_rate[i][j].rate_1bit = temp;
// printk("policer frame hppe_max_rate generating =%llu\n", hppe_policer_rate[i][j].rate_max);
// printk("policer frame step rate =%llu\n", hppe_policer_rate[i][j].rate_1bit);
}
return SW_OK;
}
static sw_error_t
__adpt_hppe_policer_max_burst_size(void)
{
a_uint32_t i = 0, j = 0;
a_uint64_t temp = 0, temp1 = 0;
for (j = 0; j < 8; j++)
{
/*max size unit is 1/1000 byte based*/
temp = ((a_uint64_t)(ADPT_HPPE_POLICER_BURST_SIZE_UNIT)) *
ADPT_HPPE_POLICER_BUCKET_SIZE_MAX;
do_div(temp, hppe_policer_token_unit[i][j]);
hppe_policer_burst_size[i][j].burst_size_max = (a_uint64_t)(temp * 1000);
temp1 = hppe_policer_burst_size[i][j].burst_size_max;
do_div(temp1, ADPT_HPPE_POLICER_BUCKET_SIZE_MAX);
hppe_policer_burst_size[i][j].burst_size_1bit = temp1;
/*
printk("policer byte hppe_max_burst_size generating =%llu\n",
hppe_policer_burst_size[i][j].burst_size_max);
printk("policer byte hppe_max_burst_size step =%llu\n",
hppe_policer_burst_size[i][j].burst_size_1bit);
*/
}
i = i + 1;
for (j = 0; j < 8; j++)
{
/* max size unit is 1/1000 frame based */
temp = ((a_uint64_t)(ADPT_HPPE_POLICER_BURST_SIZE_UNIT)) *
ADPT_HPPE_POLICER_BUCKET_SIZE_MAX;
do_div(temp, hppe_policer_token_unit[i][j]);
hppe_policer_burst_size[i][j].burst_size_max = (a_uint64_t)(temp * 1000);
temp1 = hppe_policer_burst_size[i][j].burst_size_max;
do_div(temp1, ADPT_HPPE_POLICER_BUCKET_SIZE_MAX);
hppe_policer_burst_size[i][j].burst_size_1bit = temp1;
/*
printk("policer frame hppe_max_burst_size generating =%llu\n",
hppe_policer_burst_size[i][j].burst_size_max);
printk("policer frame hppe_max_burst_size step =%llu\n",
hppe_policer_burst_size[i][j].burst_size_1bit);
*/
}
return SW_OK;
}
#ifndef IN_POLICER_MINI
static sw_error_t
__adpt_hppe_policer_two_bucket_parameter_select(a_uint64_t c_rate,
a_uint64_t c_burst_size,
a_uint64_t e_rate,
a_uint64_t e_burst_size,
a_uint32_t meter_unit,
a_uint32_t *token_unit)
{
a_uint32_t temp_token_unit;
a_uint32_t match = A_FALSE;
a_uint64_t temp_rate = 0, temp_burst_size = 0;
if(c_rate > e_rate)
temp_rate = c_rate;
else
temp_rate = e_rate;
if(c_burst_size > e_burst_size)
temp_burst_size = c_burst_size;
else
temp_burst_size = e_burst_size;
for (temp_token_unit = 0; temp_token_unit < 8; temp_token_unit++)
{
if (temp_rate > hppe_policer_rate[meter_unit][temp_token_unit].rate_max)
{
continue;
}
else if(temp_burst_size <= hppe_policer_burst_size[meter_unit][temp_token_unit].burst_size_max)
{
*token_unit = temp_token_unit;
match = A_TRUE;
break;
}
}
if (match == A_FALSE)
{
printk("Not match C and E token bucket parameter rate configuration \n");
return SW_BAD_PARAM;
}
return SW_OK;
}
#if 0
static sw_error_t
__adpt_hppe_policer_one_bucket_parameter_select(a_uint64_t c_rate,
a_uint64_t c_burst_size,
a_uint32_t meter_unit,
a_uint32_t *token_unit)
{
a_uint32_t temp_token_unit;
a_uint32_t match = A_FALSE;
for (temp_token_unit = 0; temp_token_unit < 8; temp_token_unit++)
{
if (c_rate > hppe_policer_rate[meter_unit][temp_token_unit].rate_max)
{
continue;
}
else if (c_burst_size <= hppe_policer_burst_size[meter_unit][temp_token_unit].burst_size_max)
{
*token_unit = temp_token_unit;
match = A_TRUE;
break;
}
}
if (match == A_FALSE)
{
printk("Not match policer C token bucket parameter rate configuration \n");
return SW_BAD_PARAM;
}
return SW_OK;
}
#endif
sw_error_t
adpt_hppe_port_policer_entry_get(a_uint32_t dev_id, fal_port_t port_id,
fal_policer_config_t *policer, fal_policer_action_t *action)
{
union in_port_meter_cfg_tbl_u in_port_meter_cfg_tbl;
a_uint32_t hppe_cir =0, hppe_cbs = 0, hppe_eir = 0,hppe_ebs = 0;
memset(&in_port_meter_cfg_tbl, 0, sizeof(in_port_meter_cfg_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(policer);
ADPT_NULL_POINT_CHECK(action);
if (port_id < 0 || port_id > 7)
return SW_BAD_PARAM;
hppe_in_port_meter_cfg_tbl_get(dev_id, port_id, &in_port_meter_cfg_tbl);
hppe_cir = (in_port_meter_cfg_tbl.bf.cir_1 << 3) | in_port_meter_cfg_tbl.bf.cir_0;
hppe_cbs = in_port_meter_cfg_tbl.bf.cbs;
hppe_eir = (in_port_meter_cfg_tbl.bf.eir_1 << 1) | in_port_meter_cfg_tbl.bf.eir_0;
hppe_ebs = in_port_meter_cfg_tbl.bf.ebs;
__adpt_hppe_policer_refresh_to_rate(hppe_cir,
&policer->cir,
in_port_meter_cfg_tbl.bf.meter_unit,
in_port_meter_cfg_tbl.bf.token_unit);
__adpt_hppe_policer_refresh_to_rate(hppe_eir,
&policer->eir,
in_port_meter_cfg_tbl.bf.meter_unit,
in_port_meter_cfg_tbl.bf.token_unit);
__adpt_hppe_policer_bucket_size_to_burst_size(hppe_cbs,
&policer->cbs,
in_port_meter_cfg_tbl.bf.meter_unit,
in_port_meter_cfg_tbl.bf.token_unit);
__adpt_hppe_policer_bucket_size_to_burst_size(hppe_ebs,
&policer->ebs,
in_port_meter_cfg_tbl.bf.meter_unit,
in_port_meter_cfg_tbl.bf.token_unit);
policer->meter_en = in_port_meter_cfg_tbl.bf.meter_en;
policer->color_mode = in_port_meter_cfg_tbl.bf.color_mode;
policer->frame_type = in_port_meter_cfg_tbl.bf.meter_flag;
policer->couple_en = in_port_meter_cfg_tbl.bf.coupling_flag;
policer->meter_mode = in_port_meter_cfg_tbl.bf.meter_mode;
policer->meter_unit = in_port_meter_cfg_tbl.bf.meter_unit;
action->yellow_priority_en = in_port_meter_cfg_tbl.bf.exceed_chg_pri_cmd;
action->yellow_drop_priority_en = in_port_meter_cfg_tbl.bf.exceed_chg_dp_cmd;
action->yellow_pcp_en = in_port_meter_cfg_tbl.bf.exceed_chg_pcp_cmd;
action->yellow_dei_en = in_port_meter_cfg_tbl.bf.exceed_chg_dei_cmd;
action->yellow_priority = in_port_meter_cfg_tbl.bf.exceed_pri;
action->yellow_drop_priority = in_port_meter_cfg_tbl.bf.exceed_dp;
action->yellow_pcp = in_port_meter_cfg_tbl.bf.exceed_pcp;
action->yellow_dei = in_port_meter_cfg_tbl.bf.exceed_dei;
if (in_port_meter_cfg_tbl.bf.violate_cmd == 0)
action->red_action = FAL_MAC_DROP;
else
action->red_action = FAL_MAC_FRWRD;
action->red_priority_en = in_port_meter_cfg_tbl.bf.violate_chg_pri_cmd;
action->red_drop_priority_en = in_port_meter_cfg_tbl.bf.violate_chg_dp_cmd;
action->red_pcp_en = in_port_meter_cfg_tbl.bf.violate_chg_pcp_cmd;
action->red_dei_en = in_port_meter_cfg_tbl.bf.violate_chg_dei_cmd;
action->red_priority = in_port_meter_cfg_tbl.bf.violate_pri;
action->red_drop_priority = in_port_meter_cfg_tbl.bf.violate_dp;
action->red_pcp = in_port_meter_cfg_tbl.bf.violate_pcp;
action->red_dei = in_port_meter_cfg_tbl.bf.violate_dei;
return SW_OK;
}
sw_error_t
adpt_hppe_port_policer_entry_set(a_uint32_t dev_id, fal_port_t port_id,
fal_policer_config_t *policer, fal_policer_action_t *action)
{
union in_port_meter_cfg_tbl_u in_port_meter_cfg_tbl;
a_uint32_t hppe_cir = 0, hppe_cbs = 0, hppe_eir = 0,hppe_ebs = 0;
a_uint64_t temp_cir = 0, temp_eir =0, temp_cbs =0, temp_ebs = 0;
a_uint32_t token_unit = 0;
sw_error_t rv = SW_OK;
memset(&in_port_meter_cfg_tbl, 0, sizeof(in_port_meter_cfg_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(policer);
ADPT_NULL_POINT_CHECK(action);
if (port_id < 0 || port_id > 7)
return SW_BAD_PARAM;
if(ADPT_HPPE_POLICER_METER_UNIT_BYTE == policer->meter_unit)
{
if ((policer->cir > BYTE_POLICER_MAX_RATE) || (policer->eir > BYTE_POLICER_MAX_RATE))
return SW_BAD_PARAM;
if ((policer->cir < BYTE_POLICER_MIN_RATE) && (policer->cir != 0))
return SW_BAD_PARAM;
if ((policer->eir < BYTE_POLICER_MIN_RATE) && (policer->eir != 0))
return SW_BAD_PARAM;
}
if(ADPT_HPPE_POLICER_METER_UNIT_FRAME == policer->meter_unit)
{
if ((policer->cir > FRAME_POLICER_MAX_RATE) || (policer->eir > FRAME_POLICER_MAX_RATE))
return SW_BAD_PARAM;
if ((policer->cir < FRAME_POLICER_MIN_RATE) && (policer->cir != 0))
return SW_BAD_PARAM;
if ((policer->eir < FRAME_POLICER_MIN_RATE) && (policer->eir != 0))
return SW_BAD_PARAM;
}
if((0 == policer->meter_mode) && (policer->cir > policer->eir))
return SW_BAD_PARAM;
temp_cir = ((a_uint64_t)policer->cir) * 1000;
temp_cbs = ((a_uint64_t)policer->cbs) * 1000;
temp_eir = ((a_uint64_t)policer->eir) * 1000;
temp_ebs = ((a_uint64_t)policer->ebs) * 1000;
rv = __adpt_hppe_policer_two_bucket_parameter_select(temp_cir,
temp_cbs,
temp_eir,
temp_ebs,
policer->meter_unit,
&token_unit);
if( rv != SW_OK )
return rv;
// printk("current meter unit is = %d\n", policer->meter_unit);
// printk("current token unit is = %d\n", token_unit);
__adpt_hppe_policer_rate_to_refresh(policer->cir,
&hppe_cir,
policer->meter_unit,
token_unit);
__adpt_hppe_policer_rate_to_refresh(policer->eir,
&hppe_eir,
policer->meter_unit,
token_unit);
__adpt_hppe_policer_burst_size_to_bucket_size(policer->cbs,
&hppe_cbs,
policer->meter_unit,
token_unit);
__adpt_hppe_policer_burst_size_to_bucket_size(policer->ebs,
&hppe_ebs,
policer->meter_unit,
token_unit);
in_port_meter_cfg_tbl.bf.meter_en = policer->meter_en;
in_port_meter_cfg_tbl.bf.color_mode = policer->color_mode;
in_port_meter_cfg_tbl.bf.meter_flag = policer->frame_type;
in_port_meter_cfg_tbl.bf.coupling_flag = policer->couple_en;
in_port_meter_cfg_tbl.bf.meter_mode = policer->meter_mode;
in_port_meter_cfg_tbl.bf.token_unit = token_unit;
in_port_meter_cfg_tbl.bf.meter_unit = (a_uint32_t)policer->meter_unit;
in_port_meter_cfg_tbl.bf.cbs = hppe_cbs;
in_port_meter_cfg_tbl.bf.cir_0 = hppe_cir & 0x7;
in_port_meter_cfg_tbl.bf.cir_1 = hppe_cir >> 3;
in_port_meter_cfg_tbl.bf.ebs = hppe_ebs;
in_port_meter_cfg_tbl.bf.eir_0 = hppe_eir & 0x1;
in_port_meter_cfg_tbl.bf.eir_1 = hppe_eir >> 1;
in_port_meter_cfg_tbl.bf.exceed_chg_pri_cmd = action->yellow_priority_en;
in_port_meter_cfg_tbl.bf.exceed_chg_dp_cmd = action->yellow_drop_priority_en;
in_port_meter_cfg_tbl.bf.exceed_chg_pcp_cmd = action->yellow_pcp_en;
in_port_meter_cfg_tbl.bf.exceed_chg_dei_cmd = action->yellow_dei_en;
in_port_meter_cfg_tbl.bf.exceed_pri = action->yellow_priority;
in_port_meter_cfg_tbl.bf.exceed_dp = action->yellow_drop_priority;
in_port_meter_cfg_tbl.bf.exceed_pcp = action->yellow_pcp;
in_port_meter_cfg_tbl.bf.exceed_dei = action->yellow_dei;
if (action->red_action == FAL_MAC_DROP)
in_port_meter_cfg_tbl.bf.violate_cmd = 0;
else
in_port_meter_cfg_tbl.bf.violate_cmd = 1;
in_port_meter_cfg_tbl.bf.violate_chg_pri_cmd = action->red_priority_en;
in_port_meter_cfg_tbl.bf.violate_chg_dp_cmd = action->red_drop_priority_en;
in_port_meter_cfg_tbl.bf.violate_chg_pcp_cmd = action->red_pcp_en;
in_port_meter_cfg_tbl.bf.violate_chg_dei_cmd = action->red_dei_en;
in_port_meter_cfg_tbl.bf.violate_pri = action->red_priority;
in_port_meter_cfg_tbl.bf.violate_dp = action->red_drop_priority;
in_port_meter_cfg_tbl.bf.violate_pcp = action->red_pcp;
in_port_meter_cfg_tbl.bf.violate_dei = action->red_dei;
hppe_in_port_meter_cfg_tbl_set(dev_id, port_id, &in_port_meter_cfg_tbl);
return SW_OK;
}
sw_error_t
adpt_hppe_acl_policer_entry_get(a_uint32_t dev_id, a_uint32_t index,
fal_policer_config_t *policer, fal_policer_action_t *action)
{
union in_acl_meter_cfg_tbl_u in_acl_meter_cfg_tbl;
a_uint32_t hppe_cir =0, hppe_cbs = 0, hppe_eir = 0,hppe_ebs = 0;
memset(&in_acl_meter_cfg_tbl, 0, sizeof(in_acl_meter_cfg_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(policer);
ADPT_NULL_POINT_CHECK(action);
if (index < 0 || index > 511)
return SW_BAD_PARAM;
hppe_in_acl_meter_cfg_tbl_get(dev_id, index, &in_acl_meter_cfg_tbl);
hppe_cir = (in_acl_meter_cfg_tbl.bf.cir_1 << 8) | in_acl_meter_cfg_tbl.bf.cir_0;
hppe_cbs = in_acl_meter_cfg_tbl.bf.cbs;
hppe_eir = (in_acl_meter_cfg_tbl.bf.eir_1 << 6) | in_acl_meter_cfg_tbl.bf.eir_0;
hppe_ebs = in_acl_meter_cfg_tbl.bf.ebs;
__adpt_hppe_policer_refresh_to_rate(hppe_cir,
&policer->cir,
in_acl_meter_cfg_tbl.bf.meter_unit,
in_acl_meter_cfg_tbl.bf.token_unit);
__adpt_hppe_policer_refresh_to_rate(hppe_eir,
&policer->eir,
in_acl_meter_cfg_tbl.bf.meter_unit,
in_acl_meter_cfg_tbl.bf.token_unit);
__adpt_hppe_policer_bucket_size_to_burst_size(hppe_cbs,
&policer->cbs,
in_acl_meter_cfg_tbl.bf.meter_unit,
in_acl_meter_cfg_tbl.bf.token_unit);
__adpt_hppe_policer_bucket_size_to_burst_size(hppe_ebs,
&policer->ebs,
in_acl_meter_cfg_tbl.bf.meter_unit,
in_acl_meter_cfg_tbl.bf.token_unit);
policer->meter_en = in_acl_meter_cfg_tbl.bf.meter_en;
policer->color_mode = in_acl_meter_cfg_tbl.bf.color_mode;
policer->couple_en= in_acl_meter_cfg_tbl.bf.coupling_flag;
policer->meter_mode = in_acl_meter_cfg_tbl.bf.meter_mode;
policer->meter_unit = in_acl_meter_cfg_tbl.bf.meter_unit;
action->yellow_priority_en = in_acl_meter_cfg_tbl.bf.exceed_chg_pri_cmd;
action->yellow_drop_priority_en = in_acl_meter_cfg_tbl.bf.exceed_chg_dp_cmd;
action->yellow_pcp_en = in_acl_meter_cfg_tbl.bf.exceed_chg_pcp_cmd;
action->yellow_dei_en = in_acl_meter_cfg_tbl.bf.exceed_chg_dei_cmd;
action->yellow_priority = in_acl_meter_cfg_tbl.bf.exceed_pri;
action->yellow_drop_priority = in_acl_meter_cfg_tbl.bf.exceed_dp;
action->yellow_pcp = in_acl_meter_cfg_tbl.bf.exceed_pcp;
action->yellow_dei = in_acl_meter_cfg_tbl.bf.exceed_dei;
if (in_acl_meter_cfg_tbl.bf.violate_cmd == 0)
action->red_action = FAL_MAC_DROP;
else
action->red_action = FAL_MAC_FRWRD;
action->red_priority_en = in_acl_meter_cfg_tbl.bf.violate_chg_pri_cmd;
action->red_drop_priority_en = in_acl_meter_cfg_tbl.bf.violate_chg_dp_cmd;
action->red_pcp_en = in_acl_meter_cfg_tbl.bf.violate_chg_pcp_cmd;
action->red_dei_en = in_acl_meter_cfg_tbl.bf.violate_chg_dei_cmd;
action->red_priority = (in_acl_meter_cfg_tbl.bf.violate_pri_1 << 1) |in_acl_meter_cfg_tbl.bf.violate_pri_0;
action->red_drop_priority = in_acl_meter_cfg_tbl.bf.violate_dp;
action->red_pcp = in_acl_meter_cfg_tbl.bf.violate_pcp;
action->red_dei = in_acl_meter_cfg_tbl.bf.violate_dei;
return SW_OK;
}
sw_error_t
adpt_hppe_acl_policer_entry_set(a_uint32_t dev_id, a_uint32_t index,
fal_policer_config_t *policer, fal_policer_action_t *action)
{
union in_acl_meter_cfg_tbl_u in_acl_meter_cfg_tbl;
a_uint32_t hppe_cir =0, hppe_cbs = 0, hppe_eir = 0,hppe_ebs = 0;
a_uint64_t temp_cir = 0, temp_eir =0, temp_cbs =0, temp_ebs = 0;
a_uint32_t token_unit = 0;
sw_error_t rv = SW_OK;
memset(&in_acl_meter_cfg_tbl, 0, sizeof(in_acl_meter_cfg_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(policer);
ADPT_NULL_POINT_CHECK(action);
if (index < 0 || index > 511)
return SW_BAD_PARAM;
if(ADPT_HPPE_POLICER_METER_UNIT_BYTE == policer->meter_unit)
{
if ((policer->cir > BYTE_POLICER_MAX_RATE) || (policer->eir > BYTE_POLICER_MAX_RATE))
return SW_BAD_PARAM;
if ((policer->cir < BYTE_POLICER_MIN_RATE) && (policer->cir != 0))
return SW_BAD_PARAM;
if ((policer->eir < BYTE_POLICER_MIN_RATE) && (policer->eir != 0))
return SW_BAD_PARAM;
}
if(ADPT_HPPE_POLICER_METER_UNIT_FRAME == policer->meter_unit)
{
if ((policer->cir > FRAME_POLICER_MAX_RATE) || (policer->eir > FRAME_POLICER_MAX_RATE))
return SW_BAD_PARAM;
if ((policer->cir < FRAME_POLICER_MIN_RATE) && (policer->cir != 0))
return SW_BAD_PARAM;
if ((policer->eir < FRAME_POLICER_MIN_RATE) && (policer->eir != 0))
return SW_BAD_PARAM;
}
if((0 == policer->meter_mode) && (policer->cir > policer->eir))
return SW_BAD_PARAM;
temp_cir = ((a_uint64_t)policer->cir) * 1000;
temp_cbs = ((a_uint64_t)policer->cbs) * 1000;
temp_eir = ((a_uint64_t)policer->eir) * 1000;
temp_ebs = ((a_uint64_t)policer->ebs) * 1000;
rv = __adpt_hppe_policer_two_bucket_parameter_select(temp_cir,
temp_cbs,
temp_eir,
temp_ebs,
policer->meter_unit,
&token_unit);
if( rv != SW_OK )
return rv;
// printk("current meter unit is = %d\n", policer->meter_unit);
// printk("current token unit is = %d\n", token_unit);
__adpt_hppe_policer_rate_to_refresh(policer->cir,
&hppe_cir,
policer->meter_unit,
token_unit);
__adpt_hppe_policer_rate_to_refresh(policer->eir,
&hppe_eir,
policer->meter_unit,
token_unit);
__adpt_hppe_policer_burst_size_to_bucket_size(policer->cbs,
&hppe_cbs,
policer->meter_unit,
token_unit);
__adpt_hppe_policer_burst_size_to_bucket_size(policer->ebs,
&hppe_ebs,
policer->meter_unit,
token_unit);
in_acl_meter_cfg_tbl.bf.meter_en = policer->meter_en;
in_acl_meter_cfg_tbl.bf.color_mode = policer->color_mode;
in_acl_meter_cfg_tbl.bf.coupling_flag = policer->couple_en;
in_acl_meter_cfg_tbl.bf.meter_mode = policer->meter_mode;
in_acl_meter_cfg_tbl.bf.token_unit = token_unit;
in_acl_meter_cfg_tbl.bf.meter_unit = policer->meter_unit;
in_acl_meter_cfg_tbl.bf.cbs = hppe_cbs;
in_acl_meter_cfg_tbl.bf.cir_0 = hppe_cir & 0xff;
in_acl_meter_cfg_tbl.bf.cir_1 = hppe_cir >> 8;
in_acl_meter_cfg_tbl.bf.ebs = hppe_ebs;
in_acl_meter_cfg_tbl.bf.eir_0 = hppe_eir & 0x3f;
in_acl_meter_cfg_tbl.bf.eir_1 = hppe_eir >> 6;
in_acl_meter_cfg_tbl.bf.exceed_chg_pri_cmd = action->yellow_priority_en;
in_acl_meter_cfg_tbl.bf.exceed_chg_dp_cmd = action->yellow_drop_priority_en;
in_acl_meter_cfg_tbl.bf.exceed_chg_pcp_cmd = action->yellow_pcp_en;
in_acl_meter_cfg_tbl.bf.exceed_chg_dei_cmd = action->yellow_dei_en;
in_acl_meter_cfg_tbl.bf.exceed_pri = action->yellow_priority;
in_acl_meter_cfg_tbl.bf.exceed_dp = action->yellow_drop_priority;
in_acl_meter_cfg_tbl.bf.exceed_pcp = action->yellow_pcp;
in_acl_meter_cfg_tbl.bf.exceed_dei = action->yellow_dei;
if (action->red_action == FAL_MAC_DROP)
in_acl_meter_cfg_tbl.bf.violate_cmd = 0;
else
in_acl_meter_cfg_tbl.bf.violate_cmd = 1;
in_acl_meter_cfg_tbl.bf.violate_chg_pri_cmd = action->red_priority_en;
in_acl_meter_cfg_tbl.bf.violate_chg_dp_cmd = action->red_drop_priority_en;
in_acl_meter_cfg_tbl.bf.violate_chg_pcp_cmd = action->red_pcp_en;
in_acl_meter_cfg_tbl.bf.violate_chg_dei_cmd = action->red_dei_en;
in_acl_meter_cfg_tbl.bf.violate_pri_0 = action->red_priority & 0x1;
in_acl_meter_cfg_tbl.bf.violate_pri_1 = action->red_priority >>1;
in_acl_meter_cfg_tbl.bf.violate_dp = action->red_drop_priority;
in_acl_meter_cfg_tbl.bf.violate_pcp = action->red_pcp;
in_acl_meter_cfg_tbl.bf.violate_dei = action->red_dei;
hppe_in_acl_meter_cfg_tbl_set(dev_id, index, &in_acl_meter_cfg_tbl);
return SW_OK;
}
sw_error_t
adpt_hppe_policer_time_slot_get(a_uint32_t dev_id, a_uint32_t *time_slot)
{
sw_error_t rv = SW_OK;
union time_slot_reg_u time_slot_reg;
memset(&time_slot_reg, 0, sizeof(time_slot_reg));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(time_slot);
rv = hppe_time_slot_reg_get(dev_id, &time_slot_reg);
if( rv != SW_OK )
return rv;
*time_slot = time_slot_reg.bf.time_slot;
return SW_OK;
}
#endif
sw_error_t
adpt_hppe_port_compensation_byte_set(a_uint32_t dev_id, fal_port_t port_id,
a_uint32_t length)
{
union meter_cmpst_length_reg_u meter_cmpst_length_reg;
memset(&meter_cmpst_length_reg, 0, sizeof(meter_cmpst_length_reg));
ADPT_DEV_ID_CHECK(dev_id);
if (port_id < 0 || port_id > 7)
return SW_BAD_PARAM;
if (length > 0x1f)
return SW_BAD_PARAM;
hppe_meter_cmpst_length_reg_get(dev_id, port_id, &meter_cmpst_length_reg);
meter_cmpst_length_reg.bf.cmpst_length = length;
hppe_meter_cmpst_length_reg_set(dev_id, port_id, &meter_cmpst_length_reg);
return SW_OK;
}
sw_error_t
adpt_hppe_policer_time_slot_set(a_uint32_t dev_id, a_uint32_t time_slot)
{
union time_slot_reg_u time_slot_reg;
memset(&time_slot_reg, 0, sizeof(time_slot_reg));
ADPT_DEV_ID_CHECK(dev_id);
if ((time_slot > 1024) || (time_slot < 512))
return SW_BAD_PARAM;
time_slot_reg.bf.time_slot = time_slot;
hppe_time_slot_reg_set(dev_id, &time_slot_reg);
__adpt_hppe_policer_max_rate(time_slot);
__adpt_hppe_policer_max_burst_size();
return SW_OK;
}
#ifndef IN_POLICER_MINI
sw_error_t
adpt_hppe_policer_global_counter_get(a_uint32_t dev_id,
fal_policer_global_counter_t *counter)
{
union pc_global_cnt_tbl_u pc_global_cnt_tbl;
a_uint32_t index = 0;
memset(&pc_global_cnt_tbl, 0, sizeof(pc_global_cnt_tbl));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(counter);
hppe_pc_global_cnt_tbl_get(dev_id, index, &pc_global_cnt_tbl);
counter->policer_drop_packet_counter = pc_global_cnt_tbl.bf.pkt_cnt;
counter->policer_drop_byte_counter = pc_global_cnt_tbl.bf.byte_cnt_1;
counter->policer_drop_byte_counter = (counter->policer_drop_byte_counter << 32) |
pc_global_cnt_tbl.bf.byte_cnt_0;
hppe_pc_global_cnt_tbl_get(dev_id, index + 1, &pc_global_cnt_tbl);
counter->policer_forward_packet_counter = pc_global_cnt_tbl.bf.pkt_cnt;
counter->policer_forward_byte_counter = pc_global_cnt_tbl.bf.byte_cnt_1;
counter->policer_forward_byte_counter = (counter->policer_forward_byte_counter << 32) |
pc_global_cnt_tbl.bf.byte_cnt_0;
hppe_pc_global_cnt_tbl_get(dev_id, index + 2, &pc_global_cnt_tbl);
counter->policer_bypass_packet_counter = pc_global_cnt_tbl.bf.pkt_cnt;
counter->policer_bypass_byte_counter = pc_global_cnt_tbl.bf.byte_cnt_1;
counter->policer_bypass_byte_counter = (counter->policer_bypass_byte_counter << 32) |
pc_global_cnt_tbl.bf.byte_cnt_0;
return SW_OK;
}
sw_error_t
adpt_hppe_policer_bypass_en_get(a_uint32_t dev_id, fal_policer_frame_type_t frame_type,
a_bool_t *enable)
{
sw_error_t rv = SW_OK;
union pc_drop_bypass_reg_u drop_bypass_reg;
memset(&drop_bypass_reg, 0, sizeof(drop_bypass_reg));
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(enable);
rv = hppe_pc_drop_bypass_reg_get(dev_id, &drop_bypass_reg);
SW_RTN_ON_ERROR (rv);
if (frame_type == FAL_FRAME_DROPPED) {
*enable = drop_bypass_reg.bf.drop_bypass_en;
} else {
return SW_BAD_PARAM;
}
return SW_OK;
}
#endif
sw_error_t
adpt_hppe_policer_bypass_en_set(a_uint32_t dev_id, fal_policer_frame_type_t frame_type,
a_bool_t enable)
{
sw_error_t rv = SW_OK;
union pc_drop_bypass_reg_u drop_bypass_reg;
memset(&drop_bypass_reg, 0, sizeof(drop_bypass_reg));
ADPT_DEV_ID_CHECK(dev_id);
if (frame_type == FAL_FRAME_DROPPED) {
drop_bypass_reg.bf.drop_bypass_en = enable;
} else {
return SW_BAD_PARAM;
}
rv = hppe_pc_drop_bypass_reg_set(dev_id, &drop_bypass_reg);
SW_RTN_ON_ERROR (rv);
return SW_OK;
}
void adpt_hppe_policer_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_policer_func_bitmap = ((1 << FUNC_ADPT_ACL_POLICER_COUNTER_GET)|
(1 << FUNC_ADPT_PORT_POLICER_COUNTER_GET)|
(1 << FUNC_ADPT_PORT_COMPENSATION_BYTE_GET)|
(1 << FUNC_ADPT_PORT_POLICER_ENTRY_GET)|
(1 << FUNC_ADPT_PORT_POLICER_ENTRY_SET)|
(1 << FUNC_ADPT_ACL_POLICER_ENTRY_GET)|
(1 << FUNC_ADPT_ACL_POLICER_ENTRY_SET)|
(1 << FUNC_ADPT_POLICER_TIME_SLOT_GET)|
(1 << FUNC_ADPT_PORT_COMPENSATION_BYTE_SET)|
(1 << FUNC_ADPT_POLICER_TIME_SLOT_SET) |
(1 << FUNC_ADPT_POLICER_GLOBAL_COUNTER_GET)|
(1 << FUNC_ADPT_POLICER_BYPASS_EN_SET)|
(1 << FUNC_ADPT_POLICER_BYPASS_EN_GET));
return;
}
static void adpt_hppe_policer_func_unregister(a_uint32_t dev_id, adpt_api_t *p_adpt_api)
{
if(p_adpt_api == NULL)
return;
p_adpt_api->adpt_acl_policer_counter_get = NULL;
p_adpt_api->adpt_port_policer_counter_get = NULL;
p_adpt_api->adpt_port_compensation_byte_get = NULL;
p_adpt_api->adpt_port_policer_entry_get = NULL;
p_adpt_api->adpt_port_policer_entry_set = NULL;
p_adpt_api->adpt_acl_policer_entry_get = NULL;
p_adpt_api->adpt_acl_policer_entry_set = NULL;
p_adpt_api->adpt_policer_time_slot_get = NULL;
p_adpt_api->adpt_port_compensation_byte_set = NULL;
p_adpt_api->adpt_policer_time_slot_set = NULL;
p_adpt_api->adpt_policer_global_counter_get = NULL;
p_adpt_api->adpt_policer_bypass_en_set = NULL;
p_adpt_api->adpt_policer_bypass_en_get = NULL;
return;
}
sw_error_t adpt_hppe_policer_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_policer_func_unregister(dev_id, p_adpt_api);
#ifndef IN_POLICER_MINI
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_ACL_POLICER_COUNTER_GET))
{
p_adpt_api->adpt_acl_policer_counter_get = adpt_hppe_acl_policer_counter_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_PORT_POLICER_COUNTER_GET))
{
p_adpt_api->adpt_port_policer_counter_get = adpt_hppe_port_policer_counter_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_PORT_COMPENSATION_BYTE_GET))
{
p_adpt_api->adpt_port_compensation_byte_get = adpt_hppe_port_compensation_byte_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_PORT_POLICER_ENTRY_GET))
{
p_adpt_api->adpt_port_policer_entry_get = adpt_hppe_port_policer_entry_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_PORT_POLICER_ENTRY_SET))
{
p_adpt_api->adpt_port_policer_entry_set = adpt_hppe_port_policer_entry_set;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_ACL_POLICER_ENTRY_GET))
{
p_adpt_api->adpt_acl_policer_entry_get = adpt_hppe_acl_policer_entry_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_ACL_POLICER_ENTRY_SET))
{
p_adpt_api->adpt_acl_policer_entry_set = adpt_hppe_acl_policer_entry_set;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_POLICER_TIME_SLOT_GET))
{
p_adpt_api->adpt_policer_time_slot_get = adpt_hppe_policer_time_slot_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_POLICER_GLOBAL_COUNTER_GET))
{
p_adpt_api->adpt_policer_global_counter_get = adpt_hppe_policer_global_counter_get;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_POLICER_BYPASS_EN_GET))
{
p_adpt_api->adpt_policer_bypass_en_get = adpt_hppe_policer_bypass_en_get;
}
#endif
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_PORT_COMPENSATION_BYTE_SET))
{
p_adpt_api->adpt_port_compensation_byte_set = adpt_hppe_port_compensation_byte_set;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_POLICER_TIME_SLOT_SET))
{
p_adpt_api->adpt_policer_time_slot_set = adpt_hppe_policer_time_slot_set;
}
if(p_adpt_api->adpt_policer_func_bitmap & (1 << FUNC_ADPT_POLICER_BYPASS_EN_SET))
{
p_adpt_api->adpt_policer_bypass_en_set = adpt_hppe_policer_bypass_en_set;
}
return SW_OK;
}
/**
* @}
*/