public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Neil Armstrong <narmstrong@baylibre.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH 5.10 009/101] mmc: meson-gx: use memcpy_to/fromio for dram-access-quirk
Date: Mon, 28 Jun 2021 10:24:35 -0400	[thread overview]
Message-ID: <20210628142607.32218-10-sashal@kernel.org> (raw)
In-Reply-To: <20210628142607.32218-1-sashal@kernel.org>

From: Neil Armstrong <narmstrong@baylibre.com>

commit 103a5348c22c3fca8b96c735a9e353b8a0801842 upstream.

It has been reported that usage of memcpy() to/from an iomem mapping is invalid,
and a recent arm64 memcpy update [1] triggers a memory abort when dram-access-quirk
is used on the G12A/G12B platforms.

This adds a local sg_copy_to_buffer which makes usage of io versions of memcpy
when dram-access-quirk is enabled.

[1] 285133040e6c ("arm64: Import latest memcpy()/memmove() implementation")

Fixes: acdc8e71d9bb ("mmc: meson-gx: add dram-access-quirk")
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Suggested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20210609150230.9291-1-narmstrong@baylibre.com
Cc: stable@vger.kernel.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/mmc/host/meson-gx-mmc.c | 50 +++++++++++++++++++++++++++++----
 1 file changed, 45 insertions(+), 5 deletions(-)

diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c
index 4ec41579940a..d3f40c9a8c6c 100644
--- a/drivers/mmc/host/meson-gx-mmc.c
+++ b/drivers/mmc/host/meson-gx-mmc.c
@@ -165,6 +165,7 @@ struct meson_host {
 
 	unsigned int bounce_buf_size;
 	void *bounce_buf;
+	void __iomem *bounce_iomem_buf;
 	dma_addr_t bounce_dma_addr;
 	struct sd_emmc_desc *descs;
 	dma_addr_t descs_dma_addr;
@@ -734,6 +735,47 @@ static void meson_mmc_desc_chain_transfer(struct mmc_host *mmc, u32 cmd_cfg)
 	writel(start, host->regs + SD_EMMC_START);
 }
 
+/* local sg copy to buffer version with _to/fromio usage for dram_access_quirk */
+static void meson_mmc_copy_buffer(struct meson_host *host, struct mmc_data *data,
+				  size_t buflen, bool to_buffer)
+{
+	unsigned int sg_flags = SG_MITER_ATOMIC;
+	struct scatterlist *sgl = data->sg;
+	unsigned int nents = data->sg_len;
+	struct sg_mapping_iter miter;
+	unsigned int offset = 0;
+
+	if (to_buffer)
+		sg_flags |= SG_MITER_FROM_SG;
+	else
+		sg_flags |= SG_MITER_TO_SG;
+
+	sg_miter_start(&miter, sgl, nents, sg_flags);
+
+	while ((offset < buflen) && sg_miter_next(&miter)) {
+		unsigned int len;
+
+		len = min(miter.length, buflen - offset);
+
+		/* When dram_access_quirk, the bounce buffer is a iomem mapping */
+		if (host->dram_access_quirk) {
+			if (to_buffer)
+				memcpy_toio(host->bounce_iomem_buf + offset, miter.addr, len);
+			else
+				memcpy_fromio(miter.addr, host->bounce_iomem_buf + offset, len);
+		} else {
+			if (to_buffer)
+				memcpy(host->bounce_buf + offset, miter.addr, len);
+			else
+				memcpy(miter.addr, host->bounce_buf + offset, len);
+		}
+
+		offset += len;
+	}
+
+	sg_miter_stop(&miter);
+}
+
 static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
 {
 	struct meson_host *host = mmc_priv(mmc);
@@ -777,8 +819,7 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd)
 		if (data->flags & MMC_DATA_WRITE) {
 			cmd_cfg |= CMD_CFG_DATA_WR;
 			WARN_ON(xfer_bytes > host->bounce_buf_size);
-			sg_copy_to_buffer(data->sg, data->sg_len,
-					  host->bounce_buf, xfer_bytes);
+			meson_mmc_copy_buffer(host, data, xfer_bytes, true);
 			dma_wmb();
 		}
 
@@ -947,8 +988,7 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
 	if (meson_mmc_bounce_buf_read(data)) {
 		xfer_bytes = data->blksz * data->blocks;
 		WARN_ON(xfer_bytes > host->bounce_buf_size);
-		sg_copy_from_buffer(data->sg, data->sg_len,
-				    host->bounce_buf, xfer_bytes);
+		meson_mmc_copy_buffer(host, data, xfer_bytes, false);
 	}
 
 	next_cmd = meson_mmc_get_next_command(cmd);
@@ -1168,7 +1208,7 @@ static int meson_mmc_probe(struct platform_device *pdev)
 		 * instead of the DDR memory
 		 */
 		host->bounce_buf_size = SD_EMMC_SRAM_DATA_BUF_LEN;
-		host->bounce_buf = host->regs + SD_EMMC_SRAM_DATA_BUF_OFF;
+		host->bounce_iomem_buf = host->regs + SD_EMMC_SRAM_DATA_BUF_OFF;
 		host->bounce_dma_addr = res->start + SD_EMMC_SRAM_DATA_BUF_OFF;
 	} else {
 		/* data bounce buffer */
-- 
2.30.2


  parent reply	other threads:[~2021-06-28 14:28 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-28 14:24 [PATCH 5.10 000/101] 5.10.47-rc1 review Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 001/101] module: limit enabling module.sig_enforce Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 002/101] Revert "drm/amdgpu/gfx9: fix the doorbell missing when in CGPG issue." Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 003/101] Revert "drm/amdgpu/gfx10: enlarge CP_MEC_DOORBELL_RANGE_UPPER to cover full doorbell." Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 004/101] drm: add a locked version of drm_is_current_master Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 005/101] drm/nouveau: wait for moving fence after pinning v2 Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 006/101] drm/radeon: wait for moving fence after pinning Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 007/101] drm/amdgpu: " Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 008/101] ARM: 9081/1: fix gcc-10 thumb2-kernel regression Sasha Levin
2021-06-28 14:24 ` Sasha Levin [this message]
2021-06-28 14:24 ` [PATCH 5.10 010/101] MIPS: generic: Update node names to avoid unit addresses Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 011/101] arm64: Ignore any DMA offsets in the max_zone_phys() calculation Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 012/101] arm64: Force NO_BLOCK_MAPPINGS if crashkernel reservation is required Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 013/101] spi: spi-nxp-fspi: move the register operation after the clock enable Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 014/101] Revert "PCI: PM: Do not read power state in pci_enable_device_flags()" Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 015/101] drm/vc4: hdmi: Move the HSM clock enable to runtime_pm Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 016/101] drm/vc4: hdmi: Make sure the controller is powered in detect Sasha Levin
2021-07-01 10:15   ` Pavel Machek
2021-06-28 14:24 ` [PATCH 5.10 017/101] x86/entry: Fix noinstr fail in __do_fast_syscall_32() Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 018/101] x86/xen: Fix noinstr fail in exc_xen_unknown_trap() Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 019/101] locking/lockdep: Improve noinstr vs errors Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 020/101] perf/x86/lbr: Remove cpuc->lbr_xsave allocation from atomic context Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 021/101] perf/x86/intel/lbr: Zero the xstate buffer on allocation Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 022/101] dmaengine: zynqmp_dma: Fix PM reference leak in zynqmp_dma_alloc_chan_resourc() Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 023/101] dmaengine: stm32-mdma: fix PM reference leak in stm32_mdma_alloc_chan_resourc() Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 024/101] dmaengine: xilinx: dpdma: Add missing dependencies to Kconfig Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 025/101] dmaengine: xilinx: dpdma: Limit descriptor IDs to 16 bits Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 026/101] mac80211: remove warning in ieee80211_get_sband() Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 027/101] mac80211_hwsim: drop pending frames on stop Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 028/101] cfg80211: call cfg80211_leave_ocb when switching away from OCB Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 029/101] dmaengine: rcar-dmac: Fix PM reference leak in rcar_dmac_probe() Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 030/101] dmaengine: mediatek: free the proper desc in desc_free handler Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 031/101] dmaengine: mediatek: do not issue a new desc if one is still current Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 032/101] dmaengine: mediatek: use GFP_NOWAIT instead of GFP_ATOMIC in prep_dma Sasha Levin
2021-06-28 14:24 ` [PATCH 5.10 033/101] net: ipv4: Remove unneed BUG() function Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 034/101] mac80211: drop multicast fragments Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 035/101] net: ethtool: clear heap allocations for ethtool function Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 036/101] inet: annotate data race in inet_send_prepare() and inet_dgram_connect() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 037/101] ping: Check return value of function 'ping_queue_rcv_skb' Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 038/101] net: annotate data race in sock_error() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 039/101] inet: annotate date races around sk->sk_txhash Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 040/101] net/packet: annotate data race in packet_sendmsg() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 041/101] net: phy: dp83867: perform soft reset and retain established link Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 042/101] riscv32: Use medany C model for modules Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 043/101] net: caif: fix memory leak in ldisc_open Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 044/101] net/packet: annotate accesses to po->bind Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 045/101] net/packet: annotate accesses to po->ifindex Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 046/101] r8152: Avoid memcpy() over-reading of ETH_SS_STATS Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 047/101] sh_eth: " Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 048/101] r8169: " Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 049/101] KVM: selftests: Fix kvm_check_cap() assertion Sasha Levin
2021-07-03 15:21   ` Pavel Machek
2021-07-05  7:10     ` Fuad Tabba
2021-07-05 12:00       ` Paolo Bonzini
2021-06-28 14:25 ` [PATCH 5.10 050/101] net: qed: Fix memcpy() overflow of qed_dcbx_params() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 051/101] mac80211: reset profile_periodicity/ema_ap Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 052/101] mac80211: handle various extensible elements correctly Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 053/101] recordmcount: Correct st_shndx handling Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 054/101] PCI: Add AMD RS690 quirk to enable 64-bit DMA Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 055/101] net: ll_temac: Add memory-barriers for TX BD access Sasha Levin
2021-07-03 15:22   ` Pavel Machek
2021-07-05  7:42     ` Esben Haabendal
2021-06-28 14:25 ` [PATCH 5.10 056/101] net: ll_temac: Avoid ndo_start_xmit returning NETDEV_TX_BUSY Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 057/101] perf/x86: Track pmu in per-CPU cpu_hw_events Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 058/101] pinctrl: stm32: fix the reported number of GPIO lines per bank Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 059/101] i2c: i801: Ensure that SMBHSTSTS_INUSE_STS is cleared when leaving i801_access Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 060/101] gpiolib: cdev: zero padding during conversion to gpioline_info_changed Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 061/101] scsi: sd: Call sd_revalidate_disk() for ioctl(BLKRRPART) Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 062/101] nilfs2: fix memory leak in nilfs_sysfs_delete_device_group Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 063/101] s390/stack: fix possible register corruption with stack switch helper Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 064/101] KVM: do not allow mapping valid but non-reference-counted pages Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 065/101] i2c: robotfuzz-osif: fix control-request directions Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 066/101] ceph: must hold snap_rwsem when filling inode for async create Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 067/101] kthread_worker: split code for canceling the delayed work timer Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 068/101] kthread: prevent deadlock when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 069/101] x86/fpu: Preserve supervisor states in sanitize_restored_user_xstate() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 070/101] x86/fpu: Make init_fpstate correct with optimized XSAVE Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 071/101] mm: add VM_WARN_ON_ONCE_PAGE() macro Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 072/101] mm/rmap: remove unneeded semicolon in page_not_mapped() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 073/101] mm/rmap: use page_not_mapped in try_to_unmap() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 074/101] mm, thp: use head page in __migration_entry_wait() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 075/101] mm/thp: fix __split_huge_pmd_locked() on shmem migration entry Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 076/101] mm/thp: make is_huge_zero_pmd() safe and quicker Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 077/101] mm/thp: try_to_unmap() use TTU_SYNC for safe splitting Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 078/101] mm/thp: fix vma_address() if virtual address below file offset Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 079/101] mm/thp: fix page_address_in_vma() on file THP tails Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 080/101] mm/thp: unmap_mapping_page() to fix THP truncate_cleanup_page() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 081/101] mm: thp: replace DEBUG_VM BUG with VM_WARN when unmap fails for split Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 082/101] mm: page_vma_mapped_walk(): use page for pvmw->page Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 083/101] mm: page_vma_mapped_walk(): settle PageHuge on entry Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 084/101] mm: page_vma_mapped_walk(): use pmde for *pvmw->pmd Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 085/101] mm: page_vma_mapped_walk(): prettify PVMW_MIGRATION block Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 086/101] mm: page_vma_mapped_walk(): crossing page table boundary Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 087/101] mm: page_vma_mapped_walk(): add a level of indentation Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 088/101] mm: page_vma_mapped_walk(): use goto instead of while (1) Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 089/101] mm: page_vma_mapped_walk(): get vma_address_end() earlier Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 090/101] mm/thp: fix page_vma_mapped_walk() if THP mapped by ptes Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 091/101] mm/thp: another PVMW_SYNC fix in page_vma_mapped_walk() Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 092/101] mm, futex: fix shared futex pgoff on shmem huge page Sasha Levin
2021-06-28 14:25 ` [PATCH 5.10 093/101] KVM: SVM: Call SEV Guest Decommission if ASID binding fails Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 094/101] swiotlb: manipulate orig_addr when tlb_addr has offset Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 095/101] netfs: fix test for whether we can skip read when writing beyond EOF Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 096/101] Revert "drm: add a locked version of drm_is_current_master" Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 097/101] certs: Add EFI_CERT_X509_GUID support for dbx entries Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 098/101] certs: Move load_system_certificate_list to a common function Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 099/101] certs: Add ability to preload revocation certs Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 100/101] integrity: Load mokx variables into the blacklist keyring Sasha Levin
2021-06-28 14:26 ` [PATCH 5.10 101/101] Linux 5.10.47-rc1 Sasha Levin
2021-06-28 20:49 ` [PATCH 5.10 000/101] 5.10.47-rc1 review Fox Chen
2021-06-29  7:29 ` Naresh Kamboju
2021-06-29 12:08 ` Sudip Mukherjee
2021-06-30 13:04   ` Sasha Levin
2021-06-29 18:20 ` Guenter Roeck
2021-06-30  1:01 ` Samuel Zou
2021-06-30 13:05   ` Sasha Levin
2021-07-01 11:55 ` Pavel Machek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210628142607.32218-10-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=mark.rutland@arm.com \
    --cc=narmstrong@baylibre.com \
    --cc=stable@vger.kernel.org \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox