277 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */2/*3 * CXL Flash Device Driver4 *5 * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation6 * Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation7 *8 * Copyright (C) 2015 IBM Corporation9 *10 * This program is free software; you can redistribute it and/or11 * modify it under the terms of the GNU General Public License12 * as published by the Free Software Foundation; either version13 * 2 of the License, or (at your option) any later version.14 */15 16#ifndef _CXLFLASH_IOCTL_H17#define _CXLFLASH_IOCTL_H18 19#include <linux/types.h>20 21/*22 * Structure and definitions for all CXL Flash ioctls23 */24#define CXLFLASH_WWID_LEN 1625 26/*27 * Structure and flag definitions CXL Flash superpipe ioctls28 */29 30#define DK_CXLFLASH_VERSION_0 031 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 ioctls41 *42 * Similar to the input flags, these are grown from the bottom-up with the43 * intention that ioctl-specific return flag definitions would grow from the44 * top-down, allowing the two sets to co-exist. While not required/enforced45 * at this time, this provides future flexibility.46 */47#define DK_CXLFLASH_ALL_PORTS_ACTIVE 0x0000000000000001ULL48#define DK_CXLFLASH_APP_CLOSE_ADAP_FD 0x0000000000000002ULL49#define DK_CXLFLASH_CONTEXT_SQ_CMD_MODE 0x0000000000000004ULL50 51/*52 * General Notes:53 * -------------54 * The 'context_id' field of all ioctl structures contains the context55 * identifier for a context in the lower 32-bits (upper 32-bits are not56 * to be used when identifying a context to the AFU). That said, the value57 * in its entirety (all 64-bits) is to be treated as an opaque cookie and58 * 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 initial68 * attach (successful) of a context. When a context is shared(reused), the user69 * is expected to already 'know' the adapter file descriptor associated with the70 * context.71 */72#define DK_CXLFLASH_ATTACH_REUSE_CONTEXT 0x8000000000000000ULL73 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 0x8000000000000000ULL101 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 18136#define DK_CXLFLASH_VERIFY_HINT_SENSE 0x8000000000000000ULL137 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 0x8000000000000000ULL150 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_LEN161#define DK_CXLFLASH_MANAGE_LUN_ENABLE_SUPERPIPE 0x8000000000000000ULL162#define DK_CXLFLASH_MANAGE_LUN_DISABLE_SUPERPIPE 0x4000000000000000ULL163#define DK_CXLFLASH_MANAGE_LUN_ALL_PORTS_ACCESSIBLE 0x2000000000000000ULL164 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 0xCA187#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_MAGIC191 * 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 ioctls206 */207 208#define HT_CXLFLASH_VERSION_0 0209 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 ioctls220 *221 * These are grown from the bottom-up with the intention that ioctl-specific222 * input flag definitions would grow from the top-down, allowing the two sets223 * to co-exist. While not required/enforced at this time, this provides future224 * flexibility.225 */226#define HT_CXLFLASH_HOST_READ 0x0000000000000000ULL227#define HT_CXLFLASH_HOST_WRITE 0x0000000000000001ULL228 229#define HT_CXLFLASH_LUN_PROVISION_SUBCMD_CREATE_LUN 0x0001230#define HT_CXLFLASH_LUN_PROVISION_SUBCMD_DELETE_LUN 0x0002231#define HT_CXLFLASH_LUN_PROVISION_SUBCMD_QUERY_PORT 0x0003232 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 12249struct 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_MAGIC270 * 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