linux/include/uapi/scsi/cxlflash_ioctl.h
<<
>>
Prefs
   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
  32struct 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
  74struct 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
  86struct 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
  92struct 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
 102struct 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
 111struct 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
 118struct 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
 127struct 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
 138struct 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
 151struct 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
 165struct 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
 171union 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
 210struct 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
 233struct 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
 249struct 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
 261union 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 */
 277