4 #include "block/nvme.h"
7 #define NVME_MAX_NAMESPACES 256
9 typedef struct NvmeParams
{
11 uint32_t num_queues
; /* deprecated since 5.1 */
12 uint32_t max_ioqpairs
;
16 uint32_t aer_max_queued
;
21 typedef struct NvmeAsyncEvent
{
22 QTAILQ_ENTRY(NvmeAsyncEvent
) entry
;
26 typedef struct NvmeRequest
{
27 struct NvmeSQueue
*sq
;
28 struct NvmeNamespace
*ns
;
36 QTAILQ_ENTRY(NvmeRequest
)entry
;
39 static inline const char *nvme_adm_opc_str(uint8_t opc
)
42 case NVME_ADM_CMD_DELETE_SQ
: return "NVME_ADM_CMD_DELETE_SQ";
43 case NVME_ADM_CMD_CREATE_SQ
: return "NVME_ADM_CMD_CREATE_SQ";
44 case NVME_ADM_CMD_GET_LOG_PAGE
: return "NVME_ADM_CMD_GET_LOG_PAGE";
45 case NVME_ADM_CMD_DELETE_CQ
: return "NVME_ADM_CMD_DELETE_CQ";
46 case NVME_ADM_CMD_CREATE_CQ
: return "NVME_ADM_CMD_CREATE_CQ";
47 case NVME_ADM_CMD_IDENTIFY
: return "NVME_ADM_CMD_IDENTIFY";
48 case NVME_ADM_CMD_ABORT
: return "NVME_ADM_CMD_ABORT";
49 case NVME_ADM_CMD_SET_FEATURES
: return "NVME_ADM_CMD_SET_FEATURES";
50 case NVME_ADM_CMD_GET_FEATURES
: return "NVME_ADM_CMD_GET_FEATURES";
51 case NVME_ADM_CMD_ASYNC_EV_REQ
: return "NVME_ADM_CMD_ASYNC_EV_REQ";
52 default: return "NVME_ADM_CMD_UNKNOWN";
56 static inline const char *nvme_io_opc_str(uint8_t opc
)
59 case NVME_CMD_FLUSH
: return "NVME_NVM_CMD_FLUSH";
60 case NVME_CMD_WRITE
: return "NVME_NVM_CMD_WRITE";
61 case NVME_CMD_READ
: return "NVME_NVM_CMD_READ";
62 case NVME_CMD_WRITE_ZEROES
: return "NVME_NVM_CMD_WRITE_ZEROES";
63 default: return "NVME_NVM_CMD_UNKNOWN";
67 typedef struct NvmeSQueue
{
68 struct NvmeCtrl
*ctrl
;
77 QTAILQ_HEAD(, NvmeRequest
) req_list
;
78 QTAILQ_HEAD(, NvmeRequest
) out_req_list
;
79 QTAILQ_ENTRY(NvmeSQueue
) entry
;
82 typedef struct NvmeCQueue
{
83 struct NvmeCtrl
*ctrl
;
93 QTAILQ_HEAD(, NvmeSQueue
) sq_list
;
94 QTAILQ_HEAD(, NvmeRequest
) req_list
;
97 #define TYPE_NVME_BUS "nvme-bus"
98 #define NVME_BUS(obj) OBJECT_CHECK(NvmeBus, (obj), TYPE_NVME_BUS)
100 typedef struct NvmeBus
{
104 #define TYPE_NVME "nvme"
106 OBJECT_CHECK(NvmeCtrl, (obj), TYPE_NVME)
108 typedef struct NvmeFeatureVal
{
110 uint16_t temp_thresh_hi
;
111 uint16_t temp_thresh_low
;
113 uint32_t async_config
;
117 typedef struct NvmeCtrl
{
118 PCIDevice parent_obj
;
120 MemoryRegion ctrl_mem
;
129 uint16_t max_prp_ents
;
133 uint32_t num_namespaces
;
135 uint8_t outstanding_aers
;
138 uint64_t host_timestamp
; /* Timestamp sent by the host */
139 uint64_t timestamp_set_qemu_clock_ms
; /* QEMU clock time */
140 uint64_t starttime_ms
;
141 uint16_t temperature
;
143 HostMemoryBackend
*pmrdev
;
146 NvmeRequest
**aer_reqs
;
147 QTAILQ_HEAD(, NvmeAsyncEvent
) aer_queue
;
150 NvmeNamespace
namespace;
151 NvmeNamespace
*namespaces
[NVME_MAX_NAMESPACES
];
157 NvmeFeatureVal features
;
160 static inline NvmeNamespace
*nvme_ns(NvmeCtrl
*n
, uint32_t nsid
)
162 if (!nsid
|| nsid
> n
->num_namespaces
) {
166 return n
->namespaces
[nsid
- 1];
169 static inline NvmeCQueue
*nvme_cq(NvmeRequest
*req
)
171 NvmeSQueue
*sq
= req
->sq
;
172 NvmeCtrl
*n
= sq
->ctrl
;
174 return n
->cq
[sq
->cqid
];
177 static inline NvmeCtrl
*nvme_ctrl(NvmeRequest
*req
)
179 NvmeSQueue
*sq
= req
->sq
;
183 int nvme_register_namespace(NvmeCtrl
*n
, NvmeNamespace
*ns
, Error
**errp
);
185 #endif /* HW_NVME_H */