+marcin.s.woj...@gmail.com Hi Narinder,
czw., 21 gru 2023 o 01:54 Narinder Dhillon <ndhil...@marvell.com> napisaĆ(a): > > From: Narinder Dhillon <ndhil...@marvell.com> > > Marvell Odyssey SoC does not have RTC on chip. This patch provides a > dummy RTC driver to generate architectural protocol and help boot > Odyssey SoC. > > Signed-off-by: Narinder Dhillon <ndhil...@marvell.com> > --- > .../Marvell/Drivers/Null/RtcNull/RtcNullDxe.c | 280 ++++++++++++++++++ > .../Marvell/Drivers/Null/RtcNull/RtcNullDxe.h | 37 +++ > .../Drivers/Null/RtcNull/RtcNullDxe.inf | 46 +++ Instead of the custom Null driver you should use the generic solution - it should be enough to add EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf { <LibraryClasses> RealTimeClockLib|EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf in the .dsc file, and INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf in the .fdf file, to achieve the same result. Best regards, Marcin Best regards, Marcin > 3 files changed, 363 insertions(+) > create mode 100644 Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.c > create mode 100644 Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.h > create mode 100644 Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.inf > > diff --git a/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.c > b/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.c > new file mode 100644 > index 0000000000..8a7956f35d > --- /dev/null > +++ b/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.c > @@ -0,0 +1,280 @@ > +/** @file > +* > +* SPDX-License-Identifier: BSD-2-Clause-Patent > +* https://spdx.org/licenses > +* > +* Copyright (C) 2022 Marvell > +* > +* Source file for NULL RTC Driver > +* > +**/ > + > +#include <Uefi.h> // Base defines > +#include <Library/DebugLib.h> // DEBUG > +#include <Library/MemoryAllocationLib.h> // AllocateRuntimeZeroPool > +#include <Library/BaseMemoryLib.h> // ZeroMem > +#include <Library/UefiBootServicesTableLib.h> // gBS > +#include <Library/UefiRuntimeLib.h> // EfiConvertPointer > +#include <Library/UefiRuntimeServicesTableLib.h> // gRT > + > +#include "RtcNullDxe.h" > + > +// all variables used across the driver > +RTC_NULL_PRIVATE_DATA *mRtcPrivateData; > +STATIC EFI_EVENT mRtcVirtualAddressChangeEvent; > + > +STATIC CONST INTN DayOfMonth[12] = > + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, > 30, 31 }; > + > +STATIC > +BOOLEAN > +IsLeapYear(IN EFI_TIME *Time) > +{ > + if (Time->Year % 4 == 0) { > + if (Time->Year % 100 == 0) { > + if (Time->Year % 400 == 0) { > + return TRUE; > + } else { > + return FALSE; > + } > + } else { > + return TRUE; > + } > + } else { > + return FALSE; > + } > +} > + > +BOOLEAN DayValid(IN EFI_TIME *Time) > +{ > + if (Time->Day < 1 || > + Time->Day > DayOfMonth[Time->Month - 1] || > + (Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28))) { > + return FALSE; > + } > + > + return TRUE; > +} > + > +EFI_STATUS > +GetDateTime( > + IN RTC_NULL_PRIVATE_DATA *PrivateData, > + OUT EFI_TIME *Time) > +{ > + > + if (PrivateData == NULL || Time == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + ZeroMem(Time, sizeof(EFI_TIME)); > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS > +SetDateTime(IN RTC_NULL_PRIVATE_DATA *PrivateData, > + IN EFI_TIME *Time) > +{ > + if (PrivateData == NULL || Time == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if ( (Time->Month < 1) || (Time->Month > 12) || > + (Time->Second > 59) || (Time->Minute > 59) || > + (Time->Hour > 23) || (!DayValid(Time)) || > + (Time->Year < 1998) || (Time->Year > 2099) || > + (Time->Nanosecond > 999999999) || > + (Time->TimeZone < -1440) || ((Time->TimeZone > 1440) && > + (Time->TimeZone != 2047))) { > + return EFI_INVALID_PARAMETER; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Returns the current time and date information, and the time-keeping > capabilities > + of the hardware platform. > + > + @param Time A pointer to storage to receive a snapshot > of the current time. > + @param Capabilities An optional pointer to a buffer to receive > the real time clock > + device's capabilities. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval EFI_INVALID_PARAMETER Time is NULL. > + @retval EFI_DEVICE_ERROR The time could not be retrieved due to > hardware error. > + > +**/ > +EFI_STATUS > + EFIAPI > +GetTime(OUT EFI_TIME * Time, OUT EFI_TIME_CAPABILITIES * Capabilities) > +{ > + if (Time == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (mRtcPrivateData->Initialized == FALSE) { > + return EFI_UNSUPPORTED; > + } > + > + return GetDateTime (mRtcPrivateData, Time); > +} > + > + > + > +/** > + Sets the current local time and date information. > + > + @param Time A pointer to the current time. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval EFI_INVALID_PARAMETER A time field is out of range. > + @retval EFI_DEVICE_ERROR The time could not be set due due to > hardware error. > + > +**/ > +EFI_STATUS EFIAPI SetTime(IN EFI_TIME * Time) > +{ > + if (Time == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (mRtcPrivateData->Initialized == FALSE) { > + return EFI_UNSUPPORTED; > + } > + > + return SetDateTime (mRtcPrivateData, Time); > +} > + > + > +/** > + Returns the current wakeup alarm clock setting. > + > + @param Enabled Indicates if the alarm is currently enabled > or disabled. > + @param Pending Indicates if the alarm signal is pending and > requires acknowledgement. > + @param Time The current alarm setting. > + > + @retval EFI_SUCCESS The alarm settings were returned. > + @retval EFI_INVALID_PARAMETER Any parameter is NULL. > + @retval EFI_DEVICE_ERROR The wakeup time could not be retrieved due > to a hardware error. > + > +**/ > +EFI_STATUS > + EFIAPI > +GetWakeupTime(OUT BOOLEAN * Enabled, > + OUT BOOLEAN * Pending, OUT EFI_TIME * Time) > +{ > + return EFI_UNSUPPORTED; > +} > + > + > +/** > + Sets the system wakeup alarm clock time. > + > + @param Enabled Enable or disable the wakeup alarm. > + @param Time If Enable is TRUE, the time to set the > wakeup alarm for. > + > + @retval EFI_SUCCESS If Enable is TRUE, then the wakeup alarm was > enabled. If > + Enable is FALSE, then the wakeup alarm was > disabled. > + @retval EFI_INVALID_PARAMETER A time field is out of range. > + @retval EFI_DEVICE_ERROR The wakeup time could not be set due to a > hardware error. > + @retval EFI_UNSUPPORTED A wakeup timer is not supported on this > platform. > + > +**/ > +EFI_STATUS EFIAPI SetWakeupTime(IN BOOLEAN Enabled, OUT EFI_TIME * Time) > +{ > + return EFI_UNSUPPORTED; > +} > + > + > +// Convert the mSmbus as well since the SmbusLib leaves this to the runtine > DXEs > + > +EFIAPI VOID > +RtcVirtualNotifyEvent(IN EFI_EVENT Event, IN VOID * Context) > +{ > + EfiConvertPointer (0x0, (VOID **) &mRtcPrivateData); > +} > + > +/** > + The Entry Point of module. It follows the standard UEFI driver model. > + > + @param[in] ImageHandle The firmware allocated handle for the EFI image. > + @param[in] SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The entry point is executed successfully. > + @retval other Some error occurs when executing this entry point. > + > +**/ > +EFI_STATUS > + EFIAPI > +RtcNullDxeInitialize ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE * SystemTable) > +{ > + EFI_TIME Time; > + RTC_NULL_PRIVATE_DATA *Private = NULL; > + EFI_STATUS Status = EFI_SUCCESS; > + > + DEBUG ((DEBUG_INFO, "RtcNullDxeInitialize\n")); > + > + /* Allocate the private data */ > + Private = AllocateRuntimeZeroPool (sizeof (RTC_NULL_PRIVATE_DATA)); > + > + if (Private == NULL) { > + Status = EFI_OUT_OF_RESOURCES; > + DEBUG ((DEBUG_ERROR, "RtcDxeInitialize: %r\n", Status)); > + goto Exit; > + } > + > + mRtcPrivateData = Private; > + > + Private->Initialized = FALSE; > + Private->Bus = 0xFF; > + Private->SlaveAddr = 0xFF; > + > + /* Check clock and init it to UNIX start time */ > + Status = GetDateTime (mRtcPrivateData, &Time); > + > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "RtcNullDxeInitialize: %r\n", Status)); > + goto Exit; > + } > + > + if (Time.Year == 1900) { > + Time.Day = 1; > + Time.Month = 1; > + Time.Year = 1998; > + Time.Second = 0; > + Time.Minute = 0; > + Time.Hour = 0; > + Time.Daylight = 0; > + Time.TimeZone = 0; > + > + Status = SetDateTime (mRtcPrivateData, &Time); > + > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "RtcDxeInitialize: %r\n", Status)); > + goto Exit; > + } > + } > + > +Exit: > + gRT->GetTime = GetTime; > + gRT->SetTime = SetTime; > + gRT->GetWakeupTime = GetWakeupTime; > + gRT->SetWakeupTime = SetWakeupTime; > + > + Status = gBS->InstallMultipleProtocolInterfaces (&Private->RtcHandle, > + > &gEfiRealTimeClockArchProtocolGuid, > + NULL, > + NULL); > + > + Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, > + TPL_NOTIFY, > + RtcVirtualNotifyEvent, > + NULL, > + &gEfiEventVirtualAddressChangeGuid, > + &mRtcVirtualAddressChangeEvent); > + ASSERT_EFI_ERROR(Status); > + > + return Status; > +} > diff --git a/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.h > b/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.h > new file mode 100644 > index 0000000000..dca99ef8f9 > --- /dev/null > +++ b/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.h > @@ -0,0 +1,37 @@ > +/** @file > +* > +* SPDX-License-Identifier: BSD-2-Clause-Patent > +* https://spdx.org/licenses > +* > +* Copyright (C) 2022 Marvell > +* > +* Header file for NULL RTC Driver > +* > +**/ > + > +#ifndef _RTC_NULL_DXE_H_ > +#define _RTC_NULL_DXE_H_ > + > +#include <Uefi.h> > + > +#include <Library/BaseLib.h> > +#include <Library/MemoryAllocationLib.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiBootServicesTableLib.h> // gBS > +#include <Library/BaseMemoryLib.h> // ZeroMem > + > +// > +// Private data for driver. > +// > +#define RTC_NULL_DXE_PRIVATE_DATA_SIGNATURE SIGNATURE_32( 'R', 'T', 'C', > '_' ) > + > +typedef struct { > + UINT32 Signature; > + UINT8 Bus; > + UINT8 SlaveAddr; > + EFI_HANDLE RtcHandle; > + BOOLEAN Initialized; > +} RTC_NULL_PRIVATE_DATA; > + > + > +#endif //_RTC_NULL_DXE_H_ > diff --git a/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.inf > b/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.inf > new file mode 100644 > index 0000000000..d262e971fc > --- /dev/null > +++ b/Silicon/Marvell/Drivers/Null/RtcNull/RtcNullDxe.inf > @@ -0,0 +1,46 @@ > +#/** @file > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# https://spdx.org/licenses > +# > +# Copyright (C) 2022 Marvell > +# Module description file of RTC NULL driver. > +# > +#**/ > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = RtcNullDxe > + FILE_GUID = 9c0a0971-b0f6-442e-ac01-0a3eb52c457d > + MODULE_TYPE = DXE_RUNTIME_DRIVER > + VERSION_STRING = 1.0 > + > + ENTRY_POINT = RtcNullDxeInitialize > + > + > +[Sources] > + RtcNullDxe.c > + RtcNullDxe.h > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + > +[LibraryClasses] > + DebugLib > + MemoryAllocationLib > + UefiDriverEntryPoint > + BaseMemoryLib > + UefiBootServicesTableLib > + UefiRuntimeLib > + UefiRuntimeServicesTableLib > + > +[Guids] > + gEfiEventVirtualAddressChangeGuid > + > +[Protocols] > + gEfiRealTimeClockArchProtocolGuid ## PRODUCES > + > +[Depex] > + TRUE > + > -- > 2.34.1 > > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#113721): https://edk2.groups.io/g/devel/message/113721 Mute This Topic: https://groups.io/mt/103292513/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-