hw/nvme: add Identify Endurance Group List
Commit 73064edfb864 ("hw/nvme: flexible data placement emulation") intorudced NVMe FDP feature to nvme-subsys and nvme-ctrl with a single endurance group #1 supported. This means that controller should return proper identify data to host with Identify Endurance Group List (CNS 19h). But, yes, only just for the endurance group #1. This patch allows host applications to ask for which endurance group is available and utilize FDP through that endurance group. Reviewed-by: Klaus Jensen <k.jensen@samsung.com> Signed-off-by: Minwoo Im <minwoo.im@samsung.com> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
This commit is contained in:
parent
8ab8a6dbe4
commit
6471556500
@ -5629,6 +5629,26 @@ static uint16_t nvme_identify_nslist_csi(NvmeCtrl *n, NvmeRequest *req,
|
|||||||
return nvme_c2h(n, list, data_len, req);
|
return nvme_c2h(n, list, data_len, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint16_t nvme_endurance_group_list(NvmeCtrl *n, NvmeRequest *req)
|
||||||
|
{
|
||||||
|
uint16_t list[NVME_CONTROLLER_LIST_SIZE] = {};
|
||||||
|
uint16_t *nr_ids = &list[0];
|
||||||
|
uint16_t *ids = &list[1];
|
||||||
|
uint16_t endgid = le32_to_cpu(req->cmd.cdw11) & 0xffff;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The current nvme-subsys only supports Endurance Group #1.
|
||||||
|
*/
|
||||||
|
if (!endgid) {
|
||||||
|
*nr_ids = 1;
|
||||||
|
ids[0] = 1;
|
||||||
|
} else {
|
||||||
|
*nr_ids = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nvme_c2h(n, list, sizeof(list), req);
|
||||||
|
}
|
||||||
|
|
||||||
static uint16_t nvme_identify_ns_descr_list(NvmeCtrl *n, NvmeRequest *req)
|
static uint16_t nvme_identify_ns_descr_list(NvmeCtrl *n, NvmeRequest *req)
|
||||||
{
|
{
|
||||||
NvmeNamespace *ns;
|
NvmeNamespace *ns;
|
||||||
@ -5744,6 +5764,8 @@ static uint16_t nvme_identify(NvmeCtrl *n, NvmeRequest *req)
|
|||||||
return nvme_identify_nslist(n, req, false);
|
return nvme_identify_nslist(n, req, false);
|
||||||
case NVME_ID_CNS_CS_NS_ACTIVE_LIST:
|
case NVME_ID_CNS_CS_NS_ACTIVE_LIST:
|
||||||
return nvme_identify_nslist_csi(n, req, true);
|
return nvme_identify_nslist_csi(n, req, true);
|
||||||
|
case NVME_ID_CNS_ENDURANCE_GROUP_LIST:
|
||||||
|
return nvme_endurance_group_list(n, req);
|
||||||
case NVME_ID_CNS_CS_NS_PRESENT_LIST:
|
case NVME_ID_CNS_CS_NS_PRESENT_LIST:
|
||||||
return nvme_identify_nslist_csi(n, req, false);
|
return nvme_identify_nslist_csi(n, req, false);
|
||||||
case NVME_ID_CNS_NS_DESCR_LIST:
|
case NVME_ID_CNS_NS_DESCR_LIST:
|
||||||
|
@ -1074,6 +1074,7 @@ enum NvmeIdCns {
|
|||||||
NVME_ID_CNS_CTRL_LIST = 0x13,
|
NVME_ID_CNS_CTRL_LIST = 0x13,
|
||||||
NVME_ID_CNS_PRIMARY_CTRL_CAP = 0x14,
|
NVME_ID_CNS_PRIMARY_CTRL_CAP = 0x14,
|
||||||
NVME_ID_CNS_SECONDARY_CTRL_LIST = 0x15,
|
NVME_ID_CNS_SECONDARY_CTRL_LIST = 0x15,
|
||||||
|
NVME_ID_CNS_ENDURANCE_GROUP_LIST = 0x19,
|
||||||
NVME_ID_CNS_CS_NS_PRESENT_LIST = 0x1a,
|
NVME_ID_CNS_CS_NS_PRESENT_LIST = 0x1a,
|
||||||
NVME_ID_CNS_CS_NS_PRESENT = 0x1b,
|
NVME_ID_CNS_CS_NS_PRESENT = 0x1b,
|
||||||
NVME_ID_CNS_IO_COMMAND_SET = 0x1c,
|
NVME_ID_CNS_IO_COMMAND_SET = 0x1c,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user