Skip to content

Commit

Permalink
UPSTREAM: nvme: invalidate correct memory range after read
Browse files Browse the repository at this point in the history
The current code invalidates the range after the read buffer since the
buffer pointer gets incremented in the read loop. Use a temporary
pointer to make sure we have a pristine pointer to invalidate the
correct memory range after read.

Fixes: 704e040 ("nvme: Apply cache operations on the DMA buffers")
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Stefan Agner <stefan@agner.ch>
(cherry picked from commit 30ac0b4)
Signed-off-by: Stephen Chen <stephen@radxa.com>
  • Loading branch information
agners authored and RadxaStephen committed Mar 23, 2023
1 parent a135a6a commit 6da7d0a
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions drivers/nvme/nvme.c
Expand Up @@ -740,6 +740,7 @@ static ulong nvme_blk_rw(struct udevice *udev, lbaint_t blknr,
u64 prp2;
u64 total_len = blkcnt << desc->log2blksz;
u64 temp_len = total_len;
uintptr_t temp_buffer = (uintptr_t)buffer;

u64 slba = blknr;
u16 lbas = 1 << (dev->max_transfer_shift - ns->lba_shift);
Expand Down Expand Up @@ -771,19 +772,19 @@ static ulong nvme_blk_rw(struct udevice *udev, lbaint_t blknr,
}

if (nvme_setup_prps(dev, &prp2,
lbas << ns->lba_shift, (ulong)buffer))
lbas << ns->lba_shift, temp_buffer))
return -EIO;
c.rw.slba = cpu_to_le64(slba);
slba += lbas;
c.rw.length = cpu_to_le16(lbas - 1);
c.rw.prp1 = cpu_to_le64((ulong)buffer);
c.rw.prp1 = cpu_to_le64(temp_buffer);
c.rw.prp2 = cpu_to_le64(prp2);
status = nvme_submit_sync_cmd(dev->queues[NVME_IO_Q],
&c, NULL, IO_TIMEOUT);
if (status)
break;
temp_len -= (u32)lbas << ns->lba_shift;
buffer += lbas << ns->lba_shift;
temp_buffer += lbas << ns->lba_shift;
}

if (read)
Expand Down

0 comments on commit 6da7d0a

Please sign in to comment.