From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 52D6621DFE909 for ; Mon, 7 Aug 2017 19:02:27 -0700 (PDT) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Aug 2017 19:04:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,340,1498546800"; d="scan'208";a="1180077126" Received: from shwdeopenpsi014.ccr.corp.intel.com ([10.239.9.13]) by fmsmga001.fm.intel.com with ESMTP; 07 Aug 2017 19:04:41 -0700 From: Hao Wu To: edk2-devel@lists.01.org Cc: Hao Wu , Star Zeng , Ruiyu Ni Date: Tue, 8 Aug 2017 10:04:38 +0800 Message-Id: <20170808020438.14540-1-hao.a.wu@intel.com> X-Mailer: git-send-email 2.12.0.windows.1 Subject: [PATCH] MdeModulePkg/EmmcDxe: Use Trim instead of Erase for EraseBlocks X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Aug 2017 02:02:27 -0000 The current implementation of the Erase Block Protocol service EraseBlocks() uses the erase command. According to spec eMMC Electrical Standard 5.1, Section 6.6.9: The erasable unit of the eMMC is the "Erase Group"; Erase group is measured in write blocks that are the basic writable units of the Device. However, code logic in function EmmcEraseBlocks() does not check whether the starting logical block address to be erased and/or the size in bytes to be erased is aligned with the erase group. Missing such checks will erase the data on additional blocks on an eMMC device. This commit will use the Trim command instead to perform the block erase for eMMC devices. Unlike the Erase command, according to spec eMMC Electrical Standard 5.1, Section 6.6.10: The Trim operation is similar to the default erase operation described in 6.6.9. The Trim function applies the erase operation to write blocks instead of erase groups. Also, the Trim operation is mandatory for eMMC devices according to spec eMMC Electrical Standard 5.1, Chapter 11, Table 220. Cc: Star Zeng Cc: Ruiyu Ni Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu --- MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c index c432d26801..5fd6a1eeaa 100644 --- a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c @@ -1848,9 +1848,15 @@ EmmcEraseBlock ( EraseBlock->Packet.SdMmcStatusBlk = &EraseBlock->SdMmcStatusBlk; EraseBlock->Packet.Timeout = EMMC_GENERIC_TIMEOUT; - EraseBlock->SdMmcCmdBlk.CommandIndex = EMMC_ERASE; - EraseBlock->SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc; - EraseBlock->SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1b; + EraseBlock->SdMmcCmdBlk.CommandIndex = EMMC_ERASE; + // + // Perform a Trim operation which applies the erase operation to write blocks + // instead of erase groups. (Spec JESD84-B51, eMMC Electrical Standard 5.1, + // Section 6.6.10 and 6.10.4) + // + EraseBlock->SdMmcCmdBlk.CommandArgument = 1; + EraseBlock->SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc; + EraseBlock->SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1b; EraseBlock->IsEnd = IsEnd; EraseBlock->Token = Token; -- 2.12.0.windows.1