xref: /linux/drivers/net/ethernet/huawei/hinic3/hinic3_hwif.h (revision da0e2197645c8e01bb6080c7a2b86d9a56cc64a9)
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_msix_state {
49 	HINIC3_MSIX_ENABLE,
50 	HINIC3_MSIX_DISABLE,
51 };
52 
53 enum hinic3_msix_auto_mask {
54 	HINIC3_CLR_MSIX_AUTO_MASK,
55 	HINIC3_SET_MSIX_AUTO_MASK,
56 };
57 
58 u32 hinic3_hwif_read_reg(struct hinic3_hwif *hwif, u32 reg);
59 void hinic3_hwif_write_reg(struct hinic3_hwif *hwif, u32 reg, u32 val);
60 
61 int hinic3_alloc_db_addr(struct hinic3_hwdev *hwdev, void __iomem **db_base,
62 			 void __iomem **dwqe_base);
63 void hinic3_free_db_addr(struct hinic3_hwdev *hwdev, const u8 __iomem *db_base);
64 
65 void hinic3_set_msix_state(struct hinic3_hwdev *hwdev, u16 msix_idx,
66 			   enum hinic3_msix_state flag);
67 void hinic3_msix_intr_clear_resend_bit(struct hinic3_hwdev *hwdev, u16 msix_idx,
68 				       u8 clear_resend_en);
69 void hinic3_set_msix_auto_mask_state(struct hinic3_hwdev *hwdev, u16 msix_idx,
70 				     enum hinic3_msix_auto_mask flag);
71 
72 u16 hinic3_global_func_id(struct hinic3_hwdev *hwdev);
73 
74 #endif
75