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_UTILS_H
7#define HW_ATL2_UTILS_H
8
9#include "aq_hw.h"
10
11/* F W    A P I */
12
13struct link_options_s {
14	u8 link_up:1;
15	u8 link_renegotiate:1;
16	u8 minimal_link_speed:1;
17	u8 internal_loopback:1;
18	u8 external_loopback:1;
19	u8 rate_10M_hd:1;
20	u8 rate_100M_hd:1;
21	u8 rate_1G_hd:1;
22
23	u8 rate_10M:1;
24	u8 rate_100M:1;
25	u8 rate_1G:1;
26	u8 rate_2P5G:1;
27	u8 rate_N2P5G:1;
28	u8 rate_5G:1;
29	u8 rate_N5G:1;
30	u8 rate_10G:1;
31
32	u8 eee_100M:1;
33	u8 eee_1G:1;
34	u8 eee_2P5G:1;
35	u8 eee_5G:1;
36	u8 eee_10G:1;
37	u8 rsvd3:3;
38
39	u8 pause_rx:1;
40	u8 pause_tx:1;
41	u8 rsvd4:1;
42	u8 downshift:1;
43	u8 downshift_retry:4;
44};
45
46struct link_control_s {
47	u8 mode:4;
48	u8 disable_crc_corruption:1;
49	u8 discard_short_frames:1;
50	u8 flow_control_mode:1;
51	u8 disable_length_check:1;
52
53	u8 discard_errored_frames:1;
54	u8 control_frame_enable:1;
55	u8 enable_tx_padding:1;
56	u8 enable_crc_forwarding:1;
57	u8 enable_frame_padding_removal_rx: 1;
58	u8 promiscuous_mode: 1;
59	u8 rsvd:2;
60
61	u16 rsvd2;
62};
63
64struct thermal_shutdown_s {
65	u8 enable:1;
66	u8 warning_enable:1;
67	u8 rsvd:6;
68
69	u8 shutdown_temperature;
70	u8 cold_temperature;
71	u8 warning_temperature;
72};
73
74struct mac_address_s {
75	u8 mac_address[6];
76};
77
78struct mac_address_aligned_s {
79	struct mac_address_s aligned;
80	u16 rsvd;
81};
82
83struct sleep_proxy_s {
84	struct wake_on_lan_s {
85		u8 wake_on_magic_packet:1;
86		u8 wake_on_pattern:1;
87		u8 wake_on_link_up:1;
88		u8 wake_on_link_down:1;
89		u8 wake_on_ping:1;
90		u8 wake_on_timer:1;
91		u8 rsvd:2;
92
93		u8 rsvd2;
94		u16 rsvd3;
95
96		u32 link_up_timeout;
97		u32 link_down_timeout;
98		u32 timer;
99	} wake_on_lan;
100
101	struct {
102		u32 mask[4];
103		u32 crc32;
104	} wake_up_pattern[8];
105
106	struct __packed {
107		u8 arp_responder:1;
108		u8 echo_responder:1;
109		u8 igmp_client:1;
110		u8 echo_truncate:1;
111		u8 address_guard:1;
112		u8 ignore_fragmented:1;
113		u8 rsvd:2;
114
115		u16 echo_max_len;
116		u8 rsvd2;
117	} ipv4_offload;
118
119	u32 ipv4_offload_addr[8];
120	u32 reserved[8];
121
122	struct __packed {
123		u8 ns_responder:1;
124		u8 echo_responder:1;
125		u8 mld_client:1;
126		u8 echo_truncate:1;
127		u8 address_guard:1;
128		u8 rsvd:3;
129
130		u16 echo_max_len;
131		u8 rsvd2;
132	} ipv6_offload;
133
134	u32 ipv6_offload_addr[16][4];
135
136	struct {
137		u16 port[16];
138	} tcp_port_offload;
139
140	struct {
141		u16 port[16];
142	} udp_port_offload;
143
144	struct {
145		u32 retry_count;
146		u32 retry_interval;
147	} ka4_offload;
148
149	struct {
150		u32 timeout;
151		u16 local_port;
152		u16 remote_port;
153		u8 remote_mac_addr[6];
154		u16 rsvd;
155		u32 rsvd2;
156		u32 rsvd3;
157		u16 rsvd4;
158		u16 win_size;
159		u32 seq_num;
160		u32 ack_num;
161		u32 local_ip;
162		u32 remote_ip;
163	} ka4_connection[16];
164
165	struct {
166		u32 retry_count;
167		u32 retry_interval;
168	} ka6_offload;
169
170	struct {
171		u32 timeout;
172		u16 local_port;
173		u16 remote_port;
174		u8 remote_mac_addr[6];
175		u16 rsvd;
176		u32 rsvd2;
177		u32 rsvd3;
178		u16 rsvd4;
179		u16 win_size;
180		u32 seq_num;
181		u32 ack_num;
182		u32 local_ip[4];
183		u32 remote_ip[4];
184	} ka6_connection[16];
185
186	struct {
187		u32 rr_count;
188		u32 rr_buf_len;
189		u32 idx_offset;
190		u32 rr__offset;
191	} mdns_offload;
192};
193
194struct pause_quanta_s {
195	u16 quanta_10M;
196	u16 threshold_10M;
197	u16 quanta_100M;
198	u16 threshold_100M;
199	u16 quanta_1G;
200	u16 threshold_1G;
201	u16 quanta_2P5G;
202	u16 threshold_2P5G;
203	u16 quanta_5G;
204	u16 threshold_5G;
205	u16 quanta_10G;
206	u16 threshold_10G;
207};
208
209struct data_buffer_status_s {
210	u32 data_offset;
211	u32 data_length;
212};
213
214struct device_caps_s {
215	u8 finite_flashless:1;
216	u8 cable_diag:1;
217	u8 ncsi:1;
218	u8 avb:1;
219	u8 rsvd:4;
220
221	u8 rsvd2;
222	u16 rsvd3;
223	u32 rsvd4;
224};
225
226struct version_s {
227	struct bundle_version_t {
228		u8 major;
229		u8 minor;
230		u16 build;
231	} bundle;
232	struct mac_version_t {
233		u8 major;
234		u8 minor;
235		u16 build;
236	} mac;
237	struct phy_version_t {
238		u8 major;
239		u8 minor;
240		u16 build;
241	} phy;
242	u32 drv_iface_ver:4;
243	u32 rsvd:28;
244};
245
246struct link_status_s {
247	u8 link_state:4;
248	u8 link_rate:4;
249
250	u8 pause_tx:1;
251	u8 pause_rx:1;
252	u8 eee:1;
253	u8 duplex:1;
254	u8 rsvd:4;
255
256	u16 rsvd2;
257};
258
259struct wol_status_s {
260	u8 wake_count;
261	u8 wake_reason;
262
263	u16 wake_up_packet_length :12;
264	u16 wake_up_pattern_number :3;
265	u16 rsvd:1;
266
267	u32 wake_up_packet[379];
268};
269
270struct mac_health_monitor_s {
271	u8 mac_ready:1;
272	u8 mac_fault:1;
273	u8 mac_flashless_finished:1;
274	u8 rsvd:5;
275
276	u8 mac_temperature;
277	u16 mac_heart_beat;
278	u16 mac_fault_code;
279	u16 rsvd2;
280};
281
282struct phy_health_monitor_s {
283	u8 phy_ready:1;
284	u8 phy_fault:1;
285	u8 phy_hot_warning:1;
286	u8 rsvd:5;
287
288	u8 phy_temperature;
289	u16 phy_heart_beat;
290	u16 phy_fault_code;
291	u16 rsvd2;
292};
293
294struct device_link_caps_s {
295	u8 rsvd:3;
296	u8 internal_loopback:1;
297	u8 external_loopback:1;
298	u8 rate_10M_hd:1;
299	u8 rate_100M_hd:1;
300	u8 rate_1G_hd:1;
301
302	u8 rate_10M:1;
303	u8 rate_100M:1;
304	u8 rate_1G:1;
305	u8 rate_2P5G:1;
306	u8 rate_N2P5G:1;
307	u8 rate_5G:1;
308	u8 rate_N5G:1;
309	u8 rate_10G:1;
310
311	u8 rsvd3:1;
312	u8 eee_100M:1;
313	u8 eee_1G:1;
314	u8 eee_2P5G:1;
315	u8 rsvd4:1;
316	u8 eee_5G:1;
317	u8 rsvd5:1;
318	u8 eee_10G:1;
319
320	u8 pause_rx:1;
321	u8 pause_tx:1;
322	u8 pfc:1;
323	u8 downshift:1;
324	u8 downshift_retry:4;
325};
326
327struct sleep_proxy_caps_s {
328	u8 ipv4_offload:1;
329	u8 ipv6_offload:1;
330	u8 tcp_port_offload:1;
331	u8 udp_port_offload:1;
332	u8 ka4_offload:1;
333	u8 ka6_offload:1;
334	u8 mdns_offload:1;
335	u8 wake_on_ping:1;
336
337	u8 wake_on_magic_packet:1;
338	u8 wake_on_pattern:1;
339	u8 wake_on_timer:1;
340	u8 wake_on_link:1;
341	u8 wake_patterns_count:4;
342
343	u8 ipv4_count;
344	u8 ipv6_count;
345
346	u8 tcp_port_offload_count;
347	u8 udp_port_offload_count;
348
349	u8 tcp4_ka_count;
350	u8 tcp6_ka_count;
351
352	u8 igmp_offload:1;
353	u8 mld_offload:1;
354	u8 rsvd:6;
355
356	u8 rsvd2;
357	u16 rsvd3;
358};
359
360struct lkp_link_caps_s {
361	u8 rsvd:5;
362	u8 rate_10M_hd:1;
363	u8 rate_100M_hd:1;
364	u8 rate_1G_hd:1;
365
366	u8 rate_10M:1;
367	u8 rate_100M:1;
368	u8 rate_1G:1;
369	u8 rate_2P5G:1;
370	u8 rate_N2P5G:1;
371	u8 rate_5G:1;
372	u8 rate_N5G:1;
373	u8 rate_10G:1;
374
375	u8 rsvd2:1;
376	u8 eee_100M:1;
377	u8 eee_1G:1;
378	u8 eee_2P5G:1;
379	u8 rsvd3:1;
380	u8 eee_5G:1;
381	u8 rsvd4:1;
382	u8 eee_10G:1;
383
384	u8 pause_rx:1;
385	u8 pause_tx:1;
386	u8 rsvd5:6;
387};
388
389struct core_dump_s {
390	u32 reg0;
391	u32 reg1;
392	u32 reg2;
393
394	u32 hi;
395	u32 lo;
396
397	u32 regs[32];
398};
399
400struct trace_s {
401	u32 sync_counter;
402	u32 mem_buffer[0x1ff];
403};
404
405struct cable_diag_control_s {
406	u8 toggle :1;
407	u8 rsvd:7;
408
409	u8 wait_timeout_sec;
410	u16 rsvd2;
411};
412
413struct cable_diag_lane_data_s {
414	u8 result_code;
415	u8 dist;
416	u8 far_dist;
417	u8 rsvd;
418};
419
420struct cable_diag_status_s {
421	struct cable_diag_lane_data_s lane_data[4];
422	u8 transact_id;
423	u8 status:4;
424	u8 rsvd:4;
425	u16 rsvd2;
426};
427
428struct statistics_a0_s {
429	struct {
430		u32 link_up;
431		u32 link_down;
432	} link;
433
434	struct {
435		u64 tx_unicast_octets;
436		u64 tx_multicast_octets;
437		u64 tx_broadcast_octets;
438		u64 rx_unicast_octets;
439		u64 rx_multicast_octets;
440		u64 rx_broadcast_octets;
441
442		u32 tx_unicast_frames;
443		u32 tx_multicast_frames;
444		u32 tx_broadcast_frames;
445		u32 tx_errors;
446
447		u32 rx_unicast_frames;
448		u32 rx_multicast_frames;
449		u32 rx_broadcast_frames;
450		u32 rx_dropped_frames;
451		u32 rx_error_frames;
452
453		u32 tx_good_frames;
454		u32 rx_good_frames;
455		u32 reserve_fw_gap;
456	} msm;
457	u32 main_loop_cycles;
458	u32 reserve_fw_gap;
459};
460
461struct __packed statistics_b0_s {
462	u64 rx_good_octets;
463	u64 rx_pause_frames;
464	u64 rx_good_frames;
465	u64 rx_errors;
466	u64 rx_unicast_frames;
467	u64 rx_multicast_frames;
468	u64 rx_broadcast_frames;
469
470	u64 tx_good_octets;
471	u64 tx_pause_frames;
472	u64 tx_good_frames;
473	u64 tx_errors;
474	u64 tx_unicast_frames;
475	u64 tx_multicast_frames;
476	u64 tx_broadcast_frames;
477
478	u32 main_loop_cycles;
479};
480
481struct __packed statistics_s {
482	union __packed {
483		struct statistics_a0_s a0;
484		struct statistics_b0_s b0;
485	};
486};
487
488struct filter_caps_s {
489	u8 l2_filters_base_index:6;
490	u8 flexible_filter_mask:2;
491	u8 l2_filter_count;
492	u8 ethertype_filter_base_index;
493	u8 ethertype_filter_count;
494
495	u8 vlan_filter_base_index;
496	u8 vlan_filter_count;
497	u8 l3_ip4_filter_base_index:4;
498	u8 l3_ip4_filter_count:4;
499	u8 l3_ip6_filter_base_index:4;
500	u8 l3_ip6_filter_count:4;
501
502	u8 l4_filter_base_index:4;
503	u8 l4_filter_count:4;
504	u8 l4_flex_filter_base_index:4;
505	u8 l4_flex_filter_count:4;
506	u8 rslv_tbl_base_index;
507	u8 rslv_tbl_count;
508};
509
510struct request_policy_s {
511	struct {
512		u8 all:1;
513		u8 mcast:1;
514		u8 rx_queue_tc_index:5;
515		u8 queue_or_tc:1;
516	} promisc;
517
518	struct {
519		u8 accept:1;
520		u8 rsvd:1;
521		u8 rx_queue_tc_index:5;
522		u8 queue_or_tc:1;
523	} bcast;
524
525	struct {
526		u8 accept:1;
527		u8 rsvd:1;
528		u8 rx_queue_tc_index:5;
529		u8 queue_or_tc:1;
530	} mcast;
531
532	u8 rsvd:8;
533};
534
535struct fw_interface_in {
536	u32 mtu;
537	u32 rsvd1;
538	struct mac_address_aligned_s mac_address;
539	struct link_control_s link_control;
540	u32 rsvd2;
541	struct link_options_s link_options;
542	u32 rsvd3;
543	struct thermal_shutdown_s thermal_shutdown;
544	u32 rsvd4;
545	struct sleep_proxy_s sleep_proxy;
546	u32 rsvd5;
547	struct pause_quanta_s pause_quanta[8];
548	struct cable_diag_control_s cable_diag_control;
549	u32 rsvd6;
550	struct data_buffer_status_s data_buffer_status;
551	u32 rsvd7;
552	struct request_policy_s request_policy;
553};
554
555struct transaction_counter_s {
556	u16 transaction_cnt_a;
557	u16 transaction_cnt_b;
558};
559
560struct management_status_s {
561	struct mac_address_s mac_address;
562	u16 vlan;
563
564	struct{
565		u32 enable : 1;
566		u32 rsvd:31;
567	} flags;
568
569	u32 rsvd1;
570	u32 rsvd2;
571	u32 rsvd3;
572	u32 rsvd4;
573	u32 rsvd5;
574};
575
576struct __packed fw_interface_out {
577	struct transaction_counter_s transaction_id;
578	struct version_s version;
579	struct link_status_s link_status;
580	struct wol_status_s wol_status;
581	u32 rsvd;
582	u32 rsvd2;
583	struct mac_health_monitor_s mac_health_monitor;
584	u32 rsvd3;
585	u32 rsvd4;
586	struct phy_health_monitor_s phy_health_monitor;
587	u32 rsvd5;
588	u32 rsvd6;
589	struct cable_diag_status_s cable_diag_status;
590	u32 rsvd7;
591	struct device_link_caps_s device_link_caps;
592	u32 rsvd8;
593	struct sleep_proxy_caps_s sleep_proxy_caps;
594	u32 rsvd9;
595	struct lkp_link_caps_s lkp_link_caps;
596	u32 rsvd10;
597	struct core_dump_s core_dump;
598	u32 rsvd11;
599	struct statistics_s stats;
600	struct filter_caps_s filter_caps;
601	struct device_caps_s device_caps;
602	u32 rsvd13;
603	struct management_status_s management_status;
604	u32 reserve[21];
605	struct trace_s trace;
606};
607
608#define  AQ_A2_FW_LINK_RATE_INVALID 0
609#define  AQ_A2_FW_LINK_RATE_10M     1
610#define  AQ_A2_FW_LINK_RATE_100M    2
611#define  AQ_A2_FW_LINK_RATE_1G      3
612#define  AQ_A2_FW_LINK_RATE_2G5     4
613#define  AQ_A2_FW_LINK_RATE_5G      5
614#define  AQ_A2_FW_LINK_RATE_10G     6
615
616#define  AQ_HOST_MODE_INVALID      0U
617#define  AQ_HOST_MODE_ACTIVE       1U
618#define  AQ_HOST_MODE_SLEEP_PROXY  2U
619#define  AQ_HOST_MODE_LOW_POWER    3U
620#define  AQ_HOST_MODE_SHUTDOWN     4U
621
622#define  AQ_A2_FW_INTERFACE_A0     0
623#define  AQ_A2_FW_INTERFACE_B0     1
624
625int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops);
626
627int hw_atl2_utils_soft_reset(struct aq_hw_s *self);
628
629u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self);
630
631int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self,
632						u8 *base_index, u8 *count);
633
634extern const struct aq_fw_ops aq_a2_fw_ops;
635
636#endif /* HW_ATL2_UTILS_H */
637