+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]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to