mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-25 23:15:49 +00:00
block/nvme: Reduce I/O registers scope
We only access the I/O register in nvme_init(). Remove the reference in BDRVNVMeState and reduce its scope. Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20200922083821.578519-4-philmd@redhat.com>
This commit is contained in:
parent
f68453237b
commit
37d7a45abd
29
block/nvme.c
29
block/nvme.c
@ -98,7 +98,6 @@ enum {
|
||||
struct BDRVNVMeState {
|
||||
AioContext *aio_context;
|
||||
QEMUVFIOState *vfio;
|
||||
NVMeRegs *regs;
|
||||
/* Memory mapped registers */
|
||||
volatile struct {
|
||||
uint32_t sq_tail;
|
||||
@ -695,6 +694,7 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
uint64_t timeout_ms;
|
||||
uint64_t deadline, now;
|
||||
Error *local_err = NULL;
|
||||
NVMeRegs *regs;
|
||||
|
||||
qemu_co_mutex_init(&s->dma_map_lock);
|
||||
qemu_co_queue_init(&s->dma_flush_queue);
|
||||
@ -713,16 +713,16 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
goto out;
|
||||
}
|
||||
|
||||
s->regs = qemu_vfio_pci_map_bar(s->vfio, 0, 0, sizeof(NvmeBar),
|
||||
PROT_READ | PROT_WRITE, errp);
|
||||
if (!s->regs) {
|
||||
regs = qemu_vfio_pci_map_bar(s->vfio, 0, 0, sizeof(NvmeBar),
|
||||
PROT_READ | PROT_WRITE, errp);
|
||||
if (!regs) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
/* Perform initialize sequence as described in NVMe spec "7.6.1
|
||||
* Initialization". */
|
||||
|
||||
cap = le64_to_cpu(s->regs->ctrl.cap);
|
||||
cap = le64_to_cpu(regs->ctrl.cap);
|
||||
if (!(cap & (1ULL << 37))) {
|
||||
error_setg(errp, "Device doesn't support NVMe command set");
|
||||
ret = -EINVAL;
|
||||
@ -735,10 +735,10 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
timeout_ms = MIN(500 * ((cap >> 24) & 0xFF), 30000);
|
||||
|
||||
/* Reset device to get a clean state. */
|
||||
s->regs->ctrl.cc = cpu_to_le32(le32_to_cpu(s->regs->ctrl.cc) & 0xFE);
|
||||
regs->ctrl.cc = cpu_to_le32(le32_to_cpu(regs->ctrl.cc) & 0xFE);
|
||||
/* Wait for CSTS.RDY = 0. */
|
||||
deadline = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + timeout_ms * SCALE_MS;
|
||||
while (le32_to_cpu(s->regs->ctrl.csts) & 0x1) {
|
||||
while (le32_to_cpu(regs->ctrl.csts) & 0x1) {
|
||||
if (qemu_clock_get_ns(QEMU_CLOCK_REALTIME) > deadline) {
|
||||
error_setg(errp, "Timeout while waiting for device to reset (%"
|
||||
PRId64 " ms)",
|
||||
@ -766,18 +766,18 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
}
|
||||
s->nr_queues = 1;
|
||||
QEMU_BUILD_BUG_ON(NVME_QUEUE_SIZE & 0xF000);
|
||||
s->regs->ctrl.aqa = cpu_to_le32((NVME_QUEUE_SIZE << 16) | NVME_QUEUE_SIZE);
|
||||
s->regs->ctrl.asq = cpu_to_le64(s->queues[INDEX_ADMIN]->sq.iova);
|
||||
s->regs->ctrl.acq = cpu_to_le64(s->queues[INDEX_ADMIN]->cq.iova);
|
||||
regs->ctrl.aqa = cpu_to_le32((NVME_QUEUE_SIZE << 16) | NVME_QUEUE_SIZE);
|
||||
regs->ctrl.asq = cpu_to_le64(s->queues[INDEX_ADMIN]->sq.iova);
|
||||
regs->ctrl.acq = cpu_to_le64(s->queues[INDEX_ADMIN]->cq.iova);
|
||||
|
||||
/* After setting up all control registers we can enable device now. */
|
||||
s->regs->ctrl.cc = cpu_to_le32((ctz32(NVME_CQ_ENTRY_BYTES) << 20) |
|
||||
regs->ctrl.cc = cpu_to_le32((ctz32(NVME_CQ_ENTRY_BYTES) << 20) |
|
||||
(ctz32(NVME_SQ_ENTRY_BYTES) << 16) |
|
||||
0x1);
|
||||
/* Wait for CSTS.RDY = 1. */
|
||||
now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
||||
deadline = now + timeout_ms * 1000000;
|
||||
while (!(le32_to_cpu(s->regs->ctrl.csts) & 0x1)) {
|
||||
while (!(le32_to_cpu(regs->ctrl.csts) & 0x1)) {
|
||||
if (qemu_clock_get_ns(QEMU_CLOCK_REALTIME) > deadline) {
|
||||
error_setg(errp, "Timeout while waiting for device to start (%"
|
||||
PRId64 " ms)",
|
||||
@ -808,6 +808,10 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
ret = -EIO;
|
||||
}
|
||||
out:
|
||||
if (regs) {
|
||||
qemu_vfio_pci_unmap_bar(s->vfio, 0, (void *)regs, 0, sizeof(NvmeBar));
|
||||
}
|
||||
|
||||
/* Cleaning up is done in nvme_file_open() upon error. */
|
||||
return ret;
|
||||
}
|
||||
@ -882,7 +886,6 @@ static void nvme_close(BlockDriverState *bs)
|
||||
event_notifier_cleanup(&s->irq_notifier[MSIX_SHARED_IRQ_IDX]);
|
||||
qemu_vfio_pci_unmap_bar(s->vfio, 0, (void *)s->doorbells,
|
||||
sizeof(NvmeBar), NVME_DOORBELL_SIZE);
|
||||
qemu_vfio_pci_unmap_bar(s->vfio, 0, (void *)s->regs, 0, sizeof(NvmeBar));
|
||||
qemu_vfio_close(s->vfio);
|
||||
|
||||
g_free(s->device);
|
||||
|
Loading…
x
Reference in New Issue
Block a user