Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef S390_ISM_H
  3#define S390_ISM_H
  4
  5#include <linux/spinlock.h>
  6#include <linux/types.h>
  7#include <linux/pci.h>
  8#include <net/smc.h>
  9#include <asm/pci_insn.h>
 10
 11#define UTIL_STR_LEN	16
 12
 13/*
 14 * Do not use the first word of the DMB bits to ensure 8 byte aligned access.
 15 */
 16#define ISM_DMB_WORD_OFFSET	1
 17#define ISM_DMB_BIT_OFFSET	(ISM_DMB_WORD_OFFSET * 32)
 18#define ISM_NR_DMBS		1920
 19
 20#define ISM_REG_SBA	0x1
 21#define ISM_REG_IEQ	0x2
 22#define ISM_READ_GID	0x3
 23#define ISM_ADD_VLAN_ID	0x4
 24#define ISM_DEL_VLAN_ID	0x5
 25#define ISM_SET_VLAN	0x6
 26#define ISM_RESET_VLAN	0x7
 27#define ISM_QUERY_INFO	0x8
 28#define ISM_QUERY_RGID	0x9
 29#define ISM_REG_DMB	0xA
 30#define ISM_UNREG_DMB	0xB
 31#define ISM_SIGNAL_IEQ	0xE
 32#define ISM_UNREG_SBA	0x11
 33#define ISM_UNREG_IEQ	0x12
 34
 35struct ism_req_hdr {
 36	u32 cmd;
 37	u16 : 16;
 38	u16 len;
 39};
 40
 41struct ism_resp_hdr {
 42	u32 cmd;
 43	u16 ret;
 44	u16 len;
 45};
 46
 47union ism_reg_sba {
 48	struct {
 49		struct ism_req_hdr hdr;
 50		u64 sba;
 51	} request;
 52	struct {
 53		struct ism_resp_hdr hdr;
 54	} response;
 55} __aligned(16);
 56
 57union ism_reg_ieq {
 58	struct {
 59		struct ism_req_hdr hdr;
 60		u64 ieq;
 61		u64 len;
 62	} request;
 63	struct {
 64		struct ism_resp_hdr hdr;
 65	} response;
 66} __aligned(16);
 67
 68union ism_read_gid {
 69	struct {
 70		struct ism_req_hdr hdr;
 71	} request;
 72	struct {
 73		struct ism_resp_hdr hdr;
 74		u64 gid;
 75	} response;
 76} __aligned(16);
 77
 78union ism_qi {
 79	struct {
 80		struct ism_req_hdr hdr;
 81	} request;
 82	struct {
 83		struct ism_resp_hdr hdr;
 84		u32 version;
 85		u32 max_len;
 86		u64 ism_state;
 87		u64 my_gid;
 88		u64 sba;
 89		u64 ieq;
 90		u32 ieq_len;
 91		u32 : 32;
 92		u32 dmbs_owned;
 93		u32 dmbs_used;
 94		u32 vlan_required;
 95		u32 vlan_nr_ids;
 96		u16 vlan_id[64];
 97	} response;
 98} __aligned(64);
 99
100union ism_query_rgid {
101	struct {
102		struct ism_req_hdr hdr;
103		u64 rgid;
104		u32 vlan_valid;
105		u32 vlan_id;
106	} request;
107	struct {
108		struct ism_resp_hdr hdr;
109	} response;
110} __aligned(16);
111
112union ism_reg_dmb {
113	struct {
114		struct ism_req_hdr hdr;
115		u64 dmb;
116		u32 dmb_len;
117		u32 sba_idx;
118		u32 vlan_valid;
119		u32 vlan_id;
120		u64 rgid;
121	} request;
122	struct {
123		struct ism_resp_hdr hdr;
124		u64 dmb_tok;
125	} response;
126} __aligned(32);
127
128union ism_sig_ieq {
129	struct {
130		struct ism_req_hdr hdr;
131		u64 rgid;
132		u32 trigger_irq;
133		u32 event_code;
134		u64 info;
135	} request;
136	struct {
137		struct ism_resp_hdr hdr;
138	} response;
139} __aligned(32);
140
141union ism_unreg_dmb {
142	struct {
143		struct ism_req_hdr hdr;
144		u64 dmb_tok;
145	} request;
146	struct {
147		struct ism_resp_hdr hdr;
148	} response;
149} __aligned(16);
150
151union ism_cmd_simple {
152	struct {
153		struct ism_req_hdr hdr;
154	} request;
155	struct {
156		struct ism_resp_hdr hdr;
157	} response;
158} __aligned(8);
159
160union ism_set_vlan_id {
161	struct {
162		struct ism_req_hdr hdr;
163		u64 vlan_id;
164	} request;
165	struct {
166		struct ism_resp_hdr hdr;
167	} response;
168} __aligned(16);
169
170struct ism_eq_header {
171	u64 idx;
172	u64 ieq_len;
173	u64 entry_len;
174	u64 : 64;
175};
176
177struct ism_eq {
178	struct ism_eq_header header;
179	struct smcd_event entry[15];
180};
181
182struct ism_sba {
183	u32 s : 1;	/* summary bit */
184	u32 e : 1;	/* event bit */
185	u32 : 30;
186	u32 dmb_bits[ISM_NR_DMBS / 32];
187	u32 reserved[3];
188	u16 dmbe_mask[ISM_NR_DMBS];
189};
190
191struct ism_dev {
192	spinlock_t lock;
193	struct pci_dev *pdev;
194	struct smcd_dev *smcd;
195
196	struct ism_sba *sba;
197	dma_addr_t sba_dma_addr;
198	DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
199
200	struct ism_eq *ieq;
201	dma_addr_t ieq_dma_addr;
202
203	int ieq_idx;
204};
205
206#define ISM_CREATE_REQ(dmb, idx, sf, offset)		\
207	((dmb) | (idx) << 24 | (sf) << 23 | (offset))
208
209static inline void __ism_read_cmd(struct ism_dev *ism, void *data,
210				  unsigned long offset, unsigned long len)
211{
212	struct zpci_dev *zdev = to_zpci(ism->pdev);
213	u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, 8);
214
215	while (len > 0) {
216		__zpci_load(data, req, offset);
217		offset += 8;
218		data += 8;
219		len -= 8;
220	}
221}
222
223static inline void __ism_write_cmd(struct ism_dev *ism, void *data,
224				   unsigned long offset, unsigned long len)
225{
226	struct zpci_dev *zdev = to_zpci(ism->pdev);
227	u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, len);
228
229	if (len)
230		__zpci_store_block(data, req, offset);
231}
232
233static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
234			     unsigned int size)
235{
236	struct zpci_dev *zdev = to_zpci(ism->pdev);
237	u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
238
239	return __zpci_store_block(data, req, dmb_req);
240}
241
242#endif /* S390_ISM_H */