/* * QEMU NVM Express Virtual Namespace * * Copyright (c) 2019 CNEX Labs * Copyright (c) 2020 Samsung Electronics * * Authors: * Klaus Jensen * * This work is licensed under the terms of the GNU GPL, version 2. See the * COPYING file in the top-level directory. * */ #ifndef NVME_NS_H #define NVME_NS_H #define TYPE_NVME_NS "nvme-ns" #define NVME_NS(obj) \ OBJECT_CHECK(NvmeNamespace, (obj), TYPE_NVME_NS) typedef struct NvmeNamespaceParams { uint32_t nsid; } NvmeNamespaceParams; typedef struct NvmeNamespace { DeviceState parent_obj; BlockConf blkconf; int32_t bootindex; int64_t size; NvmeIdNs id_ns; NvmeNamespaceParams params; struct { uint32_t err_rec; } features; } NvmeNamespace; static inline uint32_t nvme_nsid(NvmeNamespace *ns) { if (ns) { return ns->params.nsid; } return -1; } static inline NvmeLBAF *nvme_ns_lbaf(NvmeNamespace *ns) { NvmeIdNs *id_ns = &ns->id_ns; return &id_ns->lbaf[NVME_ID_NS_FLBAS_INDEX(id_ns->flbas)]; } static inline uint8_t nvme_ns_lbads(NvmeNamespace *ns) { return nvme_ns_lbaf(ns)->ds; } /* calculate the number of LBAs that the namespace can accomodate */ static inline uint64_t nvme_ns_nlbas(NvmeNamespace *ns) { return ns->size >> nvme_ns_lbads(ns); } /* convert an LBA to the equivalent in bytes */ static inline size_t nvme_l2b(NvmeNamespace *ns, uint64_t lba) { return lba << nvme_ns_lbads(ns); } typedef struct NvmeCtrl NvmeCtrl; int nvme_ns_setup(NvmeCtrl *n, NvmeNamespace *ns, Error **errp); void nvme_ns_drain(NvmeNamespace *ns); void nvme_ns_flush(NvmeNamespace *ns); #endif /* NVME_NS_H */