]> xenbits.xensource.com Git - seabios.git/commitdiff
nvme: Add nvme_bounce_xfer() helper function
authorKevin O'Connor <kevin@koconnor.net>
Wed, 19 Jan 2022 16:54:55 +0000 (11:54 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 21 Jan 2022 16:23:31 +0000 (11:23 -0500)
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>
src/hw/nvme.c

index 608651afb8b00902b0936e9326f2f6e38d1fa244..d656e9bfcad243142463ac1a91eb3cff5ba7986e 100644 (file)
@@ -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;