[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 39/56] hw/block/nvme: fix 64 bit register hi/lo split writes
From: |
Klaus Jensen |
Subject: |
[PULL 39/56] hw/block/nvme: fix 64 bit register hi/lo split writes |
Date: |
Tue, 9 Feb 2021 08:30:44 +0100 |
From: Klaus Jensen <k.jensen@samsung.com>
64 bit registers like ASQ and ACQ should be writable by both a hi/lo 32
bit write combination as well as a plain 64 bit write. The spec does not
define ordering on the hi/lo split, but the code currently assumes that
the low order bits are written first. Additionally, the code does not
consider that another address might already have been written into the
register, causing the OR'ing to result in a bad address.
Fix this by explicitly overwriting only the low or high order bits for
32 bit writes.
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
Reviewed-by: Keith Busch <kbusch@kernel.org>
---
hw/block/nvme.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
index 2407b6578abc..2785127037db 100644
--- a/hw/block/nvme.c
+++ b/hw/block/nvme.c
@@ -3819,19 +3819,21 @@ static void nvme_write_bar(NvmeCtrl *n, hwaddr offset,
uint64_t data,
trace_pci_nvme_mmio_aqattr(data & 0xffffffff);
break;
case 0x28: /* ASQ */
- n->bar.asq = data;
+ n->bar.asq = size == 8 ? data :
+ (n->bar.asq & ~0xffffffffULL) | (data & 0xffffffff);
trace_pci_nvme_mmio_asqaddr(data);
break;
case 0x2c: /* ASQ hi */
- n->bar.asq |= data << 32;
+ n->bar.asq = (n->bar.asq & 0xffffffff) | (data << 32);
trace_pci_nvme_mmio_asqaddr_hi(data, n->bar.asq);
break;
case 0x30: /* ACQ */
trace_pci_nvme_mmio_acqaddr(data);
- n->bar.acq = data;
+ n->bar.acq = size == 8 ? data :
+ (n->bar.acq & ~0xffffffffULL) | (data & 0xffffffff);
break;
case 0x34: /* ACQ hi */
- n->bar.acq |= data << 32;
+ n->bar.acq = (n->bar.acq & 0xffffffff) | (data << 32);
trace_pci_nvme_mmio_acqaddr_hi(data, n->bar.acq);
break;
case 0x38: /* CMBLOC */
--
2.30.0
- [PULL 15/56] nvme: Make ZNS-related definitions, (continued)
- [PULL 15/56] nvme: Make ZNS-related definitions, Klaus Jensen, 2021/02/09
- [PULL 21/56] hw/block/nvme: conditionally enable DULBE for zoned namespaces, Klaus Jensen, 2021/02/09
- [PULL 16/56] hw/block/nvme: Support Zoned Namespace Command Set, Klaus Jensen, 2021/02/09
- [PULL 20/56] hw/block/nvme: fix for non-msix machines, Klaus Jensen, 2021/02/09
- [PULL 22/56] hw/block/nvme: fix shutdown/reset logic, Klaus Jensen, 2021/02/09
- [PULL 18/56] hw/block/nvme: Support Zone Descriptor Extensions, Klaus Jensen, 2021/02/09
- [PULL 17/56] hw/block/nvme: Introduce max active and open zone limits, Klaus Jensen, 2021/02/09
- [PULL 23/56] hw/block/nvme: merge implicitly/explicitly opened processing masks, Klaus Jensen, 2021/02/09
- [PULL 24/56] hw/block/nvme: enum style fix, Klaus Jensen, 2021/02/09
- [PULL 19/56] hw/block/nvme: Document zoned parameters in usage text, Klaus Jensen, 2021/02/09
- [PULL 39/56] hw/block/nvme: fix 64 bit register hi/lo split writes,
Klaus Jensen <=
- [PULL 26/56] hw/block/nvme: add missing string representations for commands, Klaus Jensen, 2021/02/09
- [PULL 28/56] hw/block/nvme: Correct error status for unaligned ZA, Klaus Jensen, 2021/02/09
- [PULL 27/56] hw/block/nvme: remove unnecessary check for append, Klaus Jensen, 2021/02/09
- [PULL 30/56] hw/block/nvme: open code for volatile write cache, Klaus Jensen, 2021/02/09
- [PULL 33/56] hw/block/nvme: remove unused argument in nvme_ns_setup, Klaus Jensen, 2021/02/09
- [PULL 35/56] nvme: introduce bit 5 for critical warning, Klaus Jensen, 2021/02/09
- [PULL 38/56] hw/block/nvme: add size to mmio read/write trace events, Klaus Jensen, 2021/02/09
- [PULL 25/56] hw/block/nvme: zero out zones on reset, Klaus Jensen, 2021/02/09
- [PULL 45/56] hw/block/nvme: disable PMR at boot up, Klaus Jensen, 2021/02/09
- [PULL 29/56] hw/block/nvme: remove unused argument in nvme_ns_init_zoned, Klaus Jensen, 2021/02/09