1 /*
2  * Copyright 2014-2017 Cavium, Inc.
3  * The contents of this file are subject to the terms of the Common Development
4  * and Distribution License, v.1,  (the "License").
5  *
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the License at available
9  * at http://opensource.org/licenses/CDDL-1.0
10  *
11  * See the License for the specific language governing permissions and
12  * limitations under the License.
13  */
14 
15 
16 #ifndef _COM_HSI_H
17 #define _COM_HSI_H
18 
19 // Offset of xxx_hsi in 32 bit words from beginning of scratchpad
20 #define COM_HSI_OFFSET 0x4
21 
22 typedef struct _com_hsi_t {
23     fw_version_t version;
24     u32_t fw_doorbell;
25         #define KCQ_READY        (1<<0)
26         #define KCQ1_READY       (1<<1)
27         #define KCQ2_READY       (1<<2)
28         #define KCQ3_READY       (1<<3)
29     u32_t dups;
30     u32_t dacks;
31     u32_t pushs;
32     u32_t compbits;
33     u32_t num_comq;
34     u32_t num_comtq;
35     u32_t num_comxq;
36     u32_t unused_num_fail_reloads;
37     u32_t rx_place;
38     u32_t rtxs;          //  max_retx_cnt : maximum number of tcp retries
39     u32_t min_rto_tick;  //  min_rto (in ticks of retx timer)
40     u32_t max_rto_tick;  //  max_rto (in ticks of retx timer)
41     u32_t max_caf;       // max allowed ack frequency
42     u32_t false_ooo_fin_cnt;
43     u32_t l2_forward_to_mcp;
44     u32_t l2_drop_mcpq_busy;
45     u32_t drtxs;        // doubt reacheability tx count threshold (rfc 2923)
46                         // drtxs - maximum number of times that the offload target should
47                         // retransmit a segment before indicating to the host stack that
48                         // the reachability of a neighbor is in doubt.
49     u32_t abort_ooo_fin_cnt;
50     u32_t total_ooo_fin_cnt;
51     u32_t caus;
52     u32_t dtic;
53     u32_t defer_ooo_fin_cnt;
54     u32_t l4_drop_cnt;  // number of l4 packets dropped by RV2P
55     u32_t cozr;
56     u32_t com_l2_no_buffer;
57     u32_t com_cu_host_bseq;
58     u32_t tnda;
59     u32_t tcnas;
60     u32_t tccas;
61     u32_t caf;          // ack frequency
62     u32_t cmpl_dbg_cnt;
63     u32_t hcwa_kwq_cons_idx;
64     u32_t hcwa_last_kwq_cons_idx;
65     u32_t eaiv;
66     u32_t reload_aft_fin_cnt;           // Number of reload after FIN
67     u32_t enable_fast_iscsi_response;
68     u32_t tsch_restart;
69     u64_t volatile idle_count;
70     u32_t iscsi_rtxs;                   // Number of retransmissions in iSCSI
71     u32_t iscsi_cq_size;                // Number of elements in queue. Its k lsb bits must be 0. bit 0 - arm bit - means CQ is armed
72     u32_t iscsi_cq_cqes_per_page;       // Number of CQEs per page
73     u32_t iscsi_cq_num_pages;           // Number of pages of CQ ( = entries in page table)
74     u32_t iscsi_cq_cqes_per_page_log2;  // Log2 of the Number of CQEs per page
75     u32_t iscsi_data_dig_err;           // Indication on Error="1" / Warning="0" of data digest
76     u32_t iscsi_tcp_config;             // Configuration register - Enable/Disable of DA/KA mechanisms
77     u32_t iscsi_teton_l4_cmd_offset;    // Teton Only: offset of L4 ccell command array
78     u32_t iscsi_teton_l5_offset;        // Teton Only: offset of L5 section
79     u32_t iscsi_teton_l5_cmd_offset;    // Teton Only: offset of L5 ccell command array
80     u32_t iscsi_task_offset;            // offset of the task array
81     u32_t iscsi_r2tq_offset;            // offset of R2TQ section
82     u32_t iscsi_max_num_of_tasks;       // maximal number of pending tasks
83     u32_t iscsi_max_num_of_ccells;      // maximal number of ccells
84     u32_t com_cu_buf_size;
85     u32_t com_l2_iscsi_no_buffer;
86     u32_t com_unicast_no_buffer;
87     u32_t com_mcast_no_buffer;
88     u32_t com_bcast_no_buffer;
89     u32_t l2_drop_pkt_cnt;  // keep tracks of packet drop requested by RXP (e.g. not enough bytes in BD to place the pkt)
90     u32_t com_cu_free_cnt;
91     u32_t cu_rate_limiter_enable;
92 }com_hsi_t;
93 
94 // This macro can be used for little or big endian 32-bit system
95 #define COM_HSI_OFFSETOFF(m)  (OFFSETOF(com_hsi_t,m) + 0x10)
96 #define COM_HSI_SIZEOF(m)     (sizeof (((com_hsi_t *)0)->m))
97 
98 // Calling the following macro will actually get optimized during compile
99 // time. Its sole purpose is to ensure HSI variables cannot be modified/moved
100 // unnoticed   scratch[10240] 0x120000 (RW/Reset: undefined)
101 #define TEST_COM_HSI(){                                                    \
102 if (0){                                                                    \
103  1/(COM_HSI_OFFSETOFF(version)                       == (COM_HSI_OFFSET * sizeof(u32_t) + 0x000) &&  \
104     COM_HSI_OFFSETOFF(fw_doorbell)                   == (COM_HSI_OFFSET * sizeof(u32_t) + 0x010) &&  \
105     COM_HSI_OFFSETOFF(dups)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x014) &&  \
106     COM_HSI_OFFSETOFF(dacks)                         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x018) &&  \
107     COM_HSI_OFFSETOFF(pushs)                         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x01c) &&  \
108     COM_HSI_OFFSETOFF(compbits)                      == (COM_HSI_OFFSET * sizeof(u32_t) + 0x020) &&  \
109     COM_HSI_OFFSETOFF(num_comq)                      == (COM_HSI_OFFSET * sizeof(u32_t) + 0x024) &&  \
110     COM_HSI_OFFSETOFF(num_comtq)                     == (COM_HSI_OFFSET * sizeof(u32_t) + 0x028) &&  \
111     COM_HSI_OFFSETOFF(num_comxq)                     == (COM_HSI_OFFSET * sizeof(u32_t) + 0x02c) &&  \
112     COM_HSI_OFFSETOFF(unused_num_fail_reloads)       == (COM_HSI_OFFSET * sizeof(u32_t) + 0x030) &&  \
113     COM_HSI_OFFSETOFF(rx_place)                      == (COM_HSI_OFFSET * sizeof(u32_t) + 0x034) &&  \
114     COM_HSI_OFFSETOFF(rtxs)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x038) &&  \
115     COM_HSI_OFFSETOFF(min_rto_tick)                  == (COM_HSI_OFFSET * sizeof(u32_t) + 0x03c) &&  \
116     COM_HSI_OFFSETOFF(max_rto_tick)                  == (COM_HSI_OFFSET * sizeof(u32_t) + 0x040) &&  \
117     COM_HSI_OFFSETOFF(max_caf)                       == (COM_HSI_OFFSET * sizeof(u32_t) + 0x044) &&  \
118     COM_HSI_OFFSETOFF(false_ooo_fin_cnt)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x048) &&  \
119     COM_HSI_OFFSETOFF(l2_forward_to_mcp)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x04c) &&  \
120     COM_HSI_OFFSETOFF(l2_drop_mcpq_busy)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x050) &&  \
121     COM_HSI_OFFSETOFF(drtxs)                         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x054) &&  \
122     COM_HSI_OFFSETOFF(abort_ooo_fin_cnt)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x058) &&  \
123     COM_HSI_OFFSETOFF(total_ooo_fin_cnt)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x05c) &&  \
124     COM_HSI_OFFSETOFF(caus)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x060) &&  \
125     COM_HSI_OFFSETOFF(dtic)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x064) &&  \
126     COM_HSI_OFFSETOFF(defer_ooo_fin_cnt)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x068) &&  \
127     COM_HSI_OFFSETOFF(l4_drop_cnt)                   == (COM_HSI_OFFSET * sizeof(u32_t) + 0x06c) &&  \
128     COM_HSI_OFFSETOFF(cozr)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x070) &&  \
129     COM_HSI_OFFSETOFF(com_l2_no_buffer)              == (COM_HSI_OFFSET * sizeof(u32_t) + 0x074) &&  \
130     COM_HSI_OFFSETOFF(com_cu_host_bseq)              == (COM_HSI_OFFSET * sizeof(u32_t) + 0x078) &&  \
131     COM_HSI_OFFSETOFF(tnda)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x07c) &&  \
132     COM_HSI_OFFSETOFF(tcnas)                         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x080) &&  \
133     COM_HSI_OFFSETOFF(tccas)                         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x084) &&  \
134     COM_HSI_OFFSETOFF(caf)                           == (COM_HSI_OFFSET * sizeof(u32_t) + 0x088) &&  \
135     COM_HSI_OFFSETOFF(cmpl_dbg_cnt)                  == (COM_HSI_OFFSET * sizeof(u32_t) + 0x08c) &&  \
136     COM_HSI_OFFSETOFF(hcwa_kwq_cons_idx)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x090) &&  \
137     COM_HSI_OFFSETOFF(hcwa_last_kwq_cons_idx)        == (COM_HSI_OFFSET * sizeof(u32_t) + 0x094) &&  \
138     COM_HSI_OFFSETOFF(eaiv)                          == (COM_HSI_OFFSET * sizeof(u32_t) + 0x098) &&  \
139     COM_HSI_OFFSETOFF(reload_aft_fin_cnt)            == (COM_HSI_OFFSET * sizeof(u32_t) + 0x09c) &&  \
140     COM_HSI_OFFSETOFF(enable_fast_iscsi_response)    == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0a0) &&  \
141     COM_HSI_OFFSETOFF(tsch_restart)                  == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0a4) &&  \
142     COM_HSI_OFFSETOFF(idle_count)                    == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0a8) &&  \
143     COM_HSI_OFFSETOFF(iscsi_rtxs)                    == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0b0) &&  \
144     COM_HSI_OFFSETOFF(iscsi_cq_size)                 == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0b4) &&  \
145     COM_HSI_OFFSETOFF(iscsi_cq_cqes_per_page)        == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0b8) &&  \
146     COM_HSI_OFFSETOFF(iscsi_cq_num_pages)            == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0bc) &&  \
147     COM_HSI_OFFSETOFF(iscsi_cq_cqes_per_page_log2)   == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0c0) &&  \
148     COM_HSI_OFFSETOFF(iscsi_data_dig_err)            == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0c4) &&  \
149     COM_HSI_OFFSETOFF(iscsi_tcp_config)              == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0c8) &&  \
150     COM_HSI_OFFSETOFF(iscsi_teton_l4_cmd_offset)     == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0cc) &&  \
151     COM_HSI_OFFSETOFF(iscsi_teton_l5_offset)         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0d0) &&  \
152     COM_HSI_OFFSETOFF(iscsi_teton_l5_cmd_offset)     == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0d4) &&  \
153     COM_HSI_OFFSETOFF(iscsi_task_offset)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0d8) &&  \
154     COM_HSI_OFFSETOFF(iscsi_r2tq_offset)             == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0dc) &&  \
155     COM_HSI_OFFSETOFF(iscsi_max_num_of_tasks)        == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0e0) &&  \
156     COM_HSI_OFFSETOFF(iscsi_max_num_of_ccells)       == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0e4) &&  \
157     COM_HSI_OFFSETOFF(com_cu_buf_size)               == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0e8) &&  \
158     COM_HSI_OFFSETOFF(com_l2_iscsi_no_buffer)        == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0ec) &&  \
159     COM_HSI_OFFSETOFF(com_unicast_no_buffer)         == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0f0) &&  \
160     COM_HSI_OFFSETOFF(com_mcast_no_buffer)           == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0f4) &&  \
161     COM_HSI_OFFSETOFF(com_bcast_no_buffer)           == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0f8) &&  \
162     COM_HSI_OFFSETOFF(l2_drop_pkt_cnt)               == (COM_HSI_OFFSET * sizeof(u32_t) + 0x0fc) &&  \
163     COM_HSI_OFFSETOFF(com_cu_free_cnt)               == (COM_HSI_OFFSET * sizeof(u32_t) + 0x100) &&  \
164     COM_HSI_OFFSETOFF(cu_rate_limiter_enable)        == (COM_HSI_OFFSET * sizeof(u32_t) + 0x104) &&  \
165     COM_HSI_OFFSETOFF(cu_rate_limiter_enable)+COM_HSI_SIZEOF(cu_rate_limiter_enable) == (COM_HSI_OFFSET * sizeof(u32_t) + sizeof(com_hsi_t)));}}
166 
167 #endif
168 
169