1
2
3
4
5#ifndef _HNS3_ETHDEV_H_
6#define _HNS3_ETHDEV_H_
7
8#include <pthread.h>
9#include <sys/time.h>
10#include <ethdev_driver.h>
11#include <rte_byteorder.h>
12#include <rte_io.h>
13#include <rte_spinlock.h>
14
15#include "hns3_cmd.h"
16#include "hns3_mbx.h"
17#include "hns3_rss.h"
18#include "hns3_fdir.h"
19#include "hns3_stats.h"
20#include "hns3_tm.h"
21
22
23#define PCI_VENDOR_ID_HUAWEI 0x19e5
24
25
26#define HNS3_DEV_ID_GE 0xA220
27#define HNS3_DEV_ID_25GE 0xA221
28#define HNS3_DEV_ID_25GE_RDMA 0xA222
29#define HNS3_DEV_ID_50GE_RDMA 0xA224
30#define HNS3_DEV_ID_100G_RDMA_MACSEC 0xA226
31#define HNS3_DEV_ID_200G_RDMA 0xA228
32#define HNS3_DEV_ID_100G_VF 0xA22E
33#define HNS3_DEV_ID_100G_RDMA_PFC_VF 0xA22F
34
35
36#define HNS3_PCI_REVISION_ID 0x08
37#define HNS3_PCI_REVISION_ID_LEN 1
38
39#define PCI_REVISION_ID_HIP08_B 0x21
40#define PCI_REVISION_ID_HIP09_A 0x30
41
42#define HNS3_PF_FUNC_ID 0
43#define HNS3_1ST_VF_FUNC_ID 1
44
45#define HNS3_DEFAULT_PORT_CONF_BURST_SIZE 32
46#define HNS3_DEFAULT_PORT_CONF_QUEUES_NUM 1
47
48#define HNS3_SW_SHIFT_AND_DISCARD_MODE 0
49#define HNS3_HW_SHIFT_AND_DISCARD_MODE 1
50
51#define HNS3_UNLIMIT_PROMISC_MODE 0
52#define HNS3_LIMIT_PROMISC_MODE 1
53
54#define HNS3_SPECIAL_PORT_SW_CKSUM_MODE 0
55#define HNS3_SPECIAL_PORT_HW_CKSUM_MODE 1
56
57#define HNS3_UC_MACADDR_NUM 128
58#define HNS3_VF_UC_MACADDR_NUM 48
59#define HNS3_MC_MACADDR_NUM 128
60
61#define HNS3_MAX_BD_SIZE 65535
62#define HNS3_MAX_NON_TSO_BD_PER_PKT 8
63#define HNS3_MAX_TSO_BD_PER_PKT 63
64#define HNS3_MAX_FRAME_LEN 9728
65#define HNS3_VLAN_TAG_SIZE 4
66#define HNS3_DEFAULT_RX_BUF_LEN 2048
67#define HNS3_MAX_BD_PAYLEN (1024 * 1024 - 1)
68#define HNS3_MAX_TSO_HDR_SIZE 512
69#define HNS3_MAX_TSO_HDR_BD_NUM 3
70#define HNS3_MAX_LRO_SIZE 64512
71
72#define HNS3_ETH_OVERHEAD \
73 (RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN + HNS3_VLAN_TAG_SIZE * 2)
74#define HNS3_PKTLEN_TO_MTU(pktlen) ((pktlen) - HNS3_ETH_OVERHEAD)
75#define HNS3_MAX_MTU (HNS3_MAX_FRAME_LEN - HNS3_ETH_OVERHEAD)
76#define HNS3_DEFAULT_MTU 1500UL
77#define HNS3_DEFAULT_FRAME_LEN (HNS3_DEFAULT_MTU + HNS3_ETH_OVERHEAD)
78#define HNS3_HIP08_MIN_TX_PKT_LEN 33
79#define HNS3_HIP09_MIN_TX_PKT_LEN 9
80
81#define HNS3_BITS_PER_BYTE 8
82
83#define HNS3_4_TCS 4
84#define HNS3_8_TCS 8
85
86#define HNS3_MAX_PF_NUM 8
87#define HNS3_UMV_TBL_SIZE 3072
88#define HNS3_DEFAULT_UMV_SPACE_PER_PF \
89 (HNS3_UMV_TBL_SIZE / HNS3_MAX_PF_NUM)
90
91#define HNS3_PF_CFG_BLOCK_SIZE 32
92#define HNS3_PF_CFG_DESC_NUM \
93 (HNS3_PF_CFG_BLOCK_SIZE / HNS3_CFG_RD_LEN_BYTES)
94
95#define HNS3_DEFAULT_ENABLE_PFC_NUM 0
96
97#define HNS3_INTR_UNREG_FAIL_RETRY_CNT 5
98#define HNS3_INTR_UNREG_FAIL_DELAY_MS 500
99
100#define HNS3_QUIT_RESET_CNT 10
101#define HNS3_QUIT_RESET_DELAY_MS 100
102
103#define HNS3_POLL_RESPONE_MS 1
104
105#define HNS3_MAX_USER_PRIO 8
106#define HNS3_PG_NUM 4
107enum hns3_fc_mode {
108 HNS3_FC_NONE,
109 HNS3_FC_RX_PAUSE,
110 HNS3_FC_TX_PAUSE,
111 HNS3_FC_FULL,
112 HNS3_FC_DEFAULT
113};
114
115#define HNS3_SCH_MODE_SP 0
116#define HNS3_SCH_MODE_DWRR 1
117struct hns3_pg_info {
118 uint8_t pg_id;
119 uint8_t pg_sch_mode;
120 uint8_t tc_bit_map;
121 uint32_t bw_limit;
122 uint8_t tc_dwrr[HNS3_MAX_TC_NUM];
123};
124
125struct hns3_tc_info {
126 uint8_t tc_id;
127 uint8_t tc_sch_mode;
128 uint8_t pgid;
129 uint32_t bw_limit;
130 uint8_t up_to_tc_map;
131};
132
133struct hns3_dcb_info {
134 uint8_t num_tc;
135 uint8_t num_pg;
136 uint8_t pg_dwrr[HNS3_PG_NUM];
137 uint8_t prio_tc[HNS3_MAX_USER_PRIO];
138 struct hns3_pg_info pg_info[HNS3_PG_NUM];
139 struct hns3_tc_info tc_info[HNS3_MAX_TC_NUM];
140 uint8_t hw_pfc_map;
141 uint8_t pfc_en;
142};
143
144enum hns3_fc_status {
145 HNS3_FC_STATUS_NONE,
146 HNS3_FC_STATUS_MAC_PAUSE,
147 HNS3_FC_STATUS_PFC,
148};
149
150struct hns3_tc_queue_info {
151 uint16_t tqp_offset;
152 uint16_t tqp_count;
153 uint8_t tc;
154 bool enable;
155};
156
157struct hns3_cfg {
158 uint8_t tc_num;
159 uint16_t tqp_desc_num;
160 uint16_t rx_buf_len;
161 uint16_t rss_size_max;
162 uint8_t phy_addr;
163 uint8_t media_type;
164 uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
165 uint8_t default_speed;
166 uint32_t numa_node_map;
167 uint8_t speed_ability;
168 uint16_t umv_space;
169};
170
171struct hns3_set_link_speed_cfg {
172 uint32_t speed;
173 uint8_t duplex : 1;
174 uint8_t autoneg : 1;
175};
176
177
178enum hns3_media_type {
179 HNS3_MEDIA_TYPE_UNKNOWN,
180 HNS3_MEDIA_TYPE_FIBER,
181 HNS3_MEDIA_TYPE_COPPER,
182 HNS3_MEDIA_TYPE_BACKPLANE,
183 HNS3_MEDIA_TYPE_NONE,
184};
185
186#define HNS3_DEFAULT_QUERY 0
187#define HNS3_ACTIVE_QUERY 1
188
189struct hns3_mac {
190 uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
191 bool default_addr_setted;
192 uint8_t media_type;
193 uint8_t phy_addr;
194 uint8_t link_duplex : 1;
195 uint8_t link_autoneg : 1;
196 uint8_t link_status : 1;
197 uint32_t link_speed;
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217 uint8_t query_type;
218 uint32_t supported_speed;
219 uint32_t advertising;
220 uint32_t lp_advertising;
221 uint8_t support_autoneg;
222};
223
224struct hns3_fake_queue_data {
225 void **rx_queues;
226 void **tx_queues;
227 uint16_t nb_fake_rx_queues;
228 uint16_t nb_fake_tx_queues;
229};
230
231#define HNS3_PORT_BASE_VLAN_DISABLE 0
232#define HNS3_PORT_BASE_VLAN_ENABLE 1
233struct hns3_port_base_vlan_config {
234 uint16_t state;
235 uint16_t pvid;
236};
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277enum hns3_adapter_state {
278 HNS3_NIC_UNINITIALIZED = 0,
279 HNS3_NIC_INITIALIZED,
280 HNS3_NIC_CONFIGURING,
281 HNS3_NIC_CONFIGURED,
282 HNS3_NIC_STARTING,
283 HNS3_NIC_STARTED,
284 HNS3_NIC_STOPPING,
285 HNS3_NIC_CLOSING,
286 HNS3_NIC_CLOSED,
287 HNS3_NIC_REMOVED,
288 HNS3_NIC_NSTATES
289};
290
291
292enum hns3_reset_stage {
293
294 RESET_STAGE_DOWN,
295
296 RESET_STAGE_PREWAIT,
297
298 RESET_STAGE_REQ_HW_RESET,
299
300 RESET_STAGE_WAIT,
301
302 RESET_STAGE_DEV_INIT,
303
304 RESET_STAGE_RESTORE,
305
306 RESET_STAGE_DONE,
307
308 RESET_STAGE_NONE,
309};
310
311enum hns3_reset_level {
312 HNS3_FLR_RESET,
313 HNS3_VF_FUNC_RESET,
314
315
316
317
318
319
320
321 HNS3_VF_PF_FUNC_RESET = 2,
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336 HNS3_VF_FULL_RESET,
337
338
339 HNS3_VF_RESET,
340
341
342
343
344
345
346
347 HNS3_FUNC_RESET = 5,
348
349
350 HNS3_GLOBAL_RESET,
351 HNS3_IMP_RESET,
352 HNS3_NONE_RESET,
353 HNS3_MAX_RESET
354};
355
356enum hns3_wait_result {
357 HNS3_WAIT_UNKNOWN,
358 HNS3_WAIT_REQUEST,
359 HNS3_WAIT_SUCCESS,
360 HNS3_WAIT_TIMEOUT
361};
362
363#define HNS3_RESET_SYNC_US 100000
364
365struct hns3_reset_stats {
366 uint64_t request_cnt;
367 uint64_t global_cnt;
368 uint64_t imp_cnt;
369 uint64_t exec_cnt;
370 uint64_t success_cnt;
371 uint64_t fail_cnt;
372 uint64_t merge_cnt;
373};
374
375typedef bool (*check_completion_func)(struct hns3_hw *hw);
376
377struct hns3_wait_data {
378 void *hns;
379 uint64_t end_ms;
380 uint64_t interval;
381 int16_t count;
382 enum hns3_wait_result result;
383 check_completion_func check_completion;
384};
385
386struct hns3_reset_ops {
387 void (*reset_service)(void *arg);
388 int (*stop_service)(struct hns3_adapter *hns);
389 int (*prepare_reset)(struct hns3_adapter *hns);
390 int (*wait_hardware_ready)(struct hns3_adapter *hns);
391 int (*reinit_dev)(struct hns3_adapter *hns);
392 int (*restore_conf)(struct hns3_adapter *hns);
393 int (*start_service)(struct hns3_adapter *hns);
394};
395
396enum hns3_schedule {
397 SCHEDULE_NONE,
398 SCHEDULE_PENDING,
399 SCHEDULE_REQUESTED,
400 SCHEDULE_DEFERRED,
401};
402
403struct hns3_reset_data {
404 enum hns3_reset_stage stage;
405 uint16_t schedule;
406
407 uint16_t resetting;
408
409 uint16_t disable_cmd;
410
411 enum hns3_reset_level level;
412
413 uint64_t pending;
414
415 uint64_t request;
416 int attempts;
417 int retries;
418
419
420
421
422
423
424
425 bool mbuf_deferred_free;
426 struct timeval start_time;
427 struct hns3_reset_stats stats;
428 const struct hns3_reset_ops *ops;
429 struct hns3_wait_data *wait_data;
430};
431
432#define HNS3_INTR_MAPPING_VEC_RSV_ONE 0
433#define HNS3_INTR_MAPPING_VEC_ALL 1
434
435#define HNS3_INTR_COALESCE_GL_UINT_2US 0
436#define HNS3_INTR_COALESCE_GL_UINT_1US 1
437
438#define HNS3_INTR_QL_NONE 0
439
440struct hns3_queue_intr {
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459 uint8_t mapping_mode;
460
461
462
463
464
465
466 uint8_t gl_unit;
467
468 uint16_t int_ql_max;
469};
470
471#define HNS3_TSO_SW_CAL_PSEUDO_H_CSUM 0
472#define HNS3_TSO_HW_CAL_PSEUDO_H_CSUM 1
473
474#define HNS3_PKTS_DROP_STATS_MODE1 0
475#define HNS3_PKTS_DROP_STATS_MODE2 1
476
477struct hns3_hw {
478 struct rte_eth_dev_data *data;
479 void *io_base;
480 uint8_t revision;
481 struct hns3_cmq cmq;
482 struct hns3_mbx_resp_status mbx_resp;
483 struct hns3_mac mac;
484 unsigned int secondary_cnt;
485 struct hns3_tqp_stats tqp_stats;
486
487 struct hns3_mac_stats mac_stats;
488 struct hns3_rx_missed_stats imissed_stats;
489 uint64_t oerror_stats;
490 uint32_t fw_version;
491 uint16_t pf_vf_if_version;
492
493 uint16_t num_msi;
494 uint16_t total_tqps_num;
495 uint16_t tqps_num;
496 uint16_t intr_tqps_num;
497 uint16_t rss_size_max;
498 uint16_t rx_buf_len;
499 uint16_t num_tx_desc;
500 uint16_t num_rx_desc;
501 uint32_t mng_entry_num;
502 uint32_t mac_entry_num;
503
504 struct rte_ether_addr mc_addrs[HNS3_MC_MACADDR_NUM];
505 int mc_addrs_num;
506
507
508 struct hns3_rss_conf rss_info;
509 bool rss_dis_flag;
510 uint16_t rss_ind_tbl_size;
511 uint16_t rss_key_size;
512
513 uint8_t num_tc;
514 uint8_t hw_tc_map;
515 enum hns3_fc_mode requested_fc_mode;
516 struct hns3_dcb_info dcb_info;
517 enum hns3_fc_status current_fc_status;
518 struct hns3_tc_queue_info tc_queue[HNS3_MAX_TC_NUM];
519 uint16_t used_rx_queues;
520 uint16_t used_tx_queues;
521
522
523 uint16_t cfg_max_queues;
524 struct hns3_fake_queue_data fkq_data;
525 uint16_t alloc_rss_size;
526 uint16_t tx_qnum_per_tc;
527
528 uint32_t capability;
529 uint32_t max_tm_rate;
530
531
532
533
534 uint32_t min_tx_pkt_len;
535
536 struct hns3_queue_intr intr;
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553 uint8_t tso_mode;
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575 uint8_t vlan_mode;
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593 uint8_t promisc_mode;
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610 uint8_t drop_stats_mode;
611
612 uint8_t max_non_tso_bd_num;
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628 uint8_t udp_cksum_mode;
629
630 struct hns3_port_base_vlan_config port_base_vlan_cfg;
631
632 pthread_mutex_t flows_lock;
633 struct hns3_fdir_rule_list flow_fdir_list;
634 struct hns3_rss_filter_list flow_rss_list;
635 struct hns3_flow_mem_list flow_list;
636
637
638
639
640
641
642
643 rte_spinlock_t lock;
644 enum hns3_adapter_state adapter_state;
645 struct hns3_reset_data reset;
646};
647
648#define HNS3_FLAG_TC_BASE_SCH_MODE 1
649#define HNS3_FLAG_VNET_BASE_SCH_MODE 2
650
651
652struct hns3_user_vlan_table {
653 LIST_ENTRY(hns3_user_vlan_table) next;
654 bool hd_tbl_status;
655 uint16_t vlan_id;
656};
657
658
659struct hns3_rx_vtag_cfg {
660 bool rx_vlan_offload_en;
661 bool strip_tag1_en;
662 bool strip_tag2_en;
663
664
665
666
667 bool strip_tag1_discard_en;
668 bool strip_tag2_discard_en;
669
670
671
672
673 bool vlan1_vlan_prionly;
674 bool vlan2_vlan_prionly;
675};
676
677
678struct hns3_tx_vtag_cfg {
679 bool accept_tag1;
680 bool accept_untag1;
681 bool accept_tag2;
682 bool accept_untag2;
683 bool insert_tag1_en;
684 bool insert_tag2_en;
685
686
687
688
689 bool tag_shift_mode_en;
690 uint16_t default_tag1;
691 uint16_t default_tag2;
692};
693
694struct hns3_vtag_cfg {
695 struct hns3_rx_vtag_cfg rx_vcfg;
696 struct hns3_tx_vtag_cfg tx_vcfg;
697};
698
699
700enum hns3_mp_req_type {
701 HNS3_MP_REQ_START_RXTX = 1,
702 HNS3_MP_REQ_STOP_RXTX,
703 HNS3_MP_REQ_MAX
704};
705
706
707struct hns3_mp_param {
708 enum hns3_mp_req_type type;
709 int port_id;
710 int result;
711};
712
713
714#define HNS3_MP_REQ_TIMEOUT_SEC 5
715
716
717#define HNS3_MP_NAME "net_hns3_mp"
718
719#define HNS3_L2TBL_NUM 4
720#define HNS3_L3TBL_NUM 16
721#define HNS3_L4TBL_NUM 16
722#define HNS3_OL2TBL_NUM 4
723#define HNS3_OL3TBL_NUM 16
724#define HNS3_OL4TBL_NUM 16
725#define HNS3_PTYPE_NUM 256
726
727struct hns3_ptype_table {
728
729
730
731
732 uint32_t l3table[HNS3_L3TBL_NUM];
733 uint32_t l4table[HNS3_L4TBL_NUM];
734 uint32_t inner_l3table[HNS3_L3TBL_NUM];
735 uint32_t inner_l4table[HNS3_L4TBL_NUM];
736 uint32_t ol3table[HNS3_OL3TBL_NUM];
737 uint32_t ol4table[HNS3_OL4TBL_NUM];
738
739
740
741
742
743
744 uint32_t ptype[HNS3_PTYPE_NUM] __rte_cache_aligned;
745};
746
747#define HNS3_FIXED_MAX_TQP_NUM_MODE 0
748#define HNS3_FLEX_MAX_TQP_NUM_MODE 1
749
750struct hns3_pf {
751 struct hns3_adapter *adapter;
752 bool is_main_pf;
753 uint16_t func_num;
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774 uint8_t tqp_config_mode;
775
776 uint32_t pkt_buf_size;
777 uint32_t tx_buf_size;
778 uint32_t dv_buf_size;
779
780 uint16_t mps;
781
782 uint8_t tx_sch_mode;
783 uint8_t tc_max;
784 uint8_t local_max_tc;
785 uint8_t pfc_max;
786 uint8_t prio_tc[HNS3_MAX_USER_PRIO];
787 uint16_t pause_time;
788 bool support_fc_autoneg;
789 bool support_multi_tc_pause;
790
791 uint16_t wanted_umv_size;
792 uint16_t max_umv_size;
793 uint16_t used_umv_size;
794
795 bool support_sfp_query;
796 uint32_t fec_mode;
797
798 bool ptp_enable;
799
800
801 uint64_t rx_timestamp;
802
803 struct hns3_vtag_cfg vtag_config;
804 LIST_HEAD(vlan_tbl, hns3_user_vlan_table) vlan_list;
805
806 struct hns3_fdir_info fdir;
807 LIST_HEAD(counters, hns3_flow_counter) flow_counters;
808
809 struct hns3_tm_conf tm_conf;
810};
811
812enum {
813 HNS3_PF_PUSH_LSC_CAP_NOT_SUPPORTED,
814 HNS3_PF_PUSH_LSC_CAP_SUPPORTED,
815 HNS3_PF_PUSH_LSC_CAP_UNKNOWN
816};
817
818struct hns3_vf {
819 struct hns3_adapter *adapter;
820
821
822 uint16_t pf_push_lsc_cap;
823
824
825
826
827
828
829 uint16_t req_link_info_cnt;
830
831 uint16_t poll_job_started;
832};
833
834struct hns3_adapter {
835 struct hns3_hw hw;
836
837
838 bool is_vf;
839 union {
840 struct hns3_pf pf;
841 struct hns3_vf vf;
842 };
843
844 uint32_t rx_func_hint;
845 uint32_t tx_func_hint;
846
847 uint64_t dev_caps_mask;
848
849 struct hns3_ptype_table ptype_tbl __rte_cache_aligned;
850};
851
852enum {
853 HNS3_IO_FUNC_HINT_NONE = 0,
854 HNS3_IO_FUNC_HINT_VEC,
855 HNS3_IO_FUNC_HINT_SVE,
856 HNS3_IO_FUNC_HINT_SIMPLE,
857 HNS3_IO_FUNC_HINT_COMMON
858};
859
860#define HNS3_DEVARG_RX_FUNC_HINT "rx_func_hint"
861#define HNS3_DEVARG_TX_FUNC_HINT "tx_func_hint"
862
863#define HNS3_DEVARG_DEV_CAPS_MASK "dev_caps_mask"
864
865enum {
866 HNS3_DEV_SUPPORT_DCB_B,
867 HNS3_DEV_SUPPORT_COPPER_B,
868 HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B,
869 HNS3_DEV_SUPPORT_PTP_B,
870 HNS3_DEV_SUPPORT_TX_PUSH_B,
871 HNS3_DEV_SUPPORT_INDEP_TXRX_B,
872 HNS3_DEV_SUPPORT_STASH_B,
873 HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
874 HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B,
875 HNS3_DEV_SUPPORT_RAS_IMP_B,
876 HNS3_DEV_SUPPORT_TM_B,
877 HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B,
878};
879
880#define hns3_dev_dcb_supported(hw) \
881 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_DCB_B)
882
883
884#define hns3_dev_copper_supported(hw) \
885 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_COPPER_B)
886
887
888#define hns3_dev_fd_queue_region_supported(hw) \
889 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B)
890
891
892#define hns3_dev_ptp_supported(hw) \
893 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_PTP_B)
894
895
896#define hns3_dev_indep_txrx_supported(hw) \
897 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_INDEP_TXRX_B)
898
899#define hns3_dev_stash_supported(hw) \
900 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_STASH_B)
901
902#define hns3_dev_rxd_adv_layout_supported(hw) \
903 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B)
904
905#define hns3_dev_outer_udp_cksum_supported(hw) \
906 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B)
907
908#define hns3_dev_ras_imp_supported(hw) \
909 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_RAS_IMP_B)
910
911#define hns3_dev_tx_push_supported(hw) \
912 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_TX_PUSH_B)
913
914#define hns3_dev_tm_supported(hw) \
915 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_TM_B)
916
917#define hns3_dev_vf_vlan_flt_supported(hw) \
918 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B)
919
920#define HNS3_DEV_PRIVATE_TO_HW(adapter) \
921 (&((struct hns3_adapter *)adapter)->hw)
922#define HNS3_DEV_PRIVATE_TO_PF(adapter) \
923 (&((struct hns3_adapter *)adapter)->pf)
924#define HNS3_DEV_PRIVATE_TO_VF(adapter) \
925 (&((struct hns3_adapter *)adapter)->vf)
926#define HNS3_DEV_HW_TO_ADAPTER(hw) \
927 container_of(hw, struct hns3_adapter, hw)
928
929static inline struct hns3_pf *HNS3_DEV_HW_TO_PF(struct hns3_hw *hw)
930{
931 struct hns3_adapter *adapter = HNS3_DEV_HW_TO_ADAPTER(hw);
932 return &adapter->pf;
933}
934
935static inline struct hns3_vf *HNS3_DEV_HW_TO_VF(struct hns3_hw *hw)
936{
937 struct hns3_adapter *adapter = HNS3_DEV_HW_TO_ADAPTER(hw);
938 return &adapter->vf;
939}
940
941#define hns3_set_field(origin, mask, shift, val) \
942 do { \
943 (origin) &= (~(mask)); \
944 (origin) |= ((val) << (shift)) & (mask); \
945 } while (0)
946#define hns3_get_field(origin, mask, shift) \
947 (((origin) & (mask)) >> (shift))
948#define hns3_set_bit(origin, shift, val) \
949 hns3_set_field((origin), (0x1UL << (shift)), (shift), (val))
950#define hns3_get_bit(origin, shift) \
951 hns3_get_field((origin), (0x1UL << (shift)), (shift))
952
953#define hns3_gen_field_val(mask, shift, val) (((val) << (shift)) & (mask))
954
955
956
957
958
959
960
961#define upper_32_bits(n) ((uint32_t)(((n) >> 16) >> 16))
962
963
964#define lower_32_bits(n) ((uint32_t)(n))
965
966#define BIT(nr) (1UL << (nr))
967
968#define BIT_ULL(x) (1ULL << (x))
969
970#define BITS_PER_LONG (__SIZEOF_LONG__ * 8)
971#define GENMASK(h, l) \
972 (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
973
974#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
975#define rounddown(x, y) ((x) - ((x) % (y)))
976
977#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992static inline void hns3_write_reg(void *base, uint32_t reg, uint32_t value)
993{
994 rte_write32(rte_cpu_to_le_32(value),
995 (volatile void *)((char *)base + reg));
996}
997
998
999
1000
1001
1002
1003static inline void hns3_write_reg_opt(volatile void *addr, uint32_t value)
1004{
1005 rte_write32(rte_cpu_to_le_32(value), addr);
1006}
1007
1008static inline uint32_t hns3_read_reg(void *base, uint32_t reg)
1009{
1010 uint32_t read_val = rte_read32((volatile void *)((char *)base + reg));
1011 return rte_le_to_cpu_32(read_val);
1012}
1013
1014#define hns3_write_dev(a, reg, value) \
1015 hns3_write_reg((a)->io_base, (reg), (value))
1016
1017#define hns3_read_dev(a, reg) \
1018 hns3_read_reg((a)->io_base, (reg))
1019
1020#define NEXT_ITEM_OF_ACTION(act, actions, index) \
1021 do { \
1022 act = (actions) + (index); \
1023 while (act->type == RTE_FLOW_ACTION_TYPE_VOID) { \
1024 (index)++; \
1025 act = actions + index; \
1026 } \
1027 } while (0)
1028
1029#define MSEC_PER_SEC 1000L
1030#define USEC_PER_MSEC 1000L
1031
1032void hns3_clock_gettime(struct timeval *tv);
1033uint64_t hns3_clock_calctime_ms(struct timeval *tv);
1034uint64_t hns3_clock_gettime_ms(void);
1035
1036static inline uint64_t
1037hns3_atomic_test_bit(unsigned int nr, volatile uint64_t *addr)
1038{
1039 uint64_t res;
1040
1041 res = (__atomic_load_n(addr, __ATOMIC_RELAXED) & (1UL << nr)) != 0;
1042 return res;
1043}
1044
1045static inline void
1046hns3_atomic_set_bit(unsigned int nr, volatile uint64_t *addr)
1047{
1048 __atomic_fetch_or(addr, (1UL << nr), __ATOMIC_RELAXED);
1049}
1050
1051static inline void
1052hns3_atomic_clear_bit(unsigned int nr, volatile uint64_t *addr)
1053{
1054 __atomic_fetch_and(addr, ~(1UL << nr), __ATOMIC_RELAXED);
1055}
1056
1057static inline int64_t
1058hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr)
1059{
1060 uint64_t mask = (1UL << nr);
1061
1062 return __atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED) & mask;
1063}
1064
1065int hns3_buffer_alloc(struct hns3_hw *hw);
1066int hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
1067 const struct rte_flow_ops **ops);
1068bool hns3_is_reset_pending(struct hns3_adapter *hns);
1069bool hns3vf_is_reset_pending(struct hns3_adapter *hns);
1070void hns3_update_linkstatus_and_event(struct hns3_hw *hw, bool query);
1071void hns3_ether_format_addr(char *buf, uint16_t size,
1072 const struct rte_ether_addr *ether_addr);
1073int hns3_dev_infos_get(struct rte_eth_dev *eth_dev,
1074 struct rte_eth_dev_info *info);
1075void hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status,
1076 uint32_t link_speed, uint8_t link_duplex);
1077void hns3_parse_devargs(struct rte_eth_dev *dev);
1078void hns3vf_update_push_lsc_cap(struct hns3_hw *hw, bool supported);
1079int hns3_restore_ptp(struct hns3_adapter *hns);
1080int hns3_mbuf_dyn_rx_timestamp_register(struct rte_eth_dev *dev,
1081 struct rte_eth_conf *conf);
1082int hns3_ptp_init(struct hns3_hw *hw);
1083int hns3_timesync_enable(struct rte_eth_dev *dev);
1084int hns3_timesync_disable(struct rte_eth_dev *dev);
1085int hns3_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
1086 struct timespec *timestamp,
1087 uint32_t flags __rte_unused);
1088int hns3_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
1089 struct timespec *timestamp);
1090int hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts);
1091int hns3_timesync_write_time(struct rte_eth_dev *dev,
1092 const struct timespec *ts);
1093int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta);
1094
1095static inline bool
1096is_reset_pending(struct hns3_adapter *hns)
1097{
1098 bool ret;
1099 if (hns->is_vf)
1100 ret = hns3vf_is_reset_pending(hns);
1101 else
1102 ret = hns3_is_reset_pending(hns);
1103 return ret;
1104}
1105
1106static inline uint64_t
1107hns3_txvlan_cap_get(struct hns3_hw *hw)
1108{
1109 if (hw->port_base_vlan_cfg.state)
1110 return DEV_TX_OFFLOAD_VLAN_INSERT;
1111 else
1112 return DEV_TX_OFFLOAD_VLAN_INSERT | DEV_TX_OFFLOAD_QINQ_INSERT;
1113}
1114
1115#endif
1116