109 lines
3.9 KiB
C
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;
|
|
}
|