drivers/net: use ack in interrupt handlers
[dpdk.git] / drivers / raw / ntb / ntb.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation.
3  */
4
5 #ifndef _NTB_RAWDEV_H_
6 #define _NTB_RAWDEV_H_
7
8 #include <stdbool.h>
9
10 extern int ntb_logtype;
11
12 #define NTB_LOG(level, fmt, args...) \
13         rte_log(RTE_LOG_ ## level, ntb_logtype, "%s(): " fmt "\n", \
14                 __func__, ##args)
15
16 /* Vendor ID */
17 #define NTB_INTEL_VENDOR_ID         0x8086
18
19 /* Device IDs */
20 #define NTB_INTEL_DEV_ID_B2B_SKX    0x201C
21
22 #define NTB_TOPO_NAME               "topo"
23 #define NTB_LINK_STATUS_NAME        "link_status"
24 #define NTB_SPEED_NAME              "speed"
25 #define NTB_WIDTH_NAME              "width"
26 #define NTB_MW_CNT_NAME             "mw_count"
27 #define NTB_DB_CNT_NAME             "db_count"
28 #define NTB_SPAD_CNT_NAME           "spad_count"
29 /* Reserved to app to use. */
30 #define NTB_SPAD_USER               "spad_user_"
31 #define NTB_SPAD_USER_LEN           (sizeof(NTB_SPAD_USER) - 1)
32 #define NTB_SPAD_USER_MAX_NUM       10
33 #define NTB_ATTR_NAME_LEN           30
34 #define NTB_ATTR_VAL_LEN            30
35 #define NTB_ATTR_MAX                20
36
37 /* NTB Attributes */
38 struct ntb_attr {
39         /**< Name of the attribute */
40         char name[NTB_ATTR_NAME_LEN];
41         /**< Value or reference of value of attribute */
42         char value[NTB_ATTR_NAME_LEN];
43 };
44
45 enum ntb_attr_idx {
46         NTB_TOPO_ID = 0,
47         NTB_LINK_STATUS_ID,
48         NTB_SPEED_ID,
49         NTB_WIDTH_ID,
50         NTB_MW_CNT_ID,
51         NTB_DB_CNT_ID,
52         NTB_SPAD_CNT_ID,
53 };
54
55 enum ntb_topo {
56         NTB_TOPO_NONE = 0,
57         NTB_TOPO_B2B_USD,
58         NTB_TOPO_B2B_DSD,
59 };
60
61 enum ntb_link {
62         NTB_LINK_DOWN = 0,
63         NTB_LINK_UP,
64 };
65
66 enum ntb_speed {
67         NTB_SPEED_NONE = 0,
68         NTB_SPEED_GEN1 = 1,
69         NTB_SPEED_GEN2 = 2,
70         NTB_SPEED_GEN3 = 3,
71         NTB_SPEED_GEN4 = 4,
72 };
73
74 enum ntb_width {
75         NTB_WIDTH_NONE = 0,
76         NTB_WIDTH_1 = 1,
77         NTB_WIDTH_2 = 2,
78         NTB_WIDTH_4 = 4,
79         NTB_WIDTH_8 = 8,
80         NTB_WIDTH_12 = 12,
81         NTB_WIDTH_16 = 16,
82         NTB_WIDTH_32 = 32,
83 };
84
85 /* Define spad registers usage. 0 is reserved. */
86 enum ntb_spad_idx {
87         SPAD_NUM_MWS = 1,
88         SPAD_NUM_QPS,
89         SPAD_Q_SZ,
90         SPAD_MW0_SZ_H,
91         SPAD_MW0_SZ_L,
92         SPAD_MW1_SZ_H,
93         SPAD_MW1_SZ_L,
94 };
95
96 /**
97  * NTB device operations
98  * @ntb_dev_init: Init ntb dev.
99  * @get_peer_mw_addr: To get the addr of peer mw[mw_idx].
100  * @mw_set_trans: Set translation of internal memory that remote can access.
101  * @get_link_status: get link status, link speed and link width.
102  * @set_link: Set local side up/down.
103  * @spad_read: Read local/peer spad register val.
104  * @spad_write: Write val to local/peer spad register.
105  * @db_read: Read doorbells status.
106  * @db_clear: Clear local doorbells.
107  * @db_set_mask: Set bits in db mask, preventing db interrpts generated
108  * for those db bits.
109  * @peer_db_set: Set doorbell bit to generate peer interrupt for that bit.
110  * @vector_bind: Bind vector source [intr] to msix vector [msix].
111  */
112 struct ntb_dev_ops {
113         int (*ntb_dev_init)(struct rte_rawdev *dev);
114         void *(*get_peer_mw_addr)(struct rte_rawdev *dev, int mw_idx);
115         int (*mw_set_trans)(struct rte_rawdev *dev, int mw_idx,
116                             uint64_t addr, uint64_t size);
117         int (*get_link_status)(struct rte_rawdev *dev);
118         int (*set_link)(struct rte_rawdev *dev, bool up);
119         uint32_t (*spad_read)(struct rte_rawdev *dev, int spad, bool peer);
120         int (*spad_write)(struct rte_rawdev *dev, int spad,
121                           bool peer, uint32_t spad_v);
122         uint64_t (*db_read)(struct rte_rawdev *dev);
123         int (*db_clear)(struct rte_rawdev *dev, uint64_t db_bits);
124         int (*db_set_mask)(struct rte_rawdev *dev, uint64_t db_mask);
125         int (*peer_db_set)(struct rte_rawdev *dev, uint8_t db_bit);
126         int (*vector_bind)(struct rte_rawdev *dev, uint8_t intr, uint8_t msix);
127 };
128
129 /* ntb private data. */
130 struct ntb_hw {
131         uint8_t mw_cnt;
132         uint8_t peer_mw_cnt;
133         uint8_t db_cnt;
134         uint8_t spad_cnt;
135
136         uint64_t db_valid_mask;
137         uint64_t db_mask;
138
139         enum ntb_topo topo;
140
141         enum ntb_link link_status;
142         enum ntb_speed link_speed;
143         enum ntb_width link_width;
144
145         const struct ntb_dev_ops *ntb_ops;
146
147         struct rte_pci_device *pci_dev;
148         char *hw_addr;
149
150         uint64_t *mw_size;
151         uint64_t *peer_mw_size;
152         uint8_t peer_dev_up;
153
154         uint16_t queue_pairs;
155         uint16_t queue_size;
156
157         /**< mem zone to populate RX ring. */
158         const struct rte_memzone **mz;
159
160         /* Reserve several spad for app to use. */
161         int spad_user_list[NTB_SPAD_USER_MAX_NUM];
162 };
163
164 #endif /* _NTB_RAWDEV_H_ */