Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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
 35#define ISM_ERROR	0xFFFF
 36
 37struct ism_req_hdr {
 38	u32 cmd;
 39	u16 : 16;
 40	u16 len;
 41};
 42
 43struct ism_resp_hdr {
 44	u32 cmd;
 45	u16 ret;
 46	u16 len;
 47};
 48
 49union ism_reg_sba {
 50	struct {
 51		struct ism_req_hdr hdr;
 52		u64 sba;
 53	} request;
 54	struct {
 55		struct ism_resp_hdr hdr;
 56	} response;
 57} __aligned(16);
 58
 59union ism_reg_ieq {
 60	struct {
 61		struct ism_req_hdr hdr;
 62		u64 ieq;
 63		u64 len;
 64	} request;
 65	struct {
 66		struct ism_resp_hdr hdr;
 67	} response;
 68} __aligned(16);
 69
 70union ism_read_gid {
 71	struct {
 72		struct ism_req_hdr hdr;
 73	} request;
 74	struct {
 75		struct ism_resp_hdr hdr;
 76		u64 gid;
 77	} response;
 78} __aligned(16);
 79
 80union ism_qi {
 81	struct {
 82		struct ism_req_hdr hdr;
 83	} request;
 84	struct {
 85		struct ism_resp_hdr hdr;
 86		u32 version;
 87		u32 max_len;
 88		u64 ism_state;
 89		u64 my_gid;
 90		u64 sba;
 91		u64 ieq;
 92		u32 ieq_len;
 93		u32 : 32;
 94		u32 dmbs_owned;
 95		u32 dmbs_used;
 96		u32 vlan_required;
 97		u32 vlan_nr_ids;
 98		u16 vlan_id[64];
 99	} response;
100} __aligned(64);
101
102union ism_query_rgid {
103	struct {
104		struct ism_req_hdr hdr;
105		u64 rgid;
106		u32 vlan_valid;
107		u32 vlan_id;
108	} request;
109	struct {
110		struct ism_resp_hdr hdr;
111	} response;
112} __aligned(16);
113
114union ism_reg_dmb {
115	struct {
116		struct ism_req_hdr hdr;
117		u64 dmb;
118		u32 dmb_len;
119		u32 sba_idx;
120		u32 vlan_valid;
121		u32 vlan_id;
122		u64 rgid;
123	} request;
124	struct {
125		struct ism_resp_hdr hdr;
126		u64 dmb_tok;
127	} response;
128} __aligned(32);
129
130union ism_sig_ieq {
131	struct {
132		struct ism_req_hdr hdr;
133		u64 rgid;
134		u32 trigger_irq;
135		u32 event_code;
136		u64 info;
137	} request;
138	struct {
139		struct ism_resp_hdr hdr;
140	} response;
141} __aligned(32);
142
143union ism_unreg_dmb {
144	struct {
145		struct ism_req_hdr hdr;
146		u64 dmb_tok;
147	} request;
148	struct {
149		struct ism_resp_hdr hdr;
150	} response;
151} __aligned(16);
152
153union ism_cmd_simple {
154	struct {
155		struct ism_req_hdr hdr;
156	} request;
157	struct {
158		struct ism_resp_hdr hdr;
159	} response;
160} __aligned(8);
161
162union ism_set_vlan_id {
163	struct {
164		struct ism_req_hdr hdr;
165		u64 vlan_id;
166	} request;
167	struct {
168		struct ism_resp_hdr hdr;
169	} response;
170} __aligned(16);
171
172struct ism_eq_header {
173	u64 idx;
174	u64 ieq_len;
175	u64 entry_len;
176	u64 : 64;
177};
178
179struct ism_eq {
180	struct ism_eq_header header;
181	struct smcd_event entry[15];
182};
183
184struct ism_sba {
185	u32 s : 1;	/* summary bit */
186	u32 e : 1;	/* event bit */
187	u32 : 30;
188	u32 dmb_bits[ISM_NR_DMBS / 32];
189	u32 reserved[3];
190	u16 dmbe_mask[ISM_NR_DMBS];
191};
192
193struct ism_dev {
194	spinlock_t lock;
195	struct pci_dev *pdev;
196	struct smcd_dev *smcd;
197
198	struct ism_sba *sba;
199	dma_addr_t sba_dma_addr;
200	DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
201
202	struct ism_eq *ieq;
203	dma_addr_t ieq_dma_addr;
204
205	int ieq_idx;
206};
207
208#define ISM_CREATE_REQ(dmb, idx, sf, offset)		\
209	((dmb) | (idx) << 24 | (sf) << 23 | (offset))
210
211static inline void __ism_read_cmd(struct ism_dev *ism, void *data,
212				  unsigned long offset, unsigned long len)
213{
214	struct zpci_dev *zdev = to_zpci(ism->pdev);
215	u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, 8);
216
217	while (len > 0) {
218		__zpci_load(data, req, offset);
219		offset += 8;
220		data += 8;
221		len -= 8;
222	}
223}
224
225static inline void __ism_write_cmd(struct ism_dev *ism, void *data,
226				   unsigned long offset, unsigned long len)
227{
228	struct zpci_dev *zdev = to_zpci(ism->pdev);
229	u64 req = ZPCI_CREATE_REQ(zdev->fh, 2, len);
230
231	if (len)
232		__zpci_store_block(data, req, offset);
233}
234
235static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
236			     unsigned int size)
237{
238	struct zpci_dev *zdev = to_zpci(ism->pdev);
239	u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
240
241	return __zpci_store_block(data, req, dmb_req);
242}
243
244#endif /* S390_ISM_H */