linux/arch/s390/include/asm/eadm.h
<<
>>
Prefs
   1#ifndef _ASM_S390_EADM_H
   2#define _ASM_S390_EADM_H
   3
   4#include <linux/types.h>
   5#include <linux/device.h>
   6
   7struct arqb {
   8        u64 data;
   9        u16 fmt:4;
  10        u16:12;
  11        u16 cmd_code;
  12        u16:16;
  13        u16 msb_count;
  14        u32 reserved[12];
  15} __packed;
  16
  17#define ARQB_CMD_MOVE   1
  18
  19struct arsb {
  20        u16 fmt:4;
  21        u32:28;
  22        u8 ef;
  23        u8:8;
  24        u8 ecbi;
  25        u8:8;
  26        u8 fvf;
  27        u16:16;
  28        u8 eqc;
  29        u32:32;
  30        u64 fail_msb;
  31        u64 fail_aidaw;
  32        u64 fail_ms;
  33        u64 fail_scm;
  34        u32 reserved[4];
  35} __packed;
  36
  37#define EQC_WR_PROHIBIT 22
  38
  39struct msb {
  40        u8 fmt:4;
  41        u8 oc:4;
  42        u8 flags;
  43        u16:12;
  44        u16 bs:4;
  45        u32 blk_count;
  46        u64 data_addr;
  47        u64 scm_addr;
  48        u64:64;
  49} __packed;
  50
  51struct aidaw {
  52        u8 flags;
  53        u32 :24;
  54        u32 :32;
  55        u64 data_addr;
  56} __packed;
  57
  58#define MSB_OC_CLEAR    0
  59#define MSB_OC_READ     1
  60#define MSB_OC_WRITE    2
  61#define MSB_OC_RELEASE  3
  62
  63#define MSB_FLAG_BNM    0x80
  64#define MSB_FLAG_IDA    0x40
  65
  66#define MSB_BS_4K       0
  67#define MSB_BS_1M       1
  68
  69#define AOB_NR_MSB      124
  70
  71struct aob {
  72        struct arqb request;
  73        struct arsb response;
  74        struct msb msb[AOB_NR_MSB];
  75} __packed __aligned(PAGE_SIZE);
  76
  77struct aob_rq_header {
  78        struct scm_device *scmdev;
  79        char data[0];
  80};
  81
  82struct scm_device {
  83        u64 address;
  84        u64 size;
  85        unsigned int nr_max_block;
  86        struct device dev;
  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
 101enum scm_event {SCM_CHANGE, SCM_AVAIL};
 102
 103struct scm_driver {
 104        struct device_driver drv;
 105        int (*probe) (struct scm_device *scmdev);
 106        int (*remove) (struct scm_device *scmdev);
 107        void (*notify) (struct scm_device *scmdev, enum scm_event event);
 108        void (*handler) (struct scm_device *scmdev, void *data, int error);
 109};
 110
 111int scm_driver_register(struct scm_driver *scmdrv);
 112void scm_driver_unregister(struct scm_driver *scmdrv);
 113
 114int eadm_start_aob(struct aob *aob);
 115void scm_irq_handler(struct aob *aob, int error);
 116
 117#endif /* _ASM_S390_EADM_H */
 118