block/nvme: Use register definitions from 'block/nvme.h'
Use the NVMe register definitions from "block/nvme.h" which ease a bit reviewing the code while matching the datasheet. Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20200922083821.578519-6-philmd@redhat.com>
This commit is contained in:
parent
9406e0d97e
commit
fad1eb6886
21
block/nvme.c
21
block/nvme.c
@ -718,22 +718,22 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
* Initialization". */
|
||||
|
||||
cap = le64_to_cpu(regs->cap);
|
||||
if (!(cap & (1ULL << 37))) {
|
||||
if (!NVME_CAP_CSS(cap)) {
|
||||
error_setg(errp, "Device doesn't support NVMe command set");
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
s->page_size = MAX(4096, 1 << (12 + ((cap >> 48) & 0xF)));
|
||||
s->doorbell_scale = (4 << (((cap >> 32) & 0xF))) / sizeof(uint32_t);
|
||||
s->page_size = MAX(4096, 1 << NVME_CAP_MPSMIN(cap));
|
||||
s->doorbell_scale = (4 << NVME_CAP_DSTRD(cap)) / sizeof(uint32_t);
|
||||
bs->bl.opt_mem_alignment = s->page_size;
|
||||
timeout_ms = MIN(500 * ((cap >> 24) & 0xFF), 30000);
|
||||
timeout_ms = MIN(500 * NVME_CAP_TO(cap), 30000);
|
||||
|
||||
/* Reset device to get a clean state. */
|
||||
regs->cc = cpu_to_le32(le32_to_cpu(regs->cc) & 0xFE);
|
||||
/* Wait for CSTS.RDY = 0. */
|
||||
deadline = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + timeout_ms * SCALE_MS;
|
||||
while (le32_to_cpu(regs->csts) & 0x1) {
|
||||
while (NVME_CSTS_RDY(le32_to_cpu(regs->csts))) {
|
||||
if (qemu_clock_get_ns(QEMU_CLOCK_REALTIME) > deadline) {
|
||||
error_setg(errp, "Timeout while waiting for device to reset (%"
|
||||
PRId64 " ms)",
|
||||
@ -761,18 +761,19 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
}
|
||||
s->nr_queues = 1;
|
||||
QEMU_BUILD_BUG_ON(NVME_QUEUE_SIZE & 0xF000);
|
||||
regs->aqa = cpu_to_le32((NVME_QUEUE_SIZE << 16) | NVME_QUEUE_SIZE);
|
||||
regs->aqa = cpu_to_le32((NVME_QUEUE_SIZE << AQA_ACQS_SHIFT) |
|
||||
(NVME_QUEUE_SIZE << AQA_ASQS_SHIFT));
|
||||
regs->asq = cpu_to_le64(s->queues[INDEX_ADMIN]->sq.iova);
|
||||
regs->acq = cpu_to_le64(s->queues[INDEX_ADMIN]->cq.iova);
|
||||
|
||||
/* After setting up all control registers we can enable device now. */
|
||||
regs->cc = cpu_to_le32((ctz32(NVME_CQ_ENTRY_BYTES) << 20) |
|
||||
(ctz32(NVME_SQ_ENTRY_BYTES) << 16) |
|
||||
0x1);
|
||||
regs->cc = cpu_to_le32((ctz32(NVME_CQ_ENTRY_BYTES) << CC_IOCQES_SHIFT) |
|
||||
(ctz32(NVME_SQ_ENTRY_BYTES) << CC_IOSQES_SHIFT) |
|
||||
CC_EN_MASK);
|
||||
/* Wait for CSTS.RDY = 1. */
|
||||
now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
||||
deadline = now + timeout_ms * 1000000;
|
||||
while (!(le32_to_cpu(regs->csts) & 0x1)) {
|
||||
while (!NVME_CSTS_RDY(le32_to_cpu(regs->csts))) {
|
||||
if (qemu_clock_get_ns(QEMU_CLOCK_REALTIME) > deadline) {
|
||||
error_setg(errp, "Timeout while waiting for device to start (%"
|
||||
PRId64 " ms)",
|
||||
|
Loading…
Reference in New Issue
Block a user