162232e45SDan Williams /* 262232e45SDan Williams * Copyright (c) 2014-2015, Intel Corporation. 362232e45SDan Williams * 462232e45SDan Williams * This program is free software; you can redistribute it and/or modify it 562232e45SDan Williams * under the terms and conditions of the GNU Lesser General Public License, 662232e45SDan Williams * version 2.1, as published by the Free Software Foundation. 762232e45SDan Williams * 862232e45SDan Williams * This program is distributed in the hope it will be useful, but WITHOUT ANY 962232e45SDan Williams * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 1062232e45SDan Williams * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 1162232e45SDan Williams * more details. 1262232e45SDan Williams */ 1362232e45SDan Williams #ifndef __NDCTL_H__ 1462232e45SDan Williams #define __NDCTL_H__ 1562232e45SDan Williams 1662232e45SDan Williams #include <linux/types.h> 1762232e45SDan Williams 1862232e45SDan Williams struct nd_cmd_smart { 1962232e45SDan Williams __u32 status; 2062232e45SDan Williams __u8 data[128]; 2162232e45SDan Williams } __packed; 2262232e45SDan Williams 2362232e45SDan Williams struct nd_cmd_smart_threshold { 2462232e45SDan Williams __u32 status; 2562232e45SDan Williams __u8 data[8]; 2662232e45SDan Williams } __packed; 2762232e45SDan Williams 2862232e45SDan Williams struct nd_cmd_dimm_flags { 2962232e45SDan Williams __u32 status; 3062232e45SDan Williams __u32 flags; 3162232e45SDan Williams } __packed; 3262232e45SDan Williams 3362232e45SDan Williams struct nd_cmd_get_config_size { 3462232e45SDan Williams __u32 status; 3562232e45SDan Williams __u32 config_size; 3662232e45SDan Williams __u32 max_xfer; 3762232e45SDan Williams } __packed; 3862232e45SDan Williams 3962232e45SDan Williams struct nd_cmd_get_config_data_hdr { 4062232e45SDan Williams __u32 in_offset; 4162232e45SDan Williams __u32 in_length; 4262232e45SDan Williams __u32 status; 4362232e45SDan Williams __u8 out_buf[0]; 4462232e45SDan Williams } __packed; 4562232e45SDan Williams 4662232e45SDan Williams struct nd_cmd_set_config_hdr { 4762232e45SDan Williams __u32 in_offset; 4862232e45SDan Williams __u32 in_length; 4962232e45SDan Williams __u8 in_buf[0]; 5062232e45SDan Williams } __packed; 5162232e45SDan Williams 5262232e45SDan Williams struct nd_cmd_vendor_hdr { 5362232e45SDan Williams __u32 opcode; 5462232e45SDan Williams __u32 in_length; 5562232e45SDan Williams __u8 in_buf[0]; 5662232e45SDan Williams } __packed; 5762232e45SDan Williams 5862232e45SDan Williams struct nd_cmd_vendor_tail { 5962232e45SDan Williams __u32 status; 6062232e45SDan Williams __u32 out_length; 6162232e45SDan Williams __u8 out_buf[0]; 6262232e45SDan Williams } __packed; 6362232e45SDan Williams 6462232e45SDan Williams struct nd_cmd_ars_cap { 6562232e45SDan Williams __u64 address; 6662232e45SDan Williams __u64 length; 6762232e45SDan Williams __u32 status; 6862232e45SDan Williams __u32 max_ars_out; 6962232e45SDan Williams } __packed; 7062232e45SDan Williams 7162232e45SDan Williams struct nd_cmd_ars_start { 7262232e45SDan Williams __u64 address; 7362232e45SDan Williams __u64 length; 7462232e45SDan Williams __u16 type; 7562232e45SDan Williams __u8 reserved[6]; 7662232e45SDan Williams __u32 status; 7762232e45SDan Williams } __packed; 7862232e45SDan Williams 7962232e45SDan Williams struct nd_cmd_ars_status { 8062232e45SDan Williams __u32 status; 8162232e45SDan Williams __u32 out_length; 8262232e45SDan Williams __u64 address; 8362232e45SDan Williams __u64 length; 8462232e45SDan Williams __u16 type; 8562232e45SDan Williams __u32 num_records; 8662232e45SDan Williams struct nd_ars_record { 8762232e45SDan Williams __u32 handle; 8862232e45SDan Williams __u32 flags; 8962232e45SDan Williams __u64 err_address; 90*ec92777fSVishal Verma __u64 length; 9162232e45SDan Williams } __packed records[0]; 9262232e45SDan Williams } __packed; 9362232e45SDan Williams 9462232e45SDan Williams enum { 9562232e45SDan Williams ND_CMD_IMPLEMENTED = 0, 9662232e45SDan Williams 9762232e45SDan Williams /* bus commands */ 9862232e45SDan Williams ND_CMD_ARS_CAP = 1, 9962232e45SDan Williams ND_CMD_ARS_START = 2, 10062232e45SDan Williams ND_CMD_ARS_STATUS = 3, 10162232e45SDan Williams 10262232e45SDan Williams /* per-dimm commands */ 10362232e45SDan Williams ND_CMD_SMART = 1, 10462232e45SDan Williams ND_CMD_SMART_THRESHOLD = 2, 10562232e45SDan Williams ND_CMD_DIMM_FLAGS = 3, 10662232e45SDan Williams ND_CMD_GET_CONFIG_SIZE = 4, 10762232e45SDan Williams ND_CMD_GET_CONFIG_DATA = 5, 10862232e45SDan Williams ND_CMD_SET_CONFIG_DATA = 6, 10962232e45SDan Williams ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7, 11062232e45SDan Williams ND_CMD_VENDOR_EFFECT_LOG = 8, 11162232e45SDan Williams ND_CMD_VENDOR = 9, 11262232e45SDan Williams }; 11362232e45SDan Williams 11462232e45SDan Williams static inline const char *nvdimm_bus_cmd_name(unsigned cmd) 11562232e45SDan Williams { 11662232e45SDan Williams static const char * const names[] = { 11762232e45SDan Williams [ND_CMD_ARS_CAP] = "ars_cap", 11862232e45SDan Williams [ND_CMD_ARS_START] = "ars_start", 11962232e45SDan Williams [ND_CMD_ARS_STATUS] = "ars_status", 12062232e45SDan Williams }; 12162232e45SDan Williams 12262232e45SDan Williams if (cmd < ARRAY_SIZE(names) && names[cmd]) 12362232e45SDan Williams return names[cmd]; 12462232e45SDan Williams return "unknown"; 12562232e45SDan Williams } 12662232e45SDan Williams 12762232e45SDan Williams static inline const char *nvdimm_cmd_name(unsigned cmd) 12862232e45SDan Williams { 12962232e45SDan Williams static const char * const names[] = { 13062232e45SDan Williams [ND_CMD_SMART] = "smart", 13162232e45SDan Williams [ND_CMD_SMART_THRESHOLD] = "smart_thresh", 13262232e45SDan Williams [ND_CMD_DIMM_FLAGS] = "flags", 13362232e45SDan Williams [ND_CMD_GET_CONFIG_SIZE] = "get_size", 13462232e45SDan Williams [ND_CMD_GET_CONFIG_DATA] = "get_data", 13562232e45SDan Williams [ND_CMD_SET_CONFIG_DATA] = "set_data", 13662232e45SDan Williams [ND_CMD_VENDOR_EFFECT_LOG_SIZE] = "effect_size", 13762232e45SDan Williams [ND_CMD_VENDOR_EFFECT_LOG] = "effect_log", 13862232e45SDan Williams [ND_CMD_VENDOR] = "vendor", 13962232e45SDan Williams }; 14062232e45SDan Williams 14162232e45SDan Williams if (cmd < ARRAY_SIZE(names) && names[cmd]) 14262232e45SDan Williams return names[cmd]; 14362232e45SDan Williams return "unknown"; 14462232e45SDan Williams } 14562232e45SDan Williams 14662232e45SDan Williams #define ND_IOCTL 'N' 14762232e45SDan Williams 14862232e45SDan Williams #define ND_IOCTL_SMART _IOWR(ND_IOCTL, ND_CMD_SMART,\ 14962232e45SDan Williams struct nd_cmd_smart) 15062232e45SDan Williams 15162232e45SDan Williams #define ND_IOCTL_SMART_THRESHOLD _IOWR(ND_IOCTL, ND_CMD_SMART_THRESHOLD,\ 15262232e45SDan Williams struct nd_cmd_smart_threshold) 15362232e45SDan Williams 15462232e45SDan Williams #define ND_IOCTL_DIMM_FLAGS _IOWR(ND_IOCTL, ND_CMD_DIMM_FLAGS,\ 15562232e45SDan Williams struct nd_cmd_dimm_flags) 15662232e45SDan Williams 15762232e45SDan Williams #define ND_IOCTL_GET_CONFIG_SIZE _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_SIZE,\ 15862232e45SDan Williams struct nd_cmd_get_config_size) 15962232e45SDan Williams 16062232e45SDan Williams #define ND_IOCTL_GET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_DATA,\ 16162232e45SDan Williams struct nd_cmd_get_config_data_hdr) 16262232e45SDan Williams 16362232e45SDan Williams #define ND_IOCTL_SET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_SET_CONFIG_DATA,\ 16462232e45SDan Williams struct nd_cmd_set_config_hdr) 16562232e45SDan Williams 16662232e45SDan Williams #define ND_IOCTL_VENDOR _IOWR(ND_IOCTL, ND_CMD_VENDOR,\ 16762232e45SDan Williams struct nd_cmd_vendor_hdr) 16862232e45SDan Williams 16962232e45SDan Williams #define ND_IOCTL_ARS_CAP _IOWR(ND_IOCTL, ND_CMD_ARS_CAP,\ 17062232e45SDan Williams struct nd_cmd_ars_cap) 17162232e45SDan Williams 17262232e45SDan Williams #define ND_IOCTL_ARS_START _IOWR(ND_IOCTL, ND_CMD_ARS_START,\ 17362232e45SDan Williams struct nd_cmd_ars_start) 17462232e45SDan Williams 17562232e45SDan Williams #define ND_IOCTL_ARS_STATUS _IOWR(ND_IOCTL, ND_CMD_ARS_STATUS,\ 17662232e45SDan Williams struct nd_cmd_ars_status) 17762232e45SDan Williams 1784d88a97aSDan Williams #define ND_DEVICE_DIMM 1 /* nd_dimm: container for "config data" */ 1793d88002eSDan Williams #define ND_DEVICE_REGION_PMEM 2 /* nd_region: (parent of PMEM namespaces) */ 1803d88002eSDan Williams #define ND_DEVICE_REGION_BLK 3 /* nd_region: (parent of BLK namespaces) */ 1813d88002eSDan Williams #define ND_DEVICE_NAMESPACE_IO 4 /* legacy persistent memory */ 1823d88002eSDan Williams #define ND_DEVICE_NAMESPACE_PMEM 5 /* PMEM namespace (may alias with BLK) */ 1833d88002eSDan Williams #define ND_DEVICE_NAMESPACE_BLK 6 /* BLK namespace (may alias with PMEM) */ 1844d88a97aSDan Williams 1854d88a97aSDan Williams enum nd_driver_flags { 1864d88a97aSDan Williams ND_DRIVER_DIMM = 1 << ND_DEVICE_DIMM, 1873d88002eSDan Williams ND_DRIVER_REGION_PMEM = 1 << ND_DEVICE_REGION_PMEM, 1883d88002eSDan Williams ND_DRIVER_REGION_BLK = 1 << ND_DEVICE_REGION_BLK, 1893d88002eSDan Williams ND_DRIVER_NAMESPACE_IO = 1 << ND_DEVICE_NAMESPACE_IO, 1903d88002eSDan Williams ND_DRIVER_NAMESPACE_PMEM = 1 << ND_DEVICE_NAMESPACE_PMEM, 1913d88002eSDan Williams ND_DRIVER_NAMESPACE_BLK = 1 << ND_DEVICE_NAMESPACE_BLK, 1924d88a97aSDan Williams }; 193bf9bccc1SDan Williams 194bf9bccc1SDan Williams enum { 195bf9bccc1SDan Williams ND_MIN_NAMESPACE_SIZE = 0x00400000, 196bf9bccc1SDan Williams }; 19762232e45SDan Williams #endif /* __NDCTL_H__ */ 198