xref: /linux/drivers/s390/net/ism.h (revision 81deca12c202aa240a28f561a161ac3387a985db)
1684b89bcSSebastian Ott /* SPDX-License-Identifier: GPL-2.0 */
2684b89bcSSebastian Ott #ifndef S390_ISM_H
3684b89bcSSebastian Ott #define S390_ISM_H
4684b89bcSSebastian Ott 
5684b89bcSSebastian Ott #include <linux/spinlock.h>
6684b89bcSSebastian Ott #include <linux/types.h>
7684b89bcSSebastian Ott #include <linux/pci.h>
8684b89bcSSebastian Ott #include <net/smc.h>
9684b89bcSSebastian Ott 
10684b89bcSSebastian Ott #define UTIL_STR_LEN	16
11684b89bcSSebastian Ott 
12684b89bcSSebastian Ott /*
13684b89bcSSebastian Ott  * Do not use the first word of the DMB bits to ensure 8 byte aligned access.
14684b89bcSSebastian Ott  */
15684b89bcSSebastian Ott #define ISM_DMB_WORD_OFFSET	1
16684b89bcSSebastian Ott #define ISM_DMB_BIT_OFFSET	(ISM_DMB_WORD_OFFSET * 32)
17684b89bcSSebastian Ott #define ISM_NR_DMBS		1920
18684b89bcSSebastian Ott 
19684b89bcSSebastian Ott #define ISM_REG_SBA	0x1
20684b89bcSSebastian Ott #define ISM_REG_IEQ	0x2
21684b89bcSSebastian Ott #define ISM_READ_GID	0x3
22684b89bcSSebastian Ott #define ISM_ADD_VLAN_ID	0x4
23684b89bcSSebastian Ott #define ISM_DEL_VLAN_ID	0x5
24684b89bcSSebastian Ott #define ISM_SET_VLAN	0x6
25684b89bcSSebastian Ott #define ISM_RESET_VLAN	0x7
26684b89bcSSebastian Ott #define ISM_QUERY_INFO	0x8
27684b89bcSSebastian Ott #define ISM_QUERY_RGID	0x9
28684b89bcSSebastian Ott #define ISM_REG_DMB	0xA
29684b89bcSSebastian Ott #define ISM_UNREG_DMB	0xB
30684b89bcSSebastian Ott #define ISM_SIGNAL_IEQ	0xE
31684b89bcSSebastian Ott #define ISM_UNREG_SBA	0x11
32684b89bcSSebastian Ott #define ISM_UNREG_IEQ	0x12
33684b89bcSSebastian Ott 
34684b89bcSSebastian Ott #define ISM_ERROR	0xFFFF
35684b89bcSSebastian Ott 
36684b89bcSSebastian Ott struct ism_req_hdr {
37684b89bcSSebastian Ott 	u32 cmd;
38684b89bcSSebastian Ott 	u16 : 16;
39684b89bcSSebastian Ott 	u16 len;
40684b89bcSSebastian Ott };
41684b89bcSSebastian Ott 
42684b89bcSSebastian Ott struct ism_resp_hdr {
43684b89bcSSebastian Ott 	u32 cmd;
44684b89bcSSebastian Ott 	u16 ret;
45684b89bcSSebastian Ott 	u16 len;
46684b89bcSSebastian Ott };
47684b89bcSSebastian Ott 
48684b89bcSSebastian Ott union ism_reg_sba {
49684b89bcSSebastian Ott 	struct {
50684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
51684b89bcSSebastian Ott 		u64 sba;
52684b89bcSSebastian Ott 	} request;
53684b89bcSSebastian Ott 	struct {
54684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
55684b89bcSSebastian Ott 	} response;
56684b89bcSSebastian Ott } __aligned(16);
57684b89bcSSebastian Ott 
58684b89bcSSebastian Ott union ism_reg_ieq {
59684b89bcSSebastian Ott 	struct {
60684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
61684b89bcSSebastian Ott 		u64 ieq;
62684b89bcSSebastian Ott 		u64 len;
63684b89bcSSebastian Ott 	} request;
64684b89bcSSebastian Ott 	struct {
65684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
66684b89bcSSebastian Ott 	} response;
67684b89bcSSebastian Ott } __aligned(16);
68684b89bcSSebastian Ott 
69684b89bcSSebastian Ott union ism_read_gid {
70684b89bcSSebastian Ott 	struct {
71684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
72684b89bcSSebastian Ott 	} request;
73684b89bcSSebastian Ott 	struct {
74684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
75684b89bcSSebastian Ott 		u64 gid;
76684b89bcSSebastian Ott 	} response;
77684b89bcSSebastian Ott } __aligned(16);
78684b89bcSSebastian Ott 
79684b89bcSSebastian Ott union ism_qi {
80684b89bcSSebastian Ott 	struct {
81684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
82684b89bcSSebastian Ott 	} request;
83684b89bcSSebastian Ott 	struct {
84684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
85684b89bcSSebastian Ott 		u32 version;
86684b89bcSSebastian Ott 		u32 max_len;
87684b89bcSSebastian Ott 		u64 ism_state;
88684b89bcSSebastian Ott 		u64 my_gid;
89684b89bcSSebastian Ott 		u64 sba;
90684b89bcSSebastian Ott 		u64 ieq;
91684b89bcSSebastian Ott 		u32 ieq_len;
92684b89bcSSebastian Ott 		u32 : 32;
93684b89bcSSebastian Ott 		u32 dmbs_owned;
94684b89bcSSebastian Ott 		u32 dmbs_used;
95684b89bcSSebastian Ott 		u32 vlan_required;
96684b89bcSSebastian Ott 		u32 vlan_nr_ids;
97684b89bcSSebastian Ott 		u16 vlan_id[64];
98684b89bcSSebastian Ott 	} response;
99684b89bcSSebastian Ott } __aligned(64);
100684b89bcSSebastian Ott 
101684b89bcSSebastian Ott union ism_query_rgid {
102684b89bcSSebastian Ott 	struct {
103684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
104684b89bcSSebastian Ott 		u64 rgid;
105684b89bcSSebastian Ott 		u32 vlan_valid;
106684b89bcSSebastian Ott 		u32 vlan_id;
107684b89bcSSebastian Ott 	} request;
108684b89bcSSebastian Ott 	struct {
109684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
110684b89bcSSebastian Ott 	} response;
111684b89bcSSebastian Ott } __aligned(16);
112684b89bcSSebastian Ott 
113684b89bcSSebastian Ott union ism_reg_dmb {
114684b89bcSSebastian Ott 	struct {
115684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
116684b89bcSSebastian Ott 		u64 dmb;
117684b89bcSSebastian Ott 		u32 dmb_len;
118684b89bcSSebastian Ott 		u32 sba_idx;
119684b89bcSSebastian Ott 		u32 vlan_valid;
120684b89bcSSebastian Ott 		u32 vlan_id;
121684b89bcSSebastian Ott 		u64 rgid;
122684b89bcSSebastian Ott 	} request;
123684b89bcSSebastian Ott 	struct {
124684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
125684b89bcSSebastian Ott 		u64 dmb_tok;
126684b89bcSSebastian Ott 	} response;
127684b89bcSSebastian Ott } __aligned(32);
128684b89bcSSebastian Ott 
129684b89bcSSebastian Ott union ism_sig_ieq {
130684b89bcSSebastian Ott 	struct {
131684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
132684b89bcSSebastian Ott 		u64 rgid;
133684b89bcSSebastian Ott 		u32 trigger_irq;
134684b89bcSSebastian Ott 		u32 event_code;
135684b89bcSSebastian Ott 		u64 info;
136684b89bcSSebastian Ott 	} request;
137684b89bcSSebastian Ott 	struct {
138684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
139684b89bcSSebastian Ott 	} response;
140684b89bcSSebastian Ott } __aligned(32);
141684b89bcSSebastian Ott 
142684b89bcSSebastian Ott union ism_unreg_dmb {
143684b89bcSSebastian Ott 	struct {
144684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
145684b89bcSSebastian Ott 		u64 dmb_tok;
146684b89bcSSebastian Ott 	} request;
147684b89bcSSebastian Ott 	struct {
148684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
149684b89bcSSebastian Ott 	} response;
150684b89bcSSebastian Ott } __aligned(16);
151684b89bcSSebastian Ott 
152684b89bcSSebastian Ott union ism_cmd_simple {
153684b89bcSSebastian Ott 	struct {
154684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
155684b89bcSSebastian Ott 	} request;
156684b89bcSSebastian Ott 	struct {
157684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
158684b89bcSSebastian Ott 	} response;
159684b89bcSSebastian Ott } __aligned(8);
160684b89bcSSebastian Ott 
161684b89bcSSebastian Ott union ism_set_vlan_id {
162684b89bcSSebastian Ott 	struct {
163684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
164684b89bcSSebastian Ott 		u64 vlan_id;
165684b89bcSSebastian Ott 	} request;
166684b89bcSSebastian Ott 	struct {
167684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
168684b89bcSSebastian Ott 	} response;
169684b89bcSSebastian Ott } __aligned(16);
170684b89bcSSebastian Ott 
171684b89bcSSebastian Ott struct ism_eq_header {
172684b89bcSSebastian Ott 	u64 idx;
173684b89bcSSebastian Ott 	u64 ieq_len;
174684b89bcSSebastian Ott 	u64 entry_len;
175684b89bcSSebastian Ott 	u64 : 64;
176684b89bcSSebastian Ott };
177684b89bcSSebastian Ott 
178684b89bcSSebastian Ott struct ism_eq {
179684b89bcSSebastian Ott 	struct ism_eq_header header;
180684b89bcSSebastian Ott 	struct smcd_event entry[15];
181684b89bcSSebastian Ott };
182684b89bcSSebastian Ott 
183684b89bcSSebastian Ott struct ism_sba {
184684b89bcSSebastian Ott 	u32 s : 1;	/* summary bit */
185684b89bcSSebastian Ott 	u32 e : 1;	/* event bit */
186684b89bcSSebastian Ott 	u32 : 30;
187684b89bcSSebastian Ott 	u32 dmb_bits[ISM_NR_DMBS / 32];
188684b89bcSSebastian Ott 	u32 reserved[3];
189684b89bcSSebastian Ott 	u16 dmbe_mask[ISM_NR_DMBS];
190684b89bcSSebastian Ott };
191684b89bcSSebastian Ott 
192684b89bcSSebastian Ott struct ism_dev {
193684b89bcSSebastian Ott 	spinlock_t lock;
194684b89bcSSebastian Ott 	struct pci_dev *pdev;
195684b89bcSSebastian Ott 	struct smcd_dev *smcd;
196684b89bcSSebastian Ott 
197684b89bcSSebastian Ott 	void __iomem *ctl;
198684b89bcSSebastian Ott 
199684b89bcSSebastian Ott 	struct ism_sba *sba;
200684b89bcSSebastian Ott 	dma_addr_t sba_dma_addr;
201684b89bcSSebastian Ott 	DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
202684b89bcSSebastian Ott 
203684b89bcSSebastian Ott 	struct ism_eq *ieq;
204684b89bcSSebastian Ott 	dma_addr_t ieq_dma_addr;
205684b89bcSSebastian Ott 
206684b89bcSSebastian Ott 	int ieq_idx;
207684b89bcSSebastian Ott };
208684b89bcSSebastian Ott 
209684b89bcSSebastian Ott #define ISM_CREATE_REQ(dmb, idx, sf, offset)		\
210684b89bcSSebastian Ott 	((dmb) | (idx) << 24 | (sf) << 23 | (offset))
211684b89bcSSebastian Ott 
212684b89bcSSebastian Ott static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
213684b89bcSSebastian Ott 			     unsigned int size)
214684b89bcSSebastian Ott {
215684b89bcSSebastian Ott 	struct zpci_dev *zdev = to_zpci(ism->pdev);
216684b89bcSSebastian Ott 	u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
217684b89bcSSebastian Ott 
218*81deca12SSebastian Ott 	return __zpci_store_block(data, req, dmb_req);
219684b89bcSSebastian Ott }
220684b89bcSSebastian Ott 
221684b89bcSSebastian Ott #endif /* S390_ISM_H */
222