aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2022-01-19 11:54:55 -0500
committerKevin O'Connor <kevin@koconnor.net>2022-01-21 11:23:31 -0500
commit4eff93e7b0d093fd9347f2d533dada49854290fe (patch)
treee5ef674c7b1404e2cb291928bf87b7929bfc4988
parentda18ec909af70c41995b700a09927762955bbf9a (diff)
downloadseabios-4eff93e7b0d093fd9347f2d533dada49854290fe.zip
seabios-4eff93e7b0d093fd9347f2d533dada49854290fe.tar.gz
seabios-4eff93e7b0d093fd9347f2d533dada49854290fe.tar.bz2
nvme: Add nvme_bounce_xfer() helper function
Move bounce buffer processing to a new helper function. Signed-off-by: Kevin O'Connor <kevin@koconnor.net> Reviewed-by: Alexander Graf <graf@amazon.com>
-rw-r--r--src/hw/nvme.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/hw/nvme.c b/src/hw/nvme.c
index 608651a..d656e9b 100644
--- a/src/hw/nvme.c
+++ b/src/hw/nvme.c
@@ -464,6 +464,25 @@ nvme_io_xfer(struct nvme_namespace *ns, u64 lba, void *buf, u16 count,
return count;
}
+// Transfer up to one page of data using the internal dma bounce buffer
+static int
+nvme_bounce_xfer(struct nvme_namespace *ns, u64 lba, void *buf, u16 count,
+ int write)
+{
+ u16 const max_blocks = NVME_PAGE_SIZE / ns->block_size;
+ u16 blocks = count < max_blocks ? count : max_blocks;
+
+ if (write)
+ memcpy(ns->dma_buffer, buf, blocks * ns->block_size);
+
+ int res = nvme_io_xfer(ns, lba, ns->dma_buffer, blocks, write);
+
+ if (!write && res >= 0)
+ memcpy(buf, ns->dma_buffer, res * ns->block_size);
+
+ return res;
+}
+
static void nvme_reset_prpl(struct nvme_namespace *ns)
{
ns->prpl_len = 0;
@@ -717,7 +736,6 @@ nvme_scan(void)
static int
nvme_cmd_readwrite(struct nvme_namespace *ns, struct disk_op_s *op, int write)
{
- u16 const max_blocks = NVME_PAGE_SIZE / ns->block_size;
u16 i, blocks;
for (i = 0; i < op->count;) {
@@ -730,21 +748,10 @@ nvme_cmd_readwrite(struct nvme_namespace *ns, struct disk_op_s *op, int write)
if (res < 0)
return DISK_RET_EBADTRACK;
} else {
- blocks = blocks_remaining < max_blocks ? blocks_remaining
- : max_blocks;
-
- if (write) {
- memcpy(ns->dma_buffer, op_buf, blocks * ns->block_size);
- }
-
- int res = nvme_io_xfer(ns, op->lba + i, ns->dma_buffer,
- blocks, write);
+ int res = nvme_bounce_xfer(ns, op->lba + i, op_buf, blocks, write);
if (res < 0)
return DISK_RET_EBADTRACK;
-
- if (!write) {
- memcpy(op_buf, ns->dma_buffer, blocks * ns->block_size);
- }
+ blocks = res;
}
i += blocks;