blob: 4d6e103f6e26b727345563ae005ad178eebb2dad [file] [log] [blame]
Sebastian Ottd2fc439b2012-08-28 16:44:51 +02001#ifndef _ASM_S390_EADM_H
2#define _ASM_S390_EADM_H
3
4#include <linux/types.h>
Sebastian Ott1d1c8f72012-08-28 16:46:26 +02005#include <linux/device.h>
6#include <linux/spinlock.h>
Sebastian Ottd2fc439b2012-08-28 16:44:51 +02007
8struct arqb {
9 u64 data;
10 u16 fmt:4;
11 u16:12;
12 u16 cmd_code;
13 u16:16;
14 u16 msb_count;
15 u32 reserved[12];
16} __packed;
17
18#define ARQB_CMD_MOVE 1
19
20struct arsb {
21 u16 fmt:4;
22 u32:28;
23 u8 ef;
24 u8:8;
25 u8 ecbi;
26 u8:8;
27 u8 fvf;
28 u16:16;
29 u8 eqc;
30 u32:32;
31 u64 fail_msb;
32 u64 fail_aidaw;
33 u64 fail_ms;
34 u64 fail_scm;
35 u32 reserved[4];
36} __packed;
37
38struct msb {
39 u8 fmt:4;
40 u8 oc:4;
41 u8 flags;
42 u16:12;
43 u16 bs:4;
44 u32 blk_count;
45 u64 data_addr;
46 u64 scm_addr;
47 u64:64;
48} __packed;
49
50struct aidaw {
51 u8 flags;
52 u32 :24;
53 u32 :32;
54 u64 data_addr;
55} __packed;
56
57#define MSB_OC_CLEAR 0
58#define MSB_OC_READ 1
59#define MSB_OC_WRITE 2
60#define MSB_OC_RELEASE 3
61
62#define MSB_FLAG_BNM 0x80
63#define MSB_FLAG_IDA 0x40
64
65#define MSB_BS_4K 0
66#define MSB_BS_1M 1
67
68#define AOB_NR_MSB 124
69
70struct aob {
71 struct arqb request;
72 struct arsb response;
73 struct msb msb[AOB_NR_MSB];
74} __packed __aligned(PAGE_SIZE);
75
Sebastian Ott1d1c8f72012-08-28 16:46:26 +020076struct aob_rq_header {
77 struct scm_device *scmdev;
78 char data[0];
79};
80
81struct scm_device {
82 u64 address;
83 u64 size;
84 unsigned int nr_max_block;
85 struct device dev;
86 spinlock_t lock;
87 struct {
88 unsigned int persistence:4;
89 unsigned int oper_state:4;
90 unsigned int data_state:4;
91 unsigned int rank:4;
92 unsigned int release:1;
93 unsigned int res_id:8;
94 } __packed attrs;
95};
96
97#define OP_STATE_GOOD 1
98#define OP_STATE_TEMP_ERR 2
99#define OP_STATE_PERM_ERR 3
100
101struct scm_driver {
102 struct device_driver drv;
103 int (*probe) (struct scm_device *scmdev);
104 int (*remove) (struct scm_device *scmdev);
Sebastian Ott40ff4cc2012-08-28 16:47:02 +0200105 void (*notify) (struct scm_device *scmdev);
Sebastian Ott1d1c8f72012-08-28 16:46:26 +0200106 void (*handler) (struct scm_device *scmdev, void *data, int error);
107};
108
109int scm_driver_register(struct scm_driver *scmdrv);
110void scm_driver_unregister(struct scm_driver *scmdrv);
111
112int scm_start_aob(struct aob *aob);
113void scm_irq_handler(struct aob *aob, int error);
114
115struct eadm_ops {
116 int (*eadm_start) (struct aob *aob);
117 struct module *owner;
118};
119
120int scm_get_ref(void);
121void scm_put_ref(void);
122
123void register_eadm_ops(struct eadm_ops *ops);
124void unregister_eadm_ops(struct eadm_ops *ops);
125
Sebastian Ottd2fc439b2012-08-28 16:44:51 +0200126#endif /* _ASM_S390_EADM_H */