2 * QEMU NVM Express Virtual Namespace
4 * Copyright (c) 2019 CNEX Labs
5 * Copyright (c) 2020 Samsung Electronics
8 * Klaus Jensen <k.jensen@samsung.com>
10 * This work is licensed under the terms of the GNU GPL, version 2. See the
11 * COPYING file in the top-level directory.
18 #define TYPE_NVME_NS "nvme-ns"
19 #define NVME_NS(obj) \
20 OBJECT_CHECK(NvmeNamespace, (obj), TYPE_NVME_NS)
22 typedef struct NvmeNamespaceParams
{
24 } NvmeNamespaceParams
;
26 typedef struct NvmeNamespace
{
27 DeviceState parent_obj
;
33 NvmeNamespaceParams params
;
36 static inline uint32_t nvme_nsid(NvmeNamespace
*ns
)
39 return ns
->params
.nsid
;
45 static inline NvmeLBAF
*nvme_ns_lbaf(NvmeNamespace
*ns
)
47 NvmeIdNs
*id_ns
= &ns
->id_ns
;
48 return &id_ns
->lbaf
[NVME_ID_NS_FLBAS_INDEX(id_ns
->flbas
)];
51 static inline uint8_t nvme_ns_lbads(NvmeNamespace
*ns
)
53 return nvme_ns_lbaf(ns
)->ds
;
56 /* calculate the number of LBAs that the namespace can accomodate */
57 static inline uint64_t nvme_ns_nlbas(NvmeNamespace
*ns
)
59 return ns
->size
>> nvme_ns_lbads(ns
);
62 /* convert an LBA to the equivalent in bytes */
63 static inline size_t nvme_l2b(NvmeNamespace
*ns
, uint64_t lba
)
65 return lba
<< nvme_ns_lbads(ns
);
68 typedef struct NvmeCtrl NvmeCtrl
;
70 int nvme_ns_setup(NvmeCtrl
*n
, NvmeNamespace
*ns
, Error
**errp
);
71 void nvme_ns_drain(NvmeNamespace
*ns
);
72 void nvme_ns_flush(NvmeNamespace
*ns
);
74 #endif /* NVME_NS_H */