__u8 rsvd23[9];
};
+/* idle and active power scales occupy the last 2 bits of the field */
+#define POWER_SCALE(s) ((s) >> 6)
+
enum {
NVME_PS_FLAGS_MAX_POWER_SCALE = 1 << 0,
NVME_PS_FLAGS_NON_OP_STATE = 1 << 1,
__u8 resv2[448];
};
-/* idle and active power scales occupy the last 2 bits of the field */
-#define POWER_SCALE(s) ((s) >> 6)
-
struct nvme_host_mem_buffer {
__u32 hsize;
__u32 hmdlal;
struct nvme_controller_list {
__le16 num;
- __le16 identifier[];
+ __le16 identifier[2047];
};
struct nvme_secondary_controller_entry {
return ioctl(fd, ioctl_cmd, cmd);
}
-static int nvme_submit_admin_passthru(int fd, struct nvme_passthru_cmd *cmd)
+int nvme_submit_admin_passthru(int fd, struct nvme_passthru_cmd *cmd)
{
return ioctl(fd, NVME_IOCTL_ADMIN_CMD, cmd);
}
-static int nvme_submit_io_passthru(int fd, struct nvme_passthru_cmd *cmd)
+int nvme_submit_io_passthru(int fd, struct nvme_passthru_cmd *cmd)
{
return ioctl(fd, NVME_IOCTL_IO_CMD, cmd);
}
int nvme_get_log14(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
__u16 lsi, bool rae, __u8 uuid_ix, __u32 data_len, void *data)
{
+ __u32 numd = (data_len >> 2) - 1;
+ __u16 numdu = numd >> 16, numdl = numd & 0xffff;
+ __u32 cdw10 = log_id | (numdl << 16) | (rae ? 1 << 15 : 0) | lsp << 8;
+
struct nvme_admin_cmd cmd = {
.opcode = nvme_admin_get_log_page,
.nsid = nsid,
.addr = (__u64)(uintptr_t) data,
.data_len = data_len,
+ .cdw10 = cdw10,
+ .cdw11 = numdu | (lsi << 16),
+ .cdw12 = lpo & 0xffffffff,
+ .cdw13 = lpo >> 32,
+ .cdw14 = uuid_ix,
};
- __u32 numd = (data_len >> 2) - 1;
- __u16 numdu = numd >> 16, numdl = numd & 0xffff;
-
- cmd.cdw10 = log_id | (numdl << 16) | (rae ? 1 << 15 : 0);
- if (lsp)
- cmd.cdw10 |= lsp << 8;
-
- cmd.cdw11 = numdu | (lsi << 16);
- cmd.cdw12 = lpo;
- cmd.cdw13 = (lpo >> 32);
- cmd.cdw14 = uuid_ix;
return nvme_submit_admin_passthru(fd, &cmd);
+}
+int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp,
+ __u64 lpo, __u16 lsi, bool rae, __u32 data_len,
+ void *data)
+{
+ return nvme_get_log14(fd, nsid, log_id, lsp, lpo, lsi, rae, 0,
+ data_len, data);
}
int nvme_get_log(int fd, __u32 nsid, __u8 log_id, bool rae,
__u32 data_len, void *data)
{
- void *ptr = data;
__u32 offset = 0, xfer_len = data_len;
+ void *ptr = data;
int ret;
/*
int nvme_ana_log(int fd, void *ana_log, size_t ana_log_len, int rgo)
{
- __u64 lpo = 0;
-
- return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_ANA, rgo, lpo, 0,
+ return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_ANA, rgo, 0, 0,
true, ana_log_len, ana_log);
}
{
int offset;
uint64_t value;
- int err;
- int size = getpagesize();
+ int err, size = getpagesize();
*pbar = malloc(size);
if (!*pbar) {
int nvme_ns_attachment(int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist,
bool attach)
{
- int i;
- __u8 buf[0x1000];
- struct nvme_controller_list *cntlist =
- (struct nvme_controller_list *)buf;
+ struct nvme_controller_list cntlist = {
+ .num = cpu_to_le16(num_ctrls),
+ };
+
struct nvme_admin_cmd cmd = {
.opcode = nvme_admin_ns_attach,
.nsid = nsid,
- .addr = (__u64)(uintptr_t) cntlist,
+ .addr = (__u64)(uintptr_t)&cntlist,
.cdw10 = attach ? 0 : 1,
.data_len = 0x1000,
};
+ int i;
- memset(buf, 0, sizeof(buf));
- cntlist->num = cpu_to_le16(num_ctrls);
for (i = 0; i < num_ctrls; i++)
- cntlist->identifier[i] = cpu_to_le16(ctrlist[i]);
+ cntlist.identifier[i] = cpu_to_le16(ctrlist[i]);
return nvme_submit_admin_passthru(fd, &cmd);
}
/* Generic passthrough */
int nvme_submit_passthru(int fd, unsigned long ioctl_cmd,
struct nvme_passthru_cmd *cmd);
+int nvme_submit_admin_passthru(int fd, struct nvme_passthru_cmd *cmd);
+int nvme_submit_io_passthru(int fd, struct nvme_passthru_cmd *cmd);
int nvme_passthru(int fd, unsigned long ioctl_cmd, __u8 opcode, __u8 flags,
__u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3,
__u32 data_len, void *data, __u32 metadata_len,
void *metadata, __u32 timeout_ms, __u32 *result);
+
/* NVME_SUBMIT_IO */
int nvme_io(int fd, __u8 opcode, __u64 slba, __u16 nblocks, __u16 control,
__u32 dsmgmt, __u32 reftag, __u16 apptag,
__u32 dsmgmt, __u32 reftag, __u16 apptag,
__u16 appmask, void *data, void *metadata);
-int nvme_verify(int fd, __u32 nsid, __u64 slba, __u16 nblocks,
- __u16 control, __u32 reftag, __u16 apptag, __u16 appmask);
-
/* NVME_IO_CMD */
int nvme_passthru_io(int fd, __u8 opcode, __u8 flags, __u16 rsvd,
__u32 nsid, __u32 cdw2, __u32 cdw3,
int nvme_write_uncorrectable(int fd, __u32 nsid, __u64 slba, __u16 nlb);
+int nvme_verify(int fd, __u32 nsid, __u64 slba, __u16 nblocks,
+ __u16 control, __u32 reftag, __u16 apptag, __u16 appmask);
+
int nvme_flush(int fd, __u32 nsid);
int nvme_dsm(int fd, __u32 nsid, __u32 cdw11, struct nvme_dsm_range *dsm,
bool iekey, __u64 crkey);
int nvme_resv_report(int fd, __u32 nsid, __u32 numd, __u32 cdw11, void *data);
+/* NVME_ADMIN_CMD */
int nvme_identify13(int fd, __u32 nsid, __u32 cdw10, __u32 cdw11, void *data);
int nvme_identify(int fd, __u32 nsid, __u32 cdw10, void *data);
int nvme_identify_ctrl(int fd, void *data);
int nvme_get_log14(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
__u16 group_id, bool rae, __u8 uuid_ix,
__u32 data_len, void *data);
-
-static inline int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp,
- __u64 lpo, __u16 lsi, bool rae, __u32 data_len,
- void *data)
-{
- return nvme_get_log14(fd, nsid, log_id, lsp, lpo, lsi, rae, 0,
- data_len, data);
-}
-
+int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp,
+ __u64 lpo, __u16 lsi, bool rae, __u32 data_len,
+ void *data);
int nvme_get_telemetry_log(int fd, void *lp, int generate_report,
int ctrl_gen, size_t log_page_size, __u64 offset);
int nvme_fw_log(int fd, struct nvme_firmware_log_page *fw_log);
#define CREATE_CMD
#include "intel-nvme.h"
-#pragma pack(push,1)
struct nvme_additional_smart_log_item {
__u8 key;
__u8 _kp[2];
__le16 min;
__le16 max;
__le16 avg;
- } wear_level ;
+ } wear_level;
struct thermal_throttle {
__u8 pct;
__u32 count;
} thermal_throttle;
};
__u8 _rp;
-};
-#pragma pack(pop)
+} __attribute__((packed));
struct nvme_additional_smart_log {
struct nvme_additional_smart_log_item program_fail_cnt;
struct nvme_additional_smart_log_item host_bytes_written;
};
-struct nvme_vu_id_ctrl_field { //CDR MR5
+struct nvme_vu_id_ctrl_field { /* CDR MR5 */
__u8 rsvd1[3];
__u8 ss;
__u8 health[20];
__u8 sstat;
__u8 bl[8];
__u8 rsvd2[38];
- __u8 ww[8]; //little endian
+ __u8 ww[8]; /* little endian */
__u8 mic_bl[4];
__u8 mic_fw[4];
};
mic_fw[sizeof(mic_fw) - 1] = '\0';
snprintf(ww, 19, "%02X%02X%02X%02X%02X%02X%02X%02X", log->ww[7],
- log->ww[6], log->ww[5], log->ww[4], log->ww[3], log->ww[2],
- log->ww[1], log->ww[0]);
+ log->ww[6], log->ww[5], log->ww[4], log->ww[3], log->ww[2],
+ log->ww[1], log->ww[0]);
if (root) {
json_object_add_value_int(root, "ss", log->ss);
- json_object_add_value_string(root, "health", health[0] ? health : "healthy");
+ json_object_add_value_string(root, "health",
+ health[0] ? health : "healthy");
json_object_add_value_int(root, "cls", log->cls);
json_object_add_value_int(root, "nlw", log->nlw);
json_object_add_value_int(root, "scap", log->scap);
static int get_additional_smart_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
{
- struct nvme_additional_smart_log smart_log;
- int err, fd;
const char *desc = "Get Intel vendor specific additional smart log (optionally, "\
"for the specified namespace), and show it.";
const char *namespace = "(optional) desired namespace";
const char *raw = "Dump output in binary format";
const char *json= "Dump output in json format";
+
+ struct nvme_additional_smart_log smart_log;
+ int err, fd;
+
struct config {
__u32 namespace_id;
int raw_binary;
static int get_market_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
{
+ const char *desc = "Get Intel Marketing Name log and show it.";
+ const char *raw = "dump output in binary format";
+
char log[512];
int err, fd;
- const char *desc = "Get Intel Marketing Name log and show it.";
- const char *raw = "dump output in binary format";
struct config {
int raw_binary;
};
}
struct intel_assert_dump {
- __u32 coreoffset;
- __u32 assertsize;
- __u8 assertdumptype;
- __u8 assertvalid;
- __u8 reserved[2];
+ __u32 coreoffset;
+ __u32 assertsize;
+ __u8 assertdumptype;
+ __u8 assertvalid;
+ __u8 reserved[2];
};
struct intel_event_dump {
};
struct intel_cd_log {
- union {
- struct {
- __u32 selectLog : 3;
- __u32 selectCore : 2;
- __u32 selectNlog : 8;
- __u8 selectOffsetRef : 1;
- __u32 selectNlogPause : 2;
- __u32 reserved2 : 16;
- }fields;
- __u32 entireDword;
- }u;
+ union {
+ struct {
+ __u32 selectLog : 3;
+ __u32 selectCore : 2;
+ __u32 selectNlog : 8;
+ __u8 selectOffsetRef : 1;
+ __u32 selectNlogPause : 2;
+ __u32 reserved2 : 16;
+ } fields;
+ __u32 entireDword;
+ } u;
};
static void print_intel_nlog(struct intel_vu_nlog *intel_nlog)
dword_tfer = min(max_tfer, total_size);
while (total_size > 0) {
- err = nvme_submit_passthru(ioctl_fd, NVME_IOCTL_ADMIN_CMD, cmd);
+ err = nvme_submit_admin_passthru(ioctl_fd, cmd);
if (err) {
- fprintf(stderr, "failed on cmd.data_len %u cmd.cdw13 %u cmd.cdw12 %x cmd.cdw10 %u err %x remaining size %d\n", cmd->data_len, cmd->cdw13, cmd->cdw12, cmd->cdw10, err, total_size);
+ fprintf(stderr,
+ "failed on cmd.data_len %u cmd.cdw13 %u cmd.cdw12 %x cmd.cdw10 %u err %x remaining size %d\n",
+ cmd->data_len, cmd->cdw13, cmd->cdw12,
+ cmd->cdw10, err, total_size);
goto out;
}
return 0;
}
-static int read_header(struct nvme_passthru_cmd *cmd,__u8 *buf, int ioctl_fd, __u32 dw12, int nsid)
+static int read_header(struct nvme_passthru_cmd *cmd,__u8 *buf, int ioctl_fd,
+ __u32 dw12, int nsid)
{
memset(cmd, 0, sizeof(*cmd));
memset(buf, 0, 4096);
return err;
}
-static int get_internal_log(int argc, char **argv, struct command *command, struct plugin *plugin)
+static int get_internal_log(int argc, char **argv, struct command *command,
+ struct plugin *plugin)
{
__u8 buf[0x2000];
char f[0x100];
if (cfg.log == 2) {
if (cfg.verbose)
printf("Log major:%d minor:%d header:%d size:%d numcores:%d\n",
- intel->ver.major, intel->ver.minor, intel->header, intel->size,
- intel->numcores);
+ intel->ver.major, intel->ver.minor,
+ intel->header, intel->size, intel->numcores);
err = write_header(buf, output, 0x1000);
if (err) {
goto out;
}
- for (j = (cfg.core < 0 ? 0 : cfg.core); j < (cfg.core < 0 ? core_num : cfg.core + 1); j++) {
+ for (j = (cfg.core < 0 ? 0 : cfg.core);
+ j < (cfg.core < 0 ? core_num : cfg.core + 1);
+ j++) {
cdlog.u.fields.selectCore = j;
for (i = 0; i < count; i++) {
if (cfg.log == 2) {
.cdw10 = 8,
.cdw12 = select,
};
- return nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &cmd);
+ return nvme_submit_admin_passthru(fd, &cmd);
}
static int micron_selective_download(int argc, char **argv, struct command *cmd, struct plugin *plugin)
get_log.cdw10 |= ONTAP_C2_LOG_NSINFO_LSP << 8;
get_log.cdw11 = numdu;
- err = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &get_log);
+ err = nvme_submit_admin_passthru(fd, &get_log);
if (err) {
fprintf(stderr, "ioctl error %0x\n", err);
return 1;
memset(&admin_cmd, 0, sizeof (struct nvme_admin_cmd));
admin_cmd.opcode = opcode;
admin_cmd.cdw12 = cdw12;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
fprintf(stdout, "ERROR : WDC : Crash dump erase failed\n");
}
admin_cmd.cdw10 = cdw10;
admin_cmd.cdw12 = cdw12;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
l->log_size = 0;
ret = -1;
admin_cmd.cdw10 = cdw10;
admin_cmd.cdw12 = cdw12;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
fprintf(stderr, "ERROR : WDC : reading dump length failed\n");
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
admin_cmd.cdw14 = WDC_NVME_CAP_DUI_DISABLE_IO;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
fprintf(stderr, "ERROR : WDC : reading DUI data failed\n");
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
else
admin_cmd.cdw14 = WDC_NVME_CAP_DUI_DISABLE_IO;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
fprintf(stderr, "ERROR : WDC : reading DUI data V2 failed\n");
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
admin_cmd.cdw13 = curr_data_offset;
while (curr_data_offset < data_len) {
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
fprintf(stderr, "%s: ERROR : WDC : NVMe Status:%s(%x)\n",
__func__, nvme_status_to_string(ret), ret);
admin_cmd.cdw10 = xfer_size >> 2;
admin_cmd.cdw13 = curr_data_offset >> 2;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret != 0) {
fprintf(stderr, "%s: ERROR : WDC : NVMe Status:%s(%x)\n", __func__, nvme_status_to_string(ret), ret);
fprintf(stderr, "%s: ERROR : WDC : Get chunk %d, size = 0x%x, offset = 0x%x, addr = 0x%lx\n",
admin_cmd.cdw12 = subopcode;
admin_cmd.cdw10 = SN730_LOG_CHUNK_SIZE / 4;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret == 0)
*len_buf = *output;
free(output);
admin_cmd.cdw13 = offset;
admin_cmd.cdw10 = SN730_LOG_CHUNK_SIZE / 4;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (!ret)
memcpy(log_buf, output, SN730_LOG_CHUNK_SIZE);
return ret;
admin_cmd.cdw12 = ((WDC_NVME_DRIVE_LOG_SUBCMD <<
WDC_NVME_SUBCMD_SHIFT) | WDC_NVME_DRIVE_LOG_SIZE_CMD);
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret),
ret);
if (ret == 0) {
if (!wdc_check_device(fd))
return -1;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret > 0) {
switch (ret) {
case WDC_NVME_PURGE_CMD_SEQ_ERR:
if (!wdc_check_device(fd))
return -1;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
if (ret == 0) {
mon = (struct wdc_nvme_purge_monitor_data *) output;
printf("Purge state = 0x%0x\n", admin_cmd.result);
admin_cmd.cdw12 = ((WDC_NVME_CLEAR_PCIE_CORR_SUBCMD << WDC_NVME_SUBCMD_SHIFT) |
WDC_NVME_CLEAR_PCIE_CORR_CMD);
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
out:
return ret;
admin_cmd.cdw12 = ((WDC_NVME_CLEAR_ASSERT_DUMP_SUBCMD << WDC_NVME_SUBCMD_SHIFT) |
WDC_NVME_CLEAR_ASSERT_DUMP_CMD);
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
} else
fprintf(stderr, "INFO : WDC : No Assert Dump Present\n");
admin_cmd.cdw12 = ((WDC_NVME_CLEAR_FW_ACT_HIST_SUBCMD << WDC_NVME_SUBCMD_SHIFT) |
WDC_NVME_CLEAR_FW_ACT_HIST_CMD);
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
out:
cmd.cdw13 = fileId<<16;
cmd.cdw14 = spiDestn;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &cmd);
+ ret = nvme_submit_admin_passthru(fd, &cmd);
if (!ret && logSize)
*logSize = cmd.result;
cmd.addr = (__u64)(__u64)(uintptr_t)dataBuffer;
cmd.data_len = *bufferSize;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &cmd);
+ ret = nvme_submit_admin_passthru(fd, &cmd);
if( ret != WDC_STATUS_SUCCESS)
fprintf(stderr, "ERROR : WDC : VUReadBuffer() failed, status:%s(0x%x)\n", nvme_status_to_string(ret), ret);
WDC_NVME_DRIVE_RESIZE_CMD);
admin_cmd.cdw13 = new_size;
- ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
+ ret = nvme_submit_admin_passthru(fd, &admin_cmd);
return ret;
}