Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp977787pxk; Mon, 31 Aug 2020 06:44:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzeQJLqrvmTFjwvDMYh67RXCW7uSlbIWnVPHUgUrPU3kQ9Ip3Rn9cqI/x6CpbnemahWWUlb X-Received: by 2002:a17:906:d187:: with SMTP id c7mr1298131ejz.196.1598881490103; Mon, 31 Aug 2020 06:44:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598881490; cv=none; d=google.com; s=arc-20160816; b=LG7OFLTl5uttwvWRj7IsFxBgJAqaMugQUuXOQI00bj1flYyxG+nZrguTMe+MzGjovJ c0gapx9t6xZE31MqWMecu9NxfdeMU4pf6F4K5YGA4AstCy0f7LcGkS02MRvDRgxXOb9f b9iWhqwlygBgIPLZli4Opq0J+5UCFBCctkQsAfTTX6DBTa3UAsYIZHfLl7b9an0Na0GH mjsLLxupWJh3dNJkzr75BWxzUakDpVZgOja0SFO2dFVKU+A+CWXwRflL/bL0NEkbfRZ8 PA3pQY5TCfLl/OxH+3nIcamCfZvaZ2MWFJk7p/PBn5GcgU9XYQ8OOw/Mu5m8EB6/N8ZZ A+8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=6xszFInDVlD4HdGf3nBNawshZ6uYGtWxag2Jfn6phu0=; b=WlwSZ9FN1SEI5zP3eGONNCblU2LWyO6WDS4NhC6+dUuk2nXhemNGaLXhbugVYwOXbw IVUqefl3xxiNx2dYFmazlC0iJI35YsXqv41+MSmLLWEeclx/zSWgLuxUjFGOL8cSy3tx RzLLZ9Puuu8BndhtKXVjtvKS3Xv4yqfu7rsdaBsNI5zPAKumLujv7Hsdxby+qP95m2RB x/YNBTde2UwFbFncsicAhruSE3lS7fkRv7vJe+sJbWWspiqxoxUAfr3ZZ9MrQP0X5bU8 JXp5mNTP0N/434kg5H5QkjKWFVr9EesGn1JGJ/NG/LwwUtHQKVwExShdbScQFBmuBaIJ 8NsA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h21si4146410edr.418.2020.08.31.06.44.27; Mon, 31 Aug 2020 06:44:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726359AbgHaNnw (ORCPT + 99 others); Mon, 31 Aug 2020 09:43:52 -0400 Received: from brightrain.aerifal.cx ([216.12.86.13]:48484 "EHLO brightrain.aerifal.cx" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726249AbgHaNnu (ORCPT ); Mon, 31 Aug 2020 09:43:50 -0400 Date: Mon, 31 Aug 2020 09:43:49 -0400 From: Rich Felker To: Ulf Hansson Cc: linux-mmc@vger.kernel.org, Christoph Hellwig , Mark Brown , linux-sh@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] mmc: mmc_spi: Don't use dma mappings unless CONFIG_HAS_DMA is set Message-ID: <20200831134348.GN3265@brightrain.aerifal.cx> References: <20200831131636.51502-1-ulf.hansson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200831131636.51502-1-ulf.hansson@linaro.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Aug 31, 2020 at 03:16:36PM +0200, Ulf Hansson wrote: > The commit cd57d07b1e4e ("sh: don't allow non-coherent DMA for NOMMU") made > CONFIG_NO_DMA to be set for some platforms, for good reasons. > Consequentially, CONFIG_HAS_DMA doesn't get set, which makes the DMA > mapping interface to be built as stub functions. > > For weird reasons this causes the mmc_spi driver to fail to ->probe(), as > it relies on the dma mappings APIs, no matter of CONFIG_HAS_DMA is set or > not. This is wrong, so let's fix this. > > Fixes: cd57d07b1e4e ("sh: don't allow non-coherent DMA for NOMMU") > Reported-by: Rich Felker > Suggested-by: Christoph Hellwig > Signed-off-by: Ulf Hansson > --- > drivers/mmc/host/mmc_spi.c | 86 +++++++++++++++++++++++--------------- > 1 file changed, 52 insertions(+), 34 deletions(-) > > diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c > index 39bb1e30c2d7..5055a7eb134a 100644 > --- a/drivers/mmc/host/mmc_spi.c > +++ b/drivers/mmc/host/mmc_spi.c > @@ -1278,6 +1278,52 @@ mmc_spi_detect_irq(int irq, void *mmc) > return IRQ_HANDLED; > } > > +#ifdef CONFIG_HAS_DMA > +static int mmc_spi_dma_alloc(struct mmc_spi_host *host) > +{ > + struct spi_device *spi = host->spi; > + struct device *dev; > + > + if (!spi->master->dev.parent->dma_mask) > + return 0; > + > + dev = spi->master->dev.parent; > + > + host->ones_dma = dma_map_single(dev, host->ones, MMC_SPI_BLOCKSIZE, > + DMA_TO_DEVICE); > + if (dma_mapping_error(dev, host->ones_dma)) > + return -ENOMEM; > + > + host->data_dma = dma_map_single(dev, host->data, sizeof(*host->data), > + DMA_BIDIRECTIONAL); > + if (dma_mapping_error(dev, host->data_dma)) { > + dma_unmap_single(dev, host->ones_dma, MMC_SPI_BLOCKSIZE, > + DMA_TO_DEVICE); > + return -ENOMEM; > + } > + > + dma_sync_single_for_cpu(dev, host->data_dma, sizeof(*host->data), > + DMA_BIDIRECTIONAL); > + > + host->dma_dev = dev; > + return 0; > +} > + > +static void mmc_spi_dma_free(struct mmc_spi_host *host) > +{ > + if (!host->dma_dev) > + return; > + > + dma_unmap_single(host->dma_dev, host->ones_dma, MMC_SPI_BLOCKSIZE, > + DMA_TO_DEVICE); > + dma_unmap_single(host->dma_dev, host->data_dma, sizeof(*host->data), > + DMA_BIDIRECTIONAL); > +} > +#else > +static inline mmc_spi_dma_alloc(struct mmc_spi_host *host) { return 0; } > +static inline void mmc_spi_dma_free(struct mmc_spi_host *host) {} > +#endif > + > static int mmc_spi_probe(struct spi_device *spi) > { > void *ones; > @@ -1374,23 +1420,9 @@ static int mmc_spi_probe(struct spi_device *spi) > if (!host->data) > goto fail_nobuf1; > > - if (spi->master->dev.parent->dma_mask) { > - struct device *dev = spi->master->dev.parent; > - > - host->dma_dev = dev; > - host->ones_dma = dma_map_single(dev, ones, > - MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); > - if (dma_mapping_error(dev, host->ones_dma)) > - goto fail_ones_dma; > - host->data_dma = dma_map_single(dev, host->data, > - sizeof(*host->data), DMA_BIDIRECTIONAL); > - if (dma_mapping_error(dev, host->data_dma)) > - goto fail_data_dma; > - > - dma_sync_single_for_cpu(host->dma_dev, > - host->data_dma, sizeof(*host->data), > - DMA_BIDIRECTIONAL); > - } > + status = mmc_spi_dma_alloc(host); > + if (status) > + goto fail_dma; > > /* setup message for status/busy readback */ > spi_message_init(&host->readback); > @@ -1458,20 +1490,12 @@ static int mmc_spi_probe(struct spi_device *spi) > fail_add_host: > mmc_remove_host(mmc); > fail_glue_init: > - if (host->dma_dev) > - dma_unmap_single(host->dma_dev, host->data_dma, > - sizeof(*host->data), DMA_BIDIRECTIONAL); > -fail_data_dma: > - if (host->dma_dev) > - dma_unmap_single(host->dma_dev, host->ones_dma, > - MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); > -fail_ones_dma: > + mmc_spi_dma_free(host); > +fail_dma: > kfree(host->data); > - > fail_nobuf1: > mmc_free_host(mmc); > mmc_spi_put_pdata(spi); > - > nomem: > kfree(ones); > return status; > @@ -1489,13 +1513,7 @@ static int mmc_spi_remove(struct spi_device *spi) > > mmc_remove_host(mmc); > > - if (host->dma_dev) { > - dma_unmap_single(host->dma_dev, host->ones_dma, > - MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); > - dma_unmap_single(host->dma_dev, host->data_dma, > - sizeof(*host->data), DMA_BIDIRECTIONAL); > - } > - > + mmc_spi_dma_free(host); > kfree(host->data); > kfree(host->ones); > > -- > 2.25.1 A change to Kconfig is also needed to remove the HAS_DMA dependency. Rich