1
0
Fork 0
nvme-cli/plugins/lm/lm-print-json.c
Daniel Baumann 635faa7346
Merging upstream version 2.12.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-03-20 08:10:44 +01:00

109 lines
3.9 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
#include "lm-print.h"
#include "common.h"
static void json_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len,
__u32 offset)
{
if (offset) {
fprintf(stderr, "cannot understand non-zero offset\n");
return;
}
struct json_object *root = json_create_object();
struct json_object *nvmecs = json_create_object();
struct json_object *iosqs = json_create_array();
struct json_object *iocqs = json_create_array();
json_object_add_value_uint(root, "version",
le16_to_cpu(data->hdr.ver));
json_object_add_value_uint(root, "controller state attributes",
data->hdr.csattr);
json_object_add_value_uint128(root, "nvme controller state size",
le128_to_cpu(data->hdr.nvmecss));
json_object_add_value_uint128(root, "vendor specific size",
le128_to_cpu(data->hdr.vss));
json_object_add_value_object(root, "nvme controller state", nvmecs);
json_object_add_value_uint(nvmecs, "version",
le16_to_cpu(data->data.hdr.ver));
json_object_add_value_uint(nvmecs, "number of io submission queues",
le16_to_cpu(data->data.hdr.niosq));
json_object_add_value_uint(nvmecs, "number of io completion queues",
le16_to_cpu(data->data.hdr.niocq));
json_object_add_value_array(nvmecs, "io submission queue list", iosqs);
for (int i = 0; i < data->data.hdr.niosq; i++) {
struct nvme_lm_io_submission_queue_data *sq = &data->data.sqs[i];
struct json_object *sq_obj = json_create_object();
json_object_add_value_uint64(sq_obj, "io submission prp entry 1",
le64_to_cpu(sq->iosqprp1));
json_object_add_value_uint(sq_obj, "io submission queue size",
le16_to_cpu(sq->iosqqsize));
json_object_add_value_uint(sq_obj, "io submission queue identifier",
le16_to_cpu(sq->iosqqid));
json_object_add_value_uint(sq_obj, "io completion queue identifier",
le16_to_cpu(sq->iosqcqid));
json_object_add_value_uint(sq_obj, "io submission queue attributes",
le16_to_cpu(sq->iosqa));
json_object_add_value_uint(sq_obj, "io submission queue head pointer",
le16_to_cpu(sq->iosqhp));
json_object_add_value_uint(sq_obj, "io submission queue tail pointer",
le16_to_cpu(sq->iosqtp));
json_array_add_value_object(iosqs, sq_obj);
}
json_object_add_value_array(nvmecs, "io completion queue list", iocqs);
for (int i = 0; i < data->data.hdr.niocq; i++) {
struct nvme_lm_io_completion_queue_data *cq = &data->data.cqs[i];
struct json_object *cq_obj = json_create_object();
json_object_add_value_uint64(cq_obj, "io completion prp entry 1",
le64_to_cpu(cq->iocqprp1));
json_object_add_value_uint(cq_obj, "io completion queue size",
le16_to_cpu(cq->iocqqsize));
json_object_add_value_uint(cq_obj, "io completion queue identifier",
le16_to_cpu(cq->iocqqid));
json_object_add_value_uint(cq_obj, "io completion queue head pointer",
le16_to_cpu(cq->iocqhp));
json_object_add_value_uint(cq_obj, "io completion queue tail pointer",
le16_to_cpu(cq->iocqtp));
json_object_add_value_uint(cq_obj, "io completion queue attributes",
le32_to_cpu(cq->iocqa));
json_array_add_value_object(iocqs, cq_obj);
}
json_print_object(root, NULL);
printf("\n");
json_free_object(root);
}
static void json_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data)
{
struct json_object *root = json_create_object();
json_object_add_value_uint(root, "head_pointer", le32_to_cpu(data->hp));
json_object_add_value_uint(root, "tail_pointer_trigger", le32_to_cpu(data->tpt));
json_print_object(root, NULL);
printf("\n");
json_free_object(root);
}
static struct lm_print_ops json_print_ops = {
.controller_state_data = json_controller_state_data,
.controller_data_queue = json_controller_data_queue
};
struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags)
{
json_print_ops.flags = flags;
return &json_print_ops;
}