1*62232e45SDan Williams /* 2*62232e45SDan Williams * Copyright (c) 2014-2015, Intel Corporation. 3*62232e45SDan Williams * 4*62232e45SDan Williams * This program is free software; you can redistribute it and/or modify it 5*62232e45SDan Williams * under the terms and conditions of the GNU Lesser General Public License, 6*62232e45SDan Williams * version 2.1, as published by the Free Software Foundation. 7*62232e45SDan Williams * 8*62232e45SDan Williams * This program is distributed in the hope it will be useful, but WITHOUT ANY 9*62232e45SDan Williams * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 10*62232e45SDan Williams * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 11*62232e45SDan Williams * more details. 12*62232e45SDan Williams */ 13*62232e45SDan Williams #ifndef __NDCTL_H__ 14*62232e45SDan Williams #define __NDCTL_H__ 15*62232e45SDan Williams 16*62232e45SDan Williams #include <linux/types.h> 17*62232e45SDan Williams 18*62232e45SDan Williams struct nd_cmd_smart { 19*62232e45SDan Williams __u32 status; 20*62232e45SDan Williams __u8 data[128]; 21*62232e45SDan Williams } __packed; 22*62232e45SDan Williams 23*62232e45SDan Williams struct nd_cmd_smart_threshold { 24*62232e45SDan Williams __u32 status; 25*62232e45SDan Williams __u8 data[8]; 26*62232e45SDan Williams } __packed; 27*62232e45SDan Williams 28*62232e45SDan Williams struct nd_cmd_dimm_flags { 29*62232e45SDan Williams __u32 status; 30*62232e45SDan Williams __u32 flags; 31*62232e45SDan Williams } __packed; 32*62232e45SDan Williams 33*62232e45SDan Williams struct nd_cmd_get_config_size { 34*62232e45SDan Williams __u32 status; 35*62232e45SDan Williams __u32 config_size; 36*62232e45SDan Williams __u32 max_xfer; 37*62232e45SDan Williams } __packed; 38*62232e45SDan Williams 39*62232e45SDan Williams struct nd_cmd_get_config_data_hdr { 40*62232e45SDan Williams __u32 in_offset; 41*62232e45SDan Williams __u32 in_length; 42*62232e45SDan Williams __u32 status; 43*62232e45SDan Williams __u8 out_buf[0]; 44*62232e45SDan Williams } __packed; 45*62232e45SDan Williams 46*62232e45SDan Williams struct nd_cmd_set_config_hdr { 47*62232e45SDan Williams __u32 in_offset; 48*62232e45SDan Williams __u32 in_length; 49*62232e45SDan Williams __u8 in_buf[0]; 50*62232e45SDan Williams } __packed; 51*62232e45SDan Williams 52*62232e45SDan Williams struct nd_cmd_vendor_hdr { 53*62232e45SDan Williams __u32 opcode; 54*62232e45SDan Williams __u32 in_length; 55*62232e45SDan Williams __u8 in_buf[0]; 56*62232e45SDan Williams } __packed; 57*62232e45SDan Williams 58*62232e45SDan Williams struct nd_cmd_vendor_tail { 59*62232e45SDan Williams __u32 status; 60*62232e45SDan Williams __u32 out_length; 61*62232e45SDan Williams __u8 out_buf[0]; 62*62232e45SDan Williams } __packed; 63*62232e45SDan Williams 64*62232e45SDan Williams struct nd_cmd_ars_cap { 65*62232e45SDan Williams __u64 address; 66*62232e45SDan Williams __u64 length; 67*62232e45SDan Williams __u32 status; 68*62232e45SDan Williams __u32 max_ars_out; 69*62232e45SDan Williams } __packed; 70*62232e45SDan Williams 71*62232e45SDan Williams struct nd_cmd_ars_start { 72*62232e45SDan Williams __u64 address; 73*62232e45SDan Williams __u64 length; 74*62232e45SDan Williams __u16 type; 75*62232e45SDan Williams __u8 reserved[6]; 76*62232e45SDan Williams __u32 status; 77*62232e45SDan Williams } __packed; 78*62232e45SDan Williams 79*62232e45SDan Williams struct nd_cmd_ars_status { 80*62232e45SDan Williams __u32 status; 81*62232e45SDan Williams __u32 out_length; 82*62232e45SDan Williams __u64 address; 83*62232e45SDan Williams __u64 length; 84*62232e45SDan Williams __u16 type; 85*62232e45SDan Williams __u32 num_records; 86*62232e45SDan Williams struct nd_ars_record { 87*62232e45SDan Williams __u32 handle; 88*62232e45SDan Williams __u32 flags; 89*62232e45SDan Williams __u64 err_address; 90*62232e45SDan Williams __u64 mask; 91*62232e45SDan Williams } __packed records[0]; 92*62232e45SDan Williams } __packed; 93*62232e45SDan Williams 94*62232e45SDan Williams enum { 95*62232e45SDan Williams ND_CMD_IMPLEMENTED = 0, 96*62232e45SDan Williams 97*62232e45SDan Williams /* bus commands */ 98*62232e45SDan Williams ND_CMD_ARS_CAP = 1, 99*62232e45SDan Williams ND_CMD_ARS_START = 2, 100*62232e45SDan Williams ND_CMD_ARS_STATUS = 3, 101*62232e45SDan Williams 102*62232e45SDan Williams /* per-dimm commands */ 103*62232e45SDan Williams ND_CMD_SMART = 1, 104*62232e45SDan Williams ND_CMD_SMART_THRESHOLD = 2, 105*62232e45SDan Williams ND_CMD_DIMM_FLAGS = 3, 106*62232e45SDan Williams ND_CMD_GET_CONFIG_SIZE = 4, 107*62232e45SDan Williams ND_CMD_GET_CONFIG_DATA = 5, 108*62232e45SDan Williams ND_CMD_SET_CONFIG_DATA = 6, 109*62232e45SDan Williams ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7, 110*62232e45SDan Williams ND_CMD_VENDOR_EFFECT_LOG = 8, 111*62232e45SDan Williams ND_CMD_VENDOR = 9, 112*62232e45SDan Williams }; 113*62232e45SDan Williams 114*62232e45SDan Williams static inline const char *nvdimm_bus_cmd_name(unsigned cmd) 115*62232e45SDan Williams { 116*62232e45SDan Williams static const char * const names[] = { 117*62232e45SDan Williams [ND_CMD_ARS_CAP] = "ars_cap", 118*62232e45SDan Williams [ND_CMD_ARS_START] = "ars_start", 119*62232e45SDan Williams [ND_CMD_ARS_STATUS] = "ars_status", 120*62232e45SDan Williams }; 121*62232e45SDan Williams 122*62232e45SDan Williams if (cmd < ARRAY_SIZE(names) && names[cmd]) 123*62232e45SDan Williams return names[cmd]; 124*62232e45SDan Williams return "unknown"; 125*62232e45SDan Williams } 126*62232e45SDan Williams 127*62232e45SDan Williams static inline const char *nvdimm_cmd_name(unsigned cmd) 128*62232e45SDan Williams { 129*62232e45SDan Williams static const char * const names[] = { 130*62232e45SDan Williams [ND_CMD_SMART] = "smart", 131*62232e45SDan Williams [ND_CMD_SMART_THRESHOLD] = "smart_thresh", 132*62232e45SDan Williams [ND_CMD_DIMM_FLAGS] = "flags", 133*62232e45SDan Williams [ND_CMD_GET_CONFIG_SIZE] = "get_size", 134*62232e45SDan Williams [ND_CMD_GET_CONFIG_DATA] = "get_data", 135*62232e45SDan Williams [ND_CMD_SET_CONFIG_DATA] = "set_data", 136*62232e45SDan Williams [ND_CMD_VENDOR_EFFECT_LOG_SIZE] = "effect_size", 137*62232e45SDan Williams [ND_CMD_VENDOR_EFFECT_LOG] = "effect_log", 138*62232e45SDan Williams [ND_CMD_VENDOR] = "vendor", 139*62232e45SDan Williams }; 140*62232e45SDan Williams 141*62232e45SDan Williams if (cmd < ARRAY_SIZE(names) && names[cmd]) 142*62232e45SDan Williams return names[cmd]; 143*62232e45SDan Williams return "unknown"; 144*62232e45SDan Williams } 145*62232e45SDan Williams 146*62232e45SDan Williams #define ND_IOCTL 'N' 147*62232e45SDan Williams 148*62232e45SDan Williams #define ND_IOCTL_SMART _IOWR(ND_IOCTL, ND_CMD_SMART,\ 149*62232e45SDan Williams struct nd_cmd_smart) 150*62232e45SDan Williams 151*62232e45SDan Williams #define ND_IOCTL_SMART_THRESHOLD _IOWR(ND_IOCTL, ND_CMD_SMART_THRESHOLD,\ 152*62232e45SDan Williams struct nd_cmd_smart_threshold) 153*62232e45SDan Williams 154*62232e45SDan Williams #define ND_IOCTL_DIMM_FLAGS _IOWR(ND_IOCTL, ND_CMD_DIMM_FLAGS,\ 155*62232e45SDan Williams struct nd_cmd_dimm_flags) 156*62232e45SDan Williams 157*62232e45SDan Williams #define ND_IOCTL_GET_CONFIG_SIZE _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_SIZE,\ 158*62232e45SDan Williams struct nd_cmd_get_config_size) 159*62232e45SDan Williams 160*62232e45SDan Williams #define ND_IOCTL_GET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_DATA,\ 161*62232e45SDan Williams struct nd_cmd_get_config_data_hdr) 162*62232e45SDan Williams 163*62232e45SDan Williams #define ND_IOCTL_SET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_SET_CONFIG_DATA,\ 164*62232e45SDan Williams struct nd_cmd_set_config_hdr) 165*62232e45SDan Williams 166*62232e45SDan Williams #define ND_IOCTL_VENDOR _IOWR(ND_IOCTL, ND_CMD_VENDOR,\ 167*62232e45SDan Williams struct nd_cmd_vendor_hdr) 168*62232e45SDan Williams 169*62232e45SDan Williams #define ND_IOCTL_ARS_CAP _IOWR(ND_IOCTL, ND_CMD_ARS_CAP,\ 170*62232e45SDan Williams struct nd_cmd_ars_cap) 171*62232e45SDan Williams 172*62232e45SDan Williams #define ND_IOCTL_ARS_START _IOWR(ND_IOCTL, ND_CMD_ARS_START,\ 173*62232e45SDan Williams struct nd_cmd_ars_start) 174*62232e45SDan Williams 175*62232e45SDan Williams #define ND_IOCTL_ARS_STATUS _IOWR(ND_IOCTL, ND_CMD_ARS_STATUS,\ 176*62232e45SDan Williams struct nd_cmd_ars_status) 177*62232e45SDan Williams 178*62232e45SDan Williams #endif /* __NDCTL_H__ */ 179