From 9cdc9e335d51dc4e0e9d9fd6b4592ae55e30de72 Mon Sep 17 00:00:00 2001 From: Karen Xie <karen.xie@xilinx.com> Date: Tue, 3 Oct 2023 17:18:16 -0700 Subject: [PATCH] xdma: add kernel 6.x support --- XDMA/linux-kernel/xdma/cdev_sgdma.c | 8 +++- XDMA/linux-kernel/xdma/libxdma.c | 63 +++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/XDMA/linux-kernel/xdma/cdev_sgdma.c b/XDMA/linux-kernel/xdma/cdev_sgdma.c index 2b13000..4a9f638 100644 --- a/XDMA/linux-kernel/xdma/cdev_sgdma.c +++ b/XDMA/linux-kernel/xdma/cdev_sgdma.c @@ -104,7 +104,9 @@ static void async_io_handler(unsigned long cb_hndl, int err) if (caio->cmpl_cnt == caio->req_cnt) { res = caio->res; res2 = caio->res2; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + caio->iocb->ki_complete(caio->iocb, caio->err_cnt ? res2 : res); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) caio->iocb->ki_complete(caio->iocb, res, res2); #else aio_complete(caio->iocb, res, res2); @@ -119,7 +121,9 @@ skip_tran: return; skip_dev_lock: -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0) + caio->iocb->ki_complete(caio->iocb, -EBUSY); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) caio->iocb->ki_complete(caio->iocb, numbytes, -EBUSY); #else aio_complete(caio->iocb, numbytes, -EBUSY); diff --git a/XDMA/linux-kernel/xdma/libxdma.c b/XDMA/linux-kernel/xdma/libxdma.c index 4342b79..3d9c865 100644 --- a/XDMA/linux-kernel/xdma/libxdma.c +++ b/XDMA/linux-kernel/xdma/libxdma.c @@ -2908,8 +2908,13 @@ static void transfer_destroy(struct xdma_dev *xdev, struct xdma_transfer *xfer) struct sg_table *sgt = xfer->sgt; if (sgt->nents) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_unmap_sg(xdev->pdev, sgt->sgl, sgt->nents, xfer->dir); +#else + dma_unmap_sg(&xdev->pdev->dev, sgt->sgl, sgt->nents, + xfer->dir); +#endif sgt->nents = 0; } } @@ -3192,8 +3197,13 @@ ssize_t xdma_xfer_aperture(struct xdma_engine *engine, bool write, u64 ep_addr, } if (!dma_mapped) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) sgt->nents = pci_map_sg(xdev->pdev, sgt->sgl, sgt->orig_nents, dir); +#else + sgt->nents = dma_map_sg(&xdev->pdev->dev, sgt->sgl, + sgt->orig_nents, dir); +#endif if (!sgt->nents) { pr_info("map sgl failed, sgt 0x%p.\n", sgt); return -EIO; @@ -3434,7 +3444,11 @@ ssize_t xdma_xfer_aperture(struct xdma_engine *engine, bool write, u64 ep_addr, unmap_sgl: if (!dma_mapped && sgt->nents) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_unmap_sg(xdev->pdev, sgt->sgl, sgt->orig_nents, dir); +#else + dma_unmap_sg(&xdev->pdev->dev, sgt->sgl, sgt->orig_nents, dir); +#endif sgt->nents = 0; } @@ -3504,7 +3518,12 @@ ssize_t xdma_xfer_submit(void *dev_hndl, int channel, bool write, u64 ep_addr, } if (!dma_mapped) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) nents = pci_map_sg(xdev->pdev, sg, sgt->orig_nents, dir); +#else + nents = dma_map_sg(&xdev->pdev->dev, sg, sgt->orig_nents, dir); +#endif + if (!nents) { pr_info("map sgl failed, sgt 0x%p.\n", sgt); return -EIO; @@ -3660,7 +3679,11 @@ ssize_t xdma_xfer_submit(void *dev_hndl, int channel, bool write, u64 ep_addr, unmap_sgl: if (!dma_mapped && sgt->nents) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_unmap_sg(xdev->pdev, sgt->sgl, sgt->orig_nents, dir); +#else + dma_unmap_sg(&xdev->pdev->dev, sgt->sgl, sgt->orig_nents, dir); +#endif sgt->nents = 0; } @@ -3781,7 +3804,11 @@ ssize_t xdma_xfer_completion(void *cb_hndl, void *dev_hndl, int channel, unmap_sgl: if (!dma_mapped && sgt->nents) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_unmap_sg(xdev->pdev, sgt->sgl, sgt->orig_nents, dir); +#else + dma_unmap_sg(&xdev->pdev->dev, sgt->sgl, sgt->orig_nents, dir); +#endif sgt->nents = 0; } @@ -3855,7 +3882,11 @@ ssize_t xdma_xfer_submit_nowait(void *cb_hndl, void *dev_hndl, int channel, } if (!dma_mapped) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) nents = pci_map_sg(xdev->pdev, sg, sgt->orig_nents, dir); +#else + nents = dma_map_sg(&xdev->pdev->dev, sg, sgt->orig_nents, dir); +#endif if (!nents) { pr_info("map sgl failed, sgt 0x%p.\n", sgt); return -EIO; @@ -3895,8 +3926,13 @@ ssize_t xdma_xfer_submit_nowait(void *cb_hndl, void *dev_hndl, int channel, pr_info("transfer_init failed\n"); if (!dma_mapped && sgt->nents) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_unmap_sg(xdev->pdev, sgt->sgl, sgt->orig_nents, dir); +#else + dma_unmap_sg(&xdev->pdev->dev, sgt->sgl, + sgt->orig_nents, dir); +#endif sgt->nents = 0; } @@ -3943,7 +3979,11 @@ ssize_t xdma_xfer_submit_nowait(void *cb_hndl, void *dev_hndl, int channel, unmap_sgl: if (!dma_mapped && sgt->nents) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_unmap_sg(xdev->pdev, sgt->sgl, sgt->orig_nents, dir); +#else + dma_unmap_sg(&xdev->pdev->dev, sgt->sgl, sgt->orig_nents, dir); +#endif sgt->nents = 0; } @@ -4191,16 +4231,31 @@ static int set_dma_mask(struct pci_dev *pdev) dbg_init("sizeof(dma_addr_t) == %ld\n", sizeof(dma_addr_t)); /* 64-bit addressing capability for XDMA? */ - if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) + if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) +#else + if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) +#endif + { /* query for DMA transfer */ /* @see Documentation/DMA-mapping.txt */ - dbg_init("pci_set_dma_mask()\n"); + dbg_init("set_dma_mask(64)\n"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) + pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); +#endif /* use 64-bit DMA */ dbg_init("Using a 64-bit DMA mask.\n"); - pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); - } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { + } else +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) + if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) +#else + if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) +#endif + { dbg_init("Could not set 64-bit DMA mask.\n"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 16, 0) pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); +#endif /* use 32-bit DMA */ dbg_init("Using a 32-bit DMA mask.\n"); } else { -- GitLab