You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
12 KiB
305 lines
12 KiB
From 33d75d80def058590e71d79f0d536e13d48e8306 Mon Sep 17 00:00:00 2001
|
|
From: Igor Russkikh <irusskik@redhat.com>
|
|
Date: Fri, 6 Nov 2020 18:37:40 -0500
|
|
Subject: [PATCH 083/139] [netdrv] net: atlantic: HW bindings for basic A2
|
|
init/deinit hw_ops
|
|
|
|
Message-id: <1604687916-15087-84-git-send-email-irusskik@redhat.com>
|
|
Patchwork-id: 338512
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.4 BZ 1857861 083/139] net: atlantic: HW bindings for basic A2 init/deinit hw_ops
|
|
Bugzilla: 1857861
|
|
RH-Acked-by: David Arcari <darcari@redhat.com>
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1857861
|
|
|
|
commit ec7629e0c2217963eedb886026a71040c9d32aa9
|
|
Author: Dmitry Bogdanov <dbogdanov@marvell.com>
|
|
Date: Thu Apr 30 11:04:42 2020 +0300
|
|
|
|
net: atlantic: HW bindings for basic A2 init/deinit hw_ops
|
|
|
|
This patch adds A2 register definitions for basic A2 HW
|
|
initialization / deinitialization.
|
|
|
|
Signed-off-by: Dmitry Bogdanov <dbogdanov@marvell.com>
|
|
Co-developed-by: Egor Pomozov <epomozov@marvell.com>
|
|
Signed-off-by: Egor Pomozov <epomozov@marvell.com>
|
|
Co-developed-by: Igor Russkikh <irusskikh@marvell.com>
|
|
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
|
|
Co-developed-by: Nikita Danilov <ndanilov@marvell.com>
|
|
Signed-off-by: Nikita Danilov <ndanilov@marvell.com>
|
|
Signed-off-by: Mark Starovoytov <mstarovoitov@marvell.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
Signed-off-by: Igor Russkikh <irusskik@redhat.com>
|
|
|
|
Cc: David Arcari <darcari@redhat.com>
|
|
Cc: Igor Russkikh <irusskik@redhat.com>
|
|
Signed-off-by: Jan Stancek <jstancek@redhat.com>
|
|
---
|
|
.../aquantia/atlantic/hw_atl2/hw_atl2_llh.c | 70 +++++++++++++
|
|
.../aquantia/atlantic/hw_atl2/hw_atl2_llh.h | 29 ++++++
|
|
.../atlantic/hw_atl2/hw_atl2_llh_internal.h | 108 +++++++++++++++++++++
|
|
3 files changed, 207 insertions(+)
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.c
|
|
index 67f46a7bdcda..af176e1e5a18 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.c
|
|
@@ -58,6 +58,55 @@ void hw_atl2_rpf_vlan_flr_tag_set(struct aq_hw_s *aq_hw, u32 tag, u32 filter)
|
|
tag);
|
|
}
|
|
|
|
+/* TX */
|
|
+
|
|
+void hw_atl2_tpb_tx_buf_clk_gate_en_set(struct aq_hw_s *aq_hw, u32 clk_gate_en)
|
|
+{
|
|
+ aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_ADR,
|
|
+ HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_MSK,
|
|
+ HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_SHIFT,
|
|
+ clk_gate_en);
|
|
+}
|
|
+
|
|
+void hw_atl2_tps_tx_pkt_shed_tc_data_max_credit_set(struct aq_hw_s *aq_hw,
|
|
+ u32 max_credit,
|
|
+ u32 tc)
|
|
+{
|
|
+ aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPS_DATA_TCTCREDIT_MAX_ADR(tc),
|
|
+ HW_ATL2_TPS_DATA_TCTCREDIT_MAX_MSK,
|
|
+ HW_ATL2_TPS_DATA_TCTCREDIT_MAX_SHIFT,
|
|
+ max_credit);
|
|
+}
|
|
+
|
|
+void hw_atl2_tps_tx_pkt_shed_tc_data_weight_set(struct aq_hw_s *aq_hw,
|
|
+ u32 tx_pkt_shed_tc_data_weight,
|
|
+ u32 tc)
|
|
+{
|
|
+ aq_hw_write_reg_bit(aq_hw, HW_ATL2_TPS_DATA_TCTWEIGHT_ADR(tc),
|
|
+ HW_ATL2_TPS_DATA_TCTWEIGHT_MSK,
|
|
+ HW_ATL2_TPS_DATA_TCTWEIGHT_SHIFT,
|
|
+ tx_pkt_shed_tc_data_weight);
|
|
+}
|
|
+
|
|
+u32 hw_atl2_get_hw_version(struct aq_hw_s *aq_hw)
|
|
+{
|
|
+ return aq_hw_read_reg(aq_hw, HW_ATL2_FPGA_VER_ADR);
|
|
+}
|
|
+
|
|
+void hw_atl2_init_launchtime(struct aq_hw_s *aq_hw)
|
|
+{
|
|
+ u32 hw_ver = hw_atl2_get_hw_version(aq_hw);
|
|
+
|
|
+ aq_hw_write_reg_bit(aq_hw, HW_ATL2_LT_CTRL_ADR,
|
|
+ HW_ATL2_LT_CTRL_CLK_RATIO_MSK,
|
|
+ HW_ATL2_LT_CTRL_CLK_RATIO_SHIFT,
|
|
+ hw_ver < HW_ATL2_FPGA_VER_U32(1, 0, 0, 0) ?
|
|
+ HW_ATL2_LT_CTRL_CLK_RATIO_FULL_SPEED :
|
|
+ hw_ver >= HW_ATL2_FPGA_VER_U32(1, 0, 85, 2) ?
|
|
+ HW_ATL2_LT_CTRL_CLK_RATIO_HALF_SPEED :
|
|
+ HW_ATL2_LT_CTRL_CLK_RATIO_QUATER_SPEED);
|
|
+}
|
|
+
|
|
/* set action resolver record */
|
|
void hw_atl2_rpf_act_rslvr_record_set(struct aq_hw_s *aq_hw, u8 location,
|
|
u32 tag, u32 mask, u32 action)
|
|
@@ -128,3 +177,24 @@ u32 hw_atl2_mif_mcp_finished_read_get(struct aq_hw_s *aq_hw)
|
|
HW_ATL2_MIF_MCP_FINISHED_READ_MSK,
|
|
HW_ATL2_MIF_MCP_FINISHED_READ_SHIFT);
|
|
}
|
|
+
|
|
+u32 hw_atl2_mif_mcp_boot_reg_get(struct aq_hw_s *aq_hw)
|
|
+{
|
|
+ return aq_hw_read_reg(aq_hw, HW_ATL2_MIF_BOOT_REG_ADR);
|
|
+}
|
|
+
|
|
+void hw_atl2_mif_mcp_boot_reg_set(struct aq_hw_s *aq_hw, u32 val)
|
|
+{
|
|
+ return aq_hw_write_reg(aq_hw, HW_ATL2_MIF_BOOT_REG_ADR, val);
|
|
+}
|
|
+
|
|
+u32 hw_atl2_mif_host_req_int_get(struct aq_hw_s *aq_hw)
|
|
+{
|
|
+ return aq_hw_read_reg(aq_hw, HW_ATL2_MCP_HOST_REQ_INT_ADR);
|
|
+}
|
|
+
|
|
+void hw_atl2_mif_host_req_int_clr(struct aq_hw_s *aq_hw, u32 val)
|
|
+{
|
|
+ return aq_hw_write_reg(aq_hw, HW_ATL2_MCP_HOST_REQ_INT_CLR_ADR,
|
|
+ val);
|
|
+}
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.h
|
|
index bd5b0d5a8084..4acbbceb623f 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh.h
|
|
@@ -29,6 +29,23 @@ void hw_atl2_new_rpf_rss_redir_set(struct aq_hw_s *aq_hw, u32 tc, u32 index,
|
|
/* Set VLAN filter tag */
|
|
void hw_atl2_rpf_vlan_flr_tag_set(struct aq_hw_s *aq_hw, u32 tag, u32 filter);
|
|
|
|
+/* set tx buffer clock gate enable */
|
|
+void hw_atl2_tpb_tx_buf_clk_gate_en_set(struct aq_hw_s *aq_hw, u32 clk_gate_en);
|
|
+
|
|
+/* set tx packet scheduler tc data max credit */
|
|
+void hw_atl2_tps_tx_pkt_shed_tc_data_max_credit_set(struct aq_hw_s *aq_hw,
|
|
+ u32 max_credit,
|
|
+ u32 tc);
|
|
+
|
|
+/* set tx packet scheduler tc data weight */
|
|
+void hw_atl2_tps_tx_pkt_shed_tc_data_weight_set(struct aq_hw_s *aq_hw,
|
|
+ u32 tx_pkt_shed_tc_data_weight,
|
|
+ u32 tc);
|
|
+
|
|
+u32 hw_atl2_get_hw_version(struct aq_hw_s *aq_hw);
|
|
+
|
|
+void hw_atl2_init_launchtime(struct aq_hw_s *aq_hw);
|
|
+
|
|
/* set action resolver record */
|
|
void hw_atl2_rpf_act_rslvr_record_set(struct aq_hw_s *aq_hw, u8 location,
|
|
u32 tag, u32 mask, u32 action);
|
|
@@ -54,4 +71,16 @@ void hw_atl2_mif_host_finished_write_set(struct aq_hw_s *aq_hw, u32 finish);
|
|
/* get mcp finished read shared buffer indication */
|
|
u32 hw_atl2_mif_mcp_finished_read_get(struct aq_hw_s *aq_hw);
|
|
|
|
+/* get mcp boot register */
|
|
+u32 hw_atl2_mif_mcp_boot_reg_get(struct aq_hw_s *aq_hw);
|
|
+
|
|
+/* set mcp boot register */
|
|
+void hw_atl2_mif_mcp_boot_reg_set(struct aq_hw_s *aq_hw, u32 val);
|
|
+
|
|
+/* get host interrupt request */
|
|
+u32 hw_atl2_mif_host_req_int_get(struct aq_hw_s *aq_hw);
|
|
+
|
|
+/* clear host interrupt request */
|
|
+void hw_atl2_mif_host_req_int_clr(struct aq_hw_s *aq_hw, u32 val);
|
|
+
|
|
#endif /* HW_ATL2_LLH_H */
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh_internal.h
|
|
index 886491b6ab73..14b78e090950 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh_internal.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_llh_internal.h
|
|
@@ -105,6 +105,105 @@
|
|
/* default value of bitfield vlan_req_tag0{f}[3:0] */
|
|
#define HW_ATL2_RPF_VL_TAG_DEFAULT 0x0
|
|
|
|
+/* RX rx_q{Q}_tc_map[2:0] Bitfield Definitions
|
|
+ * Preprocessor definitions for the bitfield "rx_q{Q}_tc_map[2:0]".
|
|
+ * Parameter: Queue {Q} | bit-level stride | range [0, 31]
|
|
+ * PORT="pif_rx_q0_tc_map_i[2:0]"
|
|
+ */
|
|
+
|
|
+/* Register address for bitfield rx_q{Q}_tc_map[2:0] */
|
|
+#define HW_ATL2_RX_Q_TC_MAP_ADR(queue) \
|
|
+ (((queue) < 32) ? 0x00005900 + ((queue) / 8) * 4 : 0)
|
|
+/* Lower bit position of bitfield rx_q{Q}_tc_map[2:0] */
|
|
+#define HW_ATL2_RX_Q_TC_MAP_SHIFT(queue) \
|
|
+ (((queue) < 32) ? ((queue) * 4) % 32 : 0)
|
|
+/* Width of bitfield rx_q{Q}_tc_map[2:0] */
|
|
+#define HW_ATL2_RX_Q_TC_MAP_WIDTH 3
|
|
+/* Default value of bitfield rx_q{Q}_tc_map[2:0] */
|
|
+#define HW_ATL2_RX_Q_TC_MAP_DEFAULT 0x0
|
|
+
|
|
+/* tx tx_buffer_clk_gate_en bitfield definitions
|
|
+ * preprocessor definitions for the bitfield "tx_buffer_clk_gate_en".
|
|
+ * port="pif_tpb_tx_buffer_clk_gate_en_i"
|
|
+ */
|
|
+
|
|
+/* register address for bitfield tx_buffer_clk_gate_en */
|
|
+#define HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_ADR 0x00007900
|
|
+/* bitmask for bitfield tx_buffer_clk_gate_en */
|
|
+#define HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_MSK 0x00000020
|
|
+/* inverted bitmask for bitfield tx_buffer_clk_gate_en */
|
|
+#define HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_MSKN 0xffffffdf
|
|
+/* lower bit position of bitfield tx_buffer_clk_gate_en */
|
|
+#define HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_SHIFT 5
|
|
+/* width of bitfield tx_buffer_clk_gate_en */
|
|
+#define HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_WIDTH 1
|
|
+/* default value of bitfield tx_buffer_clk_gate_en */
|
|
+#define HW_ATL2_TPB_TX_BUF_CLK_GATE_EN_DEFAULT 0x0
|
|
+
|
|
+/* tx data_tc{t}_credit_max[b:0] bitfield definitions
|
|
+ * preprocessor definitions for the bitfield "data_tc{t}_credit_max[b:0]".
|
|
+ * parameter: tc {t} | stride size 0x4 | range [0, 7]
|
|
+ * port="pif_tps_data_tc0_credit_max_i[11:0]"
|
|
+ */
|
|
+
|
|
+/* register address for bitfield data_tc{t}_credit_max[b:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTCREDIT_MAX_ADR(tc) (0x00007110 + (tc) * 0x4)
|
|
+/* bitmask for bitfield data_tc{t}_credit_max[b:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTCREDIT_MAX_MSK 0x0fff0000
|
|
+/* inverted bitmask for bitfield data_tc{t}_credit_max[b:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTCREDIT_MAX_MSKN 0xf000ffff
|
|
+/* lower bit position of bitfield data_tc{t}_credit_max[b:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTCREDIT_MAX_SHIFT 16
|
|
+/* width of bitfield data_tc{t}_credit_max[b:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTCREDIT_MAX_WIDTH 12
|
|
+/* default value of bitfield data_tc{t}_credit_max[b:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTCREDIT_MAX_DEFAULT 0x0
|
|
+
|
|
+/* tx data_tc{t}_weight[8:0] bitfield definitions
|
|
+ * preprocessor definitions for the bitfield "data_tc{t}_weight[8:0]".
|
|
+ * parameter: tc {t} | stride size 0x4 | range [0, 7]
|
|
+ * port="pif_tps_data_tc0_weight_i[8:0]"
|
|
+ */
|
|
+
|
|
+/* register address for bitfield data_tc{t}_weight[8:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTWEIGHT_ADR(tc) (0x00007110 + (tc) * 0x4)
|
|
+/* bitmask for bitfield data_tc{t}_weight[8:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTWEIGHT_MSK 0x000001ff
|
|
+/* inverted bitmask for bitfield data_tc{t}_weight[8:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTWEIGHT_MSKN 0xfffffe00
|
|
+/* lower bit position of bitfield data_tc{t}_weight[8:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTWEIGHT_SHIFT 0
|
|
+/* width of bitfield data_tc{t}_weight[8:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTWEIGHT_WIDTH 9
|
|
+/* default value of bitfield data_tc{t}_weight[8:0] */
|
|
+#define HW_ATL2_TPS_DATA_TCTWEIGHT_DEFAULT 0x0
|
|
+
|
|
+/* Launch time control register */
|
|
+#define HW_ATL2_LT_CTRL_ADR 0x00007a1c
|
|
+
|
|
+#define HW_ATL2_LT_CTRL_AVB_LEN_CMP_TRSHLD_MSK 0xFFFF0000
|
|
+#define HW_ATL2_LT_CTRL_AVB_LEN_CMP_TRSHLD_SHIFT 16
|
|
+
|
|
+#define HW_ATL2_LT_CTRL_CLK_RATIO_MSK 0x0000FF00
|
|
+#define HW_ATL2_LT_CTRL_CLK_RATIO_SHIFT 8
|
|
+#define HW_ATL2_LT_CTRL_CLK_RATIO_QUATER_SPEED 4
|
|
+#define HW_ATL2_LT_CTRL_CLK_RATIO_HALF_SPEED 2
|
|
+#define HW_ATL2_LT_CTRL_CLK_RATIO_FULL_SPEED 1
|
|
+
|
|
+#define HW_ATL2_LT_CTRL_25G_MODE_SUPPORT_MSK 0x00000008
|
|
+#define HW_ATL2_LT_CTRL_25G_MODE_SUPPORT_SHIFT 3
|
|
+
|
|
+#define HW_ATL2_LT_CTRL_LINK_SPEED_MSK 0x00000007
|
|
+#define HW_ATL2_LT_CTRL_LINK_SPEED_SHIFT 0
|
|
+
|
|
+/* FPGA VER register */
|
|
+#define HW_ATL2_FPGA_VER_ADR 0x000000f4
|
|
+#define HW_ATL2_FPGA_VER_U32(mj, mi, bl, rv) \
|
|
+ ((((mj) & 0xff) << 24) | \
|
|
+ (((mi) & 0xff) << 16) | \
|
|
+ (((bl) & 0xff) << 8) | \
|
|
+ (((rv) & 0xff) << 0))
|
|
+
|
|
/* ahb_mem_addr{f}[31:0] Bitfield Definitions
|
|
* Preprocessor definitions for the bitfield "ahb_mem_addr{f}[31:0]".
|
|
* Parameter: filter {f} | stride size 0x10 | range [0, 127]
|
|
@@ -209,4 +308,13 @@
|
|
/* Default value of bitfield pif_mcp_finished_buf_rd_i */
|
|
#define HW_ATL2_MIF_MCP_FINISHED_READ_DEFAULT 0x0
|
|
|
|
+/* Register address for bitfield pif_mcp_boot_reg */
|
|
+#define HW_ATL2_MIF_BOOT_REG_ADR 0x00003040u
|
|
+
|
|
+#define HW_ATL2_MCP_HOST_REQ_INT_READY BIT(0)
|
|
+
|
|
+#define HW_ATL2_MCP_HOST_REQ_INT_ADR 0x00000F00u
|
|
+#define HW_ATL2_MCP_HOST_REQ_INT_SET_ADR 0x00000F04u
|
|
+#define HW_ATL2_MCP_HOST_REQ_INT_CLR_ADR 0x00000F08u
|
|
+
|
|
#endif /* HW_ATL2_LLH_INTERNAL_H */
|
|
--
|
|
2.13.6
|
|
|