1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Atlantic Network Driver
3  * Copyright (C) 2020 Marvell International Ltd.
4  */
5 
6 #ifndef HW_ATL2_INTERNAL_H
7 #define HW_ATL2_INTERNAL_H
8 
9 #include "hw_atl2_utils.h"
10 
11 #define HW_ATL2_MTU_JUMBO  16352U
12 #define HW_ATL2_MTU        1514U
13 
14 #define HW_ATL2_TX_RINGS 4U
15 #define HW_ATL2_RX_RINGS 4U
16 
17 #define HW_ATL2_RINGS_MAX 32U
18 #define HW_ATL2_TXD_SIZE       (16U)
19 #define HW_ATL2_RXD_SIZE       (16U)
20 
21 #define HW_ATL2_MAC_UC   0U
22 #define HW_ATL2_MAC_MIN  1U
23 #define HW_ATL2_MAC_MAX  38U
24 
25 /* interrupts */
26 #define HW_ATL2_ERR_INT 8U
27 #define HW_ATL2_INT_MASK  (0xFFFFFFFFU)
28 
29 #define HW_ATL2_TXBUF_MAX              128U
30 #define HW_ATL2_RXBUF_MAX              192U
31 
32 #define HW_ATL2_RSS_REDIRECTION_MAX 64U
33 
34 #define HW_ATL2_TC_MAX 1U
35 #define HW_ATL2_RSS_MAX 8U
36 
37 #define HW_ATL2_MIN_RXD \
38 	(ALIGN(AQ_CFG_SKB_FRAGS_MAX + 1U, AQ_HW_RXD_MULTIPLE))
39 #define HW_ATL2_MIN_TXD \
40 	(ALIGN(AQ_CFG_SKB_FRAGS_MAX + 1U, AQ_HW_TXD_MULTIPLE))
41 
42 #define HW_ATL2_MAX_RXD 8184U
43 #define HW_ATL2_MAX_TXD 8184U
44 
45 #define HW_ATL2_FW_SM_ACT_RSLVR  0x3U
46 
47 #define HW_ATL2_RPF_TAG_UC_OFFSET      0x0
48 #define HW_ATL2_RPF_TAG_ALLMC_OFFSET   0x6
49 #define HW_ATL2_RPF_TAG_ET_OFFSET      0x7
50 #define HW_ATL2_RPF_TAG_VLAN_OFFSET    0xA
51 #define HW_ATL2_RPF_TAG_UNTAG_OFFSET   0xE
52 #define HW_ATL2_RPF_TAG_L3_V4_OFFSET   0xF
53 #define HW_ATL2_RPF_TAG_L3_V6_OFFSET   0x12
54 #define HW_ATL2_RPF_TAG_L4_OFFSET      0x15
55 #define HW_ATL2_RPF_TAG_L4_FLEX_OFFSET 0x18
56 #define HW_ATL2_RPF_TAG_FLEX_OFFSET    0x1B
57 #define HW_ATL2_RPF_TAG_PCP_OFFSET     0x1D
58 
59 #define HW_ATL2_RPF_TAG_UC_MASK    (0x0000003F << HW_ATL2_RPF_TAG_UC_OFFSET)
60 #define HW_ATL2_RPF_TAG_ALLMC_MASK (0x00000001 << HW_ATL2_RPF_TAG_ALLMC_OFFSET)
61 #define HW_ATL2_RPF_TAG_UNTAG_MASK (0x00000001 << HW_ATL2_RPF_TAG_UNTAG_OFFSET)
62 #define HW_ATL2_RPF_TAG_VLAN_MASK  (0x0000000F << HW_ATL2_RPF_TAG_VLAN_OFFSET)
63 #define HW_ATL2_RPF_TAG_ET_MASK    (0x00000007 << HW_ATL2_RPF_TAG_ET_OFFSET)
64 #define HW_ATL2_RPF_TAG_L3_V4_MASK (0x00000007 << HW_ATL2_RPF_TAG_L3_V4_OFFSET)
65 #define HW_ATL2_RPF_TAG_L3_V6_MASK (0x00000007 << HW_ATL2_RPF_TAG_L3_V6_OFFSET)
66 #define HW_ATL2_RPF_TAG_L4_MASK    (0x00000007 << HW_ATL2_RPF_TAG_L4_OFFSET)
67 #define HW_ATL2_RPF_TAG_PCP_MASK   (0x00000007 << HW_ATL2_RPF_TAG_PCP_OFFSET)
68 
69 #define HW_ATL2_RPF_TAG_BASE_UC    BIT(HW_ATL2_RPF_TAG_UC_OFFSET)
70 #define HW_ATL2_RPF_TAG_BASE_ALLMC BIT(HW_ATL2_RPF_TAG_ALLMC_OFFSET)
71 #define HW_ATL2_RPF_TAG_BASE_UNTAG BIT(HW_ATL2_RPF_TAG_UNTAG_OFFSET)
72 #define HW_ATL2_RPF_TAG_BASE_VLAN  BIT(HW_ATL2_RPF_TAG_VLAN_OFFSET)
73 
74 enum HW_ATL2_RPF_ART_INDEX {
75 	HW_ATL2_RPF_L2_PROMISC_OFF_INDEX,
76 	HW_ATL2_RPF_VLAN_PROMISC_OFF_INDEX,
77 	HW_ATL2_RPF_L3L4_USER_INDEX	= 8,
78 	HW_ATL2_RPF_ET_PCP_USER_INDEX	= HW_ATL2_RPF_L3L4_USER_INDEX + 16,
79 	HW_ATL2_RPF_VLAN_USER_INDEX	= HW_ATL2_RPF_ET_PCP_USER_INDEX + 16,
80 	HW_ATL2_RPF_PCP_TO_TC_INDEX	= HW_ATL2_RPF_VLAN_USER_INDEX +
81 					  HW_ATL_VLAN_MAX_FILTERS,
82 	HW_ATL2_RPF_VLAN_INDEX		= HW_ATL2_RPF_PCP_TO_TC_INDEX +
83 					  AQ_CFG_TCS_MAX,
84 	HW_ATL2_RPF_MAC_INDEX,
85 	HW_ATL2_RPF_ALLMC_INDEX,
86 	HW_ATL2_RPF_UNTAG_INDEX,
87 	HW_ATL2_RPF_VLAN_PROMISC_ON_INDEX,
88 	HW_ATL2_RPF_L2_PROMISC_ON_INDEX,
89 };
90 
91 #define HW_ATL2_ACTION(ACTION, RSS, INDEX, VALID) \
92 	((((ACTION) & 0x3U) << 8) | \
93 	(((RSS) & 0x1U) << 7) | \
94 	(((INDEX) & 0x3FU) << 2) | \
95 	(((VALID) & 0x1U) << 0))
96 
97 #define HW_ATL2_ACTION_DROP HW_ATL2_ACTION(0, 0, 0, 1)
98 #define HW_ATL2_ACTION_DISABLE HW_ATL2_ACTION(0, 0, 0, 0)
99 #define HW_ATL2_ACTION_ASSIGN_QUEUE(QUEUE) HW_ATL2_ACTION(1, 0, (QUEUE), 1)
100 #define HW_ATL2_ACTION_ASSIGN_TC(TC) HW_ATL2_ACTION(1, 1, (TC), 1)
101 
102 enum HW_ATL2_RPF_RSS_HASH_TYPE {
103 	HW_ATL2_RPF_RSS_HASH_TYPE_NONE = 0,
104 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV4 = BIT(0),
105 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV4_TCP = BIT(1),
106 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV4_UDP = BIT(2),
107 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV6 = BIT(3),
108 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_TCP = BIT(4),
109 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_UDP = BIT(5),
110 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_EX = BIT(6),
111 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_EX_TCP = BIT(7),
112 	HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_EX_UDP = BIT(8),
113 	HW_ATL2_RPF_RSS_HASH_TYPE_ALL = HW_ATL2_RPF_RSS_HASH_TYPE_IPV4 |
114 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV4_TCP |
115 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV4_UDP |
116 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV6 |
117 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_TCP |
118 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_UDP |
119 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_EX |
120 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_EX_TCP |
121 					HW_ATL2_RPF_RSS_HASH_TYPE_IPV6_EX_UDP,
122 };
123 
124 #define HW_ATL_RSS_DISABLED 0x00000000U
125 #define HW_ATL_RSS_ENABLED_3INDEX_BITS 0xB3333333U
126 
127 #define HW_ATL_MCAST_FLT_ANY_TO_HOST 0x00010FFFU
128 
129 struct hw_atl2_priv {
130 	struct statistics_s last_stats;
131 	unsigned int art_base_index;
132 };
133 
134 #endif /* HW_ATL2_INTERNAL_H */
135