Support for Commands Supported and Effects Log Page

Change-Id: If28662585887b613e3510a8fd8414caeca9ba99b
Signed-off-by: param <kumaraparamesh92@gmail.com>
Reviewed-on: https://review.gerrithub.io/401314
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
param 2018-02-22 23:36:33 +05:30 committed by Jim Harris
parent 2114019360
commit c5cd53cce0
5 changed files with 103 additions and 0 deletions

View File

@ -1749,6 +1749,49 @@ struct __attribute__((packed)) spdk_nvme_health_information_page {
}; };
SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_health_information_page) == 512, "Incorrect size"); SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_health_information_page) == 512, "Incorrect size");
/* Commands Supported and Effects Data Structure */
struct spdk_nvme_cmds_and_effect_entry {
/** Command Supported */
uint16_t csupp : 1;
/** Logic Block Content Change */
uint16_t lbcc : 1;
/** Namespace Capability Change */
uint16_t ncc : 1;
/** Namespace Inventory Change */
uint16_t nic : 1;
/** Controller Capability Change */
uint16_t ccc : 1;
uint16_t reserved1 : 11;
/* Command Submission and Execution recommendation
* 000 - No command submission or execution restriction
* 001 - Submitted when there is no outstanding command to same NS
* 010 - Submitted when there is no outstanding command to any NS
* others - Reserved
* \ref command_submission_and_execution in section 5.14.1.5 NVMe Revision 1.3
*/
uint16_t cse : 3;
uint16_t reserved2 : 13;
};
/* Commands Supported and Effects Log Page */
struct spdk_nvme_cmds_and_effect_log_page {
/** Commands Supported and Effects Data Structure for the Admin Commands */
struct spdk_nvme_cmds_and_effect_entry admin_cmds_supported[256];
/** Commands Supported and Effects Data Structure for the IO Commands */
struct spdk_nvme_cmds_and_effect_entry io_cmds_supported[256];
uint8_t reserved0[2048];
};
SPDK_STATIC_ASSERT(sizeof(struct spdk_nvme_cmds_and_effect_log_page) == 4096, "Incorrect size");
/** /**
* Asynchronous Event Type * Asynchronous Event Type
*/ */

View File

@ -891,6 +891,9 @@ spdk_nvmf_ctrlr_get_log_page(struct spdk_nvmf_request *req)
case SPDK_NVME_LOG_FIRMWARE_SLOT: case SPDK_NVME_LOG_FIRMWARE_SLOT:
/* TODO: actually fill out log page data */ /* TODO: actually fill out log page data */
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
case SPDK_NVME_LOG_COMMAND_EFFECTS_LOG:
spdk_nvmf_get_cmds_and_effects_log_page(req->data, offset, len);
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
default: default:
goto invalid_log_page; goto invalid_log_page;
} }

View File

@ -596,6 +596,58 @@ spdk_nvmf_poll_group_resume_subsystem(struct spdk_nvmf_poll_group *group,
return 0; return 0;
} }
/* The structure can be modified if we provide support for other commands in future */
static const struct spdk_nvme_cmds_and_effect_log_page g_cmds_and_effect_log_page = {
.admin_cmds_supported = {
/* CSUPP, LBCC, NCC, NIC, CCC, CSE */
/* Get Log Page */
[SPDK_NVME_OPC_GET_LOG_PAGE] = {1, 0, 0, 0, 0, 0, 0, 0},
/* Identify */
[SPDK_NVME_OPC_IDENTIFY] = {1, 0, 0, 0, 0, 0, 0, 0},
/* Abort */
[SPDK_NVME_OPC_ABORT] = {1, 0, 0, 0, 0, 0, 0, 0},
/* Set Features */
[SPDK_NVME_OPC_SET_FEATURES] = {1, 0, 0, 0, 0, 0, 0, 0},
/* Get Features */
[SPDK_NVME_OPC_GET_FEATURES] = {1, 0, 0, 0, 0, 0, 0, 0},
/* Async Event Request */
[SPDK_NVME_OPC_ASYNC_EVENT_REQUEST] = {1, 0, 0, 0, 0, 0, 0, 0},
/* Keep Alive */
[SPDK_NVME_OPC_KEEP_ALIVE] = {1, 0, 0, 0, 0, 0, 0, 0},
},
.io_cmds_supported = {
/* FLUSH */
[SPDK_NVME_OPC_FLUSH] = {1, 1, 0, 0, 0, 0, 0, 0},
/* WRITE */
[SPDK_NVME_OPC_WRITE] = {1, 1, 0, 0, 0, 0, 0, 0},
/* READ */
[SPDK_NVME_OPC_READ] = {1, 0, 0, 0, 0, 0, 0, 0},
/* WRITE ZEROES */
[SPDK_NVME_OPC_WRITE_ZEROES] = {1, 1, 0, 0, 0, 0, 0, 0},
/* DATASET MANAGEMENT */
[SPDK_NVME_OPC_DATASET_MANAGEMENT] = {1, 1, 0, 0, 0, 0, 0, 0},
},
};
void
spdk_nvmf_get_cmds_and_effects_log_page(void *buffer,
uint64_t offset, uint32_t length)
{
uint32_t page_size = sizeof(struct spdk_nvme_cmds_and_effect_log_page);
size_t copy_len = 0;
size_t zero_len = length;
if (offset < page_size) {
copy_len = spdk_min(page_size - offset, length);
zero_len -= copy_len;
memcpy(buffer, (char *)(&g_cmds_and_effect_log_page) + offset, copy_len);
}
if (zero_len) {
memset((char *)buffer + copy_len, 0, zero_len);
}
}
SPDK_TRACE_REGISTER_FN(nvmf_trace) SPDK_TRACE_REGISTER_FN(nvmf_trace)
{ {
spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); spdk_trace_register_object(OBJECT_NVMF_IO, 'r');

View File

@ -228,6 +228,8 @@ int spdk_nvmf_request_abort(struct spdk_nvmf_request *req);
void spdk_nvmf_get_discovery_log_page(struct spdk_nvmf_tgt *tgt, void spdk_nvmf_get_discovery_log_page(struct spdk_nvmf_tgt *tgt,
void *buffer, uint64_t offset, void *buffer, uint64_t offset,
uint32_t length); uint32_t length);
void spdk_nvmf_get_cmds_and_effects_log_page(void *buffer,
uint64_t offset, uint32_t length);
struct spdk_nvmf_qpair *spdk_nvmf_ctrlr_get_qpair(struct spdk_nvmf_ctrlr *ctrlr, uint16_t qid); struct spdk_nvmf_qpair *spdk_nvmf_ctrlr_get_qpair(struct spdk_nvmf_ctrlr *ctrlr, uint16_t qid);
void spdk_nvmf_ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr); void spdk_nvmf_ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr);

View File

@ -126,6 +126,9 @@ DEFINE_STUB(spdk_nvmf_bdev_ctrlr_identify_ns,
DEFINE_STUB_V(spdk_nvmf_get_discovery_log_page, DEFINE_STUB_V(spdk_nvmf_get_discovery_log_page,
(struct spdk_nvmf_tgt *tgt, void *buffer, uint64_t offset, uint32_t length)) (struct spdk_nvmf_tgt *tgt, void *buffer, uint64_t offset, uint32_t length))
DEFINE_STUB_V(spdk_nvmf_get_cmds_and_effects_log_page,
(void *buffer, uint64_t offset, uint32_t length))
DEFINE_STUB(spdk_nvmf_request_complete, DEFINE_STUB(spdk_nvmf_request_complete,
int, int,
(struct spdk_nvmf_request *req), (struct spdk_nvmf_request *req),