Received: by 10.192.165.148 with SMTP id m20csp1782507imm; Thu, 3 May 2018 05:27:19 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrdsKF2CwHOn4abShY3EalCSnXZh1vOoQwN259KpYErIjPj76gT5PeIKR4rDOrMeRQJnICY X-Received: by 2002:a17:902:20cb:: with SMTP id v11-v6mr23307989plg.82.1525350439566; Thu, 03 May 2018 05:27:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525350439; cv=none; d=google.com; s=arc-20160816; b=a8NYXDAdmhkXqjuzQpZYODoHfVRROyQhApkPoQ7JAxD3l3tFJsnf5PCwwBrAoFhdRd XTZCw4T+C7E0jgpZR47giao6DMq2AqeV+wyYeilNX+yhsJ18hVeMg0PMclFYV8c7NS/s NZ5pImm+OFJ3n9j8xs/IKJeCIoy3v7rsOMp+tSUR6slBPwJE8XsiyAPtjuDT7ngiLOy4 WKFwJ0mp19yO0k4wbH7INF6fFqeVdrPlMSVxwhJPCRdJxvcp6CcBMftqIwSz0ahvqS7l R6nmPNk/gUeEF29EmtHmJt6Uv3cecTkexxdtNMV1a2pfkcd3qGe8WmNigTtkQnfmWrIT /ggw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature :arc-authentication-results; bh=tGpg5MPml6VNIu9eJujeKLuB4iS3XUtsSz9e/HhO4Os=; b=uvlJzAbNEGwnzDr2BG11RVn+AQ5lYWRmADBpvmVtnECTayBKfozA33Jc+stFNLi2ES iMfRcYjcKNDbHmvD9nn11S2DO+3P/EDjRip9xdeL11gNx2Xqu2OrQ0hQxCz6+2sF9aaB zoxJtjM8SFA1tlR6xmEcrkV1mhbA7V9hiBzDE9Wsbp/u07pN4vGG42jJ7G/KGYPq1jo1 EgVetWMFpFA2Q/IChDwDZry1fyC91iTa/9zYZI5UJTS5LCFNK2prEZna+1BV4iCLaM7G TT3Jb7GJuk/x5pvBZIjEz/kiZrmUTMcSpt7PgG3mdFNBAaHlgDmnvLy7NYCj2KtiBuf0 AS9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=TJ8PQcbf; dkim=pass header.i=@codeaurora.org header.s=default header.b=lmwZz6cg; 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 s23-v6si6711289plr.458.2018.05.03.05.27.05; Thu, 03 May 2018 05:27:19 -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=@codeaurora.org header.s=default header.b=TJ8PQcbf; dkim=pass header.i=@codeaurora.org header.s=default header.b=lmwZz6cg; 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 S1752253AbeECMYy (ORCPT + 99 others); Thu, 3 May 2018 08:24:54 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:41748 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751145AbeECMVR (ORCPT ); Thu, 3 May 2018 08:21:17 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 6F0CF60AF9; Thu, 3 May 2018 12:21:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1525350077; bh=g7VTAVTKHrvFt33Na0dCEByRdv9tGU7oucyNXSTALpM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TJ8PQcbfGmsaZed9QnbKYf3I+0Rz1XJXNsnPsI1nUMbtaLVmlLWtswz3aaKyGzSQV +KPp33qYgzzgY84sEz2vLgEEmCJV+cE4NlPZAtJFEN5i4ZwNtJq/55xzry5q56JCuB 2hO677mxaHbHlSA/uXu3GpjpWzlY1O67VV19Y4g8= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from absahu-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: absahu@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 6E32D60807; Thu, 3 May 2018 12:21:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1525350076; bh=g7VTAVTKHrvFt33Na0dCEByRdv9tGU7oucyNXSTALpM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lmwZz6cgqzCv4wz7rhzoWTivQL6nGBL67zlTFtDDOg4SE55R5MZmjbpkP3VKZtJ9G vIXI/bjJRk7zwACBPPhBP8iUQjDVHrkDeTWxUVAPlG5wDrFQHR0dHYtm9xtFv4VYu+ 8eKNO8katq/uiuv9TRm4u1P2biNiPhw3F5yxxNMo= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 6E32D60807 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=absahu@codeaurora.org From: Abhishek Sahu To: Boris Brezillon Cc: David Woodhouse , Brian Norris , Marek Vasut , Richard Weinberger , Miquel Raynal , linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, Andy Gross , Archit Taneja , Abhishek Sahu Subject: [PATCH v2 05/14] mtd: rawnand: qcom: wait for desc completion in all BAM channels Date: Thu, 3 May 2018 17:50:32 +0530 Message-Id: <1525350041-22995-6-git-send-email-absahu@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1525350041-22995-1-git-send-email-absahu@codeaurora.org> References: <1525350041-22995-1-git-send-email-absahu@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The BAM has 3 channels - tx, rx and command. command channel is used for register read/writes, tx channel for data writes and rx channel for data reads. Currently, the driver assumes the transfer completion once it gets all the command descriptor completed. Sometimes, there is race condition in data channel (tx/rx) and command channel completion and in these cases, the data in buffer is not valid during the small window between command descriptor completion and data descriptor completion. Now, the changes have been made to assign the callback for channel's final descriptor. The DMA will generate the callback when all the descriptors have completed in that channel. The NAND transfer will be completed only when all required DMA channels have generated the completion callback. Signed-off-by: Abhishek Sahu --- * Changes from v1: NONE 1. Removed the custom logic and used the helper fuction. drivers/mtd/nand/raw/qcom_nandc.c | 55 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c index a8d71ce..3d1ff54 100644 --- a/drivers/mtd/nand/raw/qcom_nandc.c +++ b/drivers/mtd/nand/raw/qcom_nandc.c @@ -213,6 +213,8 @@ #define QPIC_PER_CW_CMD_SGL 32 #define QPIC_PER_CW_DATA_SGL 8 +#define QPIC_NAND_COMPLETION_TIMEOUT msecs_to_jiffies(2000) + /* * Flags used in DMA descriptor preparation helper functions * (i.e. read_reg_dma/write_reg_dma/read_data_dma/write_data_dma) @@ -245,6 +247,11 @@ * @tx_sgl_start - start index in data sgl for tx. * @rx_sgl_pos - current index in data sgl for rx. * @rx_sgl_start - start index in data sgl for rx. + * @first_chan_done - if current transfer already has got first channel + * DMA desc completion. + * @txn_done - completion for nand transfer. + * @last_data_desc - last DMA desc in data channel (tx/rx). + * @last_cmd_desc - last DMA desc in command channel. */ struct bam_transaction { struct bam_cmd_element *bam_ce; @@ -258,6 +265,10 @@ struct bam_transaction { u32 tx_sgl_start; u32 rx_sgl_pos; u32 rx_sgl_start; + bool first_chan_done; + struct completion txn_done; + struct dma_async_tx_descriptor *last_data_desc; + struct dma_async_tx_descriptor *last_cmd_desc; }; /* @@ -504,6 +515,8 @@ static void free_bam_transaction(struct qcom_nand_controller *nandc) bam_txn->data_sgl = bam_txn_buf; + init_completion(&bam_txn->txn_done); + return bam_txn; } @@ -523,11 +536,36 @@ static void clear_bam_transaction(struct qcom_nand_controller *nandc) bam_txn->tx_sgl_start = 0; bam_txn->rx_sgl_pos = 0; bam_txn->rx_sgl_start = 0; + bam_txn->last_data_desc = NULL; + bam_txn->first_chan_done = false; sg_init_table(bam_txn->cmd_sgl, nandc->max_cwperpage * QPIC_PER_CW_CMD_SGL); sg_init_table(bam_txn->data_sgl, nandc->max_cwperpage * QPIC_PER_CW_DATA_SGL); + + reinit_completion(&bam_txn->txn_done); +} + +/* Callback for DMA descriptor completion */ +static void qpic_bam_dma_done(void *data) +{ + struct bam_transaction *bam_txn = data; + + /* + * In case of data transfer with NAND, 2 callbacks will be generated. + * One for command channel and another one for data channel. + * If current transaction has data descriptors then check if its + * already got one DMA channel completion callback. In this case + * make the NAND transfer complete otherwise mark first_chan_done true + * and wait for next channel DMA completion callback. + */ + if (bam_txn->last_data_desc && !bam_txn->first_chan_done) { + bam_txn->first_chan_done = true; + return; + } + + complete(&bam_txn->txn_done); } static inline struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip) @@ -756,6 +794,12 @@ static int prepare_bam_async_desc(struct qcom_nand_controller *nandc, desc->dma_desc = dma_desc; + /* update last data/command descriptor */ + if (chan == nandc->cmd_chan) + bam_txn->last_cmd_desc = dma_desc; + else + bam_txn->last_data_desc = dma_desc; + list_add_tail(&desc->node, &nandc->desc_list); return 0; @@ -1273,10 +1317,19 @@ static int submit_descs(struct qcom_nand_controller *nandc) cookie = dmaengine_submit(desc->dma_desc); if (nandc->props->is_bam) { + bam_txn->last_cmd_desc->callback = qpic_bam_dma_done; + bam_txn->last_cmd_desc->callback_param = bam_txn; + if (bam_txn->last_data_desc) { + bam_txn->last_data_desc->callback = qpic_bam_dma_done; + bam_txn->last_data_desc->callback_param = bam_txn; + } + dma_async_issue_pending(nandc->tx_chan); dma_async_issue_pending(nandc->rx_chan); + dma_async_issue_pending(nandc->cmd_chan); - if (dma_sync_wait(nandc->cmd_chan, cookie) != DMA_COMPLETE) + if (!wait_for_completion_timeout(&bam_txn->txn_done, + QPIC_NAND_COMPLETION_TIMEOUT)) return -ETIMEDOUT; } else { if (dma_sync_wait(nandc->chan, cookie) != DMA_COMPLETE) -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation