1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2022 Solidigm.
*
* Author: karl.dedow@solidigm.com
*/
#include "ocp-fw-activation-history.h"
#include <errno.h>
#include <stdio.h>
#include "common.h"
#include "nvme-print.h"
#include "ocp-utils.h"
#include "ocp-print.h"
static const unsigned char ocp_fw_activation_history_guid[GUID_LEN] = {
0x6D, 0x79, 0x9a, 0x76,
0xb4, 0xda, 0xf6, 0xa3,
0xe2, 0x4d, 0xb2, 0x8a,
0xac, 0xf3, 0x1c, 0xd1
};
int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd,
struct plugin *plugin)
{
const __u8 log_id = 0xC2;
const char *description = "Retrieves the OCP firmware activation history log.";
char *format = "normal";
OPT_ARGS(options) = {
OPT_FMT("output-format", 'o', &format, "output format : normal | json"),
OPT_END()
};
struct nvme_dev *dev = NULL;
int err = parse_and_open(&dev, argc, argv, description, options);
if (err)
return err;
__u8 uuid_index = 0;
/*
* Best effort attempt at uuid. Otherwise, assume no index (i.e. 0)
* Log GUID check will ensure correctness of returned data
*/
ocp_get_uuid_index(dev, &uuid_index);
struct fw_activation_history fw_history = { 0 };
struct nvme_get_log_args args = {
.lpo = 0,
.result = NULL,
.log = &fw_history,
.args_size = sizeof(args),
.fd = dev_fd(dev),
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
.lid = log_id,
.len = sizeof(fw_history),
.nsid = NVME_NSID_ALL,
.csi = NVME_CSI_NVM,
.lsi = NVME_LOG_LSI_NONE,
.lsp = 0,
.uuidx = uuid_index,
.rae = false,
.ot = false,
};
err = nvme_get_log(&args);
if (err)
nvme_show_status(err);
dev_close(dev);
int guid_cmp_res = memcmp(fw_history.log_page_guid, ocp_fw_activation_history_guid,
sizeof(ocp_fw_activation_history_guid));
if (!err && guid_cmp_res) {
fprintf(stderr,
"Error: Unexpected data. Log page guid does not match with expected.\n");
err = -EINVAL;
}
if (!err) {
nvme_print_flags_t print_flag;
err = validate_output_format(format, &print_flag);
if (err < 0) {
fprintf(stderr, "Error: Invalid output format.\n");
return err;
}
ocp_fw_act_history(&fw_history, print_flag);
}
return err;
}
|