Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp2084290ybp; Thu, 10 Oct 2019 01:55:07 -0700 (PDT) X-Google-Smtp-Source: APXvYqzyC/K9KWSFFZsfRJU5VvxW/u3zeuMVUTFLGPoX3yh+bR0K98AO4XWJDLL/ujBtti0JSSIh X-Received: by 2002:a05:6402:b16:: with SMTP id bm22mr7110395edb.160.1570697707264; Thu, 10 Oct 2019 01:55:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570697707; cv=none; d=google.com; s=arc-20160816; b=yG/4/OGUqCAG6sOoLEhWI+jjM5vtFGfnmuUb8IyeV0EGpS04Vo1nU3W2vF0EUzQ1sS WhxHcRMGv8vtcXbzi95jSkUk87Oa3GOvVW0mTCS+iIvulliXGnEC80X6smk4KWZbD1Q5 2qyfhHAv86nBctit4eqLg+cmXqaI6Cl6fdmfRRQv1sALuEhKaIlF954m9GoS1W7JzUeY 38oRwB9GmNj7pWaOOXAja76rKYgp9d0H+kBv9F+6gFOHOzfcqxraJeeCZwf7pGE8qgAS yItxGK9CH+ydhmt5bvSmY2L+e0lrSpp0upWQBbgvCEYV9SXE6DxdmTZjqAdij5ItRN9S eGbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=RWpp8vLcamnywocOVllRcrTW3es3peaugwYtkN4irZk=; b=Veh4j4tuOVmM3uWMWYNjZA5ryw8wDhI8uGfHZkCy0BVizhJmK0dOc1qPuz3Yan/spp DoFbuTsH8jLptC3W8qVwuzK7TMxfCwmTMFFmf7KEydK6/neFIVFKG425SkEXGsDY02ve Cj6eov5IlEwV5GpZlq3GamDVtPd+1dGx4/Svu/drLJ4arGZjItOETLp531uHgmqMVTa7 lq+yo8nzrBJ2sOnyYaJeQRn04nyWB7znN5X2I+lN241urw0t/czE9AqI2IgpKizLeNH6 ZLftPg7IvMjoz6wb2RkjsNqSMx8t29+oUw0xeMByR/R1X1iyLSzHKu/zday+QI5NJrqU Y3Gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Fquxh5aN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l18si2678677ejg.248.2019.10.10.01.54.43; Thu, 10 Oct 2019 01:55:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Fquxh5aN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390290AbfJJIwh (ORCPT + 99 others); Thu, 10 Oct 2019 04:52:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:60480 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389972AbfJJIwf (ORCPT ); Thu, 10 Oct 2019 04:52:35 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9CF6021D56; Thu, 10 Oct 2019 08:52:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570697553; bh=9Mgja6JsCu6bg1X38vpFg/o8YQLDgD7d4hwCN/gzp+g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fquxh5aNeZPuqLUKXOioNeCtfs9xHlvavnH1nDF/NCAL1HjMPMiWR9P0ENbSh19DM CKSTp5pEF/sMko2oWICURK22IZtrfSmQIILu44joxjMUwXeAjgZQoHzA5E6mJl4GiI Ktnz5TqK+BTi0CrcjLVHzQTVRk+MervTRdr3MhXw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Russell King , Adrian Hunter , Ulf Hansson Subject: [PATCH 4.14 23/61] mmc: sdhci-of-esdhc: set DMA snooping based on DMA coherence Date: Thu, 10 Oct 2019 10:36:48 +0200 Message-Id: <20191010083503.250941866@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191010083449.500442342@linuxfoundation.org> References: <20191010083449.500442342@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Russell King commit 121bd08b029e03404c451bb237729cdff76eafed upstream. We must not unconditionally set the DMA snoop bit; if the DMA API is assuming that the device is not DMA coherent, and the device snoops the CPU caches, the device can see stale cache lines brought in by speculative prefetch. This leads to the device seeing stale data, potentially resulting in corrupted data transfers. Commonly, this results in a descriptor fetch error such as: mmc0: ADMA error mmc0: sdhci: ============ SDHCI REGISTER DUMP =========== mmc0: sdhci: Sys addr: 0x00000000 | Version: 0x00002202 mmc0: sdhci: Blk size: 0x00000008 | Blk cnt: 0x00000001 mmc0: sdhci: Argument: 0x00000000 | Trn mode: 0x00000013 mmc0: sdhci: Present: 0x01f50008 | Host ctl: 0x00000038 mmc0: sdhci: Power: 0x00000003 | Blk gap: 0x00000000 mmc0: sdhci: Wake-up: 0x00000000 | Clock: 0x000040d8 mmc0: sdhci: Timeout: 0x00000003 | Int stat: 0x00000001 mmc0: sdhci: Int enab: 0x037f108f | Sig enab: 0x037f108b mmc0: sdhci: ACmd stat: 0x00000000 | Slot int: 0x00002202 mmc0: sdhci: Caps: 0x35fa0000 | Caps_1: 0x0000af00 mmc0: sdhci: Cmd: 0x0000333a | Max curr: 0x00000000 mmc0: sdhci: Resp[0]: 0x00000920 | Resp[1]: 0x001d8a33 mmc0: sdhci: Resp[2]: 0x325b5900 | Resp[3]: 0x3f400e00 mmc0: sdhci: Host ctl2: 0x00000000 mmc0: sdhci: ADMA Err: 0x00000009 | ADMA Ptr: 0x000000236d43820c mmc0: sdhci: ============================================ mmc0: error -5 whilst initialising SD card but can lead to other errors, and potentially direct the SDHCI controller to read/write data to other memory locations (e.g. if a valid descriptor is visible to the device in a stale cache line.) Fix this by ensuring that the DMA snoop bit corresponds with the behaviour of the DMA API. Since the driver currently only supports DT, use of_dma_is_coherent(). Note that device_get_dma_attr() can not be used as that risks re-introducing this bug if/when the driver is converted to ACPI. Signed-off-by: Russell King Acked-by: Adrian Hunter Cc: stable@vger.kernel.org Signed-off-by: Ulf Hansson Signed-off-by: Greg Kroah-Hartman --- drivers/mmc/host/sdhci-of-esdhc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c @@ -435,7 +435,12 @@ static int esdhc_of_enable_dma(struct sd dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40)); value = sdhci_readl(host, ESDHC_DMA_SYSCTL); - value |= ESDHC_DMA_SNOOP; + + if (of_dma_is_coherent(dev->of_node)) + value |= ESDHC_DMA_SNOOP; + else + value &= ~ESDHC_DMA_SNOOP; + sdhci_writel(host, value, ESDHC_DMA_SYSCTL); return 0; }