[U-Boot] [PATCH] nvme: add more cache flushes
Patrick Wildt
patrick at blueri.se
Mon Oct 14 11:11:40 UTC 2019
On an i.MX8MQ our nvme driver doesn't completely work since we are
missing a few cache flushes. One is the prp list, which is an extra
buffer that we need to flush before handing it to the hardware. Also
the block read/write operations needs more cache flushes on this SoC.
Signed-off-by: Patrick Wildt <patrick at blueri.se>
---
drivers/nvme/nvme.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/nvme/nvme.c b/drivers/nvme/nvme.c
index 2444e0270f..69d5e3eedc 100644
--- a/drivers/nvme/nvme.c
+++ b/drivers/nvme/nvme.c
@@ -123,6 +123,9 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
}
*prp2 = (ulong)dev->prp_pool;
+ flush_dcache_range((ulong)dev->prp_pool, (ulong)dev->prp_pool +
+ dev->prp_entry_num * sizeof(u64));
+
return 0;
}
@@ -717,9 +720,10 @@ static ulong nvme_blk_rw(struct udevice *udev, lbaint_t blknr,
u16 lbas = 1 << (dev->max_transfer_shift - ns->lba_shift);
u64 total_lbas = blkcnt;
- if (!read)
- flush_dcache_range((unsigned long)buffer,
- (unsigned long)buffer + total_len);
+ flush_dcache_range((unsigned long)buffer,
+ (unsigned long)buffer + total_len);
+ invalidate_dcache_range((unsigned long)buffer,
+ (unsigned long)buffer + total_len);
c.rw.opcode = read ? nvme_cmd_read : nvme_cmd_write;
c.rw.flags = 0;
@@ -755,9 +759,8 @@ static ulong nvme_blk_rw(struct udevice *udev, lbaint_t blknr,
buffer += lbas << ns->lba_shift;
}
- if (read)
- invalidate_dcache_range((unsigned long)buffer,
- (unsigned long)buffer + total_len);
+ invalidate_dcache_range((unsigned long)buffer,
+ (unsigned long)buffer + total_len);
return (total_len - temp_len) >> desc->log2blksz;
}
--
2.23.0
More information about the U-Boot
mailing list