From patchwork Tue Dec 5 18:01:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 120733 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp6059296qgn; Tue, 5 Dec 2017 10:02:20 -0800 (PST) X-Google-Smtp-Source: AGs4zMZ+kv/FW2HOqM5sFjO6JgOTvZa1etxJf7cwp6H6wmdRpKwJDJ4TtlmL6+sw/rZM0Y8Eh/OY X-Received: by 10.84.233.72 with SMTP id k8mr18839342plt.420.1512496940846; Tue, 05 Dec 2017 10:02:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512496940; cv=none; d=google.com; s=arc-20160816; b=jNyiZLsKQLpY11ONfipLTRoLC/TVTxFWp5+VOMMbsXDnXGpIakFMc4Oy8wRFxPm7EQ k8pbV/J7XMm6lBWOPjPUc1qEt6qbQKJKKyjYZzmUB2ppBgqz10CLmoMIZe5pioKToIX5 rHW+8tTGqPern07QAYIVMSA4QUp+EY/VEEkNTMODv+sOKkxZ9XJHnaPaYrLaBCuo8mHn 7tn31lUZN9QraBlpxVJSzbYOy00NrpbqW69BsZbDFPrsFGPREOFQJIpANKiqwkN4HctA BEA6ANcHkxQrkPkB/uNF+1LHdty9ioSft9jBLXEFSUsGd3tKwY+hhnT65/r23OSn91Bq f95Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=6me4MRvvuIoqXYumjC/eUzW2IPUxlVbXhlDw2NzHinQ=; b=xG09MQaci/KexyJKcXcnkP/GqhJ0fsq0btwP2EMKoU4GaNs7ad8q8gZDsarLLQdPy0 bE2P1z1qhaDB/VzekYeeogMVYS8tAhTPv8G844ccP6nA5TqyrZpus6syElNL06+EG10C 9k6E9oaAdjOgfj2IpB1A/TWgYq6KCM+d2qI/M6RP3wlyxKECGIHeIoqH6TX007L/rxrZ GkeTL9jwGb64ytgvw2duNYyCFMsOsj3ImrgaIOsXRTw8lSjZPofALfK5NujtBRNsnNDH qRaj9LlPLgE5eak4Xp1YWCjKC1kyteJglwUIbSH+TXTpmStRz+/as0usHR3/kgNoNaIm R8zw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=NrzotQbm; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id f11si392731pgq.406.2017.12.05.10.02.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Dec 2017 10:02:20 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=NrzotQbm; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 2A0D72218E927; Tue, 5 Dec 2017 09:57:49 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::241; helo=mail-wr0-x241.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::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 335252218E924 for ; Tue, 5 Dec 2017 09:57:48 -0800 (PST) Received: by mail-wr0-x241.google.com with SMTP id s66so1246366wrc.9 for ; Tue, 05 Dec 2017 10:02:19 -0800 (PST) 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=AC76UA7PaB4RO+SsZFFh8BrKcb4vlFJ+7SVC2EqJz4c=; b=NrzotQbmsdTaV+QTt3bfEH5IP8ahCoSeGOmcsKJk2A1btPltZOe7p13NqVQKUhSJ46 eIy0R7aTaTPQHVeLi90Lh87pk15leuv+ogwn3aqxTbmmJ5j0iUtzNfaQQxj4UjjlC2Sr hICB4UFEHcHQAeYTlCA4gC47phRNTX+YGMcus= 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=AC76UA7PaB4RO+SsZFFh8BrKcb4vlFJ+7SVC2EqJz4c=; b=elAJyoVPLMkgz8gy1u28gJ5iOFzWb5Rf6ZfTYNeK4aLm1QQzW7hdrHM4f6xU4EDrS3 tGZJ6RgQ3lvIv/2cJMeSTbTbpIWTSCgcwgpWEAG7+I1ZN8x0Z0ZfH5ITnrqhfPtMwXU8 38HIK6tk1DgN9Pk/CGnL4C2EY8Huo2iYbdUl+Ds1ZL6nbBCXnZHY39IzRfJDvkj6Bs45 NLxXY7j9hJv1eVuo8k2z8EzLpP722ePTPlN1mvoHmzDC4rC++ZR+Ekaj0ehWhMMuxvbz DioIuW7geC4WV14rpPwky8oaeThVz9IfHNdy5OnoxSL04vDnDbDXzeU/PYOVbqxTXoxw IiWg== X-Gm-Message-State: AJaThX7qMBFrew+qJIwvPsdgis2Lg108ESo45wVUtZpOSiNX9ijJDeUz CucytieYPqvyOKnk2p+aOWCxLnQzn90= X-Received: by 10.223.184.197 with SMTP id c5mr16329018wrg.18.1512496937669; Tue, 05 Dec 2017 10:02:17 -0800 (PST) Received: from localhost.localdomain ([105.150.171.234]) by smtp.gmail.com with ESMTPSA id 43sm735403wru.81.2017.12.05.10.02.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Dec 2017 10:02:12 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Tue, 5 Dec 2017 18:01:52 +0000 Message-Id: <20171205180152.15758-3-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171205180152.15758-1-ard.biesheuvel@linaro.org> References: <20171205180152.15758-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH v3 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: ruiyu.ni@intel.com, feng.tian@intel.com, Ard Biesheuvel , hao.a.wu@intel.com, leif.lindholm@linaro.org, michael.d.kinney@intel.com, star.zeng@intel.com MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" 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 | 134 +++++++++++++++++++- MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h | 1 + MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf | 2 + 3 files changed, 133 insertions(+), 4 deletions(-) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c index 0be8828abfcc..f1ea78de809e 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c @@ -17,6 +17,8 @@ #include "SdMmcPciHcDxe.h" +STATIC EDKII_SD_MMC_OVERRIDE *mOverride; + // // Driver Global Variables // @@ -214,6 +216,104 @@ Done: } /** + Execute a SD/MMC host controller reset + + @param[in] Private A pointer to the SD_MMC_HC_PRIVATE_DATA instance. + @param[in] Slot The slot number of the host controller to reset. +**/ +STATIC +EFI_STATUS +SdMmcPciHcResetHost ( + IN SD_MMC_HC_PRIVATE_DATA *Private, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + + if (mOverride != NULL && mOverride->NotifyPhase != NULL) { + Status = mOverride->NotifyPhase ( + &Private->PassThru, + Private->ControllerHandle, + Slot, + EdkiiSdMmcResetPre); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: SD/MMC pre reset notifier callback failed - %r\n", + __FUNCTION__, Status)); + return Status; + } + } + + Status = SdMmcHcReset (Private->PciIo, Slot); + if (EFI_ERROR (Status)) { + return Status; + } + + if (mOverride != NULL && mOverride->NotifyPhase != NULL) { + Status = mOverride->NotifyPhase ( + &Private->PassThru, + Private->ControllerHandle, + Slot, + EdkiiSdMmcResetPost); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: SD/MMC post reset notifier callback failed - %r\n", + __FUNCTION__, Status)); + } + } + return Status; +} + +/** + Initialize a SD/MMC host controller + + @param[in] Private A pointer to the SD_MMC_HC_PRIVATE_DATA instance. + @param[in] Slot The slot number of the host controller to initialize. +**/ +STATIC +EFI_STATUS +SdMmcPciHcInitHost ( + IN SD_MMC_HC_PRIVATE_DATA *Private, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + + if (mOverride != NULL && mOverride->NotifyPhase != NULL) { + Status = mOverride->NotifyPhase ( + &Private->PassThru, + Private->ControllerHandle, + Slot, + EdkiiSdMmcInitHostPre); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: SD/MMC pre init notifier callback failed - %r\n", + __FUNCTION__, Status)); + return Status; + } + } + + Status = SdMmcHcInitHost (Private->PciIo, Slot, Private->Capability[Slot]); + if (EFI_ERROR (Status)) { + return Status; + } + + if (mOverride != NULL && mOverride->NotifyPhase != NULL) { + Status = mOverride->NotifyPhase ( + &Private->PassThru, + Private->ControllerHandle, + Slot, + EdkiiSdMmcInitHostPost); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, + "%a: SD/MMC post init notifier callback failed - %r\n", + __FUNCTION__, Status)); + } + } + return Status; +} + +/** Sd removable device enumeration callback function when the timer event is signaled. @param[in] Event The Event this notify function registered to. @@ -281,14 +381,14 @@ SdMmcPciHcEnumerateDevice ( // // Reset the specified slot of the SD/MMC Pci Host Controller // - Status = SdMmcHcReset (Private->PciIo, Slot); + Status = SdMmcPciHcResetHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } // // Reinitialize slot and restart identification process for the new attached device // - Status = SdMmcHcInitHost (Private->PciIo, Slot, Private->Capability[Slot]); + Status = SdMmcPciHcInitHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } @@ -601,6 +701,20 @@ SdMmcPciHcDriverBindingStart ( goto Done; } + // + // Attempt to locate the singleton instance of the SD/MMC override protocol, + // which implements platform specific workarounds for non-standard SDHCI + // implementations. + // + if (mOverride == NULL) { + Status = gBS->HandleProtocol (Controller, &gEdkiiSdMmcOverrideProtocolGuid, + (VOID **)&mOverride); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "%a: found SD/MMC override protocol\n", + __FUNCTION__)); + } + } + Support64BitDma = TRUE; for (Slot = FirstBar; Slot < (FirstBar + SlotNum); Slot++) { Private->Slot[Slot].Enable = TRUE; @@ -609,6 +723,18 @@ SdMmcPciHcDriverBindingStart ( if (EFI_ERROR (Status)) { continue; } + if (mOverride != NULL && mOverride->Capability != NULL) { + Status = mOverride->Capability ( + &Private->PassThru, + Controller, + Slot, + (VOID *)&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]); Support64BitDma &= Private->Capability[Slot].SysBus64; @@ -627,7 +753,7 @@ SdMmcPciHcDriverBindingStart ( // // Reset the specified slot of the SD/MMC Pci Host Controller // - Status = SdMmcHcReset (PciIo, Slot); + Status = SdMmcPciHcResetHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } @@ -642,7 +768,7 @@ SdMmcPciHcDriverBindingStart ( continue; } - Status = SdMmcHcInitHost (PciIo, Slot, Private->Capability[Slot]); + Status = SdMmcPciHcInitHost (Private, Slot); if (EFI_ERROR (Status)) { continue; } diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h index 6a2a27969936..8830cd437edd 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 #include "SdMmcPciHci.h" diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf b/MdeModulePkg/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] [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec [LibraryClasses] DevicePathLib @@ -61,6 +62,7 @@ [LibraryClasses] DebugLib [Protocols] + gEdkiiSdMmcOverrideProtocolGuid ## SOMETIMES_CONSUMES gEfiDevicePathProtocolGuid ## TO_START gEfiPciIoProtocolGuid ## TO_START gEfiSdMmcPassThruProtocolGuid ## BY_START