diff mbox series

[v9,12/32] drm: msm: fix common struct sg_table related issues

Message ID 20200826063316.23486-13-m.szyprowski@samsung.com
State Superseded
Headers show
Series DRM: fix struct sg_table nents vs. orig_nents misuse | expand

Commit Message

Marek Szyprowski Aug. 26, 2020, 6:32 a.m. UTC
The Documentation/DMA-API-HOWTO.txt states that the dma_map_sg() function
returns the number of the created entries in the DMA address space.
However the subsequent calls to the dma_sync_sg_for_{device,cpu}() and
dma_unmap_sg must be called with the original number of the entries
passed to the dma_map_sg().

struct sg_table is a common structure used for describing a non-contiguous
memory buffer, used commonly in the DRM and graphics subsystems. It
consists of a scatterlist with memory pages and DMA addresses (sgl entry),
as well as the number of scatterlist entries: CPU pages (orig_nents entry)
and DMA mapped pages (nents entry).

It turned out that it was a common mistake to misuse nents and orig_nents
entries, calling DMA-mapping functions with a wrong number of entries or
ignoring the number of mapped entries returned by the dma_map_sg()
function.

To avoid such issues, lets use a common dma-mapping wrappers operating
directly on the struct sg_table objects and use scatterlist page
iterators where possible. This, almost always, hides references to the
nents and orig_nents entries, making the code robust, easier to follow
and copy/paste safe.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>

Acked-by: Rob Clark <robdclark@gmail.com>

---
 drivers/gpu/drm/msm/msm_gem.c    | 13 +++++--------
 drivers/gpu/drm/msm/msm_gpummu.c | 14 ++++++--------
 drivers/gpu/drm/msm/msm_iommu.c  |  2 +-
 3 files changed, 12 insertions(+), 17 deletions(-)

-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Comments

kernel test robot Aug. 26, 2020, 1:26 p.m. UTC | #1
Hi Marek,

I love your patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on drm-intel/for-linux-next linus/master v5.9-rc2 next-20200826]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Marek-Szyprowski/DRM-fix-struct-sg_table-nents-vs-orig_nents-misuse/20200826-143908
base:   git://linuxtv.org/media_tree.git master
config: arm64-randconfig-r002-20200826 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 7cfcecece0e0430937cf529ce74d3a071a4dedc6)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm64 cross compiling tool for clang build
        # apt-get install binutils-aarch64-linux-gnu
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   aarch64-linux-gnu-ld: warning: -z norelro ignored
   aarch64-linux-gnu-ld: fs/orangefs/orangefs-debugfs.o: in function `orangefs_debug_read':
   fs/orangefs/orangefs-debugfs.c:375: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: security/apparmor/lsm.o: in function `param_get_mode':
   security/apparmor/lsm.c:1559: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: security/apparmor/lsm.o: in function `param_get_audit':
   security/apparmor/lsm.c:1530: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: crypto/async_tx/async_tx.o: in function `async_tx_channel_switch':
   crypto/async_tx/async_tx.c:118: undefined reference to `dma_wait_for_async_tx'
   aarch64-linux-gnu-ld: crypto/async_tx/async_tx.o: in function `async_tx_quiesce':
   crypto/async_tx/async_tx.c:270: undefined reference to `dma_wait_for_async_tx'
   aarch64-linux-gnu-ld: crypto/async_tx/async_tx.c:270: undefined reference to `dma_wait_for_async_tx'
   aarch64-linux-gnu-ld: crypto/async_tx/async_memcpy.o: in function `async_memcpy':
   crypto/async_tx/async_memcpy.c:43: undefined reference to `dmaengine_get_unmap_data'
   aarch64-linux-gnu-ld: crypto/async_tx/async_memcpy.c:89: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_xor.o: in function `async_xor':
   crypto/async_tx/async_xor.c:172: undefined reference to `dmaengine_get_unmap_data'
   aarch64-linux-gnu-ld: crypto/async_tx/async_xor.c:199: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_xor.c:199: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_xor.c:196: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_xor.o: in function `async_xor_val':
   crypto/async_tx/async_xor.c:268: undefined reference to `dmaengine_get_unmap_data'
   aarch64-linux-gnu-ld: crypto/async_tx/async_xor.c:324: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_pq.o: in function `async_gen_syndrome':
   crypto/async_tx/async_pq.c:176: undefined reference to `dmaengine_get_unmap_data'
   aarch64-linux-gnu-ld: crypto/async_tx/async_pq.c:233: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_pq.c:229: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: crypto/async_tx/async_pq.o: in function `async_syndrome_val':
   crypto/async_tx/async_pq.c:295: undefined reference to `dmaengine_get_unmap_data'
   aarch64-linux-gnu-ld: crypto/async_tx/async_pq.c:412: undefined reference to `dmaengine_unmap_put'
   aarch64-linux-gnu-ld: drivers/xen/sys-hypervisor.o: in function `buildid_show':
   drivers/xen/sys-hypervisor.c:375: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/tty/tty_io.o: in function `tty_line_name':
   drivers/tty/tty_io.c:1139: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/tty/tty_io.c:1139: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/tty/tty_io.c:1139: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o: in function `dsi_dma_workaround_write':
   drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o: in function `vc4_dsi_host_transfer':
   drivers/gpu/drm/vc4/vc4_dsi.c:564: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o: in function `dsi_dma_workaround_write':
   drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o:drivers/gpu/drm/vc4/vc4_dsi.c:581: more undefined references to `dma_sync_wait' follow
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o: in function `vc4_dsi_bind':
   drivers/gpu/drm/vc4/vc4_dsi.c:1512: undefined reference to `dma_request_chan_by_mask'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o: in function `dsi_dma_workaround_write':
   drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.c:581: undefined reference to `dma_sync_wait'
   aarch64-linux-gnu-ld: drivers/gpu/drm/vc4/vc4_dsi.o:drivers/gpu/drm/vc4/vc4_dsi.c:581: more undefined references to `dma_sync_wait' follow
   aarch64-linux-gnu-ld: drivers/gpu/drm/msm/msm_gpummu.o: in function `msm_gpummu_map':
>> drivers/gpu/drm/msm/msm_gpummu.c:44: undefined reference to `__compiletime_assert_413'

   aarch64-linux-gnu-ld: drivers/gpu/drm/xlnx/zynqmp_disp.o: in function `zynqmp_disp_layer_release_dma':
   drivers/gpu/drm/xlnx/zynqmp_disp.c:1287: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/gpu/drm/xlnx/zynqmp_disp.c:1287: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/scsi/scsi_transport_sas.o: in function `get_sas_device_type_names':
   drivers/scsi/scsi_transport_sas.c:131: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/scsi/scsi_transport_sas.o: in function `get_sas_linkspeed_names':
   drivers/scsi/scsi_transport_sas.c:158: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/scsi/scsi_transport_sas.c:158: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/scsi/scsi_transport_sas.c:158: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/scsi/scsi_transport_sas.c:158: undefined reference to `stpcpy'
   aarch64-linux-gnu-ld: drivers/scsi/scsi_transport_sas.o:drivers/scsi/scsi_transport_sas.c:158: more undefined references to `stpcpy' follow
   aarch64-linux-gnu-ld: drivers/spi/spi-bcm2835.o: in function `bcm2835_dma_init':
   drivers/spi/spi-bcm2835.c:907: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-bcm2835.c:914: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-bcm2835.o: in function `dmaengine_desc_set_reuse':
   include/linux/dmaengine.h:1537: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1537: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1537: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1537: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1537: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: drivers/spi/spi-bcm2835.o: in function `bcm2835_dma_release':
   drivers/spi/spi-bcm2835.c:867: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-bcm2835.c:884: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-fsl-dspi.o: in function `dspi_request_dma':
   drivers/spi/spi-fsl-dspi.c:506: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-fsl-dspi.c:513: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-fsl-dspi.c:572: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-fsl-dspi.c:574: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-fsl-dspi.o: in function `dspi_release_dma':
   drivers/spi/spi-fsl-dspi.c:593: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-fsl-dspi.c:599: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-pxa2xx-dma.o: in function `dma_request_slave_channel_compat':
   include/linux/dmaengine.h:1587: undefined reference to `dma_request_slave_channel'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1587: undefined reference to `dma_request_slave_channel'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1594: undefined reference to `__dma_request_channel'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1594: undefined reference to `__dma_request_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-pxa2xx-dma.o: in function `pxa2xx_spi_dma_setup':
   drivers/spi/spi-pxa2xx-dma.c:209: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-pxa2xx-dma.o: in function `pxa2xx_spi_dma_release':
   drivers/spi/spi-pxa2xx-dma.c:223: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-pxa2xx-dma.c:228: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.o: in function `spi_qup_init_dma':
   drivers/spi/spi-qup.c:935: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.c:939: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.c:973: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.o: in function `spi_qup_release_dma':
   drivers/spi/spi-qup.c:921: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.c:923: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.o: in function `spi_qup_init_dma':
   drivers/spi/spi-qup.c:971: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.o: in function `spi_qup_release_dma':
   drivers/spi/spi-qup.c:921: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-qup.o:drivers/spi/spi-qup.c:923: more undefined references to `dma_release_channel' follow
   aarch64-linux-gnu-ld: drivers/spi/spi-rockchip.o: in function `rockchip_spi_probe':
   drivers/spi/spi-rockchip.c:748: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-rockchip.c:759: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-rockchip.c:788: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-rockchip.c:785: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-rockchip.o: in function `rockchip_spi_remove':
   drivers/spi/spi-rockchip.c:816: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-rockchip.c:818: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-rspi.o: in function `rspi_request_dma':
   drivers/spi/spi-rspi.c:1135: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-rspi.o:drivers/spi/spi-rspi.c:1148: more undefined references to `dma_release_channel' follow
   aarch64-linux-gnu-ld: drivers/spi/spi-rspi.o: in function `dma_request_slave_channel_compat':
   include/linux/dmaengine.h:1587: undefined reference to `dma_request_slave_channel'
   aarch64-linux-gnu-ld: include/linux/dmaengine.h:1594: undefined reference to `__dma_request_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-rspi.o: in function `rspi_request_dma_chan':
   drivers/spi/spi-rspi.c:1102: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-uniphier.o: in function `uniphier_spi_probe':
   drivers/spi/spi-uniphier.c:716: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-uniphier.c:725: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: drivers/spi/spi-uniphier.c:734: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/spi/spi-uniphier.c:743: undefined reference to `dma_get_slave_caps'
   aarch64-linux-gnu-ld: drivers/spi/spi-uniphier.o: in function `uniphier_spi_remove':
   drivers/spi/spi-uniphier.c:773: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/spi/spi-uniphier.c:775: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/slimbus/qcom-ngd-ctrl.o: in function `qcom_slim_ngd_exit_dma':
   drivers/slimbus/qcom-ngd-ctrl.c:1051: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/slimbus/qcom-ngd-ctrl.c:1056: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/slimbus/qcom-ngd-ctrl.o: in function `qcom_slim_ngd_init_rx_msgq':
   drivers/slimbus/qcom-ngd-ctrl.c:669: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/slimbus/qcom-ngd-ctrl.c:697: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/slimbus/qcom-ngd-ctrl.o: in function `qcom_slim_ngd_init_tx_msgq':
   drivers/slimbus/qcom-ngd-ctrl.c:708: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/slimbus/qcom-ngd-ctrl.c:732: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.o: in function `sh_mobile_i2c_release_dma':
   drivers/i2c/busses/i2c-sh_mobile.c:783: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.c:788: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.c:783: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.c:788: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.o: in function `sh_mobile_i2c_request_dma_chan':
   drivers/i2c/busses/i2c-sh_mobile.c:483: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.c:483: undefined reference to `dma_request_chan'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.c:503: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/i2c/busses/i2c-sh_mobile.c:503: undefined reference to `dma_release_channel'
   aarch64-linux-gnu-ld: drivers/md/raid5.o: in function `raid5d':
   drivers/md/raid5.c:6367: undefined reference to `dma_issue_pending_all'
   aarch64-linux-gnu-ld: drivers/md/raid5.o: in function `raid5_do_work':
   drivers/md/raid5.c:6280: undefined reference to `dma_issue_pending_all'

# https://github.com/0day-ci/linux/commit/ea1faf41c87f65cbbd61c902b1c773a681347a34
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Marek-Szyprowski/DRM-fix-struct-sg_table-nents-vs-orig_nents-misuse/20200826-143908
git checkout ea1faf41c87f65cbbd61c902b1c773a681347a34
vim +44 drivers/gpu/drm/msm/msm_gpummu.c

    27	
    28	static int msm_gpummu_map(struct msm_mmu *mmu, uint64_t iova,
    29			struct sg_table *sgt, size_t len, int prot)
    30	{
    31		struct msm_gpummu *gpummu = to_msm_gpummu(mmu);
    32		unsigned idx = (iova - GPUMMU_VA_START) / GPUMMU_PAGE_SIZE;
    33		struct sg_dma_page_iter dma_iter;
    34		unsigned prot_bits = 0;
    35	
    36		if (prot & IOMMU_WRITE)
    37			prot_bits |= 1;
    38		if (prot & IOMMU_READ)
    39			prot_bits |= 2;
    40	
    41		for_each_sgtable_dma_page(sgt, &dma_iter, 0) {
    42			dma_addr_t addr = sg_page_iter_dma_address(&dma_iter);
    43	
  > 44			BUILD_BUG_ON(GPUMMU_PAGE_SIZE != PAGE_SIZE);

    45			gpummu->table[idx++] = addr | prot_bits;
    46		}
    47	
    48		/* we can improve by deferring flush for multiple map() */
    49		gpu_write(gpummu->gpu, REG_A2XX_MH_MMU_INVALIDATE,
    50			A2XX_MH_MMU_INVALIDATE_INVALIDATE_ALL |
    51			A2XX_MH_MMU_INVALIDATE_INVALIDATE_TC);
    52		return 0;
    53	}
    54	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index b2f49152b4d4..8c7ae812b813 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -53,11 +53,10 @@  static void sync_for_device(struct msm_gem_object *msm_obj)
 	struct device *dev = msm_obj->base.dev->dev;
 
 	if (get_dma_ops(dev) && IS_ENABLED(CONFIG_ARM64)) {
-		dma_sync_sg_for_device(dev, msm_obj->sgt->sgl,
-			msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
+		dma_sync_sgtable_for_device(dev, msm_obj->sgt,
+					    DMA_BIDIRECTIONAL);
 	} else {
-		dma_map_sg(dev, msm_obj->sgt->sgl,
-			msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
+		dma_map_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);
 	}
 }
 
@@ -66,11 +65,9 @@  static void sync_for_cpu(struct msm_gem_object *msm_obj)
 	struct device *dev = msm_obj->base.dev->dev;
 
 	if (get_dma_ops(dev) && IS_ENABLED(CONFIG_ARM64)) {
-		dma_sync_sg_for_cpu(dev, msm_obj->sgt->sgl,
-			msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
+		dma_sync_sgtable_for_cpu(dev, msm_obj->sgt, DMA_BIDIRECTIONAL);
 	} else {
-		dma_unmap_sg(dev, msm_obj->sgt->sgl,
-			msm_obj->sgt->nents, DMA_BIDIRECTIONAL);
+		dma_unmap_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);
 	}
 }
 
diff --git a/drivers/gpu/drm/msm/msm_gpummu.c b/drivers/gpu/drm/msm/msm_gpummu.c
index 310a31b05faa..319f06c28235 100644
--- a/drivers/gpu/drm/msm/msm_gpummu.c
+++ b/drivers/gpu/drm/msm/msm_gpummu.c
@@ -30,21 +30,19 @@  static int msm_gpummu_map(struct msm_mmu *mmu, uint64_t iova,
 {
 	struct msm_gpummu *gpummu = to_msm_gpummu(mmu);
 	unsigned idx = (iova - GPUMMU_VA_START) / GPUMMU_PAGE_SIZE;
-	struct scatterlist *sg;
+	struct sg_dma_page_iter dma_iter;
 	unsigned prot_bits = 0;
-	unsigned i, j;
 
 	if (prot & IOMMU_WRITE)
 		prot_bits |= 1;
 	if (prot & IOMMU_READ)
 		prot_bits |= 2;
 
-	for_each_sg(sgt->sgl, sg, sgt->nents, i) {
-		dma_addr_t addr = sg->dma_address;
-		for (j = 0; j < sg->length / GPUMMU_PAGE_SIZE; j++, idx++) {
-			gpummu->table[idx] = addr | prot_bits;
-			addr += GPUMMU_PAGE_SIZE;
-		}
+	for_each_sgtable_dma_page(sgt, &dma_iter, 0) {
+		dma_addr_t addr = sg_page_iter_dma_address(&dma_iter);
+
+		BUILD_BUG_ON(GPUMMU_PAGE_SIZE != PAGE_SIZE);
+		gpummu->table[idx++] = addr | prot_bits;
 	}
 
 	/* we can improve by deferring flush for multiple map() */
diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c
index 3a381a9674c9..6c31e65834c6 100644
--- a/drivers/gpu/drm/msm/msm_iommu.c
+++ b/drivers/gpu/drm/msm/msm_iommu.c
@@ -36,7 +36,7 @@  static int msm_iommu_map(struct msm_mmu *mmu, uint64_t iova,
 	struct msm_iommu *iommu = to_msm_iommu(mmu);
 	size_t ret;
 
-	ret = iommu_map_sg(iommu->domain, iova, sgt->sgl, sgt->nents, prot);
+	ret = iommu_map_sgtable(iommu->domain, iova, sgt, prot);
 	WARN_ON(!ret);
 
 	return (ret == len) ? 0 : -EINVAL;