1*1bce7cd8SWarner Losh /*- 2*1bce7cd8SWarner Losh * Copyright (c) 2024, Netflix Inc. 3*1bce7cd8SWarner Losh * Written by Warner Losh 4*1bce7cd8SWarner Losh * 5*1bce7cd8SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 6*1bce7cd8SWarner Losh */ 7*1bce7cd8SWarner Losh 8*1bce7cd8SWarner Losh /* 9*1bce7cd8SWarner Losh * Linux compatible NVME ioctls. So far we just support ID, ADMIN_CMD and 10*1bce7cd8SWarner Losh * IO_CMD. The rest are not supported. 11*1bce7cd8SWarner Losh */ 12*1bce7cd8SWarner Losh 13*1bce7cd8SWarner Losh 14*1bce7cd8SWarner Losh #include <sys/ioccom.h> 15*1bce7cd8SWarner Losh #include <sys/_types.h> 16*1bce7cd8SWarner Losh 17*1bce7cd8SWarner Losh struct nvme_passthru_cmd { 18*1bce7cd8SWarner Losh __uint8_t opcode; 19*1bce7cd8SWarner Losh __uint8_t flags; 20*1bce7cd8SWarner Losh __uint16_t rsvd1; 21*1bce7cd8SWarner Losh __uint32_t nsid; 22*1bce7cd8SWarner Losh __uint32_t cdw2; 23*1bce7cd8SWarner Losh __uint32_t cdw3; 24*1bce7cd8SWarner Losh __uint64_t metadata; 25*1bce7cd8SWarner Losh __uint64_t addr; 26*1bce7cd8SWarner Losh __uint32_t metadata_len; 27*1bce7cd8SWarner Losh __uint32_t data_len; 28*1bce7cd8SWarner Losh __uint32_t cdw10; 29*1bce7cd8SWarner Losh __uint32_t cdw11; 30*1bce7cd8SWarner Losh __uint32_t cdw12; 31*1bce7cd8SWarner Losh __uint32_t cdw13; 32*1bce7cd8SWarner Losh __uint32_t cdw14; 33*1bce7cd8SWarner Losh __uint32_t cdw15; 34*1bce7cd8SWarner Losh __uint32_t timeout_ms; 35*1bce7cd8SWarner Losh __uint32_t result; 36*1bce7cd8SWarner Losh }; 37*1bce7cd8SWarner Losh 38*1bce7cd8SWarner Losh #define nvme_admin_cmd nvme_passthru_cmd 39*1bce7cd8SWarner Losh 40*1bce7cd8SWarner Losh /* 41*1bce7cd8SWarner Losh * Linux nvme ioctls, commented out ones are not supported 42*1bce7cd8SWarner Losh */ 43*1bce7cd8SWarner Losh #define NVME_IOCTL_ID _IO('N', 0x40) 44*1bce7cd8SWarner Losh #define NVME_IOCTL_ADMIN_CMD _IOWR('N', 0x41, struct nvme_admin_cmd) 45*1bce7cd8SWarner Losh /* #define NVME_IOCTL_SUBMIT_IO _IOW('N', 0x42, struct nvme_user_io) */ 46*1bce7cd8SWarner Losh #define NVME_IOCTL_IO_CMD _IOWR('N', 0x43, struct nvme_passthru_cmd) 47*1bce7cd8SWarner Losh #define NVME_IOCTL_RESET _IO('N', 0x44) 48*1bce7cd8SWarner Losh /* #define NVME_IOCTL_SUBSYS_RESET _IO('N', 0x45) */ 49*1bce7cd8SWarner Losh /* #define NVME_IOCTL_RESCAN _IO('N', 0x46) */ 50*1bce7cd8SWarner Losh /* #define NVME_IOCTL_ADMIN64_CMD _IOWR('N', 0x47, struct nvme_passthru_cmd64) */ 51*1bce7cd8SWarner Losh /* #define NVME_IOCTL_IO64_CMD _IOWR('N', 0x48, struct nvme_passthru_cmd64) */ 52*1bce7cd8SWarner Losh /* #define NVME_IOCTL_IO64_CMD_VEC _IOWR('N', 0x49, struct nvme_passthru_cmd64) */ 53*1bce7cd8SWarner Losh 54*1bce7cd8SWarner Losh /* io_uring async commands: */ 55*1bce7cd8SWarner Losh /* #define NVME_URING_CMD_IO _IOWR('N', 0x80, struct nvme_uring_cmd) */ 56*1bce7cd8SWarner Losh /* #define NVME_URING_CMD_IO_VEC _IOWR('N', 0x81, struct nvme_uring_cmd) */ 57*1bce7cd8SWarner Losh /* #define NVME_URING_CMD_ADMIN _IOWR('N', 0x82, struct nvme_uring_cmd) */ 58*1bce7cd8SWarner Losh /* #define NVME_URING_CMD_ADMIN_VEC _IOWR('N', 0x83, struct nvme_uring_cmd) */ 59