From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=203.18.50.4; helo=nat-hk.nvidia.com; envelope-from=ashishsingha@nvidia.com; receiver=edk2-devel@lists.01.org Received: from nat-hk.nvidia.com (nat-hk.nvidia.com [203.18.50.4]) (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 E4EA1211ACEDE for ; Wed, 2 Jan 2019 07:47:33 -0800 (PST) Received: from hkpgpgate102.nvidia.com (Not Verified[10.18.92.9]) by nat-hk.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Wed, 02 Jan 2019 23:47:32 +0800 Received: from HKMAIL101.nvidia.com ([10.18.16.10]) by hkpgpgate102.nvidia.com (PGP Universal service); Wed, 02 Jan 2019 07:47:30 -0800 X-PGP-Universal: processed; by hkpgpgate102.nvidia.com on Wed, 02 Jan 2019 07:47:30 -0800 Received: from HKMAIL102.nvidia.com (10.18.16.11) by HKMAIL101.nvidia.com (10.18.16.10) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 2 Jan 2019 15:47:29 +0000 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (104.47.36.59) by HKMAIL102.nvidia.com (10.18.16.11) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Wed, 2 Jan 2019 15:47:28 +0000 Received: from BYAPR12MB2743.namprd12.prod.outlook.com (20.177.125.220) by BYAPR12MB3365.namprd12.prod.outlook.com (20.178.55.206) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1495.6; Wed, 2 Jan 2019 15:47:25 +0000 Received: from BYAPR12MB2743.namprd12.prod.outlook.com ([fe80::d51a:3dbb:3b90:178b]) by BYAPR12MB2743.namprd12.prod.outlook.com ([fe80::d51a:3dbb:3b90:178b%3]) with mapi id 15.20.1471.019; Wed, 2 Jan 2019 15:47:24 +0000 From: Ashish Singhal To: "Wu, Hao A" , "edk2-devel@lists.01.org" Thread-Topic: [edk2] [PATCH v7] MdeModulePkg/SdMmcPciHcDxe: Add SDMMC HC v4 and above Support. Thread-Index: AQHUomSI59i4bxLHPEyPYw3Ixn5f/6WbhlSAgACZrhA= Date: Wed, 2 Jan 2019 15:47:24 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_Enabled=True; MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_SiteId=43083d15-7273-40c1-b7db-39efd9ccc17a; MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_Owner=ashishsingha@nvidia.com; MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_SetDate=2019-01-02T15:47:22.1852077Z; MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_Name=Unrestricted; MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_Application=Microsoft Azure Information Protection; MSIP_Label_6b558183-044c-4105-8d9c-cea02a2a3d86_Extended_MSFT_Method=Automatic; Sensitivity=Unrestricted authentication-results: spf=none (sender IP is ) smtp.mailfrom=ashishsingha@nvidia.com; x-originating-ip: [8.46.90.104] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; BYAPR12MB3365; 6:jMV6+Var1nPcwRzFSSJR3gbB/77FjkSiD5JXkIP10IM3yDD4i5dxNqlfeNNRvGGmTIBKSu5QCZnDLBXgAVCqNiSlAFmtNFNIeIeDCWQOrxKp05hdTdEtHlhpp9tVDi7q4CV+P5a+PWY3J0BAubQT0NabTir8FpEf2UnsNiATPjdfgval1akfGd5YwKO/wZ7JhtToEfm1KFpo8/8NxV6Hltvck6hfv1TpOqzmd2FqffGGbSaS/hd9gwPt5662y81UTTvMS2igKLGBgrsmN/k3OvBp9PwXL4Mc2kTK9SmCTLuPbxJpeCmoJGN1UaaLdjr/HeQRd768bdXd+3CgMXNjOZlbZ68vZhcq0vj3ohadxMnEF0FjMBxme2XNpv6i7iyFHvTLcbwcJJreRoXE6nR+PenEtgG7ISqpOiNLoM3AeuNz5ueVSG56dfV3uAzDhl7WDhq5hHB/YeFkLYfN7SVUfg==; 5:LTI6O71EbrnpcrX6om5U3Ge8aKwpUadywuToPQhV4jCSYflOAtwsB/9Jxes2sL1Er5kmVaNFDrN2/cVr7WxOW+xSjiyV4va8YNGi+rPByQ7/pHG58HtCEchIRvhaJUlkx4aYrFcsSgvZGcn6msdk1eq0DbhjMrsKp7jQS49Qw3A8ZXv8xc8y5aLoZOVnDGCgSp4+jsXITxD9Ez9pUbq3aA==; 7:j5YshQy6jrwRlUVTOcSRKtxdHKDJxlshzV1Jwcs73LUJvkA8frkmwhSg+5fDK1fl3XRww5vyXMk7XcZHnLJMZowyt/eNTpfw/sgGP0Ixqtky6F1LB5RidtrMHdLRIzCfsE2ag/aP3Zeqs11k/x4Y3A== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: e9c7a489-4d9b-4eb8-d487-08d670c9974c x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600109)(711020)(2017052603328)(7153060)(7193020); SRVR:BYAPR12MB3365; x-ms-traffictypediagnostic: BYAPR12MB3365: x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(3230021)(908002)(999002)(5005026)(6040522)(8220060)(2401047)(8121501046)(93006095)(93001095)(3002001)(3231475)(944501520)(52105112)(10201501046)(6041310)(20161123558120)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123560045)(201708071742011)(7699051)(76991095); SRVR:BYAPR12MB3365; BCL:0; PCL:0; RULEID:; SRVR:BYAPR12MB3365; x-forefront-prvs: 0905A6B2C7 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6029001)(396003)(366004)(39860400002)(376002)(136003)(346002)(189003)(199004)(51914003)(13464003)(53946003)(6506007)(26005)(53936002)(256004)(106356001)(97736004)(14444005)(476003)(9686003)(6436002)(76176011)(486006)(19627235002)(2501003)(55016002)(68736007)(186003)(6306002)(7696005)(102836004)(53546011)(33656002)(966005)(229853002)(5660300001)(4744004)(6246003)(2906002)(8936002)(71190400001)(71200400001)(316002)(11346002)(446003)(66066001)(99286004)(81166006)(81156014)(105586002)(8676002)(25786009)(110136005)(478600001)(14454004)(7736002)(305945005)(86362001)(6116002)(3846002)(74316002)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:BYAPR12MB3365; H:BYAPR12MB2743.namprd12.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: nvidia.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ruCweQVLB02p4dlkSJdunjMF2BFFS3AZKxQs6zPude2wGqpPjoFces+skBSwjkTTqU1S57U2/sCimAZGRH+m2iXwcmrnnfu+AIkhcNjYzTL/F7XKZ7Txc1XtrfIXQt/X8EmQfA5YNqUUu7uDA9DtuykzYYQLu9xaKY07jc5FSUtgzg08JoZEtxJzv8do9/AqOBWqtZW/j1ZKPV5MOv3LtawD2dtQ2sEGgEENvsnM54ul05fi3eFWuF7+ybT7ZNtVirXdfpXPFN0SASw1H68MRbtXy02GAxnE/CiDNwlg2Ofj6S/E0qhjSEZRWGL+KIWM spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: e9c7a489-4d9b-4eb8-d487-08d670c9974c X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Jan 2019 15:47:24.7386 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR12MB3365 X-OriginatorOrg: Nvidia.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1546444052; bh=6dw45z2OOSASL7GRd43XSeEQ2v1D6Gmb0NQ98Mf8/4E=; h=X-PGP-Universal:From:To:Subject:Thread-Topic:Thread-Index:Date: Message-ID:References:In-Reply-To:Accept-Language:X-MS-Has-Attach: X-MS-TNEF-Correlator:msip_labels:authentication-results: x-originating-ip:x-ms-publictraffictype: x-microsoft-exchange-diagnostics: x-ms-exchange-antispam-srfa-diagnostics: x-ms-office365-filtering-correlation-id:x-microsoft-antispam: x-ms-traffictypediagnostic:x-microsoft-antispam-prvs: x-exchange-antispam-report-cfa-test:x-forefront-prvs: x-forefront-antispam-report:received-spf: x-ms-exchange-senderadcheck:x-microsoft-antispam-message-info: spamdiagnosticoutput:spamdiagnosticmetadata:MIME-Version: X-MS-Exchange-CrossTenant-Network-Message-Id: X-MS-Exchange-CrossTenant-originalarrivaltime: X-MS-Exchange-CrossTenant-fromentityheader: X-MS-Exchange-CrossTenant-id: X-MS-Exchange-Transport-CrossTenantHeadersStamped:X-OriginatorOrg: Content-Language:Content-Type:Content-Transfer-Encoding; b=cpBcXJu9rLFa7z38xJPzjMExMO7yUS5isu8ano9nbzob5z6VrTUltMSXDitxUNXB0 SaSWOMV5FIiQcA3fBMceLx/ra3eQGYJjKsMTmEEdfc3Wq37xGAsG8D3mhrIjKcMPOk K03yFwOikJqjedWMewh7OzI6v+kSGpvKiXgsNN68vifPq4Gw4YEewPt9B+ngE6wCV6 u13U1eigYeibYmeIAelSYYKpSMwqcZzZzLPeszgxevOD8XdrzoBuXFCqCXj9iuKumP uXdz5LF+f9wy9t4A0BrbovX86eHq9iTV29L4y39i3ymPJeto7LPs9eUgnGyWBO6tuP nAB+KeyU9xAvw== Subject: Re: [PATCH v7] MdeModulePkg/SdMmcPciHcDxe: Add SDMMC HC v4 and above Support. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Jan 2019 15:47:35 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello Hao, I have submitted patch v8 which incorporates all the changes. Thanks Ashish -----Original Message----- From: Wu, Hao A =20 Sent: Tuesday, January 1, 2019 11:37 PM To: Wu, Hao A ; Ashish Singhal ; edk2-devel@lists.01.org Subject: RE: [edk2] [PATCH v7] MdeModulePkg/SdMmcPciHcDxe: Add SDMMC HC v= 4 and above Support. Missed one comment for commit message: "If V4 64 bit address mode is enabled in compatibility register" -> "If V4 64 bit address mode is supported in capabilities register" Best Regards, Hao Wu > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of = > Wu, Hao A > Sent: Wednesday, January 02, 2019 2:29 PM > To: Ashish Singhal; edk2-devel@lists.01.org > Subject: Re: [edk2] [PATCH v7] MdeModulePkg/SdMmcPciHcDxe: Add SDMMC=20 > HC v4 and above Support. >=20 > Hello, >=20 > I have 2 minor comments, please refer to those inline comments. > Apart from that, the patch is good to me: > Reviewed-by: Hao Wu >=20 > If you agree those inline comments, I will directly modify the patch=20 > on my side and then push it into the repository. >=20 > > -----Original Message----- > > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf=20 > > Of Ashish Singhal > > Sent: Wednesday, December 19, 2018 5:29 AM > > To: edk2-devel@lists.01.org > > Cc: Ashish Singhal > > Subject: [edk2] [PATCH v7] MdeModulePkg/SdMmcPciHcDxe: Add SDMMC HC=20 > > v4 and above Support. >=20 > Add the Bugzilla tracker information at the start of the commit log mes= sage: >=20 > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D1359 >=20 > > > > Add SDMA, ADMA2 and 26b data length support. > > > > If V4 64 bit address mode is enabled in compatibility register,=20 > > program controller to enable V4 host mode and use appropriate SDMA=20 > > registers supporting 64 bit addresses. > > > > If V4 64 bit address mode is enabled in compatibility register,=20 > > program controller to enable V4 host mode and use appropriate ADMA=20 > > descriptors supporting 64 bit addresses. > > > > If host controller version is above V4.0, enable ADMA2 with 26b data = > > length support for better performance. HC 2 register is configured=20 > > to use 26 bit data lengths and ADMA2 descriptors are configured > appropriately. > > > > Contributed-under: TianoCore Contribution Agreement 1.1 > > Signed-off-by: Ashish Singhal > > --- > > MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c | 2 +- > > MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c | 4 +- > > MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c | 21 +- > > MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h | 7 +- > > MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c | 328 > > +++++++++++++++++---- > > MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.h | 84 ++++-- > > 6 files changed, 363 insertions(+), 83 deletions(-) mode change=20 > > 100755 =3D> 100644 MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c > > > > diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c > > b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c > > old mode 100755 > > new mode 100644 > > index 2d3fb68..0c5646f > > --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c > > +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c > > @@ -707,7 +707,7 @@ EmmcSwitchClockFreq ( > > // > > // Convert the clock freq unit from MHz to KHz. > > // > > - Status =3D SdMmcHcClockSupply (PciIo, Slot, ClockFreq * 1000,=20 > > Private- > > >BaseClkFreq[Slot]); > > + Status =3D SdMmcHcClockSupply (PciIo, Slot, ClockFreq * 1000,=20 > > + Private- > > >BaseClkFreq[Slot], Private->ControllerVersion[Slot]); > > if (EFI_ERROR (Status)) { > > return Status; > > } > > diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c > > b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c > > index 68485c8..cdcdfa3 100644 > > --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c > > +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c > > @@ -864,7 +864,7 @@ SdCardSetBusMode ( > > return Status; > > } > > > > - Status =3D SdMmcHcClockSupply (PciIo, Slot, ClockFreq * 1000,=20 > > Private- > > >BaseClkFreq[Slot]); > > + Status =3D SdMmcHcClockSupply (PciIo, Slot, ClockFreq * 1000,=20 > > + Private- > > >BaseClkFreq[Slot], Private->ControllerVersion[Slot]); > > if (EFI_ERROR (Status)) { > > return Status; > > } > > @@ -1064,7 +1064,7 @@ SdCardIdentification ( > > goto Error; > > } > > > > - SdMmcHcInitClockFreq (PciIo, Slot, Private->BaseClkFreq[Slot])= ; > > + SdMmcHcInitClockFreq (PciIo, Slot,=20 > > + Private->BaseClkFreq[Slot], > Private- > > >ControllerVersion[Slot]); > > > > gBS->Stall (1000); > > > > diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c > > b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c > > index a87f8de..b5bc260 100644 > > --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c > > +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c > > @@ -62,7 +62,9 @@ SD_MMC_HC_PRIVATE_DATA gSdMmcPciHcTemplate > =3D > > { > > { // MaxCurrent > > 0, > > }, > > - 0 // ControllerVersion > > + { > > + 0 // ControllerVersion > > + } > > }; > > > > SD_DEVICE_PATH mSdDpTemplate =3D { > > @@ -621,6 +623,14 @@ SdMmcPciHcDriverBindingStart ( > > for (Slot =3D FirstBar; Slot < (FirstBar + SlotNum); Slot++) { > > Private->Slot[Slot].Enable =3D TRUE; > > > > + // > > + // Get SD/MMC Pci Host Controller Version > > + // > > + Status =3D SdMmcHcGetControllerVersion (PciIo, Slot, &Private- > > >ControllerVersion[Slot]); > > + if (EFI_ERROR (Status)) { > > + goto Done; >=20 > Like other error handling in the for loop: > Instead of "goto Done;", change to "continue;". >=20 >=20 > Thanks for the patience. >=20 > Best Regards, > Hao Wu >=20 > > + } > > + > > Status =3D SdMmcHcGetCapability (PciIo, Slot, &Private->Capabili= ty[Slot]); > > if (EFI_ERROR (Status)) { > > continue; > > @@ -649,7 +659,14 @@ SdMmcPciHcDriverBindingStart ( > > Private->BaseClkFreq[Slot] > > )); > > > > - Support64BitDma &=3D Private->Capability[Slot].SysBus64; > > + // > > + // If any of the slots does not support 64b system bus > > + // do not enable 64b DMA in the PCI layer. > > + // > > + if (Private->Capability[Slot].SysBus64V3 =3D=3D 0 && > > + Private->Capability[Slot].SysBus64V4 =3D=3D 0) { > > + Support64BitDma =3D FALSE; > > + } > > > > Status =3D SdMmcHcGetMaxCurrent (PciIo, Slot, &Private- > > >MaxCurrent[Slot]); > > if (EFI_ERROR (Status)) { > > diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h > > b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h > > index 8c1a589..1bb701a 100644 > > --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h > > +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h > > @@ -2,6 +2,7 @@ > > > > Provides some data structure definitions used by the SD/MMC host=20 > > controller driver. > > > > +Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. > > Copyright (c) 2015, Intel Corporation. All rights reserved.
=20 > > This program and the accompanying materials are licensed and made=20 > > available under the terms and conditions of the > BSD > > License > > @@ -116,8 +117,7 @@ typedef struct { > > SD_MMC_HC_SLOT Slot[SD_MMC_HC_MAX_SLOT]; > > SD_MMC_HC_SLOT_CAP Capability[SD_MMC_HC_MAX_SLOT]= ; > > UINT64 MaxCurrent[SD_MMC_HC_MAX_SLOT]= ; > > - > > - UINT32 ControllerVersion; > > + UINT16 ControllerVersion[SD_MMC_HC_MA= X_SLOT]; > > > > // > > // Some controllers may require to override base clock frequency=20 > > @@ -150,7 +150,8 @@ typedef struct { > > BOOLEAN Started; > > UINT64 Timeout; > > > > - SD_MMC_HC_ADMA_DESC_LINE *AdmaDesc; > > + SD_MMC_HC_ADMA_32_DESC_LINE *Adma32Desc; > > + SD_MMC_HC_ADMA_64_DESC_LINE *Adma64Desc; > > EFI_PHYSICAL_ADDRESS AdmaDescPhy; > > VOID *AdmaMap; > > UINT32 AdmaPages; > > diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c > > b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c > > index ddf6dcf..6086720 100644 > > --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c > > +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c > > @@ -4,6 +4,7 @@ > > > > It would expose EFI_SD_MMC_PASS_THRU_PROTOCOL for upper layer > use. > > > > + Copyright (c) 2018, NVIDIA 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 > BSD > > License > > @@ -45,7 +46,8 @@ DumpCapabilityReg ( > > DEBUG ((DEBUG_INFO, " Voltage 3.3 %a\n", Capability->Volta= ge33 ? > > "TRUE" : "FALSE")); > > DEBUG ((DEBUG_INFO, " Voltage 3.0 %a\n", Capability->Volta= ge30 ? > > "TRUE" : "FALSE")); > > DEBUG ((DEBUG_INFO, " Voltage 1.8 %a\n", Capability->Volta= ge18 ? > > "TRUE" : "FALSE")); > > - DEBUG ((DEBUG_INFO, " 64-bit Sys Bus %a\n", Capability->SysBu= s64 ? > > "TRUE" : "FALSE")); > > + DEBUG ((DEBUG_INFO, " V4 64-bit Sys Bus %a\n", Capability- > > >SysBus64V4 ? "TRUE" : "FALSE")); > > + DEBUG ((DEBUG_INFO, " V3 64-bit Sys Bus %a\n", Capability- > > >SysBus64V3 ? "TRUE" : "FALSE")); > > DEBUG ((DEBUG_INFO, " Async Interrupt %a\n", Capability->Async= Int ? > > "TRUE" : "FALSE")); > > DEBUG ((DEBUG_INFO, " SlotType ")); > > if (Capability->SlotType =3D=3D 0x00) { @@ -417,6 +419,36 @@=20 > > SdMmcHcWaitMmioSet ( } > > > > /** > > + Get the controller version information from the specified slot. > > + > > + @param[in] PciIo The PCI IO protocol instance. > > + @param[in] Slot The slot number of the SD card to send= =20the > > command to. > > + @param[out] Version The buffer to store the version inform= ation. > > + > > + @retval EFI_SUCCESS The operation executes successfully. > > + @retval Others The operation fails. > > + > > +**/ > > +EFI_STATUS > > +SdMmcHcGetControllerVersion ( > > + IN EFI_PCI_IO_PROTOCOL *PciIo, > > + IN UINT8 Slot, > > + OUT UINT16 *Version > > + ) > > +{ > > + EFI_STATUS Status; > > + > > + Status =3D SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_CTRL_VER, TRUE, > > sizeof (UINT16), Version); > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + > > + *Version &=3D 0xFF; > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > Software reset the specified SD/MMC host controller and enable=20 > > all interrupts. > > > > @param[in] Private A pointer to the SD_MMC_HC_PRIVATE_DATA > > instance. > > @@ -722,6 +754,7 @@ SdMmcHcStopClock ( > > @param[in] Slot The slot number of the SD card to send t= he > command > > to. > > @param[in] ClockFreq The max clock frequency to be set. The u= nit is > KHz. > > @param[in] BaseClkFreq The base clock frequency of host control= ler in > > MHz. > > + @param[in] ControllerVer The version of host controller. > > > > @retval EFI_SUCCESS The clock is supplied successfully. > > @retval Others The clock isn't supplied successfully. > > @@ -732,14 +765,14 @@ SdMmcHcClockSupply ( > > IN EFI_PCI_IO_PROTOCOL *PciIo, > > IN UINT8 Slot, > > IN UINT64 ClockFreq, > > - IN UINT32 BaseClkFreq > > + IN UINT32 BaseClkFreq, > > + IN UINT16 ControllerVer > > ) > > { > > EFI_STATUS Status; > > UINT32 SettingFreq; > > UINT32 Divisor; > > UINT32 Remainder; > > - UINT16 ControllerVer; > > UINT16 ClockCtrl; > > > > // > > @@ -775,18 +808,15 @@ SdMmcHcClockSupply ( > > > > DEBUG ((DEBUG_INFO, "BaseClkFreq %dMHz Divisor %d ClockFreq=20 > > %dKhz\n", BaseClkFreq, Divisor, ClockFreq)); > > > > - Status =3D SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_CTRL_VER, TRUE,=20 > > sizeof (ControllerVer), &ControllerVer); > > - if (EFI_ERROR (Status)) { > > - return Status; > > - } > > // > > // Set SDCLK Frequency Select and Internal Clock Enable fields in = > > Clock Control register. > > // > > - if (((ControllerVer & 0xFF) >=3D SD_MMC_HC_CTRL_VER_300) && > > - ((ControllerVer & 0xFF) <=3D SD_MMC_HC_CTRL_VER_420)) { > > + if ((ControllerVer >=3D SD_MMC_HC_CTRL_VER_300) && > > + (ControllerVer <=3D SD_MMC_HC_CTRL_VER_420)) { > > ASSERT (Divisor <=3D 0x3FF); > > ClockCtrl =3D ((Divisor & 0xFF) << 8) | ((Divisor & 0x300) >> 2)= ; > > - } else if (((ControllerVer & 0xFF) =3D=3D 0) || ((ControllerVer & = > > 0xFF) =3D=3D 1)) { > > + } else if ((ControllerVer =3D=3D SD_MMC_HC_CTRL_VER_100) || > > + (ControllerVer =3D=3D SD_MMC_HC_CTRL_VER_200)) { > > // > > // Only the most significant bit can be used as divisor. > > // > > @@ -934,11 +964,62 @@ SdMmcHcSetBusWidth ( } > > > > /** > > + Configure V4 controller enhancements at initialization. > > + > > + @param[in] PciIo The PCI IO protocol instance. > > + @param[in] Slot The slot number of the SD card to send t= he > > command to. > > + @param[in] Capability The capability of the slot. > > + @param[in] ControllerVer The version of host controller. > > + > > + @retval EFI_SUCCESS The clock is supplied successfully. > > + > > +**/ > > +EFI_STATUS > > +SdMmcHcInitV4Enhancements ( > > + IN EFI_PCI_IO_PROTOCOL *PciIo, > > + IN UINT8 Slot, > > + IN SD_MMC_HC_SLOT_CAP Capability, > > + IN UINT16 ControllerVer > > + ) > > +{ > > + EFI_STATUS Status; > > + UINT16 HostCtrl2; > > + > > + // > > + // Check if controller version V4 or higher // if=20 > > + (ControllerVer >=3D SD_MMC_HC_CTRL_VER_400) { > > + HostCtrl2 =3D SD_MMC_HC_V4_EN; > > + // > > + // Check if V4 64bit support is available > > + // > > + if (Capability.SysBus64V4 !=3D 0) { > > + HostCtrl2 |=3D SD_MMC_HC_64_ADDR_EN; > > + DEBUG ((DEBUG_INFO, "Enabled V4 64 bit system bus support\n"))= ; > > + } > > + // > > + // Check if controller version V4.10 or higher > > + // > > + if (ControllerVer >=3D SD_MMC_HC_CTRL_VER_410) { > > + HostCtrl2 |=3D SD_MMC_HC_26_DATA_LEN_ADMA_EN; > > + DEBUG ((DEBUG_INFO, "Enabled V4 26 bit data length ADMA > > support\n")); > > + } > > + Status =3D SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, > sizeof > > (HostCtrl2), &HostCtrl2); > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + } > > + > > + return EFI_SUCCESS; > > +} > > + > > +/** > > Supply SD/MMC card with lowest clock frequency at initialization. > > > > @param[in] PciIo The PCI IO protocol instance. > > @param[in] Slot The slot number of the SD card to send t= he > command > > to. > > @param[in] BaseClkFreq The base clock frequency of host control= ler in > > MHz. > > + @param[in] ControllerVer The version of host controller. > > > > @retval EFI_SUCCESS The clock is supplied successfully. > > @retval Others The clock isn't supplied successfully. > > @@ -948,7 +1029,8 @@ EFI_STATUS > > SdMmcHcInitClockFreq ( > > IN EFI_PCI_IO_PROTOCOL *PciIo, > > IN UINT8 Slot, > > - IN UINT32 BaseClkFreq > > + IN UINT32 BaseClkFreq, > > + IN UINT16 ControllerVer > > ) > > { > > EFI_STATUS Status; > > @@ -970,7 +1052,7 @@ SdMmcHcInitClockFreq ( > > // Supply 400KHz clock frequency at initialization phase. > > // > > InitFreq =3D 400; > > - Status =3D SdMmcHcClockSupply (PciIo, Slot, InitFreq, BaseClkFreq)= ; > > + Status =3D SdMmcHcClockSupply (PciIo, Slot, InitFreq, BaseClkFreq,= > > ControllerVer); > > return Status; > > } > > > > @@ -1104,7 +1186,12 @@ SdMmcHcInitHost ( > > PciIo =3D Private->PciIo; > > Capability =3D Private->Capability[Slot]; > > > > - Status =3D SdMmcHcInitClockFreq (PciIo, Slot,=20 > > Private->BaseClkFreq[Slot]); > > + Status =3D SdMmcHcInitV4Enhancements (PciIo, Slot, Capability,=20 > > + Private- > > >ControllerVersion[Slot]); > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + > > + Status =3D SdMmcHcInitClockFreq (PciIo, Slot,=20 > > + Private->BaseClkFreq[Slot], > > Private->ControllerVersion[Slot]); > > if (EFI_ERROR (Status)) { > > return Status; > > } > > @@ -1262,9 +1349,10 @@ SdMmcHcLedOnOff ( > > /** > > Build ADMA descriptor table for transfer. > > > > - Refer to SD Host Controller Simplified spec 3.0 Section 1.13 for d= etails. > > + Refer to SD Host Controller Simplified spec 4.2 Section 1.13 for d= etails. > > > > @param[in] Trb The pointer to the SD_MMC_HC_TRB instanc= e. > > + @param[in] ControllerVer The version of host controller. > > > > @retval EFI_SUCCESS The ADMA descriptor table is created > successfully. > > @retval Others The ADMA descriptor table isn't created > successfully. > > @@ -1272,7 +1360,8 @@ SdMmcHcLedOnOff ( **/ EFI_STATUS =20 > > BuildAdmaDescTable ( > > - IN SD_MMC_HC_TRB *Trb > > + IN SD_MMC_HC_TRB *Trb, > > + IN UINT16 ControllerVer > > ) > > { > > EFI_PHYSICAL_ADDRESS Data; > > @@ -1280,49 +1369,93 @@ BuildAdmaDescTable ( > > UINT64 Entries; > > UINT32 Index; > > UINT64 Remaining; > > - UINT32 Address; > > + UINT64 Address; > > UINTN TableSize; > > EFI_PCI_IO_PROTOCOL *PciIo; > > EFI_STATUS Status; > > UINTN Bytes; > > + BOOLEAN AddressingMode64; > > + BOOLEAN DataLength26; > > + UINT32 AdmaMaxDataPerLine; > > + UINT32 DescSize; > > + VOID *AdmaDesc; > > + > > + AddressingMode64 =3D FALSE; > > + DataLength26 =3D FALSE; > > + AdmaMaxDataPerLine =3D ADMA_MAX_DATA_PER_LINE_16B; > > + DescSize =3D sizeof (SD_MMC_HC_ADMA_32_DESC_LINE); > > + AdmaDesc =3D NULL; > > > > Data =3D Trb->DataPhy; > > DataLen =3D Trb->DataLen; > > PciIo =3D Trb->Private->PciIo; > > + > > // > > - // Only support 32bit ADMA Descriptor Table > > + // Detect whether 64bit addressing is supported. > > // > > - if ((Data >=3D 0x100000000ul) || ((Data + DataLen) >=20 > > 0x100000000ul)) { > > + if (ControllerVer >=3D SD_MMC_HC_CTRL_VER_400) { > > + Status =3D SdMmcHcCheckMmioSet(PciIo, Trb->Slot, > > SD_MMC_HC_HOST_CTRL2, sizeof(UINT16), > > + =20 > > + SD_MMC_HC_V4_EN|SD_MMC_HC_64_ADDR_EN, > > SD_MMC_HC_V4_EN|SD_MMC_HC_64_ADDR_EN); > > + if (!EFI_ERROR (Status)) { > > + AddressingMode64 =3D TRUE; > > + DescSize =3D sizeof (SD_MMC_HC_ADMA_64_DESC_LINE); > > + } > > + } > > + // > > + // Check for valid ranges in 32bit ADMA Descriptor Table // if=20 > > + (!AddressingMode64 && > > + ((Data >=3D 0x100000000ul) || ((Data + DataLen) >=20 > > + 0x100000000ul))) { > > return EFI_INVALID_PARAMETER; > > } > > // > > - // Address field shall be set on 32-bit boundary (Lower 2-bit is=20 > > always set > to > > 0) > > - // for 32-bit address descriptor table. > > + // Check address field alignment > > // > > - if ((Data & (BIT0 | BIT1)) !=3D 0) { > > - DEBUG ((DEBUG_INFO, "The buffer [0x%x] to construct ADMA desc is= > not > > aligned to 4 bytes boundary!\n", Data)); > > + if (AddressingMode64) { > > + // > > + // Address field shall be set on 64-bit boundary (Lower 3-bit=20 > > + is always > set > > to 0) > > + // > > + if ((Data & (BIT0 | BIT1 | BIT2)) !=3D 0) { > > + DEBUG ((DEBUG_INFO, "The buffer [0x%x] to construct ADMA desc = > > + is > > not aligned to 8 bytes boundary!\n", Data)); > > + } > > + } else { > > + // > > + // Address field shall be set on 32-bit boundary (Lower 2-bit=20 > > + is always > set > > to 0) > > + // > > + if ((Data & (BIT0 | BIT1)) !=3D 0) { > > + DEBUG ((DEBUG_INFO, "The buffer [0x%x] to construct ADMA desc = > > + is > > not aligned to 4 bytes boundary!\n", Data)); > > + } > > + } > > + // > > + // Detect whether 26bit data length is supported. > > + // > > + Status =3D SdMmcHcCheckMmioSet(PciIo, Trb->Slot, > > SD_MMC_HC_HOST_CTRL2, sizeof(UINT16), > > + SD_MMC_HC_26_DATA_LEN_ADMA_EN, > > SD_MMC_HC_26_DATA_LEN_ADMA_EN); > > + if (!EFI_ERROR (Status)) { > > + DataLength26 =3D TRUE; > > + AdmaMaxDataPerLine =3D ADMA_MAX_DATA_PER_LINE_26B; > > } > > > > - Entries =3D DivU64x32 ((DataLen + ADMA_MAX_DATA_PER_LINE - 1), > > ADMA_MAX_DATA_PER_LINE); > > - TableSize =3D (UINTN)MultU64x32 (Entries, sizeof=20 > > (SD_MMC_HC_ADMA_DESC_LINE)); > > + Entries =3D DivU64x32 ((DataLen + AdmaMaxDataPerLine - 1), > > AdmaMaxDataPerLine); > > + TableSize =3D (UINTN)MultU64x32 (Entries, DescSize); > > Trb->AdmaPages =3D (UINT32)EFI_SIZE_TO_PAGES (TableSize); > > Status =3D PciIo->AllocateBuffer ( > > PciIo, > > AllocateAnyPages, > > EfiBootServicesData, > > EFI_SIZE_TO_PAGES (TableSize), > > - (VOID **)&Trb->AdmaDesc, > > + (VOID **)&AdmaDesc, > > 0 > > ); > > if (EFI_ERROR (Status)) { > > return EFI_OUT_OF_RESOURCES; > > } > > - ZeroMem (Trb->AdmaDesc, TableSize); > > + ZeroMem (AdmaDesc, TableSize); > > Bytes =3D TableSize; > > Status =3D PciIo->Map ( > > PciIo, > > EfiPciIoOperationBusMasterCommonBuffer, > > - Trb->AdmaDesc, > > + AdmaDesc, > > &Bytes, > > &Trb->AdmaDescPhy, > > &Trb->AdmaMap > > @@ -1335,12 +1468,13 @@ BuildAdmaDescTable ( > > PciIo->FreeBuffer ( > > PciIo, > > EFI_SIZE_TO_PAGES (TableSize), > > - Trb->AdmaDesc > > + AdmaDesc > > ); > > return EFI_OUT_OF_RESOURCES; > > } > > > > - if ((UINT64)(UINTN)Trb->AdmaDescPhy > 0x100000000ul) { > > + if ((!AddressingMode64) && > > + (UINT64)(UINTN)Trb->AdmaDescPhy > 0x100000000ul) { > > // > > // The ADMA doesn't support 64bit addressing. > > // > > @@ -1351,35 +1485,71 @@ BuildAdmaDescTable ( > > PciIo->FreeBuffer ( > > PciIo, > > EFI_SIZE_TO_PAGES (TableSize), > > - Trb->AdmaDesc > > + AdmaDesc > > ); > > return EFI_DEVICE_ERROR; > > } > > > > Remaining =3D DataLen; > > - Address =3D (UINT32)Data; > > + Address =3D Data; > > + if (!AddressingMode64) { > > + Trb->Adma32Desc =3D AdmaDesc; > > + Trb->Adma64Desc =3D NULL; > > + } else { > > + Trb->Adma64Desc =3D AdmaDesc; > > + Trb->Adma32Desc =3D NULL; > > + } > > for (Index =3D 0; Index < Entries; Index++) { > > - if (Remaining <=3D ADMA_MAX_DATA_PER_LINE) { > > - Trb->AdmaDesc[Index].Valid =3D 1; > > - Trb->AdmaDesc[Index].Act =3D 2; > > - Trb->AdmaDesc[Index].Length =3D (UINT16)Remaining; > > - Trb->AdmaDesc[Index].Address =3D Address; > > - break; > > + if (!AddressingMode64) { > > + if (Remaining <=3D AdmaMaxDataPerLine) { > > + Trb->Adma32Desc[Index].Valid =3D 1; > > + Trb->Adma32Desc[Index].Act =3D 2; > > + if (DataLength26) { > > + Trb->Adma32Desc[Index].UpperLength =3D (UINT16)(Remaining = >> 16); > > + } > > + Trb->Adma32Desc[Index].LowerLength =3D (UINT16)(Remaining & > > MAX_UINT16); > > + Trb->Adma32Desc[Index].Address =3D (UINT32)Address; > > + break; > > + } else { > > + Trb->Adma32Desc[Index].Valid =3D 1; > > + Trb->Adma32Desc[Index].Act =3D 2; > > + if (DataLength26) { > > + Trb->Adma32Desc[Index].UpperLength =3D 0; > > + } > > + Trb->Adma32Desc[Index].LowerLength =3D 0; > > + Trb->Adma32Desc[Index].Address =3D (UINT32)Address; > > + } > > } else { > > - Trb->AdmaDesc[Index].Valid =3D 1; > > - Trb->AdmaDesc[Index].Act =3D 2; > > - Trb->AdmaDesc[Index].Length =3D 0; > > - Trb->AdmaDesc[Index].Address =3D Address; > > + if (Remaining <=3D AdmaMaxDataPerLine) { > > + Trb->Adma64Desc[Index].Valid =3D 1; > > + Trb->Adma64Desc[Index].Act =3D 2; > > + if (DataLength26) { > > + Trb->Adma64Desc[Index].UpperLength =3D (UINT16)(Remaining= =20>> 16); > > + } > > + Trb->Adma64Desc[Index].LowerLength =3D (UINT16)(Remaining &= > > MAX_UINT16); > > + Trb->Adma64Desc[Index].LowerAddress =3D (UINT32)Address; > > + Trb->Adma64Desc[Index].UpperAddress =3D (UINT32)(Address >> = 32); > > + break; > > + } else { > > + Trb->Adma64Desc[Index].Valid =3D 1; > > + Trb->Adma64Desc[Index].Act =3D 2; > > + if (DataLength26) { > > + Trb->Adma64Desc[Index].UpperLength =3D 0; > > + } > > + Trb->Adma64Desc[Index].LowerLength =3D 0; > > + Trb->Adma64Desc[Index].LowerAddress =3D (UINT32)Address; > > + Trb->Adma64Desc[Index].UpperAddress =3D (UINT32)(Address >> = 32); > > + } > > } > > > > - Remaining -=3D ADMA_MAX_DATA_PER_LINE; > > - Address +=3D ADMA_MAX_DATA_PER_LINE; > > + Remaining -=3D AdmaMaxDataPerLine; > > + Address +=3D AdmaMaxDataPerLine; > > } > > > > // > > // Set the last descriptor line as end of descriptor table > > // > > - Trb->AdmaDesc[Index].End =3D 1; > > + AddressingMode64 ? (Trb->Adma64Desc[Index].End =3D 1) : (Trb- > > >Adma32Desc[Index].End =3D 1); > > return EFI_SUCCESS; > > } > > > > @@ -1477,7 +1647,7 @@ SdMmcCreateTrb ( > > Trb->Mode =3D SdMmcNoData; > > } else if (Private->Capability[Slot].Adma2 !=3D 0) { > > Trb->Mode =3D SdMmcAdmaMode; > > - Status =3D BuildAdmaDescTable (Trb); > > + Status =3D BuildAdmaDescTable (Trb,=20 > > + Private->ControllerVersion[Slot]); > > if (EFI_ERROR (Status)) { > > PciIo->Unmap (PciIo, Trb->DataMap); > > goto Error; > > @@ -1523,11 +1693,18 @@ SdMmcFreeTrb ( > > Trb->AdmaMap > > ); > > } > > - if (Trb->AdmaDesc !=3D NULL) { > > + if (Trb->Adma32Desc !=3D NULL) { > > + PciIo->FreeBuffer ( > > + PciIo, > > + Trb->AdmaPages, > > + Trb->Adma32Desc > > + ); > > + } > > + if (Trb->Adma64Desc !=3D NULL) { > > PciIo->FreeBuffer ( > > PciIo, > > Trb->AdmaPages, > > - Trb->AdmaDesc > > + Trb->Adma64Desc > > ); > > } > > if (Trb->DataMap !=3D NULL) { > > @@ -1667,12 +1844,15 @@ SdMmcExecTrb ( > > UINT16 Cmd; > > UINT16 IntStatus; > > UINT32 Argument; > > - UINT16 BlkCount; > > + UINT32 BlkCount; > > UINT16 BlkSize; > > UINT16 TransMode; > > UINT8 HostCtrl1; > > - UINT32 SdmaAddr; > > + UINT64 SdmaAddr; > > UINT64 AdmaAddr; > > + BOOLEAN AddressingMode64; > > + > > + AddressingMode64 =3D FALSE; > > > > Packet =3D Trb->Packet; > > PciIo =3D Trb->Private->PciIo; > > @@ -1705,13 +1885,28 @@ SdMmcExecTrb ( > > > > SdMmcHcLedOnOff (PciIo, Trb->Slot, TRUE); > > > > + if (Private->ControllerVersion[Trb->Slot] >=3D=20 > > + SD_MMC_HC_CTRL_VER_400) > > { > > + Status =3D SdMmcHcCheckMmioSet(PciIo, Trb->Slot, > > SD_MMC_HC_HOST_CTRL2, sizeof(UINT16), > > + =20 > > + SD_MMC_HC_V4_EN|SD_MMC_HC_64_ADDR_EN, > > SD_MMC_HC_V4_EN|SD_MMC_HC_64_ADDR_EN); > > + if (!EFI_ERROR (Status)) { > > + AddressingMode64 =3D TRUE; > > + } > > + } > > + > > if (Trb->Mode =3D=3D SdMmcSdmaMode) { > > - if ((UINT64)(UINTN)Trb->DataPhy >=3D 0x100000000ul) { > > + if ((!AddressingMode64) && > > + ((UINT64)(UINTN)Trb->DataPhy >=3D 0x100000000ul)) { > > return EFI_INVALID_PARAMETER; > > } > > > > - SdmaAddr =3D (UINT32)(UINTN)Trb->DataPhy; > > - Status =3D SdMmcHcRwMmio (PciIo, Trb->Slot, > SD_MMC_HC_SDMA_ADDR, > > FALSE, sizeof (SdmaAddr), &SdmaAddr); > > + SdmaAddr =3D (UINT64)(UINTN)Trb->DataPhy; > > + > > + if (Private->ControllerVersion[Trb->Slot] >=3D > SD_MMC_HC_CTRL_VER_400) > > { > > + Status =3D SdMmcHcRwMmio (PciIo, Trb->Slot, > > SD_MMC_HC_ADMA_SYS_ADDR, FALSE, sizeof (UINT64), &SdmaAddr); > > + } else { > > + Status =3D SdMmcHcRwMmio (PciIo, Trb->Slot, > > SD_MMC_HC_SDMA_ADDR, FALSE, sizeof (UINT32), &SdmaAddr); > > + } > > + > > if (EFI_ERROR (Status)) { > > return Status; > > } > > @@ -1741,9 +1936,13 @@ SdMmcExecTrb ( > > // > > // Calcuate Block Count. > > // > > - BlkCount =3D (UINT16)(Trb->DataLen / Trb->BlockSize); > > + BlkCount =3D (Trb->DataLen / Trb->BlockSize); } if=20 > > + (Private->ControllerVersion[Trb->Slot] >=3D SD_MMC_HC_CTRL_VER_410)= > > { > > + Status =3D SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_SDMA_ADDR,= > > FALSE, sizeof (UINT32), &BlkCount); > > + } else { > > + Status =3D SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_BLK_COUNT,= > > FALSE, sizeof (UINT16), &BlkCount); > > } > > - Status =3D SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_BLK_COUNT,= > > FALSE, sizeof (BlkCount), &BlkCount); > > if (EFI_ERROR (Status)) { > > return Status; > > } > > @@ -1839,7 +2038,7 @@ SdMmcCheckTrbResult ( > > EFI_SD_MMC_PASS_THRU_COMMAND_PACKET *Packet; > > UINT16 IntStatus; > > UINT32 Response[4]; > > - UINT32 SdmaAddr; > > + UINT64 SdmaAddr; > > UINT8 Index; > > UINT8 SwReset; > > UINT32 PioLength; > > @@ -1963,8 +2162,19 @@ SdMmcCheckTrbResult ( > > // > > // Update SDMA Address register. > > // > > - SdmaAddr =3D SD_MMC_SDMA_ROUND_UP ((UINT32)(UINTN)Trb- > > >DataPhy, SD_MMC_SDMA_BOUNDARY); > > - Status =3D SdMmcHcRwMmio ( > > + SdmaAddr =3D SD_MMC_SDMA_ROUND_UP ((UINTN)Trb->DataPhy, > > SD_MMC_SDMA_BOUNDARY); > > + > > + if (Private->ControllerVersion[Trb->Slot] >=3D > SD_MMC_HC_CTRL_VER_400) > > { > > + Status =3D SdMmcHcRwMmio ( > > + Private->PciIo, > > + Trb->Slot, > > + SD_MMC_HC_ADMA_SYS_ADDR, > > + FALSE, > > + sizeof (UINT64), > > + &SdmaAddr > > + ); > > + } else { > > + Status =3D SdMmcHcRwMmio ( > > Private->PciIo, > > Trb->Slot, > > SD_MMC_HC_SDMA_ADDR, @@ -1972,10 +2182,12 @@=20 > > SdMmcCheckTrbResult ( > > sizeof (UINT32), > > &SdmaAddr > > ); > > + } > > + > > if (EFI_ERROR (Status)) { > > goto Done; > > } > > - Trb->DataPhy =3D (UINT32)(UINTN)SdmaAddr; > > + Trb->DataPhy =3D (UINT64)(UINTN)SdmaAddr; > > } > > > > if ((Packet->SdMmcCmdBlk->CommandType !=3D > SdMmcCommandTypeAdtc) > > && > > diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.h > > b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.h > > index dd45cbd..d157f2c 100644 > > --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.h > > +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.h > > @@ -2,6 +2,7 @@ > > > > Provides some data structure definitions used by the SD/MMC host=20 > > controller driver. > > > > +Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. > > Copyright (c) 2015, Intel Corporation. All rights reserved.
=20 > > This program and the accompanying materials are licensed and made=20 > > available under the terms and conditions of the > BSD > > License > > @@ -91,18 +92,38 @@ typedef enum { > > // > > // The maximum data length of each descriptor line // > > -#define ADMA_MAX_DATA_PER_LINE 0x10000 > > +#define ADMA_MAX_DATA_PER_LINE_16B SIZE_64KB > > +#define ADMA_MAX_DATA_PER_LINE_26B SIZE_64MB > > > > +// > > +// ADMA descriptor for 32b addressing. > > +// > > typedef struct { > > UINT32 Valid:1; > > UINT32 End:1; > > UINT32 Int:1; > > UINT32 Reserved:1; > > UINT32 Act:2; > > - UINT32 Reserved1:10; > > - UINT32 Length:16; > > + UINT32 UpperLength:10; > > + UINT32 LowerLength:16; > > UINT32 Address; > > -} SD_MMC_HC_ADMA_DESC_LINE; > > +} SD_MMC_HC_ADMA_32_DESC_LINE; > > + > > +// > > +// ADMA descriptor for 64b addressing. > > +// > > +typedef struct { > > + UINT32 Valid:1; > > + UINT32 End:1; > > + UINT32 Int:1; > > + UINT32 Reserved:1; > > + UINT32 Act:2; > > + UINT32 UpperLength:10; > > + UINT32 LowerLength:16; > > + UINT32 LowerAddress; > > + UINT32 UpperAddress; > > + UINT32 Reserved1; > > +} SD_MMC_HC_ADMA_64_DESC_LINE; > > > > #define SD_MMC_SDMA_BOUNDARY 512 * 1024 > > #define SD_MMC_SDMA_ROUND_UP(x, n) (((x) + n) & ~(n - 1)) > > @@ -129,36 +150,43 @@ typedef struct { > > UINT32 Voltage33:1; // bit 24 > > UINT32 Voltage30:1; // bit 25 > > UINT32 Voltage18:1; // bit 26 > > - UINT32 Reserved3:1; // bit 27 > > - UINT32 SysBus64:1; // bit 28 > > + UINT32 SysBus64V4:1; // bit 27 > > + UINT32 SysBus64V3:1; // bit 28 > > UINT32 AsyncInt:1; // bit 29 > > UINT32 SlotType:2; // bit 30:31 > > UINT32 Sdr50:1; // bit 32 > > UINT32 Sdr104:1; // bit 33 > > UINT32 Ddr50:1; // bit 34 > > - UINT32 Reserved4:1; // bit 35 > > + UINT32 Reserved3:1; // bit 35 > > UINT32 DriverTypeA:1; // bit 36 > > UINT32 DriverTypeC:1; // bit 37 > > UINT32 DriverTypeD:1; // bit 38 > > UINT32 DriverType4:1; // bit 39 > > UINT32 TimerCount:4; // bit 40:43 > > - UINT32 Reserved5:1; // bit 44 > > + UINT32 Reserved4:1; // bit 44 > > UINT32 TuningSDR50:1; // bit 45 > > UINT32 RetuningMod:2; // bit 46:47 > > UINT32 ClkMultiplier:8; // bit 48:55 > > - UINT32 Reserved6:7; // bit 56:62 > > + UINT32 Reserved5:7; // bit 56:62 > > UINT32 Hs400:1; // bit 63 > > } SD_MMC_HC_SLOT_CAP; > > > > // > > // SD Host controller version > > // > > -#define SD_MMC_HC_CTRL_VER_100 0x00 > > -#define SD_MMC_HC_CTRL_VER_200 0x01 > > -#define SD_MMC_HC_CTRL_VER_300 0x02 > > -#define SD_MMC_HC_CTRL_VER_400 0x03 > > -#define SD_MMC_HC_CTRL_VER_410 0x04 > > -#define SD_MMC_HC_CTRL_VER_420 0x05 > > +#define SD_MMC_HC_CTRL_VER_100 0x00 > > +#define SD_MMC_HC_CTRL_VER_200 0x01 > > +#define SD_MMC_HC_CTRL_VER_300 0x02 > > +#define SD_MMC_HC_CTRL_VER_400 0x03 > > +#define SD_MMC_HC_CTRL_VER_410 0x04 > > +#define SD_MMC_HC_CTRL_VER_420 0x05 > > + > > +// > > +// SD Host controller V4 enhancements // > > +#define SD_MMC_HC_V4_EN BIT12 > > +#define SD_MMC_HC_64_ADDR_EN BIT13 > > +#define SD_MMC_HC_26_DATA_LEN_ADMA_EN BIT10 > > > > /** > > Dump the content of SD/MMC host controller's Capability Register. > > @@ -323,6 +351,24 @@ SdMmcHcWaitMmioSet ( > > ); > > > > /** > > + Get the controller version information from the specified slot. > > + > > + @param[in] PciIo The PCI IO protocol instance. > > + @param[in] Slot The slot number of the SD card to send= =20the > > command to. > > + @param[out] Version The buffer to store the version inform= ation. > > + > > + @retval EFI_SUCCESS The operation executes successfully. > > + @retval Others The operation fails. > > + > > +**/ > > +EFI_STATUS > > +SdMmcHcGetControllerVersion ( > > + IN EFI_PCI_IO_PROTOCOL *PciIo, > > + IN UINT8 Slot, > > + OUT UINT16 *Version > > + ); > > + > > +/** > > Set all interrupt status bits in Normal and Error Interrupt Status= =20Enable > > register. > > > > @@ -424,6 +470,7 @@ SdMmcHcStopClock ( > > @param[in] Slot The slot number of the SD card to send t= he > command > > to. > > @param[in] ClockFreq The max clock frequency to be set. The u= nit is > KHz. > > @param[in] BaseClkFreq The base clock frequency of host control= ler in > > MHz. > > + @param[in] ControllerVer The version of host controller. > > > > @retval EFI_SUCCESS The clock is supplied successfully. > > @retval Others The clock isn't supplied successfully. > > @@ -434,7 +481,8 @@ SdMmcHcClockSupply ( > > IN EFI_PCI_IO_PROTOCOL *PciIo, > > IN UINT8 Slot, > > IN UINT64 ClockFreq, > > - IN UINT32 BaseClkFreq > > + IN UINT32 BaseClkFreq, > > + IN UINT16 ControllerVer > > ); > > > > /** > > @@ -483,6 +531,7 @@ SdMmcHcSetBusWidth ( > > @param[in] PciIo The PCI IO protocol instance. > > @param[in] Slot The slot number of the SD card to send t= he > command > > to. > > @param[in] BaseClkFreq The base clock frequency of host control= ler in > > MHz. > > + @param[in] ControllerVer The version of host controller. > > > > @retval EFI_SUCCESS The clock is supplied successfully. > > @retval Others The clock isn't supplied successfully. > > @@ -492,7 +541,8 @@ EFI_STATUS > > SdMmcHcInitClockFreq ( > > IN EFI_PCI_IO_PROTOCOL *PciIo, > > IN UINT8 Slot, > > - IN UINT32 BaseClkFreq > > + IN UINT32 BaseClkFreq, > > + IN UINT16 ControllerVer > > ); > > > > /** > > -- > > 2.7.4 > > > > _______________________________________________ > > edk2-devel mailing list > > edk2-devel@lists.01.org > > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel -------------------------------------------------------------------------= ---------- This email message is for the sole use of the intended recipient(s) and m= ay contain confidential information. Any unauthorized review, use, disclosure or di= stribution is prohibited. If you are not the intended recipient, please contact the= =20sender by reply email and destroy all copies of the original message. -------------------------------------------------------------------------= ----------