/* * QEMU NVM Express Subsystem: nvme-subsys * * Copyright (c) 2021 Minwoo Im * * This code is licensed under the GNU GPL v2. Refer COPYING. */ #ifndef NVME_SUBSYS_H #define NVME_SUBSYS_H #define TYPE_NVME_SUBSYS "nvme-subsys" #define NVME_SUBSYS(obj) \ OBJECT_CHECK(NvmeSubsystem, (obj), TYPE_NVME_SUBSYS) #define NVME_SUBSYS_MAX_CTRLS 32 #define NVME_MAX_NAMESPACES 256 typedef struct NvmeCtrl NvmeCtrl; typedef struct NvmeNamespace NvmeNamespace; typedef struct NvmeSubsystem { DeviceState parent_obj; uint8_t subnqn[256]; NvmeCtrl *ctrls[NVME_SUBSYS_MAX_CTRLS]; /* Allocated namespaces for this subsystem */ NvmeNamespace *namespaces[NVME_MAX_NAMESPACES + 1]; struct { char *nqn; } params; } NvmeSubsystem; int nvme_subsys_register_ctrl(NvmeCtrl *n, Error **errp); static inline NvmeCtrl *nvme_subsys_ctrl(NvmeSubsystem *subsys, uint32_t cntlid) { if (!subsys || cntlid >= NVME_SUBSYS_MAX_CTRLS) { return NULL; } return subsys->ctrls[cntlid]; } /* * Return allocated namespace of the specified nsid in the subsystem. */ static inline NvmeNamespace *nvme_subsys_ns(NvmeSubsystem *subsys, uint32_t nsid) { if (!subsys || !nsid || nsid > NVME_MAX_NAMESPACES) { return NULL; } return subsys->namespaces[nsid]; } #endif /* NVME_SUBSYS_H */