linux/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/* Atlantic Network Driver
   3 * Copyright (C) 2020 Marvell International Ltd.
   4 */
   5
   6#include "hw_atl2_llh.h"
   7#include "hw_atl2_llh_internal.h"
   8#include "aq_hw_utils.h"
   9
  10void hw_atl2_rpf_redirection_table2_select_set(struct aq_hw_s *aq_hw,
  11                                               u32 select)
  12{
  13        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_PIF_RPF_REDIR2_ENI_ADR,
  14                            HW_ATL2_RPF_PIF_RPF_REDIR2_ENI_MSK,
  15                            HW_ATL2_RPF_PIF_RPF_REDIR2_ENI_SHIFT, select);
  16}
  17
  18void hw_atl2_rpf_rss_hash_type_set(struct aq_hw_s *aq_hw, u32 rss_hash_type)
  19{
  20        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_PIF_RPF_RSS_HASH_TYPEI_ADR,
  21                            HW_ATL2_RPF_PIF_RPF_RSS_HASH_TYPEI_MSK,
  22                            HW_ATL2_RPF_PIF_RPF_RSS_HASH_TYPEI_SHIFT,
  23                            rss_hash_type);
  24}
  25
  26/* rpf */
  27
  28void hw_atl2_rpf_new_enable_set(struct aq_hw_s *aq_hw, u32 enable)
  29{
  30        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_NEW_EN_ADR,
  31                            HW_ATL2_RPF_NEW_EN_MSK,
  32                            HW_ATL2_RPF_NEW_EN_SHIFT,
  33                            enable);
  34}
  35
  36void hw_atl2_rpfl2_uc_flr_tag_set(struct aq_hw_s *aq_hw, u32 tag, u32 filter)
  37{
  38        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPFL2UC_TAG_ADR(filter),
  39                            HW_ATL2_RPFL2UC_TAG_MSK,
  40                            HW_ATL2_RPFL2UC_TAG_SHIFT,
  41                            tag);
  42}
  43
  44void hw_atl2_rpfl2_bc_flr_tag_set(struct aq_hw_s *aq_hw, u32 tag)
  45{
  46        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_L2_BC_TAG_ADR,
  47                            HW_ATL2_RPF_L2_BC_TAG_MSK,
  48                            HW_ATL2_RPF_L2_BC_TAG_SHIFT,
  49                            tag);
  50}
  51
  52void hw_atl2_new_rpf_rss_redir_set(struct aq_hw_s *aq_hw, u32 tc, u32 index,
  53                                   u32 queue)
  54{
  55        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_RSS_REDIR_ADR(tc, index),
  56                            HW_ATL2_RPF_RSS_REDIR_MSK(tc),
  57                            HW_ATL2_RPF_RSS_REDIR_SHIFT(tc),
  58                            queue);
  59}
  60
  61void hw_atl2_rpf_vlan_flr_tag_set(struct aq_hw_s *aq_hw, u32 tag, u32 filter)
  62{
  63        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_VL_TAG_ADR(filter),
  64                            HW_ATL2_RPF_VL_TAG_MSK,
  65                            HW_ATL2_RPF_VL_TAG_SHIFT,
  66                            tag);
  67}
  68
  69/* TX */
  70
  71void hw_atl2_tpb_tx_tc_q_rand_map_en_set(struct aq_hw_s *aq_hw,
  72                                         const u32 tc_q_rand_map_en)
  73{
  74        aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPB_TX_TC_Q_RAND_MAP_EN_ADR,
  75                            HW_ATL2_TPB_TX_TC_Q_RAND_MAP_EN_MSK,
  76                            HW_ATL2_TPB_TX_TC_Q_RAND_MAP_EN_SHIFT,
  77                            tc_q_rand_map_en);
  78}
  79
  80void hw_atl2_tpb_tx_buf_clk_gate_en_set(struct aq_hw_s *aq_hw, u32 clk_gate_en)
  81{
  82        aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_ADR,
  83                            HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_MSK,
  84                            HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_SHIFT,
  85                            clk_gate_en);
  86}
  87
  88void hw_atl2_reg_tx_intr_moder_ctrl_set(struct aq_hw_s *aq_hw,
  89                                        u32 tx_intr_moderation_ctl,
  90                                        u32 queue)
  91{
  92        aq_hw_write_reg(aq_hw, HW_ATL2_TX_INTR_MODERATION_CTL_ADR(queue),
  93                        tx_intr_moderation_ctl);
  94}
  95
  96void hw_atl2_tps_tx_pkt_shed_data_arb_mode_set(struct aq_hw_s *aq_hw,
  97                                               const u32 data_arb_mode)
  98{
  99        aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPS_DATA_TC_ARB_MODE_ADR,
 100                            HW_ATL2_TPS_DATA_TC_ARB_MODE_MSK,
 101                            HW_ATL2_TPS_DATA_TC_ARB_MODE_SHIFT,
 102                            data_arb_mode);
 103}
 104
 105void hw_atl2_tps_tx_pkt_shed_tc_data_max_credit_set(struct aq_hw_s *aq_hw,
 106                                                    const u32 tc,
 107                                                    const u32 max_credit)
 108{
 109        aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPS_DATA_TCTCREDIT_MAX_ADR(tc),
 110                            HW_ATL2_TPS_DATA_TCTCREDIT_MAX_MSK,
 111                            HW_ATL2_TPS_DATA_TCTCREDIT_MAX_SHIFT,
 112                            max_credit);
 113}
 114
 115void hw_atl2_tps_tx_pkt_shed_tc_data_weight_set(struct aq_hw_s *aq_hw,
 116                                                const u32 tc,
 117                                                const u32 weight)
 118{
 119        aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPS_DATA_TCTWEIGHT_ADR(tc),
 120                            HW_ATL2_TPS_DATA_TCTWEIGHT_MSK,
 121                            HW_ATL2_TPS_DATA_TCTWEIGHT_SHIFT,
 122                            weight);
 123}
 124
 125u32 hw_atl2_get_hw_version(struct aq_hw_s *aq_hw)
 126{
 127        return aq_hw_read_reg(aq_hw, HW_ATL2_FPGA_VER_ADR);
 128}
 129
 130void hw_atl2_init_launchtime(struct aq_hw_s *aq_hw)
 131{
 132        u32 hw_ver = hw_atl2_get_hw_version(aq_hw);
 133
 134        aq_hw_write_reg_bit(aq_hw, HW_ATL2_LT_CTRL_ADR,
 135                            HW_ATL2_LT_CTRL_CLK_RATIO_MSK,
 136                            HW_ATL2_LT_CTRL_CLK_RATIO_SHIFT,
 137                            hw_ver  < HW_ATL2_FPGA_VER_U32(1, 0, 0, 0) ?
 138                            HW_ATL2_LT_CTRL_CLK_RATIO_FULL_SPEED :
 139                            hw_ver >= HW_ATL2_FPGA_VER_U32(1, 0, 85, 2) ?
 140                            HW_ATL2_LT_CTRL_CLK_RATIO_HALF_SPEED :
 141                            HW_ATL2_LT_CTRL_CLK_RATIO_QUATER_SPEED);
 142}
 143
 144/* set action resolver record */
 145void hw_atl2_rpf_act_rslvr_record_set(struct aq_hw_s *aq_hw, u8 location,
 146                                      u32 tag, u32 mask, u32 action)
 147{
 148        aq_hw_write_reg(aq_hw,
 149                        HW_ATL2_RPF_ACT_RSLVR_REQ_TAG_ADR(location),
 150                        tag);
 151        aq_hw_write_reg(aq_hw,
 152                        HW_ATL2_RPF_ACT_RSLVR_TAG_MASK_ADR(location),
 153                        mask);
 154        aq_hw_write_reg(aq_hw,
 155                        HW_ATL2_RPF_ACT_RSLVR_ACTN_ADR(location),
 156                        action);
 157}
 158
 159void hw_atl2_rpf_act_rslvr_section_en_set(struct aq_hw_s *aq_hw, u32 sections)
 160{
 161        aq_hw_write_reg_bit(aq_hw, HW_ATL2_RPF_REC_TAB_EN_ADR,
 162                            HW_ATL2_RPF_REC_TAB_EN_MSK,
 163                            HW_ATL2_RPF_REC_TAB_EN_SHIFT,
 164                            sections);
 165}
 166
 167void hw_atl2_mif_shared_buf_get(struct aq_hw_s *aq_hw, int offset, u32 *data,
 168                                int len)
 169{
 170        int j = 0;
 171        int i;
 172
 173        for (i = offset; i < offset + len; i++, j++)
 174                data[j] = aq_hw_read_reg(aq_hw,
 175                                         HW_ATL2_MIF_SHARED_BUFFER_IN_ADR(i));
 176}
 177
 178void hw_atl2_mif_shared_buf_write(struct aq_hw_s *aq_hw, int offset, u32 *data,
 179                                  int len)
 180{
 181        int j = 0;
 182        int i;
 183
 184        for (i = offset; i < offset + len; i++, j++)
 185                aq_hw_write_reg(aq_hw, HW_ATL2_MIF_SHARED_BUFFER_IN_ADR(i),
 186                                data[j]);
 187}
 188
 189void hw_atl2_mif_shared_buf_read(struct aq_hw_s *aq_hw, int offset, u32 *data,
 190                                 int len)
 191{
 192        int j = 0;
 193        int i;
 194
 195        for (i = offset; i < offset + len; i++, j++)
 196                data[j] = aq_hw_read_reg(aq_hw,
 197                                         HW_ATL2_MIF_SHARED_BUFFER_OUT_ADR(i));
 198}
 199
 200void hw_atl2_mif_host_finished_write_set(struct aq_hw_s *aq_hw, u32 finish)
 201{
 202        aq_hw_write_reg_bit(aq_hw, HW_ATL2_MIF_HOST_FINISHED_WRITE_ADR,
 203                            HW_ATL2_MIF_HOST_FINISHED_WRITE_MSK,
 204                            HW_ATL2_MIF_HOST_FINISHED_WRITE_SHIFT,
 205                            finish);
 206}
 207
 208u32 hw_atl2_mif_mcp_finished_read_get(struct aq_hw_s *aq_hw)
 209{
 210        return aq_hw_read_reg_bit(aq_hw, HW_ATL2_MIF_MCP_FINISHED_READ_ADR,
 211                                  HW_ATL2_MIF_MCP_FINISHED_READ_MSK,
 212                                  HW_ATL2_MIF_MCP_FINISHED_READ_SHIFT);
 213}
 214
 215u32 hw_atl2_mif_mcp_boot_reg_get(struct aq_hw_s *aq_hw)
 216{
 217        return aq_hw_read_reg(aq_hw, HW_ATL2_MIF_BOOT_REG_ADR);
 218}
 219
 220void hw_atl2_mif_mcp_boot_reg_set(struct aq_hw_s *aq_hw, u32 val)
 221{
 222        return aq_hw_write_reg(aq_hw, HW_ATL2_MIF_BOOT_REG_ADR, val);
 223}
 224
 225u32 hw_atl2_mif_host_req_int_get(struct aq_hw_s *aq_hw)
 226{
 227        return aq_hw_read_reg(aq_hw, HW_ATL2_MCP_HOST_REQ_INT_ADR);
 228}
 229
 230void hw_atl2_mif_host_req_int_clr(struct aq_hw_s *aq_hw, u32 val)
 231{
 232        return aq_hw_write_reg(aq_hw, HW_ATL2_MCP_HOST_REQ_INT_CLR_ADR,
 233                               val);
 234}
 235