#include <linux/mmc/sdio.h>
 #include <linux/scatterlist.h>
 #include <linux/spinlock.h>
+#include <linux/swiotlb.h>
 #include <linux/workqueue.h>
 
 #include "tmio_mmc.h"
        mmc->max_blk_count = pdata->max_blk_count ? :
                (PAGE_SIZE / mmc->max_blk_size) * mmc->max_segs;
        mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
+       /*
+        * Since swiotlb has memory size limitation, this will calculate
+        * the maximum size locally (because we don't have any APIs for it now)
+        * and check the current max_req_size. And then, this will update
+        * the max_req_size if needed as a workaround.
+        */
+       if (swiotlb_max_segment()) {
+               unsigned int max_size = (1 << IO_TLB_SHIFT) * IO_TLB_SEGSIZE;
+
+               if (mmc->max_req_size > max_size)
+                       mmc->max_req_size = max_size;
+       }
        mmc->max_seg_size = mmc->max_req_size;
 
        _host->native_hotplug = !(pdata->flags & TMIO_MMC_USE_GPIO_CD ||