[PATCH] nvme: Fix PRP list pointer arithmetic for chained transfers
Neil Armstrong
neil.armstrong at linaro.org
Tue May 19 11:43:09 CEST 2026
On 5/18/26 04:25, Prashant Kamble wrote:
> The PRP setup code advances prp_pool using u64 pointer
> arithmetic:
>
> prp_pool += page_size;
>
> This increments the pointer by page_size * sizeof(u64)
> bytes instead of page_size bytes, resulting in invalid
> PRP list addresses when multiple PRP list pages are
> required.
>
> The issue becomes visible for large transfers, typically
> above 2 MiB when MDTS > 9.
>
> Fix it by using byte-wise pointer arithmetic when
> advancing to the next PRP list page.
>
> Signed-off-by: Prashant Kamble <prashant.kamble223 at gmail.com>
> ---
> drivers/nvme/nvme.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/nvme/nvme.c b/drivers/nvme/nvme.c
> index 2b14437f69c..3ce98de1a5c 100644
> --- a/drivers/nvme/nvme.c
> +++ b/drivers/nvme/nvme.c
> @@ -94,7 +94,7 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2,
> *(prp_pool + i) = cpu_to_le64((ulong)prp_pool +
> page_size);
> i = 0;
> - prp_pool += page_size;
> + prp_pool = (u64 *)((uintptr_t)prp_pool + page_size);
> }
> *(prp_pool + i++) = cpu_to_le64(dma_addr);
> dma_addr += page_size;
Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
Thanks,
Neil
More information about the U-Boot
mailing list