xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_hwif.h (revision 8804d970fab45726b3c7cd7f240b31122aa94219)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */
3 
4 #ifndef _HINIC3_HWIF_H_
5 #define _HINIC3_HWIF_H_
6 
7 #include <linux/build_bug.h>
8 #include <linux/spinlock_types.h>
9 
10 struct hinic3_hwdev;
11 
12 enum hinic3_func_type {
13 	HINIC3_FUNC_TYPE_VF = 1,
14 };
15 
16 struct hinic3_db_area {
17 	unsigned long *db_bitmap_array;
18 	u32           db_max_areas;
19 	/* protect doorbell area alloc and free */
20 	spinlock_t    idx_lock;
21 };
22 
23 struct hinic3_func_attr {
24 	enum hinic3_func_type func_type;
25 	u16                   func_global_idx;
26 	u16                   global_vf_id_of_pf;
27 	u16                   num_irqs;
28 	u16                   num_sq;
29 	u8                    port_to_port_idx;
30 	u8                    pci_intf_idx;
31 	u8                    ppf_idx;
32 	u8                    num_aeqs;
33 	u8                    num_ceqs;
34 	u8                    msix_flex_en;
35 };
36 
37 static_assert(sizeof(struct hinic3_func_attr) == 20);
38 
39 struct hinic3_hwif {
40 	u8 __iomem              *cfg_regs_base;
41 	u64                     db_base_phy;
42 	u64                     db_dwqe_len;
43 	u8 __iomem              *db_base;
44 	struct hinic3_db_area   db_area;
45 	struct hinic3_func_attr attr;
46 };
47 
48 enum hinic3_outbound_ctrl {
49 	ENABLE_OUTBOUND  = 0x0,
50 	DISABLE_OUTBOUND = 0x1,
51 };
52 
53 enum hinic3_doorbell_ctrl {
54 	ENABLE_DOORBELL  = 0,
55 	DISABLE_DOORBELL = 1,
56 };
57 
58 enum hinic3_msix_state {
59 	HINIC3_MSIX_ENABLE,
60 	HINIC3_MSIX_DISABLE,
61 };
62 
63 enum hinic3_msix_auto_mask {
64 	HINIC3_CLR_MSIX_AUTO_MASK,
65 	HINIC3_SET_MSIX_AUTO_MASK,
66 };
67 
68 u32 hinic3_hwif_read_reg(struct hinic3_hwif *hwif, u32 reg);
69 void hinic3_hwif_write_reg(struct hinic3_hwif *hwif, u32 reg, u32 val);
70 
71 void hinic3_toggle_doorbell(struct hinic3_hwif *hwif,
72 			    enum hinic3_doorbell_ctrl flag);
73 
74 int hinic3_alloc_db_addr(struct hinic3_hwdev *hwdev, void __iomem **db_base,
75 			 void __iomem **dwqe_base);
76 void hinic3_free_db_addr(struct hinic3_hwdev *hwdev, const u8 __iomem *db_base);
77 
78 int hinic3_init_hwif(struct hinic3_hwdev *hwdev);
79 void hinic3_free_hwif(struct hinic3_hwdev *hwdev);
80 
81 void hinic3_set_msix_state(struct hinic3_hwdev *hwdev, u16 msix_idx,
82 			   enum hinic3_msix_state flag);
83 void hinic3_msix_intr_clear_resend_bit(struct hinic3_hwdev *hwdev, u16 msix_idx,
84 				       u8 clear_resend_en);
85 void hinic3_set_msix_auto_mask_state(struct hinic3_hwdev *hwdev, u16 msix_idx,
86 				     enum hinic3_msix_auto_mask flag);
87 
88 u16 hinic3_global_func_id(struct hinic3_hwdev *hwdev);
89 
90 #endif
91