]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
nvme: Fix error in nvme_setup_prps
authorJon Lin <jon.lin@rock-chips.com>
Tue, 19 Oct 2021 02:40:54 +0000 (10:40 +0800)
committerTom Rini <trini@konsulko.com>
Wed, 17 Nov 2021 22:09:47 +0000 (17:09 -0500)
Consulting to "NVM Express® Base Specification, revision 2.0".

If more PRP List pages are required, then the last entry of
the PRP List contains the Page Base Address of the next PRP
List page. The next PRP List page shall be memory page aligned.

Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com>
drivers/nvme/nvme.c

index 9623c896a15d20c337fe3764d11ccffae34f7f6e..22ded626a529924dd5d7f22095e5351cf094a0d4 100644 (file)
@@ -100,7 +100,7 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
        }
 
        nprps = DIV_ROUND_UP(length, page_size);
-       num_pages = DIV_ROUND_UP(nprps, prps_per_page);
+       num_pages = DIV_ROUND_UP(nprps + 1, prps_per_page);
 
        if (nprps > dev->prp_entry_num) {
                free(dev->prp_pool);
@@ -119,10 +119,11 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
        prp_pool = dev->prp_pool;
        i = 0;
        while (nprps) {
-               if (i == ((page_size >> 3) - 1)) {
-                       *(prp_pool + i) = cpu_to_le64((ulong)prp_pool +
+               if (i == prps_per_page) {
+                       *(prp_pool + i) = *(prp_pool + i - 1);
+                       *(prp_pool + i - 1) = cpu_to_le64((ulong)prp_pool +
                                        page_size);
-                       i = 0;
+                       i = 1;
                        prp_pool += page_size;
                }
                *(prp_pool + i++) = cpu_to_le64(dma_addr);