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
492 uint16_t num_msi;
493 uint16_t total_tqps_num;
494 uint16_t tqps_num;
495 uint16_t intr_tqps_num;
496 uint16_t rss_size_max;
497 uint16_t rx_buf_len;
498 uint16_t num_tx_desc;
499 uint16_t num_rx_desc;
500 uint32_t mng_entry_num;
501 uint32_t mac_entry_num;
502
503 struct rte_ether_addr mc_addrs[HNS3_MC_MACADDR_NUM];
504 int mc_addrs_num;
505
506
507 struct hns3_rss_conf rss_info;
508 bool rss_dis_flag;
509 uint16_t rss_ind_tbl_size;
510 uint16_t rss_key_size;
511
512 uint8_t num_tc;
513 uint8_t hw_tc_map;
514 enum hns3_fc_mode requested_fc_mode;
515 struct hns3_dcb_info dcb_info;
516 enum hns3_fc_status current_fc_status;
517 struct hns3_tc_queue_info tc_queue[HNS3_MAX_TC_NUM];
518 uint16_t used_rx_queues;
519 uint16_t used_tx_queues;
520
521
522 uint16_t cfg_max_queues;
523 struct hns3_fake_queue_data fkq_data;
524 uint16_t alloc_rss_size;
525 uint16_t tx_qnum_per_tc;
526
527 uint32_t capability;
528 uint32_t max_tm_rate;
529
530
531
532
533 uint32_t min_tx_pkt_len;
534
535 struct hns3_queue_intr intr;
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552 uint8_t tso_mode;
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574 uint8_t vlan_mode;
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592 uint8_t promisc_mode;
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609 uint8_t drop_stats_mode;
610
611 uint8_t max_non_tso_bd_num;
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627 uint8_t udp_cksum_mode;
628
629 struct hns3_port_base_vlan_config port_base_vlan_cfg;
630
631 pthread_mutex_t flows_lock;
632
633
634
635
636
637
638
639 rte_spinlock_t lock;
640 enum hns3_adapter_state adapter_state;
641 struct hns3_reset_data reset;
642};
643
644#define HNS3_FLAG_TC_BASE_SCH_MODE 1
645#define HNS3_FLAG_VNET_BASE_SCH_MODE 2
646
647
648struct hns3_user_vlan_table {
649 LIST_ENTRY(hns3_user_vlan_table) next;
650 bool hd_tbl_status;
651 uint16_t vlan_id;
652};
653
654
655struct hns3_rx_vtag_cfg {
656 bool rx_vlan_offload_en;
657 bool strip_tag1_en;
658 bool strip_tag2_en;
659
660
661
662
663 bool strip_tag1_discard_en;
664 bool strip_tag2_discard_en;
665
666
667
668
669 bool vlan1_vlan_prionly;
670 bool vlan2_vlan_prionly;
671};
672
673
674struct hns3_tx_vtag_cfg {
675 bool accept_tag1;
676 bool accept_untag1;
677 bool accept_tag2;
678 bool accept_untag2;
679 bool insert_tag1_en;
680 bool insert_tag2_en;
681
682
683
684
685 bool tag_shift_mode_en;
686 uint16_t default_tag1;
687 uint16_t default_tag2;
688};
689
690struct hns3_vtag_cfg {
691 struct hns3_rx_vtag_cfg rx_vcfg;
692 struct hns3_tx_vtag_cfg tx_vcfg;
693};
694
695
696enum hns3_mp_req_type {
697 HNS3_MP_REQ_START_RXTX = 1,
698 HNS3_MP_REQ_STOP_RXTX,
699 HNS3_MP_REQ_MAX
700};
701
702
703struct hns3_mp_param {
704 enum hns3_mp_req_type type;
705 int port_id;
706 int result;
707};
708
709
710#define HNS3_MP_REQ_TIMEOUT_SEC 5
711
712
713#define HNS3_MP_NAME "net_hns3_mp"
714
715#define HNS3_L2TBL_NUM 4
716#define HNS3_L3TBL_NUM 16
717#define HNS3_L4TBL_NUM 16
718#define HNS3_OL2TBL_NUM 4
719#define HNS3_OL3TBL_NUM 16
720#define HNS3_OL4TBL_NUM 16
721#define HNS3_PTYPE_NUM 256
722
723struct hns3_ptype_table {
724
725
726
727
728 uint32_t l3table[HNS3_L3TBL_NUM];
729 uint32_t l4table[HNS3_L4TBL_NUM];
730 uint32_t inner_l3table[HNS3_L3TBL_NUM];
731 uint32_t inner_l4table[HNS3_L4TBL_NUM];
732 uint32_t ol3table[HNS3_OL3TBL_NUM];
733 uint32_t ol4table[HNS3_OL4TBL_NUM];
734
735
736
737
738
739
740 uint32_t ptype[HNS3_PTYPE_NUM] __rte_cache_aligned;
741};
742
743#define HNS3_FIXED_MAX_TQP_NUM_MODE 0
744#define HNS3_FLEX_MAX_TQP_NUM_MODE 1
745
746struct hns3_pf {
747 struct hns3_adapter *adapter;
748 bool is_main_pf;
749 uint16_t func_num;
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770 uint8_t tqp_config_mode;
771
772 uint32_t pkt_buf_size;
773 uint32_t tx_buf_size;
774 uint32_t dv_buf_size;
775
776 uint16_t mps;
777
778 uint8_t tx_sch_mode;
779 uint8_t tc_max;
780 uint8_t local_max_tc;
781 uint8_t pfc_max;
782 uint8_t prio_tc[HNS3_MAX_USER_PRIO];
783 uint16_t pause_time;
784 bool support_fc_autoneg;
785
786 uint16_t wanted_umv_size;
787 uint16_t max_umv_size;
788 uint16_t used_umv_size;
789
790 bool support_sfp_query;
791 uint32_t fec_mode;
792
793 bool ptp_enable;
794
795
796 uint64_t rx_timestamp;
797
798 struct hns3_vtag_cfg vtag_config;
799 LIST_HEAD(vlan_tbl, hns3_user_vlan_table) vlan_list;
800
801 struct hns3_fdir_info fdir;
802 LIST_HEAD(counters, hns3_flow_counter) flow_counters;
803
804 struct hns3_tm_conf tm_conf;
805};
806
807enum {
808 HNS3_PF_PUSH_LSC_CAP_NOT_SUPPORTED,
809 HNS3_PF_PUSH_LSC_CAP_SUPPORTED,
810 HNS3_PF_PUSH_LSC_CAP_UNKNOWN
811};
812
813struct hns3_vf {
814 struct hns3_adapter *adapter;
815
816
817 uint16_t pf_push_lsc_cap;
818
819
820
821
822
823
824 uint16_t req_link_info_cnt;
825
826 uint16_t poll_job_started;
827};
828
829struct hns3_adapter {
830 struct hns3_hw hw;
831
832
833 bool is_vf;
834 union {
835 struct hns3_pf pf;
836 struct hns3_vf vf;
837 };
838
839 uint32_t rx_func_hint;
840 uint32_t tx_func_hint;
841
842 uint64_t dev_caps_mask;
843
844 struct hns3_ptype_table ptype_tbl __rte_cache_aligned;
845};
846
847enum {
848 HNS3_IO_FUNC_HINT_NONE = 0,
849 HNS3_IO_FUNC_HINT_VEC,
850 HNS3_IO_FUNC_HINT_SVE,
851 HNS3_IO_FUNC_HINT_SIMPLE,
852 HNS3_IO_FUNC_HINT_COMMON
853};
854
855#define HNS3_DEVARG_RX_FUNC_HINT "rx_func_hint"
856#define HNS3_DEVARG_TX_FUNC_HINT "tx_func_hint"
857
858#define HNS3_DEVARG_DEV_CAPS_MASK "dev_caps_mask"
859
860enum {
861 HNS3_DEV_SUPPORT_DCB_B,
862 HNS3_DEV_SUPPORT_COPPER_B,
863 HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B,
864 HNS3_DEV_SUPPORT_PTP_B,
865 HNS3_DEV_SUPPORT_INDEP_TXRX_B,
866 HNS3_DEV_SUPPORT_STASH_B,
867 HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
868 HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B,
869 HNS3_DEV_SUPPORT_RAS_IMP_B,
870};
871
872#define hns3_dev_dcb_supported(hw) \
873 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_DCB_B)
874
875
876#define hns3_dev_copper_supported(hw) \
877 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_COPPER_B)
878
879
880#define hns3_dev_fd_queue_region_supported(hw) \
881 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B)
882
883
884#define hns3_dev_ptp_supported(hw) \
885 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_PTP_B)
886
887
888#define hns3_dev_indep_txrx_supported(hw) \
889 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_INDEP_TXRX_B)
890
891#define hns3_dev_stash_supported(hw) \
892 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_STASH_B)
893
894#define hns3_dev_rxd_adv_layout_supported(hw) \
895 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B)
896
897#define hns3_dev_outer_udp_cksum_supported(hw) \
898 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B)
899
900#define hns3_dev_ras_imp_supported(hw) \
901 hns3_get_bit((hw)->capability, HNS3_DEV_SUPPORT_RAS_IMP_B)
902
903#define HNS3_DEV_PRIVATE_TO_HW(adapter) \
904 (&((struct hns3_adapter *)adapter)->hw)
905#define HNS3_DEV_PRIVATE_TO_PF(adapter) \
906 (&((struct hns3_adapter *)adapter)->pf)
907#define HNS3_DEV_PRIVATE_TO_VF(adapter) \
908 (&((struct hns3_adapter *)adapter)->vf)
909#define HNS3_DEV_HW_TO_ADAPTER(hw) \
910 container_of(hw, struct hns3_adapter, hw)
911
912static inline struct hns3_pf *HNS3_DEV_HW_TO_PF(struct hns3_hw *hw)
913{
914 struct hns3_adapter *adapter = HNS3_DEV_HW_TO_ADAPTER(hw);
915 return &adapter->pf;
916}
917
918static inline struct hns3_vf *HNS3_DEV_HW_TO_VF(struct hns3_hw *hw)
919{
920 struct hns3_adapter *adapter = HNS3_DEV_HW_TO_ADAPTER(hw);
921 return &adapter->vf;
922}
923
924#define hns3_set_field(origin, mask, shift, val) \
925 do { \
926 (origin) &= (~(mask)); \
927 (origin) |= ((val) << (shift)) & (mask); \
928 } while (0)
929#define hns3_get_field(origin, mask, shift) \
930 (((origin) & (mask)) >> (shift))
931#define hns3_set_bit(origin, shift, val) \
932 hns3_set_field((origin), (0x1UL << (shift)), (shift), (val))
933#define hns3_get_bit(origin, shift) \
934 hns3_get_field((origin), (0x1UL << (shift)), (shift))
935
936#define hns3_gen_field_val(mask, shift, val) (((val) << (shift)) & (mask))
937
938
939
940
941
942
943
944#define upper_32_bits(n) ((uint32_t)(((n) >> 16) >> 16))
945
946
947#define lower_32_bits(n) ((uint32_t)(n))
948
949#define BIT(nr) (1UL << (nr))
950
951#define BIT_ULL(x) (1ULL << (x))
952
953#define BITS_PER_LONG (__SIZEOF_LONG__ * 8)
954#define GENMASK(h, l) \
955 (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
956
957#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
958#define rounddown(x, y) ((x) - ((x) % (y)))
959
960#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975static inline void hns3_write_reg(void *base, uint32_t reg, uint32_t value)
976{
977 rte_write32(rte_cpu_to_le_32(value),
978 (volatile void *)((char *)base + reg));
979}
980
981
982
983
984
985
986static inline void hns3_write_reg_opt(volatile void *addr, uint32_t value)
987{
988 rte_write32(rte_cpu_to_le_32(value), addr);
989}
990
991static inline uint32_t hns3_read_reg(void *base, uint32_t reg)
992{
993 uint32_t read_val = rte_read32((volatile void *)((char *)base + reg));
994 return rte_le_to_cpu_32(read_val);
995}
996
997#define hns3_write_dev(a, reg, value) \
998 hns3_write_reg((a)->io_base, (reg), (value))
999
1000#define hns3_read_dev(a, reg) \
1001 hns3_read_reg((a)->io_base, (reg))
1002
1003#define NEXT_ITEM_OF_ACTION(act, actions, index) \
1004 do { \
1005 act = (actions) + (index); \
1006 while (act->type == RTE_FLOW_ACTION_TYPE_VOID) { \
1007 (index)++; \
1008 act = actions + index; \
1009 } \
1010 } while (0)
1011
1012#define MSEC_PER_SEC 1000L
1013#define USEC_PER_MSEC 1000L
1014
1015void hns3_clock_gettime(struct timeval *tv);
1016uint64_t hns3_clock_calctime_ms(struct timeval *tv);
1017uint64_t hns3_clock_gettime_ms(void);
1018
1019static inline uint64_t
1020hns3_atomic_test_bit(unsigned int nr, volatile uint64_t *addr)
1021{
1022 uint64_t res;
1023
1024 res = (__atomic_load_n(addr, __ATOMIC_RELAXED) & (1UL << nr)) != 0;
1025 return res;
1026}
1027
1028static inline void
1029hns3_atomic_set_bit(unsigned int nr, volatile uint64_t *addr)
1030{
1031 __atomic_fetch_or(addr, (1UL << nr), __ATOMIC_RELAXED);
1032}
1033
1034static inline void
1035hns3_atomic_clear_bit(unsigned int nr, volatile uint64_t *addr)
1036{
1037 __atomic_fetch_and(addr, ~(1UL << nr), __ATOMIC_RELAXED);
1038}
1039
1040static inline int64_t
1041hns3_test_and_clear_bit(unsigned int nr, volatile uint64_t *addr)
1042{
1043 uint64_t mask = (1UL << nr);
1044
1045 return __atomic_fetch_and(addr, ~mask, __ATOMIC_RELAXED) & mask;
1046}
1047
1048int hns3_buffer_alloc(struct hns3_hw *hw);
1049int hns3_dev_flow_ops_get(struct rte_eth_dev *dev,
1050 const struct rte_flow_ops **ops);
1051bool hns3_is_reset_pending(struct hns3_adapter *hns);
1052bool hns3vf_is_reset_pending(struct hns3_adapter *hns);
1053void hns3_update_linkstatus_and_event(struct hns3_hw *hw, bool query);
1054void hns3_ether_format_addr(char *buf, uint16_t size,
1055 const struct rte_ether_addr *ether_addr);
1056int hns3_dev_infos_get(struct rte_eth_dev *eth_dev,
1057 struct rte_eth_dev_info *info);
1058void hns3vf_update_link_status(struct hns3_hw *hw, uint8_t link_status,
1059 uint32_t link_speed, uint8_t link_duplex);
1060void hns3_parse_devargs(struct rte_eth_dev *dev);
1061void hns3vf_update_push_lsc_cap(struct hns3_hw *hw, bool supported);
1062int hns3_restore_ptp(struct hns3_adapter *hns);
1063int hns3_mbuf_dyn_rx_timestamp_register(struct rte_eth_dev *dev,
1064 struct rte_eth_conf *conf);
1065int hns3_ptp_init(struct hns3_hw *hw);
1066int hns3_timesync_enable(struct rte_eth_dev *dev);
1067int hns3_timesync_disable(struct rte_eth_dev *dev);
1068int hns3_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
1069 struct timespec *timestamp,
1070 uint32_t flags __rte_unused);
1071int hns3_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
1072 struct timespec *timestamp);
1073int hns3_timesync_read_time(struct rte_eth_dev *dev, struct timespec *ts);
1074int hns3_timesync_write_time(struct rte_eth_dev *dev,
1075 const struct timespec *ts);
1076int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta);
1077
1078static inline bool
1079is_reset_pending(struct hns3_adapter *hns)
1080{
1081 bool ret;
1082 if (hns->is_vf)
1083 ret = hns3vf_is_reset_pending(hns);
1084 else
1085 ret = hns3_is_reset_pending(hns);
1086 return ret;
1087}
1088
1089static inline uint64_t
1090hns3_txvlan_cap_get(struct hns3_hw *hw)
1091{
1092 if (hw->port_base_vlan_cfg.state)
1093 return DEV_TX_OFFLOAD_VLAN_INSERT;
1094 else
1095 return DEV_TX_OFFLOAD_VLAN_INSERT | DEV_TX_OFFLOAD_QINQ_INSERT;
1096}
1097
1098#endif
1099