1#ifndef HW_NVME_H
2#define HW_NVME_H
3#include "block/nvme.h"
4
5typedef struct NvmeAsyncEvent {
6 QSIMPLEQ_ENTRY(NvmeAsyncEvent) entry;
7 NvmeAerResult result;
8} NvmeAsyncEvent;
9
10typedef struct NvmeRequest {
11 struct NvmeSQueue *sq;
12 BlockAIOCB *aiocb;
13 uint16_t status;
14 bool has_sg;
15 NvmeCqe cqe;
16 BlockAcctCookie acct;
17 QEMUSGList qsg;
18 QEMUIOVector iov;
19 QTAILQ_ENTRY(NvmeRequest)entry;
20} NvmeRequest;
21
22typedef struct NvmeSQueue {
23 struct NvmeCtrl *ctrl;
24 uint16_t sqid;
25 uint16_t cqid;
26 uint32_t head;
27 uint32_t tail;
28 uint32_t size;
29 uint64_t dma_addr;
30 QEMUTimer *timer;
31 NvmeRequest *io_req;
32 QTAILQ_HEAD(, NvmeRequest) req_list;
33 QTAILQ_HEAD(, NvmeRequest) out_req_list;
34 QTAILQ_ENTRY(NvmeSQueue) entry;
35} NvmeSQueue;
36
37typedef struct NvmeCQueue {
38 struct NvmeCtrl *ctrl;
39 uint8_t phase;
40 uint16_t cqid;
41 uint16_t irq_enabled;
42 uint32_t head;
43 uint32_t tail;
44 uint32_t vector;
45 uint32_t size;
46 uint64_t dma_addr;
47 QEMUTimer *timer;
48 QTAILQ_HEAD(, NvmeSQueue) sq_list;
49 QTAILQ_HEAD(, NvmeRequest) req_list;
50} NvmeCQueue;
51
52typedef struct NvmeNamespace {
53 NvmeIdNs id_ns;
54} NvmeNamespace;
55
56#define TYPE_NVME "nvme"
57#define NVME(obj) \
58 OBJECT_CHECK(NvmeCtrl, (obj), TYPE_NVME)
59
60typedef struct NvmeCtrl {
61 PCIDevice parent_obj;
62 MemoryRegion iomem;
63 MemoryRegion ctrl_mem;
64 NvmeBar bar;
65 BlockConf conf;
66
67 uint32_t page_size;
68 uint16_t page_bits;
69 uint16_t max_prp_ents;
70 uint16_t cqe_size;
71 uint16_t sqe_size;
72 uint32_t reg_size;
73 uint32_t num_namespaces;
74 uint32_t num_queues;
75 uint32_t max_q_ents;
76 uint64_t ns_size;
77 uint32_t cmb_size_mb;
78 uint32_t cmbsz;
79 uint32_t cmbloc;
80 uint8_t *cmbuf;
81 uint64_t irq_status;
82 uint64_t host_timestamp; /* Timestamp sent by the host */
83 uint64_t timestamp_set_qemu_clock_ms; /* QEMU clock time */
84
85 char *serial;
86 NvmeNamespace *namespaces;
87 NvmeSQueue **sq;
88 NvmeCQueue **cq;
89 NvmeSQueue admin_sq;
90 NvmeCQueue admin_cq;
91 NvmeIdCtrl id_ctrl;
92} NvmeCtrl;
93
94#endif /* HW_NVME_H */
95