222 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef S390_ISM_H
 | |
| #define S390_ISM_H
 | |
| 
 | |
| #include <linux/spinlock.h>
 | |
| #include <linux/types.h>
 | |
| #include <linux/pci.h>
 | |
| #include <net/smc.h>
 | |
| 
 | |
| #define UTIL_STR_LEN	16
 | |
| 
 | |
| /*
 | |
|  * Do not use the first word of the DMB bits to ensure 8 byte aligned access.
 | |
|  */
 | |
| #define ISM_DMB_WORD_OFFSET	1
 | |
| #define ISM_DMB_BIT_OFFSET	(ISM_DMB_WORD_OFFSET * 32)
 | |
| #define ISM_NR_DMBS		1920
 | |
| 
 | |
| #define ISM_REG_SBA	0x1
 | |
| #define ISM_REG_IEQ	0x2
 | |
| #define ISM_READ_GID	0x3
 | |
| #define ISM_ADD_VLAN_ID	0x4
 | |
| #define ISM_DEL_VLAN_ID	0x5
 | |
| #define ISM_SET_VLAN	0x6
 | |
| #define ISM_RESET_VLAN	0x7
 | |
| #define ISM_QUERY_INFO	0x8
 | |
| #define ISM_QUERY_RGID	0x9
 | |
| #define ISM_REG_DMB	0xA
 | |
| #define ISM_UNREG_DMB	0xB
 | |
| #define ISM_SIGNAL_IEQ	0xE
 | |
| #define ISM_UNREG_SBA	0x11
 | |
| #define ISM_UNREG_IEQ	0x12
 | |
| 
 | |
| #define ISM_ERROR	0xFFFF
 | |
| 
 | |
| struct ism_req_hdr {
 | |
| 	u32 cmd;
 | |
| 	u16 : 16;
 | |
| 	u16 len;
 | |
| };
 | |
| 
 | |
| struct ism_resp_hdr {
 | |
| 	u32 cmd;
 | |
| 	u16 ret;
 | |
| 	u16 len;
 | |
| };
 | |
| 
 | |
| union ism_reg_sba {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 sba;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(16);
 | |
| 
 | |
| union ism_reg_ieq {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 ieq;
 | |
| 		u64 len;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(16);
 | |
| 
 | |
| union ism_read_gid {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 		u64 gid;
 | |
| 	} response;
 | |
| } __aligned(16);
 | |
| 
 | |
| union ism_qi {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 		u32 version;
 | |
| 		u32 max_len;
 | |
| 		u64 ism_state;
 | |
| 		u64 my_gid;
 | |
| 		u64 sba;
 | |
| 		u64 ieq;
 | |
| 		u32 ieq_len;
 | |
| 		u32 : 32;
 | |
| 		u32 dmbs_owned;
 | |
| 		u32 dmbs_used;
 | |
| 		u32 vlan_required;
 | |
| 		u32 vlan_nr_ids;
 | |
| 		u16 vlan_id[64];
 | |
| 	} response;
 | |
| } __aligned(64);
 | |
| 
 | |
| union ism_query_rgid {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 rgid;
 | |
| 		u32 vlan_valid;
 | |
| 		u32 vlan_id;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(16);
 | |
| 
 | |
| union ism_reg_dmb {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 dmb;
 | |
| 		u32 dmb_len;
 | |
| 		u32 sba_idx;
 | |
| 		u32 vlan_valid;
 | |
| 		u32 vlan_id;
 | |
| 		u64 rgid;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 		u64 dmb_tok;
 | |
| 	} response;
 | |
| } __aligned(32);
 | |
| 
 | |
| union ism_sig_ieq {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 rgid;
 | |
| 		u32 trigger_irq;
 | |
| 		u32 event_code;
 | |
| 		u64 info;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(32);
 | |
| 
 | |
| union ism_unreg_dmb {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 dmb_tok;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(16);
 | |
| 
 | |
| union ism_cmd_simple {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(8);
 | |
| 
 | |
| union ism_set_vlan_id {
 | |
| 	struct {
 | |
| 		struct ism_req_hdr hdr;
 | |
| 		u64 vlan_id;
 | |
| 	} request;
 | |
| 	struct {
 | |
| 		struct ism_resp_hdr hdr;
 | |
| 	} response;
 | |
| } __aligned(16);
 | |
| 
 | |
| struct ism_eq_header {
 | |
| 	u64 idx;
 | |
| 	u64 ieq_len;
 | |
| 	u64 entry_len;
 | |
| 	u64 : 64;
 | |
| };
 | |
| 
 | |
| struct ism_eq {
 | |
| 	struct ism_eq_header header;
 | |
| 	struct smcd_event entry[15];
 | |
| };
 | |
| 
 | |
| struct ism_sba {
 | |
| 	u32 s : 1;	/* summary bit */
 | |
| 	u32 e : 1;	/* event bit */
 | |
| 	u32 : 30;
 | |
| 	u32 dmb_bits[ISM_NR_DMBS / 32];
 | |
| 	u32 reserved[3];
 | |
| 	u16 dmbe_mask[ISM_NR_DMBS];
 | |
| };
 | |
| 
 | |
| struct ism_dev {
 | |
| 	spinlock_t lock;
 | |
| 	struct pci_dev *pdev;
 | |
| 	struct smcd_dev *smcd;
 | |
| 
 | |
| 	void __iomem *ctl;
 | |
| 
 | |
| 	struct ism_sba *sba;
 | |
| 	dma_addr_t sba_dma_addr;
 | |
| 	DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
 | |
| 
 | |
| 	struct ism_eq *ieq;
 | |
| 	dma_addr_t ieq_dma_addr;
 | |
| 
 | |
| 	int ieq_idx;
 | |
| };
 | |
| 
 | |
| #define ISM_CREATE_REQ(dmb, idx, sf, offset)		\
 | |
| 	((dmb) | (idx) << 24 | (sf) << 23 | (offset))
 | |
| 
 | |
| static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
 | |
| 			     unsigned int size)
 | |
| {
 | |
| 	struct zpci_dev *zdev = to_zpci(ism->pdev);
 | |
| 	u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
 | |
| 
 | |
| 	return zpci_write_block(req, data, dmb_req);
 | |
| }
 | |
| 
 | |
| #endif /* S390_ISM_H */
 | 
