hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_S390_EADM_H
#define _ASM_S390_EADM_H
 
#include <linux/types.h>
#include <linux/device.h>
#include <linux/blk_types.h>
 
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;
 
#define EQC_WR_PROHIBIT 22
 
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);
 
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
 
enum scm_event {SCM_CHANGE, SCM_AVAIL};
 
struct scm_driver {
   struct device_driver drv;
   int (*probe) (struct scm_device *scmdev);
   int (*remove) (struct scm_device *scmdev);
   void (*notify) (struct scm_device *scmdev, enum scm_event event);
   void (*handler) (struct scm_device *scmdev, void *data,
           blk_status_t error);
};
 
int scm_driver_register(struct scm_driver *scmdrv);
void scm_driver_unregister(struct scm_driver *scmdrv);
 
int eadm_start_aob(struct aob *aob);
void scm_irq_handler(struct aob *aob, blk_status_t error);
 
#endif /* _ASM_S390_EADM_H */