xref: /linux/drivers/s390/net/ism.h (revision 06d07429858317ded2db7986113a9e0129cd599b)
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>
81baedb13SStefan Raspl #include <linux/ism.h>
9684b89bcSSebastian Ott #include <net/smc.h>
10c475f177SSebastian Ott #include <asm/pci_insn.h>
11684b89bcSSebastian Ott 
12684b89bcSSebastian Ott #define UTIL_STR_LEN	16
13684b89bcSSebastian Ott 
14684b89bcSSebastian Ott /*
15684b89bcSSebastian Ott  * Do not use the first word of the DMB bits to ensure 8 byte aligned access.
16684b89bcSSebastian Ott  */
17684b89bcSSebastian Ott #define ISM_DMB_WORD_OFFSET	1
18684b89bcSSebastian Ott #define ISM_DMB_BIT_OFFSET	(ISM_DMB_WORD_OFFSET * 32)
19684b89bcSSebastian Ott 
20684b89bcSSebastian Ott #define ISM_REG_SBA	0x1
21684b89bcSSebastian Ott #define ISM_REG_IEQ	0x2
22684b89bcSSebastian Ott #define ISM_READ_GID	0x3
23684b89bcSSebastian Ott #define ISM_ADD_VLAN_ID	0x4
24684b89bcSSebastian Ott #define ISM_DEL_VLAN_ID	0x5
25684b89bcSSebastian Ott #define ISM_SET_VLAN	0x6
26684b89bcSSebastian Ott #define ISM_RESET_VLAN	0x7
27684b89bcSSebastian Ott #define ISM_QUERY_INFO	0x8
28684b89bcSSebastian Ott #define ISM_QUERY_RGID	0x9
29684b89bcSSebastian Ott #define ISM_REG_DMB	0xA
30684b89bcSSebastian Ott #define ISM_UNREG_DMB	0xB
31684b89bcSSebastian Ott #define ISM_SIGNAL_IEQ	0xE
32684b89bcSSebastian Ott #define ISM_UNREG_SBA	0x11
33684b89bcSSebastian Ott #define ISM_UNREG_IEQ	0x12
34684b89bcSSebastian Ott 
35684b89bcSSebastian Ott struct ism_req_hdr {
36684b89bcSSebastian Ott 	u32 cmd;
37684b89bcSSebastian Ott 	u16 : 16;
38684b89bcSSebastian Ott 	u16 len;
39684b89bcSSebastian Ott };
40684b89bcSSebastian Ott 
41684b89bcSSebastian Ott struct ism_resp_hdr {
42684b89bcSSebastian Ott 	u32 cmd;
43684b89bcSSebastian Ott 	u16 ret;
44684b89bcSSebastian Ott 	u16 len;
45684b89bcSSebastian Ott };
46684b89bcSSebastian Ott 
47684b89bcSSebastian Ott union ism_reg_sba {
48684b89bcSSebastian Ott 	struct {
49684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
50684b89bcSSebastian Ott 		u64 sba;
51684b89bcSSebastian Ott 	} request;
52684b89bcSSebastian Ott 	struct {
53684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
54684b89bcSSebastian Ott 	} response;
55684b89bcSSebastian Ott } __aligned(16);
56684b89bcSSebastian Ott 
57684b89bcSSebastian Ott union ism_reg_ieq {
58684b89bcSSebastian Ott 	struct {
59684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
60684b89bcSSebastian Ott 		u64 ieq;
61684b89bcSSebastian Ott 		u64 len;
62684b89bcSSebastian Ott 	} request;
63684b89bcSSebastian Ott 	struct {
64684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
65684b89bcSSebastian Ott 	} response;
66684b89bcSSebastian Ott } __aligned(16);
67684b89bcSSebastian Ott 
68684b89bcSSebastian Ott union ism_read_gid {
69684b89bcSSebastian Ott 	struct {
70684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
71684b89bcSSebastian Ott 	} request;
72684b89bcSSebastian Ott 	struct {
73684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
74684b89bcSSebastian Ott 		u64 gid;
75684b89bcSSebastian Ott 	} response;
76684b89bcSSebastian Ott } __aligned(16);
77684b89bcSSebastian Ott 
78684b89bcSSebastian Ott union ism_qi {
79684b89bcSSebastian Ott 	struct {
80684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
81684b89bcSSebastian Ott 	} request;
82684b89bcSSebastian Ott 	struct {
83684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
84684b89bcSSebastian Ott 		u32 version;
85684b89bcSSebastian Ott 		u32 max_len;
86684b89bcSSebastian Ott 		u64 ism_state;
87684b89bcSSebastian Ott 		u64 my_gid;
88684b89bcSSebastian Ott 		u64 sba;
89684b89bcSSebastian Ott 		u64 ieq;
90684b89bcSSebastian Ott 		u32 ieq_len;
91684b89bcSSebastian Ott 		u32 : 32;
92684b89bcSSebastian Ott 		u32 dmbs_owned;
93684b89bcSSebastian Ott 		u32 dmbs_used;
94684b89bcSSebastian Ott 		u32 vlan_required;
95684b89bcSSebastian Ott 		u32 vlan_nr_ids;
96684b89bcSSebastian Ott 		u16 vlan_id[64];
97684b89bcSSebastian Ott 	} response;
98684b89bcSSebastian Ott } __aligned(64);
99684b89bcSSebastian Ott 
100684b89bcSSebastian Ott union ism_query_rgid {
101684b89bcSSebastian Ott 	struct {
102684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
103684b89bcSSebastian Ott 		u64 rgid;
104684b89bcSSebastian Ott 		u32 vlan_valid;
105684b89bcSSebastian Ott 		u32 vlan_id;
106684b89bcSSebastian Ott 	} request;
107684b89bcSSebastian Ott 	struct {
108684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
109684b89bcSSebastian Ott 	} response;
110684b89bcSSebastian Ott } __aligned(16);
111684b89bcSSebastian Ott 
112684b89bcSSebastian Ott union ism_reg_dmb {
113684b89bcSSebastian Ott 	struct {
114684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
115684b89bcSSebastian Ott 		u64 dmb;
116684b89bcSSebastian Ott 		u32 dmb_len;
117684b89bcSSebastian Ott 		u32 sba_idx;
118684b89bcSSebastian Ott 		u32 vlan_valid;
119684b89bcSSebastian Ott 		u32 vlan_id;
120684b89bcSSebastian Ott 		u64 rgid;
121684b89bcSSebastian Ott 	} request;
122684b89bcSSebastian Ott 	struct {
123684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
124684b89bcSSebastian Ott 		u64 dmb_tok;
125684b89bcSSebastian Ott 	} response;
126684b89bcSSebastian Ott } __aligned(32);
127684b89bcSSebastian Ott 
128684b89bcSSebastian Ott union ism_sig_ieq {
129684b89bcSSebastian Ott 	struct {
130684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
131684b89bcSSebastian Ott 		u64 rgid;
132684b89bcSSebastian Ott 		u32 trigger_irq;
133684b89bcSSebastian Ott 		u32 event_code;
134684b89bcSSebastian Ott 		u64 info;
135684b89bcSSebastian Ott 	} request;
136684b89bcSSebastian Ott 	struct {
137684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
138684b89bcSSebastian Ott 	} response;
139684b89bcSSebastian Ott } __aligned(32);
140684b89bcSSebastian Ott 
141684b89bcSSebastian Ott union ism_unreg_dmb {
142684b89bcSSebastian Ott 	struct {
143684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
144684b89bcSSebastian Ott 		u64 dmb_tok;
145684b89bcSSebastian Ott 	} request;
146684b89bcSSebastian Ott 	struct {
147684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
148684b89bcSSebastian Ott 	} response;
149684b89bcSSebastian Ott } __aligned(16);
150684b89bcSSebastian Ott 
151684b89bcSSebastian Ott union ism_cmd_simple {
152684b89bcSSebastian Ott 	struct {
153684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
154684b89bcSSebastian Ott 	} request;
155684b89bcSSebastian Ott 	struct {
156684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
157684b89bcSSebastian Ott 	} response;
158684b89bcSSebastian Ott } __aligned(8);
159684b89bcSSebastian Ott 
160684b89bcSSebastian Ott union ism_set_vlan_id {
161684b89bcSSebastian Ott 	struct {
162684b89bcSSebastian Ott 		struct ism_req_hdr hdr;
163684b89bcSSebastian Ott 		u64 vlan_id;
164684b89bcSSebastian Ott 	} request;
165684b89bcSSebastian Ott 	struct {
166684b89bcSSebastian Ott 		struct ism_resp_hdr hdr;
167684b89bcSSebastian Ott 	} response;
168684b89bcSSebastian Ott } __aligned(16);
169684b89bcSSebastian Ott 
170684b89bcSSebastian Ott struct ism_eq_header {
171684b89bcSSebastian Ott 	u64 idx;
172684b89bcSSebastian Ott 	u64 ieq_len;
173684b89bcSSebastian Ott 	u64 entry_len;
174684b89bcSSebastian Ott 	u64 : 64;
175684b89bcSSebastian Ott };
176684b89bcSSebastian Ott 
177684b89bcSSebastian Ott struct ism_eq {
178684b89bcSSebastian Ott 	struct ism_eq_header header;
179*89e7d2baSStefan Raspl 	struct ism_event entry[15];
180684b89bcSSebastian Ott };
181684b89bcSSebastian Ott 
182684b89bcSSebastian Ott struct ism_sba {
183684b89bcSSebastian Ott 	u32 s : 1;	/* summary bit */
184684b89bcSSebastian Ott 	u32 e : 1;	/* event bit */
185684b89bcSSebastian Ott 	u32 : 30;
186684b89bcSSebastian Ott 	u32 dmb_bits[ISM_NR_DMBS / 32];
187684b89bcSSebastian Ott 	u32 reserved[3];
188684b89bcSSebastian Ott 	u16 dmbe_mask[ISM_NR_DMBS];
189684b89bcSSebastian Ott };
190684b89bcSSebastian Ott 
191684b89bcSSebastian Ott #define ISM_CREATE_REQ(dmb, idx, sf, offset)		\
192684b89bcSSebastian Ott 	((dmb) | (idx) << 24 | (sf) << 23 | (offset))
193684b89bcSSebastian Ott 
__ism_read_cmd(struct ism_dev * ism,void * data,unsigned long offset,unsigned long len)194c475f177SSebastian Ott static inline void __ism_read_cmd(struct ism_dev *ism, void *data,
195c475f177SSebastian Ott 				  unsigned long offset, unsigned long len)
196c475f177SSebastian Ott {
197c475f177SSebastian Ott 	struct zpci_dev *zdev = to_zpci(ism->pdev);
198c475f177SSebastian Ott 	u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, 8);
199c475f177SSebastian Ott 
200c475f177SSebastian Ott 	while (len > 0) {
201c475f177SSebastian Ott 		__zpci_load(data, req, offset);
202c475f177SSebastian Ott 		offset += 8;
203c475f177SSebastian Ott 		data += 8;
204c475f177SSebastian Ott 		len -= 8;
205c475f177SSebastian Ott 	}
206c475f177SSebastian Ott }
207c475f177SSebastian Ott 
__ism_write_cmd(struct ism_dev * ism,void * data,unsigned long offset,unsigned long len)208c475f177SSebastian Ott static inline void __ism_write_cmd(struct ism_dev *ism, void *data,
209c475f177SSebastian Ott 				   unsigned long offset, unsigned long len)
210c475f177SSebastian Ott {
211c475f177SSebastian Ott 	struct zpci_dev *zdev = to_zpci(ism->pdev);
212c475f177SSebastian Ott 	u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, len);
213c475f177SSebastian Ott 
214c475f177SSebastian Ott 	if (len)
215c475f177SSebastian Ott 		__zpci_store_block(data, req, offset);
216c475f177SSebastian Ott }
217c475f177SSebastian Ott 
__ism_move(struct ism_dev * ism,u64 dmb_req,void * data,unsigned int size)218684b89bcSSebastian Ott static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
219684b89bcSSebastian Ott 			     unsigned int size)
220684b89bcSSebastian Ott {
221684b89bcSSebastian Ott 	struct zpci_dev *zdev = to_zpci(ism->pdev);
222684b89bcSSebastian Ott 	u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
223684b89bcSSebastian Ott 
22481deca12SSebastian Ott 	return __zpci_store_block(data, req, dmb_req);
225684b89bcSSebastian Ott }
226684b89bcSSebastian Ott 
227684b89bcSSebastian Ott #endif /* S390_ISM_H */
228