From nobody Sat Dec 28 10:41:38 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1499231138711351.42927430884765; Tue, 4 Jul 2017 22:05:38 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 13B2A2095A6DD; Tue, 4 Jul 2017 22:03:53 -0700 (PDT) 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 8A3082095A6BF for ; Tue, 4 Jul 2017 22:03:51 -0700 (PDT) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Jul 2017 22:05:30 -0700 Received: from shwdeopenpsi014.ccr.corp.intel.com ([10.239.9.13]) by FMSMGA003.fm.intel.com with ESMTP; 04 Jul 2017 22:05:29 -0700 X-Original-To: edk2-devel@lists.01.org X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,310,1496127600"; d="scan'208";a="874845479" From: Hao Wu To: edk2-devel@lists.01.org Date: Wed, 5 Jul 2017 13:05:24 +0800 Message-Id: <20170705050524.24328-4-hao.a.wu@intel.com> X-Mailer: git-send-email 2.12.0.windows.1 In-Reply-To: <20170705050524.24328-1-hao.a.wu@intel.com> References: <20170705050524.24328-1-hao.a.wu@intel.com> Subject: [edk2] [PATCH 3/3] MdeModulePkg/EmmcDxe: Implementation of Disk Information Protocol 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: , Cc: Hao Wu , Ruiyu Ni , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Adds the implementation of Disk Information Protocol for EMMC devices per PI 1.6 spec. Cc: Ruiyu Ni Cc: Star Zeng Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu --- MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.c | 140 +++++++++++++++++++++++++= ++++ MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.h | 115 ++++++++++++++++++++++++ MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.c | 15 +++- MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.h | 9 +- MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf | 5 +- 5 files changed, 281 insertions(+), 3 deletions(-) create mode 100644 MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.c create mode 100644 MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.h diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.c b/MdeModulePkg/Bus/= Sd/EmmcDxe/EmmcDiskInfo.c new file mode 100644 index 0000000000..85c7ac6c2e --- /dev/null +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.c @@ -0,0 +1,140 @@ +/** @file + Implement the EFI_DISK_INFO_PROTOCOL interface on EMMC devices. + + Copyright (c) 2017, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#include "EmmcDxe.h" + +/** + Provides inquiry information for the controller type. + + This function is used by the driver entity to get inquiry data. Data for= mat of + Identify data is defined by the Interface GUID. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL i= nstance. + @param[in,out] InquiryData Pointer to a buffer for the inquiry dat= a. + @param[in,out] InquiryDataSize Pointer to the value for the inquiry da= ta size. + + @retval EFI_SUCCESS The command was accepted without any erro= rs. + @retval EFI_NOT_FOUND Device does not support this data class. + @retval EFI_DEVICE_ERROR Error reading InquiryData from device. + @retval EFI_BUFFER_TOO_SMALL InquiryDataSize not big enough. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoInquiry ( + IN EFI_DISK_INFO_PROTOCOL *This, + IN OUT VOID *InquiryData, + IN OUT UINT32 *InquiryDataSize + ) +{ + EFI_STATUS Status; + EMMC_PARTITION *Partition; + EMMC_DEVICE *Device; + + Partition =3D EMMC_PARTITION_DATA_FROM_DISKINFO (This); + Device =3D Partition->Device; + + if (*InquiryDataSize >=3D sizeof (Device->Cid)) { + Status =3D EFI_SUCCESS; + CopyMem (InquiryData, &Device->Cid, sizeof (Device->Cid)); + } else { + Status =3D EFI_BUFFER_TOO_SMALL; + } + + *InquiryDataSize =3D sizeof (Device->Cid); + + return Status; +} + +/** + Provides identify information for the controller type. + + This function is used by the driver entity to get identify data. Data fo= rmat + of Identify data is defined by the Interface GUID. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL + instance. + @param[in,out] IdentifyData Pointer to a buffer for the identify d= ata. + @param[in,out] IdentifyDataSize Pointer to the value for the identify = data + size. + + @retval EFI_SUCCESS The command was accepted without any erro= rs. + @retval EFI_NOT_FOUND Device does not support this data class. + @retval EFI_DEVICE_ERROR Error reading IdentifyData from device. + @retval EFI_BUFFER_TOO_SMALL IdentifyDataSize not big enough. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoIdentify ( + IN EFI_DISK_INFO_PROTOCOL *This, + IN OUT VOID *IdentifyData, + IN OUT UINT32 *IdentifyDataSize + ) +{ + return EFI_NOT_FOUND; +} + +/** + Provides sense data information for the controller type. + + This function is used by the driver entity to get sense data. Data forma= t of + Sense data is defined by the Interface GUID. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL i= nstance. + @param[in,out] SenseData Pointer to the SenseData. + @param[in,out] SenseDataSize Size of SenseData in bytes. + @param[out] SenseDataNumber Pointer to the value for the sense data= size. + + @retval EFI_SUCCESS The command was accepted without any erro= rs. + @retval EFI_NOT_FOUND Device does not support this data class. + @retval EFI_DEVICE_ERROR Error reading SenseData from device. + @retval EFI_BUFFER_TOO_SMALL SenseDataSize not big enough. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoSenseData ( + IN EFI_DISK_INFO_PROTOCOL *This, + IN OUT VOID *SenseData, + IN OUT UINT32 *SenseDataSize, + OUT UINT8 *SenseDataNumber + ) +{ + return EFI_NOT_FOUND; +} + +/** + Provides IDE channel and device information for the interface. + + This function is used by the driver entity to get controller information. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance. + @param[out] IdeChannel Pointer to the Ide Channel number. Primary or = secondary. + @param[out] IdeDevice Pointer to the Ide Device number. Master or sl= ave. + + @retval EFI_SUCCESS IdeChannel and IdeDevice are valid. + @retval EFI_UNSUPPORTED This is not an IDE device. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoWhichIde ( + IN EFI_DISK_INFO_PROTOCOL *This, + OUT UINT32 *IdeChannel, + OUT UINT32 *IdeDevice + ) +{ + return EFI_UNSUPPORTED; +} diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.h b/MdeModulePkg/Bus/= Sd/EmmcDxe/EmmcDiskInfo.h new file mode 100644 index 0000000000..4d3e6916d5 --- /dev/null +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDiskInfo.h @@ -0,0 +1,115 @@ +/** @file + Header file for EFI_DISK_INFO_PROTOCOL interface on EMMC devices. + + Copyright (c) 2017, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BS= D License + which accompanies this distribution. The full text of the license may b= e found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMP= LIED. + +**/ + +#ifndef _EMMC_DISKINFO_H_ +#define _EMMC_DISKINFO_H_ + +/** + Provides inquiry information for the controller type. + + This function is used by the driver entity to get inquiry data. Data for= mat of + Identify data is defined by the Interface GUID. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL i= nstance. + @param[in,out] InquiryData Pointer to a buffer for the inquiry dat= a. + @param[in,out] InquiryDataSize Pointer to the value for the inquiry da= ta size. + + @retval EFI_SUCCESS The command was accepted without any erro= rs. + @retval EFI_NOT_FOUND Device does not support this data class. + @retval EFI_DEVICE_ERROR Error reading InquiryData from device. + @retval EFI_BUFFER_TOO_SMALL InquiryDataSize not big enough. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoInquiry ( + IN EFI_DISK_INFO_PROTOCOL *This, + IN OUT VOID *InquiryData, + IN OUT UINT32 *InquiryDataSize + ); + +/** + Provides identify information for the controller type. + + This function is used by the driver entity to get identify data. Data fo= rmat + of Identify data is defined by the Interface GUID. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL + instance. + @param[in,out] IdentifyData Pointer to a buffer for the identify d= ata. + @param[in,out] IdentifyDataSize Pointer to the value for the identify = data + size. + + @retval EFI_SUCCESS The command was accepted without any erro= rs. + @retval EFI_NOT_FOUND Device does not support this data class. + @retval EFI_DEVICE_ERROR Error reading IdentifyData from device. + @retval EFI_BUFFER_TOO_SMALL IdentifyDataSize not big enough. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoIdentify ( + IN EFI_DISK_INFO_PROTOCOL *This, + IN OUT VOID *IdentifyData, + IN OUT UINT32 *IdentifyDataSize + ); + +/** + Provides sense data information for the controller type. + + This function is used by the driver entity to get sense data. Data forma= t of + Sense data is defined by the Interface GUID. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL i= nstance. + @param[in,out] SenseData Pointer to the SenseData. + @param[in,out] SenseDataSize Size of SenseData in bytes. + @param[out] SenseDataNumber Pointer to the value for the sense data= size. + + @retval EFI_SUCCESS The command was accepted without any erro= rs. + @retval EFI_NOT_FOUND Device does not support this data class. + @retval EFI_DEVICE_ERROR Error reading SenseData from device. + @retval EFI_BUFFER_TOO_SMALL SenseDataSize not big enough. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoSenseData ( + IN EFI_DISK_INFO_PROTOCOL *This, + IN OUT VOID *SenseData, + IN OUT UINT32 *SenseDataSize, + OUT UINT8 *SenseDataNumber + ); + +/** + Provides IDE channel and device information for the interface. + + This function is used by the driver entity to get controller information. + + @param[in] This Pointer to the EFI_DISK_INFO_PROTOCOL instance. + @param[out] IdeChannel Pointer to the Ide Channel number. Primary or = secondary. + @param[out] IdeDevice Pointer to the Ide Device number. Master or sl= ave. + + @retval EFI_SUCCESS IdeChannel and IdeDevice are valid. + @retval EFI_UNSUPPORTED This is not an IDE device. + +**/ +EFI_STATUS +EFIAPI +EmmcDiskInfoWhichIde ( + IN EFI_DISK_INFO_PROTOCOL *This, + OUT UINT32 *IdeChannel, + OUT UINT32 *IdeDevice + ); + +#endif diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.c b/MdeModulePkg/Bus/Sd/Em= mcDxe/EmmcDxe.c index 5040882d62..4ebced0b94 100644 --- a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.c +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.c @@ -4,7 +4,7 @@ It produces BlockIo, BlockIo2 and StorageSecurity protocols to allow upp= er layer access the EMMC device. =20 - Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -73,6 +73,13 @@ EMMC_PARTITION mEmmcPartitionTemplate =3D { 1, EmmcEraseBlocks }, + { // DiskInfo + EFI_DISK_INFO_SD_MMC_INTERFACE_GUID, + EmmcDiskInfoInquiry, + EmmcDiskInfoIdentify, + EmmcDiskInfoSenseData, + EmmcDiskInfoWhichIde + }, { NULL, NULL @@ -454,6 +461,8 @@ InstallProtocolOnPartition ( &Partition->BlockIo2, &gEfiEraseBlockProtocolGuid, &Partition->EraseBlock, + &gEfiDiskInfoProtocolGuid, + &Partition->DiskInfo, NULL ); if (EFI_ERROR (Status)) { @@ -481,6 +490,8 @@ InstallProtocolOnPartition ( &Partition->BlockIo2, &gEfiEraseBlockProtocolGuid, &Partition->EraseBlock, + &gEfiDiskInfoProtocolGuid, + &Partition->DiskInfo, NULL ); goto Error; @@ -1104,6 +1115,8 @@ EmmcDxeDriverBindingStop ( &Partition->BlockIo2, &gEfiEraseBlockProtocolGuid, &Partition->EraseBlock, + &gEfiDiskInfoProtocolGuid, + &Partition->DiskInfo, NULL ); if (EFI_ERROR (Status)) { diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.h b/MdeModulePkg/Bus/Sd/Em= mcDxe/EmmcDxe.h index 0ae4eccac6..abdffbb50b 100644 --- a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.h +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.h @@ -4,7 +4,7 @@ This file defines common data structures, macro definitions and some mod= ule internal function header files. =20 - Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -26,6 +26,7 @@ #include #include #include +#include =20 #include =20 @@ -40,6 +41,8 @@ #include =20 #include "EmmcBlockIo.h" +#include "EmmcDiskInfo.h" + // // Global Variables // @@ -61,6 +64,9 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gEmmcDxeComponent= Name2; #define EMMC_PARTITION_DATA_FROM_ERASEBLK(a) \ CR(a, EMMC_PARTITION, EraseBlock, EMMC_PARTITION_SIGNATURE) =20 +#define EMMC_PARTITION_DATA_FROM_DISKINFO(a) \ + CR(a, EMMC_PARTITION, DiskInfo, EMMC_PARTITION_SIGNATURE) + // // Take 2.5 seconds as generic time out value, 1 microsecond as unit. // @@ -102,6 +108,7 @@ typedef struct { EFI_BLOCK_IO_MEDIA BlockMedia; EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity; EFI_ERASE_BLOCK_PROTOCOL EraseBlock; + EFI_DISK_INFO_PROTOCOL DiskInfo; =20 LIST_ENTRY Queue; =20 diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf b/MdeModulePkg/Bus/Sd/= EmmcDxe/EmmcDxe.inf index 7b0504937a..3f27bdbcaf 100644 --- a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf @@ -4,7 +4,7 @@ # It produces BlockIo, BlockIo2 and StorageSecurity protocols to allow up= per layer # access the EMMC device. # -# Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
+# Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the B= SD License @@ -41,6 +41,8 @@ EmmcDxe.h EmmcBlockIo.c EmmcBlockIo.h + EmmcDiskInfo.c + EmmcDiskInfo.h =20 [Packages] MdePkg/MdePkg.dec @@ -61,6 +63,7 @@ gEfiBlockIo2ProtocolGuid ## BY_START gEfiStorageSecurityCommandProtocolGuid ## SOMETIMES_PRODUCES gEfiEraseBlockProtocolGuid ## BY_START + gEfiDiskInfoProtocolGuid ## BY_START ## TO_START ## BY_START gEfiDevicePathProtocolGuid --=20 2.12.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel