root/include/uapi/scsi/cxlflash_ioctl.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
   2 /*
   3  * CXL Flash Device Driver
   4  *
   5  * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
   6  *             Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
   7  *
   8  * Copyright (C) 2015 IBM Corporation
   9  *
  10  * This program is free software; you can redistribute it and/or
  11  * modify it under the terms of the GNU General Public License
  12  * as published by the Free Software Foundation; either version
  13  * 2 of the License, or (at your option) any later version.
  14  */
  15 
  16 #ifndef _CXLFLASH_IOCTL_H
  17 #define _CXLFLASH_IOCTL_H
  18 
  19 #include <linux/types.h>
  20 
  21 /*
  22  * Structure and definitions for all CXL Flash ioctls
  23  */
  24 #define CXLFLASH_WWID_LEN               16
  25 
  26 /*
  27  * Structure and flag definitions CXL Flash superpipe ioctls
  28  */
  29 
  30 #define DK_CXLFLASH_VERSION_0   0
  31 
  32 struct dk_cxlflash_hdr {
  33         __u16 version;                  /* Version data */
  34         __u16 rsvd[3];                  /* Reserved for future use */
  35         __u64 flags;                    /* Input flags */
  36         __u64 return_flags;             /* Returned flags */
  37 };
  38 
  39 /*
  40  * Return flag definitions available to all superpipe ioctls
  41  *
  42  * Similar to the input flags, these are grown from the bottom-up with the
  43  * intention that ioctl-specific return flag definitions would grow from the
  44  * top-down, allowing the two sets to co-exist. While not required/enforced
  45  * at this time, this provides future flexibility.
  46  */
  47 #define DK_CXLFLASH_ALL_PORTS_ACTIVE    0x0000000000000001ULL
  48 #define DK_CXLFLASH_APP_CLOSE_ADAP_FD   0x0000000000000002ULL
  49 #define DK_CXLFLASH_CONTEXT_SQ_CMD_MODE 0x0000000000000004ULL
  50 
  51 /*
  52  * General Notes:
  53  * -------------
  54  * The 'context_id' field of all ioctl structures contains the context
  55  * identifier for a context in the lower 32-bits (upper 32-bits are not
  56  * to be used when identifying a context to the AFU). That said, the value
  57  * in its entirety (all 64-bits) is to be treated as an opaque cookie and
  58  * should be presented as such when issuing ioctls.
  59  */
  60 
  61 /*
  62  * DK_CXLFLASH_ATTACH Notes:
  63  * ------------------------
  64  * Read/write access permissions are specified via the O_RDONLY, O_WRONLY,
  65  * and O_RDWR flags defined in the fcntl.h header file.
  66  *
  67  * A valid adapter file descriptor (fd >= 0) is only returned on the initial
  68  * attach (successful) of a context. When a context is shared(reused), the user
  69  * is expected to already 'know' the adapter file descriptor associated with the
  70  * context.
  71  */
  72 #define DK_CXLFLASH_ATTACH_REUSE_CONTEXT        0x8000000000000000ULL
  73 
  74 struct dk_cxlflash_attach {
  75         struct dk_cxlflash_hdr hdr;     /* Common fields */
  76         __u64 num_interrupts;           /* Requested number of interrupts */
  77         __u64 context_id;               /* Returned context */
  78         __u64 mmio_size;                /* Returned size of MMIO area */
  79         __u64 block_size;               /* Returned block size, in bytes */
  80         __u64 adap_fd;                  /* Returned adapter file descriptor */
  81         __u64 last_lba;                 /* Returned last LBA on the device */
  82         __u64 max_xfer;                 /* Returned max transfer size, blocks */
  83         __u64 reserved[8];              /* Reserved for future use */
  84 };
  85 
  86 struct dk_cxlflash_detach {
  87         struct dk_cxlflash_hdr hdr;     /* Common fields */
  88         __u64 context_id;               /* Context to detach */
  89         __u64 reserved[8];              /* Reserved for future use */
  90 };
  91 
  92 struct dk_cxlflash_udirect {
  93         struct dk_cxlflash_hdr hdr;     /* Common fields */
  94         __u64 context_id;               /* Context to own physical resources */
  95         __u64 rsrc_handle;              /* Returned resource handle */
  96         __u64 last_lba;                 /* Returned last LBA on the device */
  97         __u64 reserved[8];              /* Reserved for future use */
  98 };
  99 
 100 #define DK_CXLFLASH_UVIRTUAL_NEED_WRITE_SAME    0x8000000000000000ULL
 101 
 102 struct dk_cxlflash_uvirtual {
 103         struct dk_cxlflash_hdr hdr;     /* Common fields */
 104         __u64 context_id;               /* Context to own virtual resources */
 105         __u64 lun_size;                 /* Requested size, in 4K blocks */
 106         __u64 rsrc_handle;              /* Returned resource handle */
 107         __u64 last_lba;                 /* Returned last LBA of LUN */
 108         __u64 reserved[8];              /* Reserved for future use */
 109 };
 110 
 111 struct dk_cxlflash_release {
 112         struct dk_cxlflash_hdr hdr;     /* Common fields */
 113         __u64 context_id;               /* Context owning resources */
 114         __u64 rsrc_handle;              /* Resource handle to release */
 115         __u64 reserved[8];              /* Reserved for future use */
 116 };
 117 
 118 struct dk_cxlflash_resize {
 119         struct dk_cxlflash_hdr hdr;     /* Common fields */
 120         __u64 context_id;               /* Context owning resources */
 121         __u64 rsrc_handle;              /* Resource handle of LUN to resize */
 122         __u64 req_size;                 /* New requested size, in 4K blocks */
 123         __u64 last_lba;                 /* Returned last LBA of LUN */
 124         __u64 reserved[8];              /* Reserved for future use */
 125 };
 126 
 127 struct dk_cxlflash_clone {
 128         struct dk_cxlflash_hdr hdr;     /* Common fields */
 129         __u64 context_id_src;           /* Context to clone from */
 130         __u64 context_id_dst;           /* Context to clone to */
 131         __u64 adap_fd_src;              /* Source context adapter fd */
 132         __u64 reserved[8];              /* Reserved for future use */
 133 };
 134 
 135 #define DK_CXLFLASH_VERIFY_SENSE_LEN    18
 136 #define DK_CXLFLASH_VERIFY_HINT_SENSE   0x8000000000000000ULL
 137 
 138 struct dk_cxlflash_verify {
 139         struct dk_cxlflash_hdr hdr;     /* Common fields */
 140         __u64 context_id;               /* Context owning resources to verify */
 141         __u64 rsrc_handle;              /* Resource handle of LUN */
 142         __u64 hint;                     /* Reasons for verify */
 143         __u64 last_lba;                 /* Returned last LBA of device */
 144         __u8 sense_data[DK_CXLFLASH_VERIFY_SENSE_LEN]; /* SCSI sense data */
 145         __u8 pad[6];                    /* Pad to next 8-byte boundary */
 146         __u64 reserved[8];              /* Reserved for future use */
 147 };
 148 
 149 #define DK_CXLFLASH_RECOVER_AFU_CONTEXT_RESET   0x8000000000000000ULL
 150 
 151 struct dk_cxlflash_recover_afu {
 152         struct dk_cxlflash_hdr hdr;     /* Common fields */
 153         __u64 reason;                   /* Reason for recovery request */
 154         __u64 context_id;               /* Context to recover / updated ID */
 155         __u64 mmio_size;                /* Returned size of MMIO area */
 156         __u64 adap_fd;                  /* Returned adapter file descriptor */
 157         __u64 reserved[8];              /* Reserved for future use */
 158 };
 159 
 160 #define DK_CXLFLASH_MANAGE_LUN_WWID_LEN                 CXLFLASH_WWID_LEN
 161 #define DK_CXLFLASH_MANAGE_LUN_ENABLE_SUPERPIPE         0x8000000000000000ULL
 162 #define DK_CXLFLASH_MANAGE_LUN_DISABLE_SUPERPIPE        0x4000000000000000ULL
 163 #define DK_CXLFLASH_MANAGE_LUN_ALL_PORTS_ACCESSIBLE     0x2000000000000000ULL
 164 
 165 struct dk_cxlflash_manage_lun {
 166         struct dk_cxlflash_hdr hdr;                     /* Common fields */
 167         __u8 wwid[DK_CXLFLASH_MANAGE_LUN_WWID_LEN];     /* Page83 WWID, NAA-6 */
 168         __u64 reserved[8];                              /* Rsvd, future use */
 169 };
 170 
 171 union cxlflash_ioctls {
 172         struct dk_cxlflash_attach attach;
 173         struct dk_cxlflash_detach detach;
 174         struct dk_cxlflash_udirect udirect;
 175         struct dk_cxlflash_uvirtual uvirtual;
 176         struct dk_cxlflash_release release;
 177         struct dk_cxlflash_resize resize;
 178         struct dk_cxlflash_clone clone;
 179         struct dk_cxlflash_verify verify;
 180         struct dk_cxlflash_recover_afu recover_afu;
 181         struct dk_cxlflash_manage_lun manage_lun;
 182 };
 183 
 184 #define MAX_CXLFLASH_IOCTL_SZ   (sizeof(union cxlflash_ioctls))
 185 
 186 #define CXL_MAGIC 0xCA
 187 #define CXL_IOWR(_n, _s)        _IOWR(CXL_MAGIC, _n, struct _s)
 188 
 189 /*
 190  * CXL Flash superpipe ioctls start at base of the reserved CXL_MAGIC
 191  * region (0x80) and grow upwards.
 192  */
 193 #define DK_CXLFLASH_ATTACH              CXL_IOWR(0x80, dk_cxlflash_attach)
 194 #define DK_CXLFLASH_USER_DIRECT         CXL_IOWR(0x81, dk_cxlflash_udirect)
 195 #define DK_CXLFLASH_RELEASE             CXL_IOWR(0x82, dk_cxlflash_release)
 196 #define DK_CXLFLASH_DETACH              CXL_IOWR(0x83, dk_cxlflash_detach)
 197 #define DK_CXLFLASH_VERIFY              CXL_IOWR(0x84, dk_cxlflash_verify)
 198 #define DK_CXLFLASH_RECOVER_AFU         CXL_IOWR(0x85, dk_cxlflash_recover_afu)
 199 #define DK_CXLFLASH_MANAGE_LUN          CXL_IOWR(0x86, dk_cxlflash_manage_lun)
 200 #define DK_CXLFLASH_USER_VIRTUAL        CXL_IOWR(0x87, dk_cxlflash_uvirtual)
 201 #define DK_CXLFLASH_VLUN_RESIZE         CXL_IOWR(0x88, dk_cxlflash_resize)
 202 #define DK_CXLFLASH_VLUN_CLONE          CXL_IOWR(0x89, dk_cxlflash_clone)
 203 
 204 /*
 205  * Structure and flag definitions CXL Flash host ioctls
 206  */
 207 
 208 #define HT_CXLFLASH_VERSION_0  0
 209 
 210 struct ht_cxlflash_hdr {
 211         __u16 version;          /* Version data */
 212         __u16 subcmd;           /* Sub-command */
 213         __u16 rsvd[2];          /* Reserved for future use */
 214         __u64 flags;            /* Input flags */
 215         __u64 return_flags;     /* Returned flags */
 216 };
 217 
 218 /*
 219  * Input flag definitions available to all host ioctls
 220  *
 221  * These are grown from the bottom-up with the intention that ioctl-specific
 222  * input flag definitions would grow from the top-down, allowing the two sets
 223  * to co-exist. While not required/enforced at this time, this provides future
 224  * flexibility.
 225  */
 226 #define HT_CXLFLASH_HOST_READ                           0x0000000000000000ULL
 227 #define HT_CXLFLASH_HOST_WRITE                          0x0000000000000001ULL
 228 
 229 #define HT_CXLFLASH_LUN_PROVISION_SUBCMD_CREATE_LUN     0x0001
 230 #define HT_CXLFLASH_LUN_PROVISION_SUBCMD_DELETE_LUN     0x0002
 231 #define HT_CXLFLASH_LUN_PROVISION_SUBCMD_QUERY_PORT     0x0003
 232 
 233 struct ht_cxlflash_lun_provision {
 234         struct ht_cxlflash_hdr hdr; /* Common fields */
 235         __u16 port;                 /* Target port for provision request */
 236         __u16 reserved16[3];        /* Reserved for future use */
 237         __u64 size;                 /* Size of LUN (4K blocks) */
 238         __u64 lun_id;               /* SCSI LUN ID */
 239         __u8 wwid[CXLFLASH_WWID_LEN];/* Page83 WWID, NAA-6 */
 240         __u64 max_num_luns;         /* Maximum number of LUNs provisioned */
 241         __u64 cur_num_luns;         /* Current number of LUNs provisioned */
 242         __u64 max_cap_port;         /* Total capacity for port (4K blocks) */
 243         __u64 cur_cap_port;         /* Current capacity for port (4K blocks) */
 244         __u64 reserved[8];          /* Reserved for future use */
 245 };
 246 
 247 #define HT_CXLFLASH_AFU_DEBUG_MAX_DATA_LEN              262144  /* 256K */
 248 #define HT_CXLFLASH_AFU_DEBUG_SUBCMD_LEN                12
 249 struct ht_cxlflash_afu_debug {
 250         struct ht_cxlflash_hdr hdr; /* Common fields */
 251         __u8 reserved8[4];          /* Reserved for future use */
 252         __u8 afu_subcmd[HT_CXLFLASH_AFU_DEBUG_SUBCMD_LEN]; /* AFU subcommand,
 253                                                             * (pass through)
 254                                                             */
 255         __u64 data_ea;              /* Data buffer effective address */
 256         __u32 data_len;             /* Data buffer length */
 257         __u32 reserved32;           /* Reserved for future use */
 258         __u64 reserved[8];          /* Reserved for future use */
 259 };
 260 
 261 union cxlflash_ht_ioctls {
 262         struct ht_cxlflash_lun_provision lun_provision;
 263         struct ht_cxlflash_afu_debug afu_debug;
 264 };
 265 
 266 #define MAX_HT_CXLFLASH_IOCTL_SZ        (sizeof(union cxlflash_ht_ioctls))
 267 
 268 /*
 269  * CXL Flash host ioctls start at the top of the reserved CXL_MAGIC
 270  * region (0xBF) and grow downwards.
 271  */
 272 #define HT_CXLFLASH_LUN_PROVISION CXL_IOWR(0xBF, ht_cxlflash_lun_provision)
 273 #define HT_CXLFLASH_AFU_DEBUG     CXL_IOWR(0xBE, ht_cxlflash_afu_debug)
 274 
 275 
 276 #endif /* ifndef _CXLFLASH_IOCTL_H */

/* [<][>][^][v][top][bottom][index][help] */