nvme: add enum for opcode data direction
NVMe opcodes contain a two-bit field that encodes the expected data direction for each command. Add an enum and a function to extract these bits. Change-Id: Ie214319f121cf0899c6aa5663866f2988b128dd2 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
b7095d7b00
commit
ab1f6bdc54
@ -526,6 +526,34 @@ enum spdk_nvme_nvm_opcode {
|
|||||||
SPDK_NVME_OPC_RESERVATION_RELEASE = 0x15,
|
SPDK_NVME_OPC_RESERVATION_RELEASE = 0x15,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data transfer (bits 1:0) of an NVMe opcode.
|
||||||
|
*
|
||||||
|
* \sa spdk_nvme_opc_get_data_transfer
|
||||||
|
*/
|
||||||
|
enum spdk_nvme_data_transfer {
|
||||||
|
/** Opcode does not transfer data */
|
||||||
|
SPDK_NVME_DATA_NONE = 0,
|
||||||
|
/** Opcode transfers data from host to controller (e.g. Write) */
|
||||||
|
SPDK_NVME_DATA_HOST_TO_CONTROLLER = 1,
|
||||||
|
/** Opcode transfers data from controller to host (e.g. Read) */
|
||||||
|
SPDK_NVME_DATA_CONTROLLER_TO_HOST = 2,
|
||||||
|
/** Opcode transfers data both directions */
|
||||||
|
SPDK_NVME_DATA_BIDIRECTIONAL = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the Data Transfer bits from an NVMe opcode.
|
||||||
|
*
|
||||||
|
* This determines whether a command requires a data buffer and
|
||||||
|
* which direction (host to controller or controller to host) it is
|
||||||
|
* transferred.
|
||||||
|
*/
|
||||||
|
static inline enum spdk_nvme_data_transfer spdk_nvme_opc_get_data_transfer(uint8_t opc)
|
||||||
|
{
|
||||||
|
return opc & 3;
|
||||||
|
}
|
||||||
|
|
||||||
enum spdk_nvme_feat {
|
enum spdk_nvme_feat {
|
||||||
/* 0x00 - reserved */
|
/* 0x00 - reserved */
|
||||||
SPDK_NVME_FEAT_ARBITRATION = 0x01,
|
SPDK_NVME_FEAT_ARBITRATION = 0x01,
|
||||||
|
@ -14,7 +14,7 @@ timing_enter nvme
|
|||||||
|
|
||||||
timing_enter unit
|
timing_enter unit
|
||||||
$valgrind $testdir/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut
|
$valgrind $testdir/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut
|
||||||
$testdir/unit/nvme_c/nvme_ut
|
$valgrind $testdir/unit/nvme_c/nvme_ut
|
||||||
$valgrind $testdir/unit/nvme_qpair_c/nvme_qpair_ut
|
$valgrind $testdir/unit/nvme_qpair_c/nvme_qpair_ut
|
||||||
$valgrind $testdir/unit/nvme_ctrlr_c/nvme_ctrlr_ut
|
$valgrind $testdir/unit/nvme_ctrlr_c/nvme_ctrlr_ut
|
||||||
$valgrind $testdir/unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut
|
$valgrind $testdir/unit/nvme_ctrlr_cmd_c/nvme_ctrlr_cmd_ut
|
||||||
|
@ -71,6 +71,24 @@ spdk_nvme_ctrlr_opts_set_defaults(struct spdk_nvme_ctrlr_opts *opts)
|
|||||||
memset(opts, 0, sizeof(*opts));
|
memset(opts, 0, sizeof(*opts));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_opc_data_transfer(void)
|
||||||
|
{
|
||||||
|
enum spdk_nvme_data_transfer xfer;
|
||||||
|
|
||||||
|
xfer = spdk_nvme_opc_get_data_transfer(SPDK_NVME_OPC_FLUSH);
|
||||||
|
CU_ASSERT(xfer == SPDK_NVME_DATA_NONE);
|
||||||
|
|
||||||
|
xfer = spdk_nvme_opc_get_data_transfer(SPDK_NVME_OPC_WRITE);
|
||||||
|
CU_ASSERT(xfer == SPDK_NVME_DATA_HOST_TO_CONTROLLER);
|
||||||
|
|
||||||
|
xfer = spdk_nvme_opc_get_data_transfer(SPDK_NVME_OPC_READ);
|
||||||
|
CU_ASSERT(xfer == SPDK_NVME_DATA_CONTROLLER_TO_HOST);
|
||||||
|
|
||||||
|
xfer = spdk_nvme_opc_get_data_transfer(SPDK_NVME_OPC_GET_LOG_PAGE);
|
||||||
|
CU_ASSERT(xfer == SPDK_NVME_DATA_CONTROLLER_TO_HOST);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
CU_pSuite suite = NULL;
|
CU_pSuite suite = NULL;
|
||||||
@ -86,15 +104,12 @@ int main(int argc, char **argv)
|
|||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (
|
if (
|
||||||
CU_add_test(suite, "test1", test1) == NULL
|
CU_add_test(suite, "test_opc_data_transfer", test_opc_data_transfer) == NULL
|
||||||
|| CU_add_test(suite, "test2", test2) == NULL
|
|
||||||
) {
|
) {
|
||||||
CU_cleanup_registry();
|
CU_cleanup_registry();
|
||||||
return CU_get_error();
|
return CU_get_error();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
CU_basic_set_mode(CU_BRM_VERBOSE);
|
CU_basic_set_mode(CU_BRM_VERBOSE);
|
||||||
CU_basic_run_tests();
|
CU_basic_run_tests();
|
||||||
|
Loading…
Reference in New Issue
Block a user