Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp302115imm; Wed, 11 Jul 2018 02:43:54 -0700 (PDT) X-Google-Smtp-Source: AAOMgpd1h0y6uw86KZTg3p3yxWrgA8BW8phgJPHNlC76WIThwZucQOjq5nkRPqswbSV9JegXxfoM X-Received: by 2002:a62:c0a:: with SMTP id u10-v6mr29099444pfi.43.1531302234773; Wed, 11 Jul 2018 02:43:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531302234; cv=none; d=google.com; s=arc-20160816; b=txbUFNAjV98MXf5nShkWZIWBkaC+j4sUp8Z7ZVHZIFfz3+hCuUkHWVcaw5s8vHYvNY YzcfiFuicGXoCa3eMnzQwfr3tEHRDr3R8oLJGkqj+4WGF77LaQu46Br3JUauRndiTQyg DA0d8eGEPsc+PdvPrDo1qgE5GwAzM27GhP4/H8Rr/AZ+Hdhf5S3xaT5DKz85xSV8oaDP 7FgQS3oqG17+tGtq30EA8RAPaSDP6A9k0ZTcrwDhBcXpHAj4NQa1Tvphobf4Fh6a3vGO 5cC5iCiXukRTLF4ov3sEiXT5VllE3e1xM0V8pY5lumLaYRItBu8fWpguqFSJHW4jZ6X+ ATwA== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=s+9E6KC1tNvr6cBwmquRJ/TCctu4oBwh24DjW1jIjQM=; b=esiK2GlXDKCkNs2UgpYh5DulKI7JY/WbHpOABSqBBFBBlefepSTdsPWRxCqrJ7s1Eb JA1ziHAhdYGCAae3EgTmgNWf1C39XTgntBh+PGOd3VuuQnef7FmWXyRbQrtPbKzth4BU e+vlbjTLbESj0v0QCYOrn9thYCOofUpIz/CN6UjpA1bisQJPhEPNKc1N2WnVl/ophmyq FTy9ANEt2lAAo9L7oG76EMagdXXnll4w4O0YaGgh7TuKG9IkpWm2VDKk2nyJUMarLFFu ajGVEQ4w3YLzwALyzq9jQV+asgfaej5bepEvDt8bupmbtHM54bOoYm91ysbDxBOJFzmW fg0g== ARC-Authentication-Results: i=1; mx.google.com; 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 z33-v6si18598723plb.380.2018.07.11.02.43.39; Wed, 11 Jul 2018 02:43:54 -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; 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 S1732758AbeGKJpB (ORCPT + 99 others); Wed, 11 Jul 2018 05:45:01 -0400 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:44784 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732376AbeGKJpB (ORCPT ); Wed, 11 Jul 2018 05:45:01 -0400 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx08-.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id w6B9dD8d018059; Wed, 11 Jul 2018 11:41:09 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-00178001.pphosted.com with ESMTP id 2k5eu1g6u2-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 11 Jul 2018 11:41:08 +0200 Received: from zeta.dmz-eu.st.com (zeta.dmz-eu.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 5C70138; Wed, 11 Jul 2018 09:41:08 +0000 (GMT) Received: from Webmail-eu.st.com (sfhdag6node1.st.com [10.75.127.16]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 3A2972635; Wed, 11 Jul 2018 09:41:08 +0000 (GMT) Received: from [10.48.0.237] (10.75.127.47) by SFHDAG6NODE1.st.com (10.75.127.16) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Wed, 11 Jul 2018 11:41:06 +0200 Subject: Re: [PATCH 01/19] mmc: mmci: regroup and define dma operations To: Ulf Hansson CC: Rob Herring , Maxime Coquelin , Alexandre Torgue , Gerald Baeza , Linux ARM , Linux Kernel Mailing List , , "linux-mmc@vger.kernel.org" References: <1528809280-31116-1-git-send-email-ludovic.Barre@st.com> <1528809280-31116-2-git-send-email-ludovic.Barre@st.com> From: Ludovic BARRE Message-ID: Date: Wed, 11 Jul 2018 11:41:06 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.75.127.47] X-ClientProxiedBy: SFHDAG3NODE3.st.com (10.75.127.9) To SFHDAG6NODE1.st.com (10.75.127.16) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-07-11_01:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/05/2018 05:17 PM, Ulf Hansson wrote: > On 12 June 2018 at 15:14, Ludovic Barre wrote: >> From: Ludovic Barre >> >> Prepare mmci driver to manage dma interface by new property. >> This patch defines and regroups dma operations for mmci drivers. >> mmci_dma_XX prototypes are added to call member of mmci_dma_ops >> if not null. Based on legacy need, a mmci dma interface has been >> defined with: >> -mmci_dma_setup >> -mmci_dma_release >> -mmci_dma_pre_req >> -mmci_dma_start >> -mmci_dma_finalize >> -mmci_dma_post_req >> -mmci_dma_error >> -mmci_dma_get_next_data > > As I suggested for one of the other patches, I would rather turn core > mmci functions into library functions, which can be either invoked > from variant callbacks or assigned directly to them. > > In other words, I would leave the functions that you move in this > patch to stay in mmci.c. Although some needs to be re-factored and we > also needs to make some of them available to be called from another > file, hence the functions needs to be shared via mmci.h rather than > being declared static. In previous exchange mail "STM32MP1 SDMMC driver review" we are said: >>> -dma variant à should fit in Qualcomm implementation, reuse (rename) >>> mmci_qcom_dml.c file and integrate ST dma in. >> >> stm32 sdmmc has an internal dma, no need to use dmaengine API; >> So some modifications in mmci (pre/post request, mmci_dma_xx). perhaps >> should be done with an ops or not. > >Yes. > >The Qualcomm variant is also using an internal DMA, hence I thought >there may be something we could re-use, or at least have some new >common ops for. It's not crystal clear for me. Do you always agree with a dma ops which allow to address different DMA transfer: -with dmaengine API -sdmmc idma, without dmaengine API -... > > Let me take a concrete example on how I would move forward, hopefully > that explains it a bit better. Please see below. > > [...] > >> -/* >> - * All the DMA operation mode stuff goes inside this ifdef. >> - * This assumes that you have a generic DMA device interface, >> - * no custom DMA interfaces are supported. >> - */ >> -#ifdef CONFIG_DMA_ENGINE >> -static void mmci_dma_setup(struct mmci_host *host) >> -{ >> - const char *rxname, *txname; >> - struct variant_data *variant = host->variant; >> - >> - host->dma_rx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "rx"); >> - host->dma_tx_channel = dma_request_slave_channel(mmc_dev(host->mmc), "tx"); >> - >> - /* initialize pre request cookie */ >> - host->next_data.cookie = 1; >> - >> - /* >> - * If only an RX channel is specified, the driver will >> - * attempt to use it bidirectionally, however if it is >> - * is specified but cannot be located, DMA will be disabled. >> - */ >> - if (host->dma_rx_channel && !host->dma_tx_channel) >> - host->dma_tx_channel = host->dma_rx_channel; >> - >> - if (host->dma_rx_channel) >> - rxname = dma_chan_name(host->dma_rx_channel); >> - else >> - rxname = "none"; >> - >> - if (host->dma_tx_channel) >> - txname = dma_chan_name(host->dma_tx_channel); >> - else >> - txname = "none"; >> - >> - dev_info(mmc_dev(host->mmc), "DMA channels RX %s, TX %s\n", >> - rxname, txname); >> - >> - /* >> - * Limit the maximum segment size in any SG entry according to >> - * the parameters of the DMA engine device. >> - */ >> - if (host->dma_tx_channel) { >> - struct device *dev = host->dma_tx_channel->device->dev; >> - unsigned int max_seg_size = dma_get_max_seg_size(dev); >> - >> - if (max_seg_size < host->mmc->max_seg_size) >> - host->mmc->max_seg_size = max_seg_size; >> - } >> - if (host->dma_rx_channel) { >> - struct device *dev = host->dma_rx_channel->device->dev; >> - unsigned int max_seg_size = dma_get_max_seg_size(dev); >> - >> - if (max_seg_size < host->mmc->max_seg_size) >> - host->mmc->max_seg_size = max_seg_size; >> - } > > Everything above shall be left as generic library function, > mmci_dma_setup() and I would share it via mmci.h and thus change it > from being static. > each interfaces mmci_dma_XXX have very different needs depending dma_ops (legacy, sdmmc idma) >> - >> - if (variant->qcom_dml && host->dma_rx_channel && host->dma_tx_channel) >> - if (dml_hw_init(host, host->mmc->parent->of_node)) >> - variant->qcom_dml = false; > > This piece of code, should be made specific to the qcom variant and > managed though a "mmci_host_ops" callback. The corresponding code in > that callback would then start by invoking mmci_dma_setup(), before it > continues with the qcom specific operations. > > For legacy variants, the corresponding callback would be set directly > to mmci_dma_setup() and called through the callback from mmci.c when > needed. There is no need to have a separate file for DMA for the > legacy variants, I think. > > [...] > > Kind regards > Uffe >