From nobody Wed Dec 25 13:54:50 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 1510322354666117.96533148872152; Fri, 10 Nov 2017 05:59:14 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 74CD02035521F; Fri, 10 Nov 2017 05:55:08 -0800 (PST) Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 9D21621B00DC5 for ; Fri, 10 Nov 2017 05:55:06 -0800 (PST) Received: by mail-wm0-x241.google.com with SMTP id g141so2914526wmg.2 for ; Fri, 10 Nov 2017 05:59:09 -0800 (PST) Received: from localhost.localdomain ([160.167.170.128]) by smtp.gmail.com with ESMTPSA id d125sm769726wmd.2.2017.11.10.05.59.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Nov 2017 05:59:07 -0800 (PST) X-Original-To: edk2-devel@lists.01.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; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c09::241; helo=mail-wm0-x241.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ODvyVYqEoni6KNczEty9ken5ASiYEGjLYWxBlPw8cKM=; b=ia7tvzpPllFeGHpoSoJ+mkqUkp3vqVQMVaaRkRDOda0Op+rIi9Ps6ZDZ4Xjed3/14Z UrCDiD3KSbVWRbWT9w+59c+Jz/ShWClxfFBEkFR+nZ2FlycYNJ9Ru+oqfTczxO6HjiPS bhcT67EMZ0JQaOhQDqQjZTQoNw5YVYZyCYQhA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ODvyVYqEoni6KNczEty9ken5ASiYEGjLYWxBlPw8cKM=; b=rhCaULn32CPNUCgvqFlP5xrblG+qe4Va70CQOK6GOzvA7sFIp4WP+jDH4fHU19Lohk /qVdHINOC3eXV+PIADQtukz6WJsXhLwJ3zSolJ7iwWwdS+I4paMdpALC2QafWra7Jfnd 5pr4k3Eq9h0Heo+VJv1mGho0dUloDMMrlg3F89rN47JBxbBrShJ5fIQ/0dbOl4nY1/zr hmn8LP4BBecQNmYbg98Z+mrNjsAHJkFMv3OA8L+qjm0GZcjq+NYVWcDAGd7yn+w+QaEx ZUgBi12NFMmDAXbS7vd9fRAVnNCtGVEXOgY80lJtDN7vig21gURT9H1jOPS/nmXuyVtn Ex+A== X-Gm-Message-State: AJaThX6v4IkXwUyuuyeY9KJb6cWM/tuZldXK1yEKSQDlRsIK3E90wqjX QXgHSDsjAMJSKWMdVBjcGzofHabM4vE= X-Google-Smtp-Source: AGs4zMZuL5kI1yT23vb2rf26aLGO+d19GFsrWq25DCF0Xf//RnSz2WkIwibwJLRql368/F2PBKEYZA== X-Received: by 10.28.58.81 with SMTP id h78mr347913wma.10.1510322347932; Fri, 10 Nov 2017 05:59:07 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org, michael.d.kinney@intel.com Date: Fri, 10 Nov 2017 13:58:47 +0000 Message-Id: <20171110135847.361-3-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171110135847.361-1-ard.biesheuvel@linaro.org> References: <20171110135847.361-1-ard.biesheuvel@linaro.org> Subject: [edk2] [RFC PATCH 2/2] MdeModulePkg/SdMmcPciHcDxe: allow HC capabilities to be overridden 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: feng.tian@intel.com, Ard Biesheuvel , star.zeng@intel.com, liming.gao@intel.com, eric.dong@intel.com MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Invoke the newly introduced SD/MMC override protocol to override the capabilities register after reading it from the device registers, and to call the pre/post host init and reset hooks at the appropriate times. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c | 111 +++++++++++++++= ++++- MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h | 6 ++ MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf | 2 + 3 files changed, 114 insertions(+), 5 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c b/MdeModule= Pkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c index 0be8828abfcc..d328e9f867c4 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c @@ -60,7 +60,8 @@ SD_MMC_HC_PRIVATE_DATA gSdMmcPciHcTemplate =3D { { // MaxCurrent 0, }, - 0 // ControllerVersion + 0, // ControllerVersion + NULL // Override }; =20 SD_DEVICE_PATH mSdDpTemplate =3D { @@ -213,6 +214,88 @@ Done: return; } =20 +STATIC +EFI_STATUS +SdMmcPciHcResetHost ( + IN SD_MMC_HC_PRIVATE_DATA *Private, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + + if (Private->Override !=3D NULL && + Private->Override->InvokeHook !=3D NULL) { + Status =3D Private->Override->InvokeHook ( + Private->ControllerHandle, + Slot, + SD_MMC_OVERRIDE_RESET_PRE_HOOK); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: SD/MMC pre reset hook failed - %r\n", + __FUNCTION__, Status)); + return Status; + } + } + + Status =3D SdMmcHcReset (Private->PciIo, Slot); + if (EFI_ERROR (Status)) { + return Status; + } + + if (Private->Override !=3D NULL && + Private->Override->InvokeHook !=3D NULL) { + Status =3D Private->Override->InvokeHook ( + Private->ControllerHandle, + Slot, + SD_MMC_OVERRIDE_RESET_POST_HOOK); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: SD/MMC post reset hook failed - %r\n", + __FUNCTION__, Status)); + } + } + return Status; +} + +STATIC +EFI_STATUS +SdMmcPciHcInitHost ( + IN SD_MMC_HC_PRIVATE_DATA *Private, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + + if (Private->Override !=3D NULL && + Private->Override->InvokeHook !=3D NULL) { + Status =3D Private->Override->InvokeHook ( + Private->ControllerHandle, + Slot, + SD_MMC_OVERRIDE_INIT_HOST_PRE_HOOK); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: SD/MMC pre init hook failed - %r\n", + __FUNCTION__, Status)); + return Status; + } + } + + Status =3D SdMmcHcInitHost (Private->PciIo, Slot, Private->Capability[Sl= ot]); + if (EFI_ERROR (Status)) { + return Status; + } + + if (Private->Override !=3D NULL && + Private->Override->InvokeHook !=3D NULL) { + Status =3D Private->Override->InvokeHook ( + Private->ControllerHandle, + Slot, + SD_MMC_OVERRIDE_INIT_HOST_POST_HOOK); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: SD/MMC post init hook failed - %r\n", + __FUNCTION__, Status)); + } + } + return Status; +} + /** Sd removable device enumeration callback function when the timer event i= s signaled. =20 @@ -281,14 +364,14 @@ SdMmcPciHcEnumerateDevice ( // // Reset the specified slot of the SD/MMC Pci Host Controller // - Status =3D SdMmcHcReset (Private->PciIo, Slot); + Status =3D SdMmcPciHcResetHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } // // Reinitialize slot and restart identification process for the ne= w attached device // - Status =3D SdMmcHcInitHost (Private->PciIo, Slot, Private->Capabil= ity[Slot]); + Status =3D SdMmcPciHcInitHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } @@ -601,6 +684,12 @@ SdMmcPciHcDriverBindingStart ( goto Done; } =20 + Status =3D gBS->HandleProtocol (Controller, &gEdkiiSdMmcOverrideProtocol= Guid, + (VOID **)&Private->Override); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "%a: using SD/MMC override protocol\n", __FUNCTION= __)); + } + Support64BitDma =3D TRUE; for (Slot =3D FirstBar; Slot < (FirstBar + SlotNum); Slot++) { Private->Slot[Slot].Enable =3D TRUE; @@ -609,6 +698,18 @@ SdMmcPciHcDriverBindingStart ( if (EFI_ERROR (Status)) { continue; } + if (Private->Override !=3D NULL && + Private->Override->OverrideCapability !=3D NULL) { + Status =3D Private->Override->OverrideCapability ( + Controller, + Slot, + &Private->Capability[Slot]); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: Failed to override capability - %r\n", + __FUNCTION__, Status)); + continue; + } + } DumpCapabilityReg (Slot, &Private->Capability[Slot]); =20 Support64BitDma &=3D Private->Capability[Slot].SysBus64; @@ -627,7 +728,7 @@ SdMmcPciHcDriverBindingStart ( // // Reset the specified slot of the SD/MMC Pci Host Controller // - Status =3D SdMmcHcReset (PciIo, Slot); + Status =3D SdMmcPciHcResetHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } @@ -642,7 +743,7 @@ SdMmcPciHcDriverBindingStart ( continue; } =20 - Status =3D SdMmcHcInitHost (PciIo, Slot, Private->Capability[Slot]); + Status =3D SdMmcPciHcInitHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h b/MdeModule= Pkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h index 6a2a27969936..b51e0529f885 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h @@ -35,6 +35,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER= EXPRESS OR IMPLIED. #include #include #include +#include #include =20 #include "SdMmcPciHci.h" @@ -115,6 +116,11 @@ typedef struct { UINT64 MaxCurrent[SD_MMC_HC_MAX_SLOT]; =20 UINT32 ControllerVersion; + + // + // Optional protocol to deal with non-standard SDHCI implementations + // + SD_MMC_OVERRIDE *Override; } SD_MMC_HC_PRIVATE_DATA; =20 #define SD_MMC_HC_TRB_SIG SIGNATURE_32 ('T', 'R', 'B', 'T') diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf b/MdeModu= lePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf index e26e6a098c17..154ce45d8223 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf @@ -48,6 +48,7 @@ [Sources] =20 [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec =20 [LibraryClasses] DevicePathLib @@ -61,6 +62,7 @@ [LibraryClasses] DebugLib =20 [Protocols] + gEdkiiSdMmcOverrideProtocolGuid ## SOMETIMES_CONSUMES gEfiDevicePathProtocolGuid ## TO_START gEfiPciIoProtocolGuid ## TO_START gEfiSdMmcPassThruProtocolGuid ## BY_START --=20 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel