* [PATCH v2 edk-platforms 0/3] enable eMMC/SD controller on HiKey @ 2018-08-16 1:49 Haojian Zhuang 2018-08-16 1:49 ` [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition Haojian Zhuang ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Haojian Zhuang @ 2018-08-16 1:49 UTC (permalink / raw) To: edk2-devel Changelog: v2: * Add more comments in the patch of fixing LDO9_VSET. v1: * Enable eMMC/SD driver on HiKey. * Enable SD driver on HiKey960. Haojian Zhuang (3): Silicon/Hi3660: fix LDO9_VSET register definition Platform/HiKey960: enable SD controller Platform/HiKey: enable SD/MMC controller on HiKey Platform/Hisilicon/HiKey/HiKey.dsc | 17 +-- Platform/Hisilicon/HiKey960/HiKey960.dsc | 8 ++ Platform/Hisilicon/HiKey/HiKey.fdf | 15 ++- Platform/Hisilicon/HiKey960/HiKey960.fdf | 8 ++ Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf | 1 + Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf | 45 +++++++ Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf | 1 + Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf | 46 +++++++ Silicon/Hisilicon/Hi3660/Include/Hi3660.h | 2 +- Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c | 26 ++++ Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c | 139 ++++++++++++++++++++ Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c | 15 +++ Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c | 125 ++++++++++++++++++ 13 files changed, 431 insertions(+), 17 deletions(-) create mode 100644 Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf create mode 100644 Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf create mode 100644 Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c create mode 100644 Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> -- 2.7.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition 2018-08-16 1:49 [PATCH v2 edk-platforms 0/3] enable eMMC/SD controller on HiKey Haojian Zhuang @ 2018-08-16 1:49 ` Haojian Zhuang 2018-08-16 9:23 ` Leif Lindholm 2018-08-16 1:49 ` [PATCH v2 edk-platforms 2/3] Platform/HiKey960: enable SD controller Haojian Zhuang 2018-08-16 1:49 ` [PATCH v2 edk-platforms 3/3] Platform/HiKey: enable SD/MMC controller on HiKey Haojian Zhuang 2 siblings, 1 reply; 7+ messages in thread From: Haojian Zhuang @ 2018-08-16 1:49 UTC (permalink / raw) To: edk2-devel Fix the LDO9_VSET register definition in PMIC. LDO9 is used by Designware SD controller. Without this fix, SD controller fails to operate SD card since lack of right voltage setting. Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> --- Silicon/Hisilicon/Hi3660/Include/Hi3660.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Silicon/Hisilicon/Hi3660/Include/Hi3660.h b/Silicon/Hisilicon/Hi3660/Include/Hi3660.h index 5fbf32267657..6e0587f7783a 100644 --- a/Silicon/Hisilicon/Hi3660/Include/Hi3660.h +++ b/Silicon/Hisilicon/Hi3660/Include/Hi3660.h @@ -58,7 +58,7 @@ #define USB3OTG_PHY_CR_CAP_ADDR (1 << 0) #define PMU_REG_BASE 0xFFF34000 -#define PMIC_LDO9_VSET_REG (PMU_REG_BASE + (0x068 << 2)) +#define PMIC_LDO9_VSET_REG (PMU_REG_BASE + (0x06b << 2)) #define LDO9_VSET_MASK (7 << 0) #define PMIC_LDO16_ONOFF_ECO_REG (PMU_REG_BASE + (0x078 << 2)) -- 2.7.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition 2018-08-16 1:49 ` [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition Haojian Zhuang @ 2018-08-16 9:23 ` Leif Lindholm 0 siblings, 0 replies; 7+ messages in thread From: Leif Lindholm @ 2018-08-16 9:23 UTC (permalink / raw) To: Haojian Zhuang; +Cc: edk2-devel, Ard Biesheuvel On Thu, Aug 16, 2018 at 09:49:24AM +0800, Haojian Zhuang wrote: > Fix the LDO9_VSET register definition in PMIC. LDO9 is used > by Designware SD controller. Without this fix, SD controller > fails to operate SD card since lack of right voltage setting. > > Cc: Leif Lindholm <leif.lindholm@linaro.org> > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Pushed as d11581e5fd. > --- > Silicon/Hisilicon/Hi3660/Include/Hi3660.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/Silicon/Hisilicon/Hi3660/Include/Hi3660.h b/Silicon/Hisilicon/Hi3660/Include/Hi3660.h > index 5fbf32267657..6e0587f7783a 100644 > --- a/Silicon/Hisilicon/Hi3660/Include/Hi3660.h > +++ b/Silicon/Hisilicon/Hi3660/Include/Hi3660.h > @@ -58,7 +58,7 @@ > #define USB3OTG_PHY_CR_CAP_ADDR (1 << 0) > > #define PMU_REG_BASE 0xFFF34000 > -#define PMIC_LDO9_VSET_REG (PMU_REG_BASE + (0x068 << 2)) > +#define PMIC_LDO9_VSET_REG (PMU_REG_BASE + (0x06b << 2)) > #define LDO9_VSET_MASK (7 << 0) > > #define PMIC_LDO16_ONOFF_ECO_REG (PMU_REG_BASE + (0x078 << 2)) > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 edk-platforms 2/3] Platform/HiKey960: enable SD controller 2018-08-16 1:49 [PATCH v2 edk-platforms 0/3] enable eMMC/SD controller on HiKey Haojian Zhuang 2018-08-16 1:49 ` [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition Haojian Zhuang @ 2018-08-16 1:49 ` Haojian Zhuang 2018-10-31 17:26 ` Leif Lindholm 2018-08-16 1:49 ` [PATCH v2 edk-platforms 3/3] Platform/HiKey: enable SD/MMC controller on HiKey Haojian Zhuang 2 siblings, 1 reply; 7+ messages in thread From: Haojian Zhuang @ 2018-08-16 1:49 UTC (permalink / raw) To: edk2-devel Enable DwMmcHcDxe driver on HiKey960 platform. Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> --- Platform/Hisilicon/HiKey960/HiKey960.dsc | 8 ++ Platform/Hisilicon/HiKey960/HiKey960.fdf | 8 ++ Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf | 1 + Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf | 46 +++++++ Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c | 15 +++ Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c | 125 ++++++++++++++++++++ 6 files changed, 203 insertions(+) diff --git a/Platform/Hisilicon/HiKey960/HiKey960.dsc b/Platform/Hisilicon/HiKey960/HiKey960.dsc index be13714b9c19..1ce306da5b50 100644 --- a/Platform/Hisilicon/HiKey960/HiKey960.dsc +++ b/Platform/Hisilicon/HiKey960/HiKey960.dsc @@ -193,6 +193,14 @@ [Components.common] # EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf + # + # MMC/SD + # + Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf + EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf + EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf + MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf + Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf # diff --git a/Platform/Hisilicon/HiKey960/HiKey960.fdf b/Platform/Hisilicon/HiKey960/HiKey960.fdf index d65f77878575..d4fe4c46b818 100644 --- a/Platform/Hisilicon/HiKey960/HiKey960.fdf +++ b/Platform/Hisilicon/HiKey960/HiKey960.fdf @@ -128,6 +128,14 @@ [FV.FvMain] # INF EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf + # + # MMC/SD + # + INF Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf + INF EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf + INF EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf + INF MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf + INF Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf # diff --git a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf index 54105bdb3c94..9d66c028832e 100644 --- a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf +++ b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf @@ -33,6 +33,7 @@ [LibraryClasses] CacheMaintenanceLib DxeServicesTableLib IoLib + NonDiscoverableDeviceRegistrationLib PcdLib TimerLib UefiBootManagerLib diff --git a/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf new file mode 100644 index 000000000000..3e4bc807956e --- /dev/null +++ b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf @@ -0,0 +1,46 @@ +#/** @file +# +# Copyright (c) 2018, Linaro. All rights reserved. +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be 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 IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = HiKey960MmcDxe + FILE_GUID = e10d1dea-2f00-4eea-ac5d-9d6cfa7831a0 + MODULE_TYPE = UEFI_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = HiKey960MmcEntryPoint + +[Sources.common] + HiKey960MmcDxe.c + +[LibraryClasses] + DebugLib + IoLib + TimerLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Protocols] + gEfiDriverBindingProtocolGuid + gEmbeddedGpioProtocolGuid + gPlatformDwMmcProtocolGuid + +[Packages] + EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + Silicon/Hisilicon/Hi3660/Hi3660.dec + +[Depex] + TRUE diff --git a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c index 47ec879861bd..75627d5d6665 100644 --- a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c +++ b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c @@ -23,6 +23,7 @@ #include <Library/DevicePathLib.h> #include <Library/IoLib.h> #include <Library/MemoryAllocationLib.h> +#include <Library/NonDiscoverableDeviceRegistrationLib.h> #include <Library/PrintLib.h> #include <Library/SerialPortLib.h> #include <Library/TimerLib.h> @@ -33,6 +34,7 @@ #include <Protocol/DevicePathFromText.h> #include <Protocol/EmbeddedGpio.h> #include <Protocol/LoadedImage.h> +#include <Protocol/NonDiscoverableDevice.h> #include <Protocol/PlatformBootManager.h> #include <Protocol/PlatformVirtualKeyboard.h> @@ -447,6 +449,19 @@ HiKey960EntryPoint ( return Status; } + Status = RegisterNonDiscoverableMmioDevice ( + NonDiscoverableDeviceTypeSdhci, + NonDiscoverableDeviceDmaTypeNonCoherent, + NULL, + NULL, + 1, + 0xFF37F000, // SD + SIZE_4KB + ); + if (EFI_ERROR (Status)) { + return Status; + } + Status = gBS->InstallProtocolInterface ( &ImageHandle, &gPlatformVirtualKeyboardProtocolGuid, diff --git a/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c new file mode 100644 index 000000000000..0a2b60edf352 --- /dev/null +++ b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c @@ -0,0 +1,125 @@ +/** @file +* +* Copyright (c) 2018, Linaro. All rights reserved. +* +* This program and the accompanying materials are licensed and made available +* under the terms and conditions of the BSD License which accompanies this +* distribution. The full text of the license may be 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 IMPLIED. +* +**/ + +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/IoLib.h> +#include <Library/TimerLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> + +#include <Protocol/EmbeddedGpio.h> +#include <Protocol/PlatformDwMmc.h> + +#include <Hi3660.h> + +#define DETECT_SD_CARD 203 // GPIO 25_3 + +DW_MMC_HC_SLOT_CAP +DwMmcCapability[] = { + { + .HighSpeed = 1, + .BusWidth = 4, + .SlotType = RemovableSlot, + .CardType = SdCardType, + .Voltage30 = 1, + .BaseClkFreq = 3200 + } +}; + +EFI_STATUS +EFIAPI +HiKey960GetCapability ( + IN EFI_HANDLE Controller, + IN UINT8 Slot, + OUT DW_MMC_HC_SLOT_CAP *Capability + ) +{ + if (Capability == NULL) { + return EFI_INVALID_PARAMETER; + } + if (DwMmcCapability[0].Controller == 0) { + DwMmcCapability[0].Controller = Controller; + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); + } else if (DwMmcCapability[0].Controller == Controller) { + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); + } else { + return EFI_INVALID_PARAMETER; + } + return EFI_SUCCESS; +} + +BOOLEAN +EFIAPI +HiKey960CardDetect ( + IN EFI_HANDLE Controller, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + EMBEDDED_GPIO *Gpio; + UINTN Value; + + if (Slot == 0) { + Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&Gpio); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get GPIO protocol: %r\n", Status)); + goto Exit; + } + Status = Gpio->Set (Gpio, DETECT_SD_CARD, GPIO_MODE_INPUT); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to sed GPIO as input mode: %r\n", Status)); + goto Exit; + } + Status = Gpio->Get (Gpio, DETECT_SD_CARD, &Value); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get GPIO value: %r\n", Status)); + goto Exit; + } + if (Value == 0) { + return TRUE; + } + } +Exit: + return FALSE; +} + +PLATFORM_DW_MMC_PROTOCOL mDwMmcDevice = { + HiKey960GetCapability, + HiKey960CardDetect +}; + +EFI_STATUS +EFIAPI +HiKey960MmcEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = gBS->InstallProtocolInterface ( + &ImageHandle, + &gPlatformDwMmcProtocolGuid, + EFI_NATIVE_INTERFACE, + &mDwMmcDevice + ); + if (EFI_ERROR (Status)) { + return Status; + } + return Status; +} -- 2.7.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 edk-platforms 2/3] Platform/HiKey960: enable SD controller 2018-08-16 1:49 ` [PATCH v2 edk-platforms 2/3] Platform/HiKey960: enable SD controller Haojian Zhuang @ 2018-10-31 17:26 ` Leif Lindholm 0 siblings, 0 replies; 7+ messages in thread From: Leif Lindholm @ 2018-10-31 17:26 UTC (permalink / raw) To: Haojian Zhuang; +Cc: edk2-devel, Ard Biesheuvel Apologies for ridiculously slow response, On Thu, Aug 16, 2018 at 09:49:25AM +0800, Haojian Zhuang wrote: > Enable DwMmcHcDxe driver on HiKey960 platform. > > Cc: Leif Lindholm <leif.lindholm@linaro.org> > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> > --- > Platform/Hisilicon/HiKey960/HiKey960.dsc | 8 ++ > Platform/Hisilicon/HiKey960/HiKey960.fdf | 8 ++ > Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf | 1 + > Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf | 46 +++++++ > Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c | 15 +++ > Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c | 125 ++++++++++++++++++++ > 6 files changed, 203 insertions(+) > > diff --git a/Platform/Hisilicon/HiKey960/HiKey960.dsc b/Platform/Hisilicon/HiKey960/HiKey960.dsc > index be13714b9c19..1ce306da5b50 100644 > --- a/Platform/Hisilicon/HiKey960/HiKey960.dsc > +++ b/Platform/Hisilicon/HiKey960/HiKey960.dsc > @@ -193,6 +193,14 @@ [Components.common] > # > EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf > > + # > + # MMC/SD > + # > + Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf > + EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf > + EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf > + MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf > + > Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf > > # > diff --git a/Platform/Hisilicon/HiKey960/HiKey960.fdf b/Platform/Hisilicon/HiKey960/HiKey960.fdf > index d65f77878575..d4fe4c46b818 100644 > --- a/Platform/Hisilicon/HiKey960/HiKey960.fdf > +++ b/Platform/Hisilicon/HiKey960/HiKey960.fdf > @@ -128,6 +128,14 @@ [FV.FvMain] > # > INF EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf > > + # > + # MMC/SD > + # > + INF Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf > + INF EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf > + INF EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf > + INF MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf > + > INF Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf > > # > diff --git a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf > index 54105bdb3c94..9d66c028832e 100644 > --- a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf > +++ b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.inf > @@ -33,6 +33,7 @@ [LibraryClasses] > CacheMaintenanceLib > DxeServicesTableLib > IoLib > + NonDiscoverableDeviceRegistrationLib > PcdLib > TimerLib > UefiBootManagerLib > diff --git a/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf > new file mode 100644 > index 000000000000..3e4bc807956e > --- /dev/null > +++ b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.inf > @@ -0,0 +1,46 @@ > +#/** @file > +# > +# Copyright (c) 2018, Linaro. All rights reserved. > +# > +# This program and the accompanying materials are licensed and made available > +# under the terms and conditions of the BSD License which accompanies this > +# distribution. The full text of the license may be 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 IMPLIED. > +# > +# > +#**/ > + > +[Defines] > + INF_VERSION = 0x00010019 > + BASE_NAME = HiKey960MmcDxe > + FILE_GUID = e10d1dea-2f00-4eea-ac5d-9d6cfa7831a0 > + MODULE_TYPE = UEFI_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = HiKey960MmcEntryPoint > + > +[Sources.common] > + HiKey960MmcDxe.c > + > +[LibraryClasses] > + DebugLib > + IoLib > + TimerLib > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + > +[Protocols] > + gEfiDriverBindingProtocolGuid > + gEmbeddedGpioProtocolGuid > + gPlatformDwMmcProtocolGuid > + > +[Packages] > + EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.dec > + EmbeddedPkg/EmbeddedPkg.dec > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec Swap order of the two above lines? > + Silicon/Hisilicon/Hi3660/Hi3660.dec > + > +[Depex] > + TRUE > diff --git a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c > index 47ec879861bd..75627d5d6665 100644 > --- a/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c > +++ b/Platform/Hisilicon/HiKey960/HiKey960Dxe/HiKey960Dxe.c > @@ -23,6 +23,7 @@ > #include <Library/DevicePathLib.h> > #include <Library/IoLib.h> > #include <Library/MemoryAllocationLib.h> > +#include <Library/NonDiscoverableDeviceRegistrationLib.h> > #include <Library/PrintLib.h> > #include <Library/SerialPortLib.h> > #include <Library/TimerLib.h> > @@ -33,6 +34,7 @@ > #include <Protocol/DevicePathFromText.h> > #include <Protocol/EmbeddedGpio.h> > #include <Protocol/LoadedImage.h> > +#include <Protocol/NonDiscoverableDevice.h> > #include <Protocol/PlatformBootManager.h> > #include <Protocol/PlatformVirtualKeyboard.h> > > @@ -447,6 +449,19 @@ HiKey960EntryPoint ( > return Status; > } > > + Status = RegisterNonDiscoverableMmioDevice ( > + NonDiscoverableDeviceTypeSdhci, > + NonDiscoverableDeviceDmaTypeNonCoherent, > + NULL, > + NULL, > + 1, Can you either make a #define or add a comment explaining why there's a live-coded integer here? > + 0xFF37F000, // SD And could you add the appropriate #defines to Silicon/Hisilicon/Hi3660/Include/Hi3660.h and use that instead? > + SIZE_4KB > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > Status = gBS->InstallProtocolInterface ( > &ImageHandle, > &gPlatformVirtualKeyboardProtocolGuid, > diff --git a/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c > new file mode 100644 > index 000000000000..0a2b60edf352 > --- /dev/null > +++ b/Platform/Hisilicon/HiKey960/HiKey960MmcDxe/HiKey960MmcDxe.c > @@ -0,0 +1,125 @@ > +/** @file > +* > +* Copyright (c) 2018, Linaro. All rights reserved. > +* > +* This program and the accompanying materials are licensed and made available > +* under the terms and conditions of the BSD License which accompanies this > +* distribution. The full text of the license may be 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 IMPLIED. > +* > +**/ > + > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/DebugLib.h> > +#include <Library/DevicePathLib.h> > +#include <Library/IoLib.h> > +#include <Library/TimerLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > + > +#include <Protocol/EmbeddedGpio.h> > +#include <Protocol/PlatformDwMmc.h> > + > +#include <Hi3660.h> > + > +#define DETECT_SD_CARD 203 // GPIO 25_3 And could you move this to a local .h file? > + > +DW_MMC_HC_SLOT_CAP Where is this struct defined? > +DwMmcCapability[] = { 'm' prefix for global variable. And STATIC unless it is intended for use outside this file. > + { > + .HighSpeed = 1, > + .BusWidth = 4, > + .SlotType = RemovableSlot, > + .CardType = SdCardType, > + .Voltage30 = 1, > + .BaseClkFreq = 3200 > + } > +}; > + > +EFI_STATUS > +EFIAPI > +HiKey960GetCapability ( > + IN EFI_HANDLE Controller, > + IN UINT8 Slot, > + OUT DW_MMC_HC_SLOT_CAP *Capability Is the placement of that OUT intentional? I don't think I've seen that before, but it sort of makes sense. > + ) > +{ > + if (Capability == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + if (DwMmcCapability[0].Controller == 0) { Pretty sure that should be NULL? Why is DwMmcCapability being treated as a single-entry array? And why is Slot ignored? / Leif > + DwMmcCapability[0].Controller = Controller; > + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); > + } else if (DwMmcCapability[0].Controller == Controller) { > + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); > + } else { > + return EFI_INVALID_PARAMETER; > + } > + return EFI_SUCCESS; > +} > + > +BOOLEAN > +EFIAPI > +HiKey960CardDetect ( > + IN EFI_HANDLE Controller, > + IN UINT8 Slot > + ) > +{ > + EFI_STATUS Status; > + EMBEDDED_GPIO *Gpio; > + UINTN Value; > + > + if (Slot == 0) { > + Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&Gpio); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Failed to get GPIO protocol: %r\n", Status)); > + goto Exit; > + } > + Status = Gpio->Set (Gpio, DETECT_SD_CARD, GPIO_MODE_INPUT); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Failed to sed GPIO as input mode: %r\n", Status)); > + goto Exit; > + } > + Status = Gpio->Get (Gpio, DETECT_SD_CARD, &Value); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Failed to get GPIO value: %r\n", Status)); > + goto Exit; > + } > + if (Value == 0) { > + return TRUE; > + } > + } > +Exit: > + return FALSE; > +} > + > +PLATFORM_DW_MMC_PROTOCOL mDwMmcDevice = { > + HiKey960GetCapability, > + HiKey960CardDetect > +}; > + > +EFI_STATUS > +EFIAPI > +HiKey960MmcEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + Status = gBS->InstallProtocolInterface ( > + &ImageHandle, > + &gPlatformDwMmcProtocolGuid, > + EFI_NATIVE_INTERFACE, > + &mDwMmcDevice > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + return Status; > +} > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 edk-platforms 3/3] Platform/HiKey: enable SD/MMC controller on HiKey 2018-08-16 1:49 [PATCH v2 edk-platforms 0/3] enable eMMC/SD controller on HiKey Haojian Zhuang 2018-08-16 1:49 ` [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition Haojian Zhuang 2018-08-16 1:49 ` [PATCH v2 edk-platforms 2/3] Platform/HiKey960: enable SD controller Haojian Zhuang @ 2018-08-16 1:49 ` Haojian Zhuang 2018-10-31 17:34 ` Leif Lindholm 2 siblings, 1 reply; 7+ messages in thread From: Haojian Zhuang @ 2018-08-16 1:49 UTC (permalink / raw) To: edk2-devel Replace DwEmmcDxe driver by DwMmcHcDxe driver on HiKey platform. Since the new driver could work on both eMMC and SD controller. Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> --- Platform/Hisilicon/HiKey/HiKey.dsc | 17 +-- Platform/Hisilicon/HiKey/HiKey.fdf | 15 ++- Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf | 1 + Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf | 45 +++++++ Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c | 26 ++++ Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c | 139 ++++++++++++++++++++ 6 files changed, 227 insertions(+), 16 deletions(-) diff --git a/Platform/Hisilicon/HiKey/HiKey.dsc b/Platform/Hisilicon/HiKey/HiKey.dsc index 9c1fc2e1b40d..4b5b73c15afe 100644 --- a/Platform/Hisilicon/HiKey/HiKey.dsc +++ b/Platform/Hisilicon/HiKey/HiKey.dsc @@ -126,12 +126,6 @@ [PcdsFixedAtBuild.common] gEmbeddedTokenSpaceGuid.PcdMetronomeTickPeriod|1000 # - # DW MMC/SD card controller - # - gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeBaseAddress|0xF723D000 - gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeClockFrequencyInHz|100000000 - - # # # Fastboot # @@ -204,13 +198,16 @@ [Components.common] # EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf - Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf - # # MMC/SD # - EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf - EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmcDxe.inf + Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf + EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf + EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf + MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf + MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf + + Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf # # USB Host Support diff --git a/Platform/Hisilicon/HiKey/HiKey.fdf b/Platform/Hisilicon/HiKey/HiKey.fdf index 2bca7232b6e5..89d3e9280ff6 100644 --- a/Platform/Hisilicon/HiKey/HiKey.fdf +++ b/Platform/Hisilicon/HiKey/HiKey.fdf @@ -128,15 +128,18 @@ [FV.FvMain] # INF EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf + # + # MMC/SD + # + INF Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf + INF EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf + INF EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf + INF MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf + INF MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf + INF Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf # - # Multimedia Card Interface - # - INF EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf - INF EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmcDxe.inf - - # # USB Host Support # INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf diff --git a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf index 4c4644a0fe51..3d2843fbc9f6 100644 --- a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf +++ b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf @@ -32,6 +32,7 @@ [LibraryClasses] CacheMaintenanceLib DebugLib IoLib + NonDiscoverableDeviceRegistrationLib UefiBootManagerLib UefiLib UefiDriverEntryPoint diff --git a/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf new file mode 100644 index 000000000000..1b78d3228ccf --- /dev/null +++ b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf @@ -0,0 +1,45 @@ +#/** @file +# +# Copyright (c) 2017, Linaro. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be 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 IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = HiKeyMmcDxe + FILE_GUID = a4f9bfb1-b3f8-4d4d-8c04-9539173fc1f2 + MODULE_TYPE = UEFI_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = HiKeyMmcEntryPoint + +[Sources.common] + HiKeyMmcDxe.c + +[LibraryClasses] + DebugLib + IoLib + TimerLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Protocols] + gEfiDriverBindingProtocolGuid + gEmbeddedGpioProtocolGuid + gPlatformDwMmcProtocolGuid + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OpenPlatformPkg/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.dec + +[Depex] + TRUE diff --git a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c index 2162b68529bd..cdec3f1dd0b0 100644 --- a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c +++ b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c @@ -17,6 +17,7 @@ #include <Library/DevicePathLib.h> #include <Library/IoLib.h> #include <Library/MemoryAllocationLib.h> +#include <Library/NonDiscoverableDeviceRegistrationLib.h> #include <Library/PcdLib.h> #include <Library/UefiBootManagerLib.h> #include <Library/UefiBootServicesTableLib.h> @@ -351,6 +352,31 @@ HiKeyEntryPoint ( return Status; } + Status = RegisterNonDiscoverableMmioDevice ( + NonDiscoverableDeviceTypeSdhci, + NonDiscoverableDeviceDmaTypeNonCoherent, + NULL, + NULL, + 1, + 0xF723D000, // eMMC + SIZE_4KB + ); + if (EFI_ERROR (Status)) { + return Status; + } + Status = RegisterNonDiscoverableMmioDevice ( + NonDiscoverableDeviceTypeSdhci, + NonDiscoverableDeviceDmaTypeNonCoherent, + NULL, + NULL, + 1, + 0xF723E000, // SD + SIZE_4KB + ); + if (EFI_ERROR (Status)) { + return Status; + } + Status = gBS->InstallProtocolInterface ( &ImageHandle, &gPlatformVirtualKeyboardProtocolGuid, diff --git a/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c new file mode 100644 index 000000000000..390c23018bc6 --- /dev/null +++ b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c @@ -0,0 +1,139 @@ +/** @file +* +* Copyright (c) 2017, Linaro. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be 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 IMPLIED. +* +**/ + +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/DevicePathLib.h> +#include <Library/IoLib.h> +#include <Library/TimerLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> + +#include <Protocol/EmbeddedGpio.h> +#include <Protocol/PlatformDwMmc.h> + +#include <Hi6220.h> + +#define DETECT_SD_CARD 8 // GPIO 1_0 + +DW_MMC_HC_SLOT_CAP +DwMmcCapability[2] = { + { + .Ddr50 = 1, + .HighSpeed = 1, + .BusWidth = 8, + .SlotType = EmbeddedSlot, + .CardType = EmmcCardType, + .BaseClkFreq = 100000 + }, { + .HighSpeed = 1, + .BusWidth = 4, + .SlotType = RemovableSlot, + .CardType = SdCardType, + .Voltage30 = 1, + .BaseClkFreq = 100000 + } +}; + +EFI_STATUS +EFIAPI +HiKeyGetCapability ( + IN EFI_HANDLE Controller, + IN UINT8 Slot, + OUT DW_MMC_HC_SLOT_CAP *Capability + ) +{ + if (Capability == NULL) { + return EFI_INVALID_PARAMETER; + } + if (DwMmcCapability[0].Controller == 0) { + DwMmcCapability[0].Controller = Controller; + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); + } else if (DwMmcCapability[0].Controller == Controller) { + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); + } else if (DwMmcCapability[1].Controller == 0) { + DwMmcCapability[1].Controller = Controller; + CopyMem (Capability, &DwMmcCapability[1], sizeof (DW_MMC_HC_SLOT_CAP)); + } else if (DwMmcCapability[1].Controller == Controller) { + CopyMem (Capability, &DwMmcCapability[1], sizeof (DW_MMC_HC_SLOT_CAP)); + } else { + return EFI_INVALID_PARAMETER; + } + return EFI_SUCCESS; +} + +BOOLEAN +EFIAPI +HiKeyCardDetect ( + IN EFI_HANDLE Controller, + IN UINT8 Slot + ) +{ + EFI_STATUS Status; + EMBEDDED_GPIO *Gpio; + UINTN Value; + + if (DwMmcCapability[0].Controller == Controller) { + return TRUE; + } else if (DwMmcCapability[1].Controller == Controller) { + Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&Gpio); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get GPIO protocol: %r\n", Status)); + return FALSE; + } + Status = Gpio->Set (Gpio, DETECT_SD_CARD, GPIO_MODE_INPUT); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to sed GPIO as input mode: %r\n", Status)); + return FALSE; + } + Status = Gpio->Get (Gpio, DETECT_SD_CARD, &Value); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to get GPIO value: %r\n", Status)); + return FALSE; + } + if (Value == 0) { + return TRUE; + } + return FALSE; + } + return FALSE; +} + +PLATFORM_DW_MMC_PROTOCOL mDwMmcDevice = { + HiKeyGetCapability, + HiKeyCardDetect +}; + +EFI_STATUS +EFIAPI +HiKeyMmcEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = gBS->InstallProtocolInterface ( + &ImageHandle, + &gPlatformDwMmcProtocolGuid, + EFI_NATIVE_INTERFACE, + &mDwMmcDevice + ); + if (EFI_ERROR (Status)) { + return Status; + } + return Status; +} -- 2.7.4 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 edk-platforms 3/3] Platform/HiKey: enable SD/MMC controller on HiKey 2018-08-16 1:49 ` [PATCH v2 edk-platforms 3/3] Platform/HiKey: enable SD/MMC controller on HiKey Haojian Zhuang @ 2018-10-31 17:34 ` Leif Lindholm 0 siblings, 0 replies; 7+ messages in thread From: Leif Lindholm @ 2018-10-31 17:34 UTC (permalink / raw) To: Haojian Zhuang; +Cc: edk2-devel, Ard Biesheuvel On Thu, Aug 16, 2018 at 09:49:26AM +0800, Haojian Zhuang wrote: > Replace DwEmmcDxe driver by DwMmcHcDxe driver on HiKey platform. Since > the new driver could work on both eMMC and SD controller. > > Cc: Leif Lindholm <leif.lindholm@linaro.org> > Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> > --- > Platform/Hisilicon/HiKey/HiKey.dsc | 17 +-- > Platform/Hisilicon/HiKey/HiKey.fdf | 15 ++- > Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf | 1 + > Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf | 45 +++++++ > Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c | 26 ++++ > Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c | 139 ++++++++++++++++++++ > 6 files changed, 227 insertions(+), 16 deletions(-) > > diff --git a/Platform/Hisilicon/HiKey/HiKey.dsc b/Platform/Hisilicon/HiKey/HiKey.dsc > index 9c1fc2e1b40d..4b5b73c15afe 100644 > --- a/Platform/Hisilicon/HiKey/HiKey.dsc > +++ b/Platform/Hisilicon/HiKey/HiKey.dsc > @@ -126,12 +126,6 @@ [PcdsFixedAtBuild.common] > gEmbeddedTokenSpaceGuid.PcdMetronomeTickPeriod|1000 > > # > - # DW MMC/SD card controller > - # > - gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeBaseAddress|0xF723D000 > - gEmbeddedTokenSpaceGuid.PcdDwEmmcDxeClockFrequencyInHz|100000000 > - > - # > # > # Fastboot > # > @@ -204,13 +198,16 @@ [Components.common] > # > EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf > > - Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf > - > # > # MMC/SD > # > - EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf > - EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmcDxe.inf > + Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf > + EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf > + EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf > + MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf > + MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf > + > + Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf > > # > # USB Host Support > diff --git a/Platform/Hisilicon/HiKey/HiKey.fdf b/Platform/Hisilicon/HiKey/HiKey.fdf > index 2bca7232b6e5..89d3e9280ff6 100644 > --- a/Platform/Hisilicon/HiKey/HiKey.fdf > +++ b/Platform/Hisilicon/HiKey/HiKey.fdf > @@ -128,15 +128,18 @@ [FV.FvMain] > # > INF EmbeddedPkg/Drivers/VirtualKeyboardDxe/VirtualKeyboardDxe.inf > > + # > + # MMC/SD > + # > + INF Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf > + INF EmbeddedPkg/Universal/NonDiscoverableDeviceDxe/NonDiscoverableDeviceDxe.inf > + INF EmbeddedPkg/Drivers/DwMmcHcDxe/DwMmcHcDxe.inf > + INF MdeModulePkg/Bus/Sd/EmmcDxe/EmmcDxe.inf > + INF MdeModulePkg/Bus/Sd/SdDxe/SdDxe.inf > + > INF Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf > > # > - # Multimedia Card Interface > - # > - INF EmbeddedPkg/Universal/MmcDxe/MmcDxe.inf > - INF EmbeddedPkg/Drivers/DwEmmcDxe/DwEmmcDxe.inf > - > - # > # USB Host Support > # > INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf > diff --git a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf > index 4c4644a0fe51..3d2843fbc9f6 100644 > --- a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf > +++ b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.inf > @@ -32,6 +32,7 @@ [LibraryClasses] > CacheMaintenanceLib > DebugLib > IoLib > + NonDiscoverableDeviceRegistrationLib > UefiBootManagerLib > UefiLib > UefiDriverEntryPoint > diff --git a/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf > new file mode 100644 > index 000000000000..1b78d3228ccf > --- /dev/null > +++ b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.inf > @@ -0,0 +1,45 @@ > +#/** @file > +# > +# Copyright (c) 2017, Linaro. All rights reserved. 2018? > +# > +# This program and the accompanying materials > +# are licensed and made available under the terms and conditions of the BSD License > +# which accompanies this distribution. The full text of the license may be 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 IMPLIED. > +# > +# > +#**/ > + > +[Defines] > + INF_VERSION = 0x00010019 > + BASE_NAME = HiKeyMmcDxe > + FILE_GUID = a4f9bfb1-b3f8-4d4d-8c04-9539173fc1f2 > + MODULE_TYPE = UEFI_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = HiKeyMmcEntryPoint > + > +[Sources.common] > + HiKeyMmcDxe.c > + > +[LibraryClasses] > + DebugLib > + IoLib > + TimerLib > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + > +[Protocols] > + gEfiDriverBindingProtocolGuid > + gEmbeddedGpioProtocolGuid > + gPlatformDwMmcProtocolGuid > + > +[Packages] > + EmbeddedPkg/EmbeddedPkg.dec > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec Swap above two lines around? > + OpenPlatformPkg/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.dec > + > +[Depex] > + TRUE > diff --git a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c > index 2162b68529bd..cdec3f1dd0b0 100644 > --- a/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c > +++ b/Platform/Hisilicon/HiKey/HiKeyDxe/HiKeyDxe.c > @@ -17,6 +17,7 @@ > #include <Library/DevicePathLib.h> > #include <Library/IoLib.h> > #include <Library/MemoryAllocationLib.h> > +#include <Library/NonDiscoverableDeviceRegistrationLib.h> > #include <Library/PcdLib.h> > #include <Library/UefiBootManagerLib.h> > #include <Library/UefiBootServicesTableLib.h> > @@ -351,6 +352,31 @@ HiKeyEntryPoint ( > return Status; > } > > + Status = RegisterNonDiscoverableMmioDevice ( > + NonDiscoverableDeviceTypeSdhci, > + NonDiscoverableDeviceDmaTypeNonCoherent, > + NULL, > + NULL, > + 1, #define in .h, or comment? > + 0xF723D000, // eMMC Define in Silicon/Hisilicon/Hi6220/Include/Hi6220.h and use that? > + SIZE_4KB > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + Status = RegisterNonDiscoverableMmioDevice ( > + NonDiscoverableDeviceTypeSdhci, > + NonDiscoverableDeviceDmaTypeNonCoherent, > + NULL, > + NULL, > + 1, #define in .h, or comment? > + 0xF723E000, // SD Define in Silicon/Hisilicon/Hi6220/Include/Hi6220.h and use that? > + SIZE_4KB > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > Status = gBS->InstallProtocolInterface ( > &ImageHandle, > &gPlatformVirtualKeyboardProtocolGuid, > diff --git a/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c > new file mode 100644 > index 000000000000..390c23018bc6 > --- /dev/null > +++ b/Platform/Hisilicon/HiKey/HiKeyMmcDxe/HiKeyMmcDxe.c > @@ -0,0 +1,139 @@ > +/** @file > +* > +* Copyright (c) 2017, Linaro. All rights reserved. > +* > +* This program and the accompanying materials > +* are licensed and made available under the terms and conditions of the BSD License > +* which accompanies this distribution. The full text of the license may be 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 IMPLIED. > +* > +**/ > + > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/DebugLib.h> > +#include <Library/DevicePathLib.h> > +#include <Library/IoLib.h> > +#include <Library/TimerLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > + > +#include <Protocol/EmbeddedGpio.h> > +#include <Protocol/PlatformDwMmc.h> > + > +#include <Hi6220.h> > + > +#define DETECT_SD_CARD 8 // GPIO 1_0 Move to local .h. > + > +DW_MMC_HC_SLOT_CAP > +DwMmcCapability[2] = { #define for that 2. > + { > + .Ddr50 = 1, > + .HighSpeed = 1, > + .BusWidth = 8, > + .SlotType = EmbeddedSlot, > + .CardType = EmmcCardType, > + .BaseClkFreq = 100000 > + }, { > + .HighSpeed = 1, > + .BusWidth = 4, > + .SlotType = RemovableSlot, > + .CardType = SdCardType, > + .Voltage30 = 1, > + .BaseClkFreq = 100000 > + } > +}; > + > +EFI_STATUS > +EFIAPI > +HiKeyGetCapability ( > + IN EFI_HANDLE Controller, > + IN UINT8 Slot, > + OUT DW_MMC_HC_SLOT_CAP *Capability > + ) > +{ > + if (Capability == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + if (DwMmcCapability[0].Controller == 0) { > + DwMmcCapability[0].Controller = Controller; > + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); > + } else if (DwMmcCapability[0].Controller == Controller) { > + CopyMem (Capability, &DwMmcCapability[0], sizeof (DW_MMC_HC_SLOT_CAP)); > + } else if (DwMmcCapability[1].Controller == 0) { > + DwMmcCapability[1].Controller = Controller; > + CopyMem (Capability, &DwMmcCapability[1], sizeof (DW_MMC_HC_SLOT_CAP)); > + } else if (DwMmcCapability[1].Controller == Controller) { > + CopyMem (Capability, &DwMmcCapability[1], sizeof (DW_MMC_HC_SLOT_CAP)); It looks to me like there are huge opportunities for reducing duplication between 960 version and this. I would suggest moving all of the common bits into a library and doing only the platform-specific registration here. / Leif > + } else { > + return EFI_INVALID_PARAMETER; > + } > + return EFI_SUCCESS; > +} > + > +BOOLEAN > +EFIAPI > +HiKeyCardDetect ( > + IN EFI_HANDLE Controller, > + IN UINT8 Slot > + ) > +{ > + EFI_STATUS Status; > + EMBEDDED_GPIO *Gpio; > + UINTN Value; > + > + if (DwMmcCapability[0].Controller == Controller) { > + return TRUE; > + } else if (DwMmcCapability[1].Controller == Controller) { > + Status = gBS->LocateProtocol (&gEmbeddedGpioProtocolGuid, NULL, (VOID **)&Gpio); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Failed to get GPIO protocol: %r\n", Status)); > + return FALSE; > + } > + Status = Gpio->Set (Gpio, DETECT_SD_CARD, GPIO_MODE_INPUT); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Failed to sed GPIO as input mode: %r\n", Status)); > + return FALSE; > + } > + Status = Gpio->Get (Gpio, DETECT_SD_CARD, &Value); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Failed to get GPIO value: %r\n", Status)); > + return FALSE; > + } > + if (Value == 0) { > + return TRUE; > + } > + return FALSE; > + } > + return FALSE; > +} > + > +PLATFORM_DW_MMC_PROTOCOL mDwMmcDevice = { > + HiKeyGetCapability, > + HiKeyCardDetect > +}; > + > +EFI_STATUS > +EFIAPI > +HiKeyMmcEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + Status = gBS->InstallProtocolInterface ( > + &ImageHandle, > + &gPlatformDwMmcProtocolGuid, > + EFI_NATIVE_INTERFACE, > + &mDwMmcDevice > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + return Status; > +} > -- > 2.7.4 > ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-10-31 17:34 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-08-16 1:49 [PATCH v2 edk-platforms 0/3] enable eMMC/SD controller on HiKey Haojian Zhuang 2018-08-16 1:49 ` [PATCH v2 edk-platforms 1/3] Silicon/Hi3660: fix LDO9_VSET register definition Haojian Zhuang 2018-08-16 9:23 ` Leif Lindholm 2018-08-16 1:49 ` [PATCH v2 edk-platforms 2/3] Platform/HiKey960: enable SD controller Haojian Zhuang 2018-10-31 17:26 ` Leif Lindholm 2018-08-16 1:49 ` [PATCH v2 edk-platforms 3/3] Platform/HiKey: enable SD/MMC controller on HiKey Haojian Zhuang 2018-10-31 17:34 ` Leif Lindholm
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox