xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_hwif.h (revision 37a93dd5c49b5fda807fd204edf2547c3493319c) !
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_PF = 0,
14 	HINIC3_FUNC_TYPE_VF = 1,
15 };
16 
17 struct hinic3_db_area {
18 	unsigned long *db_bitmap_array;
19 	u32           db_max_areas;
20 	/* protect doorbell area alloc and free */
21 	spinlock_t    idx_lock;
22 };
23 
24 struct hinic3_func_attr {
25 	enum hinic3_func_type func_type;
26 	u16                   func_global_idx;
27 	u16                   global_vf_id_of_pf;
28 	u16                   num_irqs;
29 	u16                   num_sq;
30 	u8                    port_to_port_idx;
31 	u8                    pci_intf_idx;
32 	u8                    ppf_idx;
33 	u8                    num_aeqs;
34 	u8                    num_ceqs;
35 	u8                    msix_flex_en;
36 };
37 
38 static_assert(sizeof(struct hinic3_func_attr) == 20);
39 
40 struct hinic3_hwif {
41 	u8 __iomem              *cfg_regs_base;
42 	u8 __iomem              *intr_regs_base;
43 	u8 __iomem              *mgmt_regs_base;
44 	u64                     db_base_phy;
45 	u64                     db_dwqe_len;
46 	u8 __iomem              *db_base;
47 	struct hinic3_db_area   db_area;
48 	struct hinic3_func_attr attr;
49 };
50 
51 enum hinic3_outbound_ctrl {
52 	ENABLE_OUTBOUND  = 0x0,
53 	DISABLE_OUTBOUND = 0x1,
54 };
55 
56 enum hinic3_pf_status {
57 	HINIC3_PF_STATUS_INIT            = 0x0,
58 	HINIC3_PF_STATUS_ACTIVE_FLAG     = 0x11,
59 	HINIC3_PF_STATUS_FLR_START_FLAG  = 0x12,
60 	HINIC3_PF_STATUS_FLR_FINISH_FLAG = 0x13,
61 };
62 
63 enum hinic3_doorbell_ctrl {
64 	ENABLE_DOORBELL  = 0,
65 	DISABLE_DOORBELL = 1,
66 };
67 
68 enum hinic3_msix_state {
69 	HINIC3_MSIX_ENABLE,
70 	HINIC3_MSIX_DISABLE,
71 };
72 
73 enum hinic3_msix_auto_mask {
74 	HINIC3_CLR_MSIX_AUTO_MASK,
75 	HINIC3_SET_MSIX_AUTO_MASK,
76 };
77 
78 #define HINIC3_FUNC_TYPE(hwdev)  ((hwdev)->hwif->attr.func_type)
79 #define HINIC3_IS_PF(hwdev)  \
80 	(HINIC3_FUNC_TYPE(hwdev) == HINIC3_FUNC_TYPE_PF)
81 #define HINIC3_IS_VF(hwdev)  \
82 	(HINIC3_FUNC_TYPE(hwdev) == HINIC3_FUNC_TYPE_VF)
83 
84 u32 hinic3_hwif_read_reg(struct hinic3_hwif *hwif, u32 reg);
85 void hinic3_hwif_write_reg(struct hinic3_hwif *hwif, u32 reg, u32 val);
86 
87 void hinic3_toggle_doorbell(struct hinic3_hwif *hwif,
88 			    enum hinic3_doorbell_ctrl flag);
89 
90 int hinic3_alloc_db_addr(struct hinic3_hwdev *hwdev, void __iomem **db_base,
91 			 void __iomem **dwqe_base);
92 void hinic3_free_db_addr(struct hinic3_hwdev *hwdev, const u8 __iomem *db_base);
93 
94 void hinic3_set_pf_status(struct hinic3_hwif *hwif,
95 			  enum hinic3_pf_status status);
96 enum hinic3_pf_status hinic3_get_pf_status(struct hinic3_hwif *hwif);
97 
98 int hinic3_init_hwif(struct hinic3_hwdev *hwdev);
99 void hinic3_free_hwif(struct hinic3_hwdev *hwdev);
100 
101 void hinic3_set_msix_state(struct hinic3_hwdev *hwdev, u16 msix_idx,
102 			   enum hinic3_msix_state flag);
103 void hinic3_msix_intr_clear_resend_bit(struct hinic3_hwdev *hwdev, u16 msix_idx,
104 				       u8 clear_resend_en);
105 void hinic3_set_msix_auto_mask_state(struct hinic3_hwdev *hwdev, u16 msix_idx,
106 				     enum hinic3_msix_auto_mask flag);
107 
108 u16 hinic3_global_func_id(struct hinic3_hwdev *hwdev);
109 u8 hinic3_pf_id_of_vf(struct hinic3_hwdev *hwdev);
110 u16 hinic3_glb_pf_vf_offset(struct hinic3_hwdev *hwdev);
111 u8 hinic3_ppf_idx(struct hinic3_hwdev *hwdev);
112 
113 #endif
114