From patchwork Thu Nov 19 07:03:50 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Terry Lv X-Patchwork-Id: 71685 X-Patchwork-Delegate: afleming@freescale.com Return-Path: X-Original-To: wd@gemini.denx.de Delivered-To: wd@gemini.denx.de Received: from diddl.denx.de (diddl.denx.de [10.0.0.6]) by gemini.denx.de (Postfix) with ESMTP id 1D83EC88C3 for ; Thu, 19 Nov 2009 08:07:55 +0100 (CET) Received: from diddl.denx.de (localhost.localdomain [127.0.0.1]) by diddl.denx.de (Postfix) with ESMTP id 0FBE3C7FA5CC for ; Thu, 19 Nov 2009 08:07:55 +0100 (MET) Received: from pop.mnet-online.de by diddl.denx.de with POP3 (fetchmail-6.3.9) for (single-drop); Thu, 19 Nov 2009 08:07:55 +0100 (MET) Received: from murder (svr19.m-online.net [192.168.3.147]) by backend2 (Cyrus v2.2.12) with LMTPA; Thu, 19 Nov 2009 08:06:17 +0100 X-Sieve: CMU Sieve 2.2 Received: from mail.m-online.net (localhost [127.0.0.1]) by frontend3.pop.m-online.net (Cyrus v2.2.13) with LMTPA; Thu, 19 Nov 2009 08:06:16 +0100 Received: from scanner-1.m-online.net (scanner-1.m-online.net [192.168.2.221]) by mail.m-online.net (Postfix) with ESMTP id BC40A2000A8; Thu, 19 Nov 2009 08:06:16 +0100 (CET) Received: from mxin-1.m-online.net ([192.168.1.21]) by scanner-1.m-online.net (scanner-1.m-online.net [192.168.2.221]) (amavisd-new, port 10026) with ESMTP id 08287-07-4; Thu, 19 Nov 2009 08:06:08 +0100 (CET) Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by mxin-2.m-online.net (Postfix) with ESMTP id BA6E946E1C2; Thu, 19 Nov 2009 08:06:07 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id DE9BA280E7; Thu, 19 Nov 2009 08:06:02 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 21YdxTNZUHvX; Thu, 19 Nov 2009 08:06:02 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 4A02F280E9; Thu, 19 Nov 2009 08:05:58 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id DDDC7280E0 for ; Thu, 19 Nov 2009 08:05:55 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rtOc+CVIzgTC for ; Thu, 19 Nov 2009 08:05:55 +0100 (CET) Received: from az33egw02.freescale.net (az33egw02.freescale.net [192.88.158.103]) by theia.denx.de (Postfix) with ESMTP id 07523280D5 for ; Thu, 19 Nov 2009 08:05:53 +0100 (CET) Received: from az33smr02.freescale.net (az33smr02.freescale.net [10.64.34.200]) by az33egw02.freescale.net (8.14.3/az33egw02) with ESMTP id nAJ75kx6006340 for ; Thu, 19 Nov 2009 00:05:50 -0700 (MST) Received: from zch01exm26.fsl.freescale.net (zch01exm26.ap.freescale.net [10.192.129.221]) by az33smr02.freescale.net (8.13.1/8.13.0) with ESMTP id nAJ75kNp022365 for ; Thu, 19 Nov 2009 01:05:46 -0600 (CST) Received: from localhost.localdomain ([10.193.100.158]) by zch01exm26.fsl.freescale.net with Microsoft SMTPSVC(6.0.3790.3959); Thu, 19 Nov 2009 15:05:44 +0800 From: Terry Lv To: u-boot@lists.denx.de Date: Thu, 19 Nov 2009 15:03:50 +0800 Message-Id: <12586142302775-git-send-email-r65388@freescale.com> X-Mailer: git-send-email 1.5.3.1 X-OriginalArrivalTime: 19 Nov 2009 07:05:44.0065 (UTC) FILETIME=[B61DBF10:01CA68E6] X-Brightmail-Tracker: AAAAAQAAAWE= X-Brightmail-Tracker: AAAAAQAAAWE= Subject: [U-Boot] [PATCH] Improve read performance of generic mmc. X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.9 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de X-Virus-Scanned: by amavisd-new at m-online.net In drivers/mmc/mmc.c, mmc_bread will do aligned read. So we don't need to use single block read. We can use multiblock read to improve the performance. Signed-off-by: Terry Lv --- drivers/mmc/mmc.c | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 40 insertions(+), 11 deletions(-) diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index b69ce15..53ca3a1 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -205,27 +205,56 @@ free_buffer: static ulong mmc_bread(int dev_num, ulong start, lbaint_t blkcnt, void *dst) { + struct mmc_cmd cmd; + struct mmc_data data; int err; - int i; + int stoperr = 0; struct mmc *mmc = find_mmc_device(dev_num); + int blklen; if (!mmc) - return 0; + return -1; - /* We always do full block reads from the card */ - err = mmc_set_blocklen(mmc, mmc->read_bl_len); + blklen = mmc->read_bl_len; + + err = mmc_set_blocklen(mmc, blklen); if (err) { - return 0; + printf("set read bl len failed\n\r"); + return err; } - for (i = start; i < start + blkcnt; i++, dst += mmc->read_bl_len) { - err = mmc_read_block(mmc, dst, i); + if (blkcnt > 1) + cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK; + else + cmd.cmdidx = MMC_CMD_READ_SINGLE_BLOCK; - if (err) { - printf("block read failed: %d\n", err); - return i - start; - } + if (mmc->high_capacity) + cmd.cmdarg = start; + else + cmd.cmdarg = start * blklen; + + cmd.resp_type = MMC_RSP_R1; + cmd.flags = 0; + + data.dest = dst; + data.blocks = blkcnt; + data.blocksize = blklen; + data.flags = MMC_DATA_READ; + + err = mmc_send_cmd(mmc, &cmd, &data); + + if (err) { + printf("mmc read failed\n\r"); + return err; + } + + if (blkcnt > 1) { + cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION; + cmd.cmdarg = 0; + cmd.resp_type = MMC_RSP_R1b; + cmd.flags = 0; + stoperr = mmc_send_cmd(mmc, &cmd, NULL); } return blkcnt;