mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 02:03:56 -06:00
hw/nvme: i/o cmd set independent namespace data structure
Add support for the I/O Command Set Independent Namespace Data Structure (CNS 8h and 1fh). Signed-off-by: Arun Kumar <arun.kka@samsung.com> Reviewed-by: Klaus Jensen <k.jensen@samsung.com> Link: https://lore.kernel.org/r/20240925004407.3521406-1-arun.kka@samsung.com Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
This commit is contained in:
parent
daaf51001a
commit
79e490058f
5 changed files with 59 additions and 3 deletions
|
@ -5692,6 +5692,33 @@ static uint16_t nvme_identify_sec_ctrl_list(NvmeCtrl *n, NvmeRequest *req)
|
|||
return nvme_c2h(n, (uint8_t *)&list, sizeof(list), req);
|
||||
}
|
||||
|
||||
static uint16_t nvme_identify_ns_ind(NvmeCtrl *n, NvmeRequest *req, bool alloc)
|
||||
{
|
||||
NvmeNamespace *ns;
|
||||
NvmeIdentify *c = (NvmeIdentify *)&req->cmd;
|
||||
uint32_t nsid = le32_to_cpu(c->nsid);
|
||||
|
||||
trace_pci_nvme_identify_ns_ind(nsid);
|
||||
|
||||
if (!nvme_nsid_valid(n, nsid) || nsid == NVME_NSID_BROADCAST) {
|
||||
return NVME_INVALID_NSID | NVME_DNR;
|
||||
}
|
||||
|
||||
ns = nvme_ns(n, nsid);
|
||||
if (unlikely(!ns)) {
|
||||
if (alloc) {
|
||||
ns = nvme_subsys_ns(n->subsys, nsid);
|
||||
if (!ns) {
|
||||
return nvme_rpt_empty_id_struct(n, req);
|
||||
}
|
||||
} else {
|
||||
return nvme_rpt_empty_id_struct(n, req);
|
||||
}
|
||||
}
|
||||
|
||||
return nvme_c2h(n, (uint8_t *)&ns->id_ns_ind, sizeof(NvmeIdNsInd), req);
|
||||
}
|
||||
|
||||
static uint16_t nvme_identify_ns_csi(NvmeCtrl *n, NvmeRequest *req,
|
||||
bool active)
|
||||
{
|
||||
|
@ -5946,6 +5973,10 @@ static uint16_t nvme_identify(NvmeCtrl *n, NvmeRequest *req)
|
|||
return nvme_identify_sec_ctrl_list(n, req);
|
||||
case NVME_ID_CNS_CS_NS:
|
||||
return nvme_identify_ns_csi(n, req, true);
|
||||
case NVME_ID_CNS_CS_IND_NS:
|
||||
return nvme_identify_ns_ind(n, req, false);
|
||||
case NVME_ID_CNS_CS_IND_NS_ALLOCATED:
|
||||
return nvme_identify_ns_ind(n, req, true);
|
||||
case NVME_ID_CNS_CS_NS_PRESENT:
|
||||
return nvme_identify_ns_csi(n, req, false);
|
||||
case NVME_ID_CNS_CTRL:
|
||||
|
|
|
@ -62,6 +62,7 @@ static int nvme_ns_init(NvmeNamespace *ns, Error **errp)
|
|||
static uint64_t ns_count;
|
||||
NvmeIdNs *id_ns = &ns->id_ns;
|
||||
NvmeIdNsNvm *id_ns_nvm = &ns->id_ns_nvm;
|
||||
NvmeIdNsInd *id_ns_ind = &ns->id_ns_ind;
|
||||
uint8_t ds;
|
||||
uint16_t ms;
|
||||
int i;
|
||||
|
@ -75,7 +76,9 @@ static int nvme_ns_init(NvmeNamespace *ns, Error **errp)
|
|||
id_ns->nsfeat |= (0x4 | 0x10);
|
||||
|
||||
if (ns->params.shared) {
|
||||
id_ns->nmic |= NVME_NMIC_NS_SHARED;
|
||||
id_ns->nmic |= NVME_ID_NS_IND_NMIC_SHRNS;
|
||||
id_ns_ind->nmic = NVME_ID_NS_IND_NMIC_SHRNS;
|
||||
id_ns_ind->nstat = NVME_ID_NS_IND_NSTAT_NRDY;
|
||||
}
|
||||
|
||||
/* Substitute a missing EUI-64 by an autogenerated one */
|
||||
|
@ -770,6 +773,7 @@ static void nvme_ns_realize(DeviceState *dev, Error **errp)
|
|||
subsys->namespaces[nsid] = ns;
|
||||
|
||||
ns->id_ns.endgid = cpu_to_le16(0x1);
|
||||
ns->id_ns_ind.endgrpid = cpu_to_le16(0x1);
|
||||
|
||||
if (ns->params.detached) {
|
||||
return;
|
||||
|
|
|
@ -233,6 +233,7 @@ typedef struct NvmeNamespace {
|
|||
int64_t moff;
|
||||
NvmeIdNs id_ns;
|
||||
NvmeIdNsNvm id_ns_nvm;
|
||||
NvmeIdNsInd id_ns_ind;
|
||||
NvmeLBAF lbaf;
|
||||
unsigned int nlbaf;
|
||||
size_t lbasz;
|
||||
|
|
|
@ -56,6 +56,7 @@ pci_nvme_identify(uint16_t cid, uint8_t cns, uint16_t ctrlid, uint8_t csi) "cid
|
|||
pci_nvme_identify_ctrl(void) "identify controller"
|
||||
pci_nvme_identify_ctrl_csi(uint8_t csi) "identify controller, csi=0x%"PRIx8""
|
||||
pci_nvme_identify_ns(uint32_t ns) "nsid %"PRIu32""
|
||||
pci_nvme_identify_ns_ind(uint32_t nsid) "nsid %"PRIu32""
|
||||
pci_nvme_identify_ctrl_list(uint8_t cns, uint16_t cntid) "cns 0x%"PRIx8" cntid %"PRIu16""
|
||||
pci_nvme_identify_pri_ctrl_cap(uint16_t cntlid) "identify primary controller capabilities cntlid=%"PRIu16""
|
||||
pci_nvme_identify_sec_ctrl_list(uint16_t cntlid, uint8_t numcntl) "identify secondary controller list cntlid=%"PRIu16" numcntl=%"PRIu8""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue