| 
									
										
										
										
											2012-08-28 16:44:51 +02:00
										 |  |  | #ifndef _ASM_S390_EADM_H
 | 
					
						
							|  |  |  | #define _ASM_S390_EADM_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/types.h>
 | 
					
						
							| 
									
										
										
										
											2012-08-28 16:46:26 +02:00
										 |  |  | #include <linux/device.h>
 | 
					
						
							| 
									
										
										
										
											2012-08-28 16:44:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct arqb { | 
					
						
							|  |  |  | 	u64 data; | 
					
						
							|  |  |  | 	u16 fmt:4; | 
					
						
							|  |  |  | 	u16:12; | 
					
						
							|  |  |  | 	u16 cmd_code; | 
					
						
							|  |  |  | 	u16:16; | 
					
						
							|  |  |  | 	u16 msb_count; | 
					
						
							|  |  |  | 	u32 reserved[12]; | 
					
						
							|  |  |  | } __packed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ARQB_CMD_MOVE	1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct arsb { | 
					
						
							|  |  |  | 	u16 fmt:4; | 
					
						
							|  |  |  | 	u32:28; | 
					
						
							|  |  |  | 	u8 ef; | 
					
						
							|  |  |  | 	u8:8; | 
					
						
							|  |  |  | 	u8 ecbi; | 
					
						
							|  |  |  | 	u8:8; | 
					
						
							|  |  |  | 	u8 fvf; | 
					
						
							|  |  |  | 	u16:16; | 
					
						
							|  |  |  | 	u8 eqc; | 
					
						
							|  |  |  | 	u32:32; | 
					
						
							|  |  |  | 	u64 fail_msb; | 
					
						
							|  |  |  | 	u64 fail_aidaw; | 
					
						
							|  |  |  | 	u64 fail_ms; | 
					
						
							|  |  |  | 	u64 fail_scm; | 
					
						
							|  |  |  | 	u32 reserved[4]; | 
					
						
							|  |  |  | } __packed; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-28 12:07:48 +01:00
										 |  |  | #define EQC_WR_PROHIBIT 22
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 16:44:51 +02:00
										 |  |  | struct msb { | 
					
						
							|  |  |  | 	u8 fmt:4; | 
					
						
							|  |  |  | 	u8 oc:4; | 
					
						
							|  |  |  | 	u8 flags; | 
					
						
							|  |  |  | 	u16:12; | 
					
						
							|  |  |  | 	u16 bs:4; | 
					
						
							|  |  |  | 	u32 blk_count; | 
					
						
							|  |  |  | 	u64 data_addr; | 
					
						
							|  |  |  | 	u64 scm_addr; | 
					
						
							|  |  |  | 	u64:64; | 
					
						
							|  |  |  | } __packed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct aidaw { | 
					
						
							|  |  |  | 	u8 flags; | 
					
						
							|  |  |  | 	u32 :24; | 
					
						
							|  |  |  | 	u32 :32; | 
					
						
							|  |  |  | 	u64 data_addr; | 
					
						
							|  |  |  | } __packed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MSB_OC_CLEAR	0
 | 
					
						
							|  |  |  | #define MSB_OC_READ	1
 | 
					
						
							|  |  |  | #define MSB_OC_WRITE	2
 | 
					
						
							|  |  |  | #define MSB_OC_RELEASE	3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MSB_FLAG_BNM	0x80
 | 
					
						
							|  |  |  | #define MSB_FLAG_IDA	0x40
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MSB_BS_4K	0
 | 
					
						
							|  |  |  | #define MSB_BS_1M	1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define AOB_NR_MSB	124
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct aob { | 
					
						
							|  |  |  | 	struct arqb request; | 
					
						
							|  |  |  | 	struct arsb response; | 
					
						
							|  |  |  | 	struct msb msb[AOB_NR_MSB]; | 
					
						
							|  |  |  | } __packed __aligned(PAGE_SIZE); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 16:46:26 +02:00
										 |  |  | struct aob_rq_header { | 
					
						
							|  |  |  | 	struct scm_device *scmdev; | 
					
						
							|  |  |  | 	char data[0]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct scm_device { | 
					
						
							|  |  |  | 	u64 address; | 
					
						
							|  |  |  | 	u64 size; | 
					
						
							|  |  |  | 	unsigned int nr_max_block; | 
					
						
							|  |  |  | 	struct device dev; | 
					
						
							|  |  |  | 	struct { | 
					
						
							|  |  |  | 		unsigned int persistence:4; | 
					
						
							|  |  |  | 		unsigned int oper_state:4; | 
					
						
							|  |  |  | 		unsigned int data_state:4; | 
					
						
							|  |  |  | 		unsigned int rank:4; | 
					
						
							|  |  |  | 		unsigned int release:1; | 
					
						
							|  |  |  | 		unsigned int res_id:8; | 
					
						
							|  |  |  | 	} __packed attrs; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define OP_STATE_GOOD		1
 | 
					
						
							|  |  |  | #define OP_STATE_TEMP_ERR	2
 | 
					
						
							|  |  |  | #define OP_STATE_PERM_ERR	3
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-28 12:07:55 +01:00
										 |  |  | enum scm_event {SCM_CHANGE, SCM_AVAIL}; | 
					
						
							| 
									
										
										
										
											2013-02-28 12:07:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 16:46:26 +02:00
										 |  |  | struct scm_driver { | 
					
						
							|  |  |  | 	struct device_driver drv; | 
					
						
							|  |  |  | 	int (*probe) (struct scm_device *scmdev); | 
					
						
							|  |  |  | 	int (*remove) (struct scm_device *scmdev); | 
					
						
							| 
									
										
										
										
											2013-02-28 12:07:38 +01:00
										 |  |  | 	void (*notify) (struct scm_device *scmdev, enum scm_event event); | 
					
						
							| 
									
										
										
										
											2012-08-28 16:46:26 +02:00
										 |  |  | 	void (*handler) (struct scm_device *scmdev, void *data, int error); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int scm_driver_register(struct scm_driver *scmdrv); | 
					
						
							|  |  |  | void scm_driver_unregister(struct scm_driver *scmdrv); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-14 10:44:56 +01:00
										 |  |  | int eadm_start_aob(struct aob *aob); | 
					
						
							| 
									
										
										
										
											2012-08-28 16:46:26 +02:00
										 |  |  | void scm_irq_handler(struct aob *aob, int error); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-28 16:44:51 +02:00
										 |  |  | #endif /* _ASM_S390_EADM_H */
 |