Home | History | Annotate | Download | only in linux
      1 /*
      2  * Copyright (C) 2015 CNEX Labs.  All rights reserved.
      3  *
      4  * This program is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU General Public License version
      6  * 2 as published by the Free Software Foundation.
      7  *
      8  * This program is distributed in the hope that it will be useful, but
      9  * WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     11  * General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program; see the file COPYING.  If not, write to
     15  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
     16  * USA.
     17  */
     18 
     19 #ifndef _UAPI_LINUX_LIGHTNVM_H
     20 #define _UAPI_LINUX_LIGHTNVM_H
     21 
     22 #ifdef __KERNEL__
     23 #include <linux/kernel.h>
     24 #include <linux/ioctl.h>
     25 #else /* __KERNEL__ */
     26 #include <stdio.h>
     27 #include <sys/ioctl.h>
     28 #define DISK_NAME_LEN 32
     29 #endif /* __KERNEL__ */
     30 
     31 #include <linux/types.h>
     32 #include <linux/ioctl.h>
     33 
     34 #define NVM_TTYPE_NAME_MAX 48
     35 #define NVM_TTYPE_MAX 63
     36 #define NVM_MMTYPE_LEN 8
     37 
     38 #define NVM_CTRL_FILE "/dev/lightnvm/control"
     39 
     40 struct nvm_ioctl_info_tgt {
     41 	__u32 version[3];
     42 	__u32 reserved;
     43 	char tgtname[NVM_TTYPE_NAME_MAX];
     44 };
     45 
     46 struct nvm_ioctl_info {
     47 	__u32 version[3];	/* in/out - major, minor, patch */
     48 	__u16 tgtsize;		/* number of targets */
     49 	__u16 reserved16;	/* pad to 4K page */
     50 	__u32 reserved[12];
     51 	struct nvm_ioctl_info_tgt tgts[NVM_TTYPE_MAX];
     52 };
     53 
     54 enum {
     55 	NVM_DEVICE_ACTIVE = 1 << 0,
     56 };
     57 
     58 struct nvm_ioctl_device_info {
     59 	char devname[DISK_NAME_LEN];
     60 	char bmname[NVM_TTYPE_NAME_MAX];
     61 	__u32 bmversion[3];
     62 	__u32 flags;
     63 	__u32 reserved[8];
     64 };
     65 
     66 struct nvm_ioctl_get_devices {
     67 	__u32 nr_devices;
     68 	__u32 reserved[31];
     69 	struct nvm_ioctl_device_info info[31];
     70 };
     71 
     72 struct nvm_ioctl_create_simple {
     73 	__u32 lun_begin;
     74 	__u32 lun_end;
     75 };
     76 
     77 enum {
     78 	NVM_CONFIG_TYPE_SIMPLE = 0,
     79 };
     80 
     81 struct nvm_ioctl_create_conf {
     82 	__u32 type;
     83 	union {
     84 		struct nvm_ioctl_create_simple s;
     85 	};
     86 };
     87 
     88 struct nvm_ioctl_create {
     89 	char dev[DISK_NAME_LEN];		/* open-channel SSD device */
     90 	char tgttype[NVM_TTYPE_NAME_MAX];	/* target type name */
     91 	char tgtname[DISK_NAME_LEN];		/* dev to expose target as */
     92 
     93 	__u32 flags;
     94 
     95 	struct nvm_ioctl_create_conf conf;
     96 };
     97 
     98 struct nvm_ioctl_remove {
     99 	char tgtname[DISK_NAME_LEN];
    100 
    101 	__u32 flags;
    102 };
    103 
    104 struct nvm_ioctl_dev_init {
    105 	char dev[DISK_NAME_LEN];		/* open-channel SSD device */
    106 	char mmtype[NVM_MMTYPE_LEN];		/* register to media manager */
    107 
    108 	__u32 flags;
    109 };
    110 
    111 enum {
    112 	NVM_FACTORY_ERASE_ONLY_USER	= 1 << 0, /* erase only blocks used as
    113 						   * host blks or grown blks */
    114 	NVM_FACTORY_RESET_HOST_BLKS	= 1 << 1, /* remove host blk marks */
    115 	NVM_FACTORY_RESET_GRWN_BBLKS	= 1 << 2, /* remove grown blk marks */
    116 	NVM_FACTORY_NR_BITS		= 1 << 3, /* stops here */
    117 };
    118 
    119 struct nvm_ioctl_dev_factory {
    120 	char dev[DISK_NAME_LEN];
    121 
    122 	__u32 flags;
    123 };
    124 
    125 /* The ioctl type, 'L', 0x20 - 0x2F documented in ioctl-number.txt */
    126 enum {
    127 	/* top level cmds */
    128 	NVM_INFO_CMD = 0x20,
    129 	NVM_GET_DEVICES_CMD,
    130 
    131 	/* device level cmds */
    132 	NVM_DEV_CREATE_CMD,
    133 	NVM_DEV_REMOVE_CMD,
    134 
    135 	/* Init a device to support LightNVM media managers */
    136 	NVM_DEV_INIT_CMD,
    137 
    138 	/* Factory reset device */
    139 	NVM_DEV_FACTORY_CMD,
    140 };
    141 
    142 #define NVM_IOCTL 'L' /* 0x4c */
    143 
    144 #define NVM_INFO		_IOWR(NVM_IOCTL, NVM_INFO_CMD, \
    145 						struct nvm_ioctl_info)
    146 #define NVM_GET_DEVICES		_IOR(NVM_IOCTL, NVM_GET_DEVICES_CMD, \
    147 						struct nvm_ioctl_get_devices)
    148 #define NVM_DEV_CREATE		_IOW(NVM_IOCTL, NVM_DEV_CREATE_CMD, \
    149 						struct nvm_ioctl_create)
    150 #define NVM_DEV_REMOVE		_IOW(NVM_IOCTL, NVM_DEV_REMOVE_CMD, \
    151 						struct nvm_ioctl_remove)
    152 #define NVM_DEV_INIT		_IOW(NVM_IOCTL, NVM_DEV_INIT_CMD, \
    153 						struct nvm_ioctl_dev_init)
    154 #define NVM_DEV_FACTORY		_IOW(NVM_IOCTL, NVM_DEV_FACTORY_CMD, \
    155 						struct nvm_ioctl_dev_factory)
    156 
    157 #define NVM_VERSION_MAJOR	1
    158 #define NVM_VERSION_MINOR	0
    159 #define NVM_VERSION_PATCHLEVEL	0
    160 
    161 #endif
    162