From patchwork Fri Jul 27 09:16:56 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Liu X-Patchwork-Id: 173608 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id 71DEE2C0A99 for ; Fri, 27 Jul 2012 19:19:59 +1000 (EST) Received: from va3outboundpool.messaging.microsoft.com (va3ehsobe010.messaging.microsoft.com [216.32.180.30]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (Client CN "mail.global.frontbridge.com", Issuer "Microsoft Secure Server Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id D02102C07C5 for ; Fri, 27 Jul 2012 19:17:29 +1000 (EST) Received: from mail204-va3-R.bigfish.com (10.7.14.237) by VA3EHSOBE007.bigfish.com (10.7.40.11) with Microsoft SMTP Server id 14.1.225.23; Fri, 27 Jul 2012 09:17:27 +0000 Received: from mail204-va3 (localhost [127.0.0.1]) by mail204-va3-R.bigfish.com (Postfix) with ESMTP id CA293B80190; Fri, 27 Jul 2012 09:17:26 +0000 (UTC) X-Forefront-Antispam-Report: CIP:70.37.183.190; KIP:(null); UIP:(null); IPV:NLI; H:mail.freescale.net; RD:none; EFVD:NLI X-SpamScore: 0 X-BigFish: VS0(zzzz1202hzz8275bhz2dh2a8h668h839hd24he5bhf0ah107ah) Received: from mail204-va3 (localhost.localdomain [127.0.0.1]) by mail204-va3 (MessageSwitch) id 1343380645450637_29119; Fri, 27 Jul 2012 09:17:25 +0000 (UTC) Received: from VA3EHSMHS039.bigfish.com (unknown [10.7.14.251]) by mail204-va3.bigfish.com (Postfix) with ESMTP id 61181DC0047; Fri, 27 Jul 2012 09:17:25 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by VA3EHSMHS039.bigfish.com (10.7.99.49) with Microsoft SMTP Server (TLS) id 14.1.225.23; Fri, 27 Jul 2012 09:17:25 +0000 Received: from az84smr01.freescale.net (10.64.34.197) by 039-SN1MMR1-003.039d.mgd.msft.net (10.84.1.16) with Microsoft SMTP Server (TLS) id 14.2.298.5; Fri, 27 Jul 2012 04:17:24 -0500 Received: from linux.ap.freescale.net ([10.213.130.145]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id q6R9HHo3026857; Fri, 27 Jul 2012 02:17:19 -0700 From: To: , Subject: [PATCH v4 7/7] fsl-dma: add memcpy self test interface Date: Fri, 27 Jul 2012 17:16:56 +0800 Message-ID: <1343380616-12126-1-git-send-email-qiang.liu@freescale.com> X-Mailer: git-send-email 1.7.1 MIME-Version: 1.0 X-OriginatorOrg: freescale.com Cc: "Ira W. Snyder" , Vinod Koul , Qiang Liu , herbert@gondor.hengli.com.au, Dan Williams , davem@davemloft.net X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" From: Qiang Liu Add memory copy self test when probe device, fsl-dma will be disabled if self test failed. Cc: Dan Williams Cc: Vinod Koul Cc: Li Yang Cc: Ira W. Snyder Signed-off-by: Qiang Liu --- drivers/dma/fsldma.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 83 insertions(+), 0 deletions(-) -- 1.7.5.1 diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index 6fc22eb..5e0b162 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c @@ -1277,6 +1277,82 @@ out_unwind: return ret; } +/* + * Perform a transaction to verify the HW works. + */ +#define FSL_DMA_TEST_SIZE 2000 + +static int __devinit fsl_dma_memcpy_self_test(struct fsldma_device *device) +{ + int i; + void *src, *dest; + dma_addr_t src_dma, dest_dma; + struct dma_chan *dma_chan; + dma_cookie_t cookie; + struct dma_async_tx_descriptor *tx; + int err = 0; + struct fsldma_chan *chan; + + src = kmalloc(sizeof(u8) * FSL_DMA_TEST_SIZE, GFP_KERNEL); + if (!src) + return -ENOMEM; + + dest = kzalloc(sizeof(u8) * FSL_DMA_TEST_SIZE, GFP_KERNEL); + if (!dest) { + kfree(src); + return -ENOMEM; + } + + /* Fill in src buffer */ + for (i = 0; i < FSL_DMA_TEST_SIZE; i++) + ((u8 *) src)[i] = (u8)i; + + /* Start copy, using first DMA channel */ + dma_chan = container_of(device->common.channels.next, + struct dma_chan, device_node); + if (fsl_dma_alloc_chan_resources(dma_chan) < 1) { + err = -ENODEV; + goto out; + } + + chan = to_fsl_chan(dma_chan); + dest_dma = dma_map_single(chan->common.device->dev, dest, + FSL_DMA_TEST_SIZE, DMA_FROM_DEVICE); + + src_dma = dma_map_single(chan->common.device->dev, src, + FSL_DMA_TEST_SIZE, DMA_TO_DEVICE); + + tx = fsl_dma_prep_memcpy(dma_chan, dest_dma, src_dma, FSL_DMA_TEST_SIZE, + DMA_COMPL_SKIP_DEST_UNMAP | DMA_COMPL_SRC_UNMAP_SINGLE); + cookie = fsl_dma_tx_submit(tx); + fsl_dma_memcpy_issue_pending(dma_chan); + async_tx_ack(tx); + msleep(1); + + if (fsl_tx_status(dma_chan, cookie, NULL) != DMA_SUCCESS) { + dev_printk(KERN_ERR, dma_chan->device->dev, + "Self-test copy timed out, disabling\n"); + err = -ENODEV; + goto free_resources; + } + + dma_sync_single_for_cpu(device->dev, dest_dma, + FSL_DMA_TEST_SIZE, DMA_FROM_DEVICE); + if (memcmp(src, dest, FSL_DMA_TEST_SIZE)) { + dev_printk(KERN_ERR, dma_chan->device->dev, + "Self-test copy failed compare, disabling\n"); + err = -ENODEV; + goto free_resources; + } + +free_resources: + fsl_dma_free_chan_resources(dma_chan); +out: + kfree(src); + kfree(dest); + return err; +} + /*----------------------------------------------------------------------------*/ /* OpenFirmware Subsystem */ /*----------------------------------------------------------------------------*/ @@ -1461,6 +1537,13 @@ static int __devinit fsldma_of_probe(struct platform_device *op) goto out_free_fdev; } + if (dma_has_cap(DMA_MEMCPY, fdev->common.cap_mask)) { + err = fsl_dma_memcpy_self_test(fdev); + printk(KERN_INFO "FSL-DMA Channel memcpy self test returned %d\n", err); + if (err) + goto out_free_fdev; + } + dma_async_device_register(&fdev->common); return 0;