On Mon, Oct 14, 2019 at 7:11 PM Patrick Wildt <[email protected]> wrote: > > 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 <[email protected]> > --- > 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);
Why we need this for read? > + 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); Why we need this for write? > > return (total_len - temp_len) >> desc->log2blksz; > } > -- Regards, Bin _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

