From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::244; helo=mail-wr0-x244.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) (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 4798921A1099A for ; Thu, 30 Nov 2017 02:07:33 -0800 (PST) Received: by mail-wr0-x244.google.com with SMTP id g53so6012009wra.2 for ; Thu, 30 Nov 2017 02:11:58 -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=Cz/hD6vM+NVrKan1ZdJzrsccC8fIkAgC4GQTGh1SaZE=; b=YReRF2dxvZBtnoL78d77uRu2yODDfk25K+xFultcdU7ujWMs5ja3/hADGWpOmLkqFv 0L/lSpoDVbbiVylkrKPiPrjDjBenzM7qEWoryEH9fciH0eewSvqDsN8d89+7qUOegg9K 0jMEn4mwZuDmLuQ17vz86c/H2EAxHaHeZOScY= 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=Cz/hD6vM+NVrKan1ZdJzrsccC8fIkAgC4GQTGh1SaZE=; b=G/eZKElYfcUkDIIEBEFTaZUJNTZE4L9mdRvMyI+AgYAespMRGhFVOd7GHQJsUVsqbO KZBcjwY63EW8BYxg8272PsyG4vxeskc/0hS3ArzUR7towgsphm8s3TWPHRoSq+yCsrPq mrBLu49BJ4LNK/O4i8MSfS3lLKXAIivrhTpPRRWwTJDUjRnJVSBEgBfyYq5yyHar0Yli GlK9MU+Cn4LsiN2HpcGVGNIYQZfwLPKQGBRko3UkJimoug5nOxvvZ/6Di38qwPmbTE1v my7f9y4kupg/3skeuREqm9wJ1hTbEEca0G/awydBWjPdAMnvkuZZal11pu9jfTJ/y5ve GTHw== X-Gm-Message-State: AJaThX6k6ZVmaLkEC+J2wKWof0ierYtInf108K8SLyCS9l9pcCI2SkQq s+vsGpI5UceEQTgCDNoO2yW+JOuLZ3Y= X-Google-Smtp-Source: AGs4zMZ2MKpX1a0tQO73ZJTF+qgk6kbDLnIkOnLtxy7GbL3F82rt8wA5VC7Iem9lzftNUrfXwASkRA== X-Received: by 10.223.169.100 with SMTP id u91mr1396929wrc.108.1512036707928; Thu, 30 Nov 2017 02:11:47 -0800 (PST) Received: from localhost.localdomain ([105.150.171.234]) by smtp.gmail.com with ESMTPSA id z108sm6572353wrb.67.2017.11.30.02.11.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 30 Nov 2017 02:11:47 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Cc: leif.lindholm@linaro.org, star.zeng@intel.com, hao.a.wu@intel.com, feng.tian@intel.com, Ard Biesheuvel Date: Thu, 30 Nov 2017 10:11:32 +0000 Message-Id: <20171130101132.18317-3-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171130101132.18317-1-ard.biesheuvel@linaro.org> References: <20171130101132.18317-1-ard.biesheuvel@linaro.org> Subject: [PATCH v2 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: , X-List-Received-Date: Thu, 30 Nov 2017 10:07:33 -0000 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 | 116 +++++++++++++++++++- MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.h | 6 + MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.inf | 2 + 3 files changed, 119 insertions(+), 5 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c index 0be8828abfcc..61f64285807d 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 = { { // MaxCurrent 0, }, - 0 // ControllerVersion + 0, // ControllerVersion + NULL // Override }; SD_DEVICE_PATH mSdDpTemplate = { @@ -213,6 +214,92 @@ Done: return; } +STATIC +EFI_STATUS +SdMmcPciHcResetHost ( + IN SD_MMC_HC_PRIVATE_DATA *Private, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + + if (Private->Override != NULL && + Private->Override->InvokeHook != NULL) { + Status = Private->Override->InvokeHook ( + &Private->PassThru, + 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 = SdMmcHcReset (Private->PciIo, Slot); + if (EFI_ERROR (Status)) { + return Status; + } + + if (Private->Override != NULL && + Private->Override->InvokeHook != NULL) { + Status = Private->Override->InvokeHook ( + &Private->PassThru, + 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 != NULL && + Private->Override->InvokeHook != NULL) { + Status = Private->Override->InvokeHook ( + &Private->PassThru, + 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 = SdMmcHcInitHost (Private->PciIo, Slot, Private->Capability[Slot]); + if (EFI_ERROR (Status)) { + return Status; + } + + if (Private->Override != NULL && + Private->Override->InvokeHook != NULL) { + Status = Private->Override->InvokeHook ( + &Private->PassThru, + 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 is signaled. @@ -281,14 +368,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 +688,12 @@ SdMmcPciHcDriverBindingStart ( goto Done; } + Status = gBS->HandleProtocol (Controller, &gEdkiiSdMmcOverrideProtocolGuid, + (VOID **)&Private->Override); + if (!EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "%a: using SD/MMC override protocol\n", __FUNCTION__)); + } + Support64BitDma = TRUE; for (Slot = FirstBar; Slot < (FirstBar + SlotNum); Slot++) { Private->Slot[Slot].Enable = TRUE; @@ -609,6 +702,19 @@ SdMmcPciHcDriverBindingStart ( if (EFI_ERROR (Status)) { continue; } + if (Private->Override != NULL && + Private->Override->OverrideCapability != NULL) { + Status = Private->Override->OverrideCapability ( + &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 +733,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 +748,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..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 #include "SdMmcPciHci.h" @@ -115,6 +116,11 @@ typedef struct { UINT64 MaxCurrent[SD_MMC_HC_MAX_SLOT]; UINT32 ControllerVersion; + + // + // Optional protcol to deal with non-standard SDHCI implementations + // + SD_MMC_OVERRIDE *Override; } SD_MMC_HC_PRIVATE_DATA; #define SD_MMC_HC_TRB_SIG SIGNATURE_32 ('T', 'R', 'B', 'T') 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 -- 2.11.0