blob: e8f59911712586abfb2027bb32b7f05303de91d5 [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_sec.h"
#include "hppe_sec_reg.h"
#include "hppe_sec.h"
#include "adpt.h"
sw_error_t
adpt_hppe_sec_l3_excep_parser_ctrl_set(a_uint32_t dev_id, fal_l3_excep_parser_ctrl *ctrl)
{
union l3_exception_parsing_ctrl_reg_u l3_exception_parsing_ctrl;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(ctrl);
memset(&l3_exception_parsing_ctrl, 0, sizeof(l3_exception_parsing_ctrl));
l3_exception_parsing_ctrl.bf.small_ttl = ctrl->small_ip4ttl;
l3_exception_parsing_ctrl.bf.small_hop_limit = ctrl->small_ip6hoplimit;
return hppe_l3_exception_parsing_ctrl_reg_set(dev_id, &l3_exception_parsing_ctrl);
}
sw_error_t
adpt_hppe_sec_l3_excep_ctrl_get(a_uint32_t dev_id, a_uint32_t excep_type, fal_l3_excep_ctrl_t *ctrl)
{
union l3_exception_cmd_u l3_exception_cmd;
union l3_exp_l3_only_ctrl_u l3_only_ctrl;
union l3_exp_l2_only_ctrl_u l2_only_ctrl;
union l3_exp_l2_flow_ctrl_u l2_flow_ctrl;
union l3_exp_l3_flow_ctrl_u l3_flow_ctrl;
union l3_exp_multicast_ctrl_u multicast_ctrl;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(ctrl);
if (excep_type >= L3_EXCEPTION_CMD_MAX_ENTRY)
return SW_BAD_VALUE;
hppe_l3_exception_cmd_get(dev_id, excep_type, &l3_exception_cmd);
hppe_l3_exp_l3_only_ctrl_get(dev_id, excep_type, &l3_only_ctrl);
hppe_l3_exp_l2_only_ctrl_get(dev_id, excep_type, &l2_only_ctrl);
hppe_l3_exp_l3_flow_ctrl_get(dev_id, excep_type, &l3_flow_ctrl);
hppe_l3_exp_l2_flow_ctrl_get(dev_id, excep_type, &l2_flow_ctrl);
hppe_l3_exp_multicast_ctrl_get(dev_id, excep_type, &multicast_ctrl);
ctrl->cmd = l3_exception_cmd.bf.l3_excep_cmd;
ctrl->deacclr_en = l3_exception_cmd.bf.de_acce;
ctrl->l3route_only_en = l3_only_ctrl.bf.excep_en;
ctrl->l2fwd_only_en = l2_only_ctrl.bf.excep_en;
ctrl->l3flow_en = l3_flow_ctrl.bf.excep_en;
ctrl->l2flow_en = l2_flow_ctrl.bf.excep_en;
ctrl->multicast_en = multicast_ctrl.bf.excep_en;
return SW_OK;
}
sw_error_t
adpt_hppe_sec_l3_excep_parser_ctrl_get(a_uint32_t dev_id, fal_l3_excep_parser_ctrl *ctrl)
{
sw_error_t rv = SW_OK;
union l3_exception_parsing_ctrl_reg_u l3_exception_parsing_ctrl;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(ctrl);
rv = hppe_l3_exception_parsing_ctrl_reg_get(dev_id, &l3_exception_parsing_ctrl);
if( rv != SW_OK )
return rv;
ctrl->small_ip4ttl = l3_exception_parsing_ctrl.bf.small_ttl;
ctrl->small_ip6hoplimit = l3_exception_parsing_ctrl.bf.small_hop_limit;
return SW_OK;
}
sw_error_t
adpt_hppe_sec_l4_excep_parser_ctrl_set(a_uint32_t dev_id, fal_l4_excep_parser_ctrl *ctrl)
{
union l4_exception_parsing_ctrl_0_reg_u l4_exception_parsing_ctrl_0;
union l4_exception_parsing_ctrl_1_reg_u l4_exception_parsing_ctrl_1;
union l4_exception_parsing_ctrl_2_reg_u l4_exception_parsing_ctrl_2;
union l4_exception_parsing_ctrl_3_reg_u l4_exception_parsing_ctrl_3;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(ctrl);
l4_exception_parsing_ctrl_0.bf.tcp_flags0 = ctrl->tcp_flags[0];
l4_exception_parsing_ctrl_0.bf.tcp_flags0_mask = ctrl->tcp_flags_mask[0];
l4_exception_parsing_ctrl_0.bf.tcp_flags1 = ctrl->tcp_flags[1];
l4_exception_parsing_ctrl_0.bf.tcp_flags1_mask = ctrl->tcp_flags_mask[1];
l4_exception_parsing_ctrl_1.bf.tcp_flags2 = ctrl->tcp_flags[2];
l4_exception_parsing_ctrl_1.bf.tcp_flags2_mask = ctrl->tcp_flags_mask[2];
l4_exception_parsing_ctrl_1.bf.tcp_flags3 = ctrl->tcp_flags[3];
l4_exception_parsing_ctrl_1.bf.tcp_flags3_mask = ctrl->tcp_flags_mask[3];
l4_exception_parsing_ctrl_2.bf.tcp_flags4 = ctrl->tcp_flags[4];
l4_exception_parsing_ctrl_2.bf.tcp_flags4_mask = ctrl->tcp_flags_mask[4];
l4_exception_parsing_ctrl_2.bf.tcp_flags5 = ctrl->tcp_flags[5];
l4_exception_parsing_ctrl_2.bf.tcp_flags5_mask = ctrl->tcp_flags_mask[5];
l4_exception_parsing_ctrl_3.bf.tcp_flags6 = ctrl->tcp_flags[6];
l4_exception_parsing_ctrl_3.bf.tcp_flags6_mask = ctrl->tcp_flags_mask[6];
l4_exception_parsing_ctrl_3.bf.tcp_flags7 = ctrl->tcp_flags[7];
l4_exception_parsing_ctrl_3.bf.tcp_flags7_mask = ctrl->tcp_flags_mask[7];
hppe_l4_exception_parsing_ctrl_0_reg_set(dev_id, &l4_exception_parsing_ctrl_0);
hppe_l4_exception_parsing_ctrl_1_reg_set(dev_id, &l4_exception_parsing_ctrl_1);
hppe_l4_exception_parsing_ctrl_2_reg_set(dev_id, &l4_exception_parsing_ctrl_2);
hppe_l4_exception_parsing_ctrl_3_reg_set(dev_id, &l4_exception_parsing_ctrl_3);
return SW_OK;
}
sw_error_t
adpt_hppe_sec_l3_excep_ctrl_set(a_uint32_t dev_id, a_uint32_t excep_type, fal_l3_excep_ctrl_t *ctrl)
{
union l3_exception_cmd_u l3_exception_cmd;
union l3_exp_l3_only_ctrl_u l3_only_ctrl;
union l3_exp_l2_only_ctrl_u l2_only_ctrl;
union l3_exp_l2_flow_ctrl_u l2_flow_ctrl;
union l3_exp_l3_flow_ctrl_u l3_flow_ctrl;
union l3_exp_multicast_ctrl_u multicast_ctrl;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(ctrl);
if (excep_type >= L3_EXCEPTION_CMD_MAX_ENTRY)
return SW_BAD_VALUE;
l3_exception_cmd.bf.l3_excep_cmd= ctrl->cmd;
l3_exception_cmd.bf.de_acce= ctrl->deacclr_en;
l3_only_ctrl.bf.excep_en = ctrl->l3route_only_en;
l2_only_ctrl.bf.excep_en = ctrl->l2fwd_only_en;
l3_flow_ctrl.bf.excep_en = ctrl->l3flow_en;
l2_flow_ctrl.bf.excep_en = ctrl->l2flow_en;
multicast_ctrl.bf.excep_en = ctrl->multicast_en;
hppe_l3_exception_cmd_set(dev_id, excep_type, &l3_exception_cmd);
hppe_l3_exp_l3_only_ctrl_set(dev_id, excep_type, &l3_only_ctrl);
hppe_l3_exp_l2_only_ctrl_set(dev_id, excep_type, &l2_only_ctrl);
hppe_l3_exp_l3_flow_ctrl_set(dev_id, excep_type, &l3_flow_ctrl);
hppe_l3_exp_l2_flow_ctrl_set(dev_id, excep_type, &l2_flow_ctrl);
hppe_l3_exp_multicast_ctrl_set(dev_id, excep_type, &multicast_ctrl);
return SW_OK;
}
sw_error_t
adpt_hppe_sec_l4_excep_parser_ctrl_get(a_uint32_t dev_id, fal_l4_excep_parser_ctrl *ctrl)
{
union l4_exception_parsing_ctrl_0_reg_u l4_exception_parsing_ctrl_0;
union l4_exception_parsing_ctrl_1_reg_u l4_exception_parsing_ctrl_1;
union l4_exception_parsing_ctrl_2_reg_u l4_exception_parsing_ctrl_2;
union l4_exception_parsing_ctrl_3_reg_u l4_exception_parsing_ctrl_3;
ADPT_DEV_ID_CHECK(dev_id);
ADPT_NULL_POINT_CHECK(ctrl);
hppe_l4_exception_parsing_ctrl_0_reg_get(dev_id, &l4_exception_parsing_ctrl_0);
hppe_l4_exception_parsing_ctrl_1_reg_get(dev_id, &l4_exception_parsing_ctrl_1);
hppe_l4_exception_parsing_ctrl_2_reg_get(dev_id, &l4_exception_parsing_ctrl_2);
hppe_l4_exception_parsing_ctrl_3_reg_get(dev_id, &l4_exception_parsing_ctrl_3);
ctrl->tcp_flags[0] = l4_exception_parsing_ctrl_0.bf.tcp_flags0;
ctrl->tcp_flags_mask[0] = l4_exception_parsing_ctrl_0.bf.tcp_flags0_mask;
ctrl->tcp_flags[1] = l4_exception_parsing_ctrl_0.bf.tcp_flags1;
ctrl->tcp_flags_mask[1] = l4_exception_parsing_ctrl_0.bf.tcp_flags1_mask;
ctrl->tcp_flags[2] = l4_exception_parsing_ctrl_1.bf.tcp_flags2;
ctrl->tcp_flags_mask[2] = l4_exception_parsing_ctrl_1.bf.tcp_flags2_mask;
ctrl->tcp_flags[3] = l4_exception_parsing_ctrl_1.bf.tcp_flags3;
ctrl->tcp_flags_mask[3] = l4_exception_parsing_ctrl_1.bf.tcp_flags3_mask;
ctrl->tcp_flags[4] = l4_exception_parsing_ctrl_2.bf.tcp_flags4;
ctrl->tcp_flags_mask[4] = l4_exception_parsing_ctrl_2.bf.tcp_flags4_mask;
ctrl->tcp_flags[5] = l4_exception_parsing_ctrl_2.bf.tcp_flags5;
ctrl->tcp_flags_mask[5] = l4_exception_parsing_ctrl_2.bf.tcp_flags5_mask;
ctrl->tcp_flags[6] = l4_exception_parsing_ctrl_3.bf.tcp_flags6;
ctrl->tcp_flags_mask[6] = l4_exception_parsing_ctrl_3.bf.tcp_flags6_mask;
ctrl->tcp_flags[7] = l4_exception_parsing_ctrl_3.bf.tcp_flags7;
ctrl->tcp_flags_mask[7] = l4_exception_parsing_ctrl_3.bf.tcp_flags7_mask;
return SW_OK;
}
void adpt_hppe_sec_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_sec_func_bitmap = ((1 << FUNC_SEC_L3_EXCEP_CTRL_SET) |
(1 << FUNC_SEC_L3_EXCEP_CTRL_GET) |
(1 << FUNC_SEC_L3_EXCEP_PARSER_CTRL_SET) |
(1 << FUNC_SEC_L3_EXCEP_PARSER_CTRL_GET) |
(1 << FUNC_SEC_L4_EXCEP_PARSER_CTRL_SET) |
(1 << FUNC_SEC_L4_EXCEP_PARSER_CTRL_GET));
return;
}
static void adpt_hppe_sec_func_unregister(a_uint32_t dev_id, adpt_api_t *p_adpt_api)
{
if(p_adpt_api == NULL)
return;
p_adpt_api->adpt_sec_l3_excep_parser_ctrl_set = NULL;
p_adpt_api->adpt_sec_l3_excep_ctrl_get = NULL;
p_adpt_api->adpt_sec_l3_excep_parser_ctrl_get = NULL;
p_adpt_api->adpt_sec_l4_excep_parser_ctrl_set = NULL;
p_adpt_api->adpt_sec_l3_excep_ctrl_set = NULL;
p_adpt_api->adpt_sec_l4_excep_parser_ctrl_get = NULL;
return;
}
sw_error_t adpt_hppe_sec_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_sec_func_unregister(dev_id, p_adpt_api);
if (p_adpt_api->adpt_sec_func_bitmap & (1 << FUNC_SEC_L3_EXCEP_PARSER_CTRL_SET))
p_adpt_api->adpt_sec_l3_excep_parser_ctrl_set = adpt_hppe_sec_l3_excep_parser_ctrl_set;
if (p_adpt_api->adpt_sec_func_bitmap & (1 << FUNC_SEC_L3_EXCEP_CTRL_GET))
p_adpt_api->adpt_sec_l3_excep_ctrl_get = adpt_hppe_sec_l3_excep_ctrl_get;
if (p_adpt_api->adpt_sec_func_bitmap & (1 << FUNC_SEC_L3_EXCEP_PARSER_CTRL_GET))
p_adpt_api->adpt_sec_l3_excep_parser_ctrl_get = adpt_hppe_sec_l3_excep_parser_ctrl_get;
if (p_adpt_api->adpt_sec_func_bitmap & (1 << FUNC_SEC_L4_EXCEP_PARSER_CTRL_SET))
p_adpt_api->adpt_sec_l4_excep_parser_ctrl_set = adpt_hppe_sec_l4_excep_parser_ctrl_set;
if (p_adpt_api->adpt_sec_func_bitmap & (1 << FUNC_SEC_L3_EXCEP_CTRL_SET))
p_adpt_api->adpt_sec_l3_excep_ctrl_set = adpt_hppe_sec_l3_excep_ctrl_set;
if (p_adpt_api->adpt_sec_func_bitmap & (1 << FUNC_SEC_L4_EXCEP_PARSER_CTRL_GET))
p_adpt_api->adpt_sec_l4_excep_parser_ctrl_get = adpt_hppe_sec_l4_excep_parser_ctrl_get;
return SW_OK;
}
/**
* @}
*/