> -----Original Message-----
> From: Leif Lindholm <leif.lindh...@linaro.org>
> Sent: Monday, December 17, 2018 11:06 PM
> To: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com>
> Cc: ard.biesheu...@linaro.org; michael.d.kin...@intel.com; edk2-
> de...@lists.01.org; Udit Kumar <udit.ku...@nxp.com>; Varun Sethi
> <v.se...@nxp.com>
> Subject: Re: [PATCH edk2-platforms 02/41] Silicon/NXP : Add support for
> Watchdog driver
>
> Starting with this one, since that was the biggest pain point last time
> around.
>
> On Wed, Nov 28, 2018 at 08:31:16PM +0530, Meenakshi Aggarwal wrote:
> > Installs watchdog timer arch protocol
>
> As per the email I just cc:d you on: unless the hardware supports
> configuration in
> a mode where it could be used for a compliant
> EFI_WATCHDOG_TIMER_ARCH_PROTOCOL (i.e., trigger a software event rather
> than a hardware reset), please rewrite this driver such that it does not
> register as
> that protocol.
>
Decided to use watchdog driver from MdeModulePkg.
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Meenakshi Aggarwal <meenakshi.aggar...@nxp.com>
> > ---
> > Silicon/NXP/Drivers/WatchDog/WatchDog.c | 402
> +++++++++++++++++++++++++++
> > Silicon/NXP/Drivers/WatchDog/WatchDog.h | 39 +++
> > Silicon/NXP/Drivers/WatchDog/WatchDogDxe.inf | 47 ++++
> > 3 files changed, 488 insertions(+)
> > create mode 100644 Silicon/NXP/Drivers/WatchDog/WatchDog.c
> > create mode 100644 Silicon/NXP/Drivers/WatchDog/WatchDog.h
> > create mode 100644 Silicon/NXP/Drivers/WatchDog/WatchDogDxe.inf
>
> I would appreciate if you could follow
> https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.
> com%2Ftianocore%2Ftianocore.github.io%2Fwiki%2FLaszlo%27s-unkempt-git-
> guide-for-edk2-contributors-and-maintainers%23contrib-
> 23&data=02%7C01%7Cmeenakshi.aggarwal%40nxp.com%7Cc5cb603bead
> b4855f07608d6644624a1%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0
> %7C636806649758902154&sdata=NSs8taX%2F4oV0yhHmNEWVR%2Btzp3
> TqzuLnIy97t2R8dvs%3D&reserved=0
> when submitting the next revision. It greatly assists with reviewing.
>
Ok, will do.
> > diff --git a/Silicon/NXP/Drivers/WatchDog/WatchDog.c
> > b/Silicon/NXP/Drivers/WatchDog/WatchDog.c
> > new file mode 100644
> > index 0000000..1b1a3b5
> > --- /dev/null
> > +++ b/Silicon/NXP/Drivers/WatchDog/WatchDog.c
> > @@ -0,0 +1,402 @@
> > +/** WatchDog.c
> > +*
> > +* Based on Watchdog driver implemenation available in
> > +* ArmPlatformPkg/Drivers/SP805WatchdogDxe/SP805Watchdog.c
> > +*
> > +* Copyright 2017 NXP
>
> May want to change this to 2017-2018
> Also, format should be
> Copyright (c) ... NXP. All rights reserved.
>
Will change the year to 2017-2019,
but I cant add (c) as it will not be approved by NXP's TAs.
> > +*
> > +* 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
> > +*
> > +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fope
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi
> >
> +.aggarwal%40nxp.com%7Cc5cb603beadb4855f07608d6644624a1%7C686ea1d
> 3bc2b
> >
> +4c6fa92cd99c5c301635%7C0%7C0%7C636806649758902154&sdata=RLV
> E%2Bxi
> > +qQaQnHRKR7Spc6QYdx1pHPnKyqheLBqIinU4%3D&reserved=0
> > +*
> > +* 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 <PiDxe.h>
> > +#include <Library/BaseLib.h>
> > +#include <Library/IoAccessLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/PcdLib.h>
> > +#include <Library/UefiBootServicesTableLib.h>
> > +#include <Protocol/WatchdogTimer.h>
> > +
> > +#include "WatchDog.h"
> > +
> > +STATIC EFI_EVENT EfiExitBootServicesEvent; STATIC EFI_EVENT
> > +WdogFeedEvent;
>
> m-prefix for both above please.
>
> Can you do a search-and-replace Wdog -> Watchdog and WDOG -> WATCHDOG
> please?
>
> > +STATIC MMIO_OPERATIONS_16 *mMmioOps;
> > +
> > +
> > +STATIC
> > +VOID
> > +WdogPing (
> > + VOID
> > + )
> > +{
> > + //
> > + // To reload a timeout value to the counter the proper service
> > +sequence begins by
> > + // writing 0x_5555 followed by 0x_AAAA to the Watchdog Service Register
> (WDOG_WSR).
> > + // This service sequence will reload the counter with the timeout
> > +value WT[7:0] of
> > + // Watchdog Control Register (WDOG_WCR).
> > + //
> > +
> > + mMmioOps->Write (PcdGet64 (PcdWdog1BaseAddr) +
> WDOG_WSR_OFFSET,
> > + WDOG_SERVICE_SEQ1);
>
> The memory access operations really need to encode size.
> I would strongly prefer mMmioOps->Write16.
>
> You could also tidy the call sites up with something like
>
> #define WATCHDOG_ADDRESS(register) (PcdGet64 (PcdWdog1BaseAddr),
> WATCHDOG_ ## register ## _OFFSET)
>
> So the invocation becomes
>
> mMmioOps->Write16 (WATCHDOG_ADDRESS (WSR),
> WATCHDOG_SERVICE_SEQ1);
>
>
> > + mMmioOps->Write (PcdGet64 (PcdWdog1BaseAddr) +
> WDOG_WSR_OFFSET,
> > + WDOG_SERVICE_SEQ2); }
> > +
> > +/**
> > + Stop the Wdog watchdog timer from counting down.
> > +**/
> > +STATIC
> > +VOID
> > +WdogStop (
> > + VOID
> > + )
> > +{
> > + // Watchdog cannot be disabled by software once started.
> > + // At best, we can keep reload counter with maximum value
> > +
> > + mMmioOps->AndThenOr (PcdGet64 (PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET,
> > + (UINT16)(~WDOG_WCR_WT),
> > + (WD_COUNT (WT_MAX_TIME) & WD_COUNT_MASK));
> > + WdogPing ();
> > +}
> > +
> > +/**
> > + Starts the Wdog counting down by feeding Service register with
> > + desired pattern.
> > + The count down will start from the value stored in the Load
> > +register,
> > + not from the value where it was previously stopped.
> > +**/
> > +STATIC
> > +VOID
> > +WdogStart (
> > + VOID
> > + )
> > +{
> > + //Reload the timeout value
> > + WdogPing ();
> > +}
> > +
> > +/**
> > + On exiting boot services we must make sure the Wdog Watchdog Timer
> > + is stopped.
> > +**/
> > +STATIC
> > +VOID
> > +EFIAPI
> > +ExitBootServicesEvent (
> > + IN EFI_EVENT Event,
> > + IN VOID *Context
> > + )
> > +{
> > + WdogStop ();
> > +}
> > +
> > +/**
> > + This function registers the handler NotifyFunction so it is called
> > +every time
> > + the watchdog timer expires. It also passes the amount of time
> > +since the last
> > + handler call to the NotifyFunction.
> > + If NotifyFunction is not NULL and a handler is not already
> > +registered,
> > + then the new handler is registered and EFI_SUCCESS is returned.
> > + If NotifyFunction is NULL, and a handler is already registered,
> > + then that handler is unregistered.
> > + If an attempt is made to register a handler when a handler is
> > +already registered,
> > + then EFI_ALREADY_STARTED is returned.
> > + If an attempt is made to unregister a handler when a handler is not
> > +registered,
> > + then EFI_INVALID_PARAMETER is returned.
> > +
> > + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> > + @param NotifyFunction The function to call when a timer interrupt
> > fires.
> This
> > + function executes at TPL_HIGH_LEVEL. The DXE
> > Core will
> > + register a handler for the timer interrupt, so
> > it can know
> > + how much time has passed. This information is
> > used to
> > + signal timer based events. NULL will unregister
> > the handler.
> > +
> > + @retval EFI_SUCCESS The watchdog timer handler was registered.
> > + @retval EFI_ALREADY_STARTED NotifyFunction is not NULL, and a handler
> is already
> > + registered.
> > + @retval EFI_INVALID_PARAMETER NotifyFunction is NULL, and a handler
> was not
> > + previously registered.
> > +
> > +**/
> > +STATIC
> > +EFI_STATUS
> > +EFIAPI
> > +WdogRegisterHandler (
> > + IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> > + IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
> > + )
> > +{
> > + // ERROR: This function is not supported.
> > + // The hardware watchdog will reset the board
> > + return EFI_INVALID_PARAMETER;
> > +}
> > +
> > +/**
> > +
> > + This function adjusts the period of timer interrupts to the value
> > + specified by TimerPeriod. If the timer period is updated, then the
> > + selected timer period is stored in EFI_TIMER.TimerPeriod, and
> > + EFI_SUCCESS is returned. If the timer hardware is not programmable, then
> EFI_UNSUPPORTED is returned.
> > + If an error occurs while attempting to update the timer period,
> > + then the timer hardware will be put back in its state prior to this
> > + call, and EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then
> > + the timer interrupt is disabled. This is not the same as disabling the
> > CPU's
> interrupts.
> > + Instead, it must either turn off the timer hardware, or it must
> > + adjust the interrupt controller so that a CPU interrupt is not
> > + generated when the timer interrupt fires.
> > +
> > + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> > + @param TimerPeriod The rate to program the timer interrupt in 100
> > nS
> units. If
> > + the timer hardware is not programmable, then
> EFI_UNSUPPORTED is
> > + returned. If the timer is programmable, then
> > the timer period
> > + will be rounded up to the nearest timer period
> > that is
> supported
> > + by the timer hardware. If TimerPeriod is set to
> > 0, then the
> > + timer interrupts will be disabled.
> > +
> > +
> > + @retval EFI_SUCCESS The timer period was changed.
> > + @retval EFI_UNSUPPORTED The platform cannot change the period of
> the timer interrupt.
> > + @retval EFI_DEVICE_ERROR The timer period could not be changed due
> to a device error.
> > +
> > +**/
> > +STATIC
> > +EFI_STATUS
> > +EFIAPI
> > +WdogSetTimerPeriod (
> > + IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> > + IN UINT64 TimerPeriod // In 100ns units
> > + )
> > +{
> > + EFI_STATUS Status;
> > + UINT64 TimerPeriodInSec;
> > + UINT16 Val;
> > +
> > + Status = EFI_SUCCESS;
> > +
> > + if (TimerPeriod == 0) {
> > + // This is a watchdog stop request
> > + WdogStop ();
> > + return Status;
> > + } else {
> > + // Convert the TimerPeriod (in 100 ns unit) to an equivalent
> > + second value
> > +
> > + TimerPeriodInSec = DivU64x32 (TimerPeriod, NANO_SECOND_BASE);
> > +
> > + // The registers in the Wdog are only 32 bits
> > + if (TimerPeriodInSec > WT_MAX_TIME) {
> > + // We could load the watchdog with the maximum supported value but
> > + // if a smaller value was requested, this could have the watchdog
> > + // triggering before it was intended.
> > + // Better generate an error to let the caller know.
> > + Status = EFI_DEVICE_ERROR;
> > + return Status;
> > + }
> > +
> > + // set the new timeout value in the WCR
> > + // Convert the timeout value from Seconds to timer count
> > + Val = ((WD_COUNT(TimerPeriodInSec) & WD_COUNT_MASK) << 8);
> > +
> > + mMmioOps->AndThenOr (PcdGet64 (PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET,
> > + (UINT16)(~WDOG_WCR_WT),
> > + Val);
> > + // Start the watchdog
> > + WdogStart ();
> > + }
> > +
> > + return Status;
> > +}
> > +
> > +/**
> > + This function retrieves the period of timer interrupts in 100 ns
> > +units,
> > + returns that value in TimerPeriod, and returns EFI_SUCCESS. If
> > +TimerPeriod
> > + is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod
> > +of 0 is
> > + returned, then the timer is currently disabled.
> > +
> > + @param This The EFI_TIMER_ARCH_PROTOCOL instance.
> > + @param TimerPeriod A pointer to the timer period to retrieve in
> > 100 ns
> units. If
> > + 0 is returned, then the timer is currently
> > disabled.
> > +
> > +
> > + @retval EFI_SUCCESS The timer period was returned in
> > TimerPeriod.
> > + @retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
> > +
> > +**/
> > +STATIC
> > +EFI_STATUS
> > +EFIAPI
> > +WdogGetTimerPeriod (
> > + IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
> > + OUT UINT64 *TimerPeriod
> > + )
> > +{
> > + EFI_STATUS Status;
> > + UINT64 ReturnValue;
> > + UINT16 Val;
> > +
> > + Status = EFI_SUCCESS;
> > +
> > + if (TimerPeriod == NULL) {
> > + return EFI_INVALID_PARAMETER;
> > + }
> > +
> > + // Check if the watchdog is stopped if ((mMmioOps->Read (PcdGet64
> > + (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET)
> > + & WDOG_WCR_WDE) == 0 ) {
> > + // It is stopped, so return zero.
> > + ReturnValue = 0;
> > + } else {
> > + // Convert the Watchdog ticks into equivalent TimerPeriod second value.
> > + Val = (mMmioOps->Read (PcdGet64 (PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET)
> > + & WDOG_WCR_WT ) >> 8;
> > + ReturnValue = WD_SEC(Val);
> > + }
> > +
> > + *TimerPeriod = ReturnValue;
> > + return Status;
> > +}
> > +
> > +/**
> > + Interface structure for the Watchdog Architectural Protocol.
> > +
> > + @par Protocol Description:
> > + This protocol provides a service to set the amount of time to wait
> > + before firing the watchdog timer, and it also provides a service to
> > + register a handler that is invoked when the watchdog timer fires.
> > +
> > + @par When the watchdog timer fires, control will be passed to a
> > + handler if one has been registered. If no handler has been
> > + registered, or the registered handler returns, then the system will
> > + be reset by calling the Runtime Service ResetSystem().
> > +
> > + @param RegisterHandler
> > + Registers a handler that will be called each time the
> > + watchdogtimer interrupt fires. TimerPeriod defines the minimum
> > + time between timer interrupts, so TimerPeriod will also be the
> > + minimum time between calls to the registered handler.
> > + NOTE: If the watchdog resets the system in hardware, then
> > + this function will not have any chance of executing.
> > +
> > + @param SetTimerPeriod
> > + Sets the period of the timer interrupt in 100 nS units.
> > + This function is optional, and may return EFI_UNSUPPORTED.
> > + If this function is supported, then the timer period will be
> > + rounded up to the nearest supported timer period.
> > +
> > + @param GetTimerPeriod
> > + Retrieves the period of the timer interrupt in 100 nS units.
> > +
> > +**/
> > +STATIC
> > +EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
>
> g implies global (as in visible to all modules). Please use 'm' for
> module-local
> globals.
>
> > + WdogRegisterHandler,
> > + WdogSetTimerPeriod,
> > + WdogGetTimerPeriod
> > +};
> > +
> > +/**
> > + Call back function when the timer event is signaled.
> > + This function will feed the watchdog with maximum value
> > + so that system wont reset in idle case e.g. stopped on UEFI shell.
> > +
> > + @param[in] Event The Event this notify function registered to.
> > + @param[in] Context Pointer to the context data registered to the
> > + Event.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +WdogFeed (
> > + IN EFI_EVENT Event,
> > + IN VOID* Context
> > + )
> > +{
> > + WdogPing();
> > +}
> > +/**
> > + Initialize state information for the Watchdog Timer Architectural
> > Protocol.
> > +
> > + @param ImageHandle of the loaded driver
> > + @param SystemTable Pointer to the System Table
> > +
> > + @retval EFI_SUCCESS Protocol registered
> > + @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure
> > + @retval EFI_DEVICE_ERROR Hardware problems
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +WdogInitialize (
> > + IN EFI_HANDLE ImageHandle,
> > + IN EFI_SYSTEM_TABLE *SystemTable
> > + )
> > +{
> > + EFI_STATUS Status;
> > + EFI_HANDLE Handle;
> > +
> > + mMmioOps = GetMmioOperations16 (FixedPcdGetBool
> > + (PcdWdogBigEndian));
> > +
> > + mMmioOps->AndThenOr (PcdGet64 (PcdWdog1BaseAddr) +
> WDOG_WCR_OFFSET,
> > + (UINT16)(~WDOG_WCR_WT),
> > + (WD_COUNT (WT_MAX_TIME) & WD_COUNT_MASK));
> > +
> > + mMmioOps->Or (PcdGet64 (PcdWdog1BaseAddr) + WDOG_WCR_OFFSET,
> > + WDOG_WCR_WDE);
> > +
> > + //
> > + // Make sure the Watchdog Timer Architectural Protocol // has not
> > + been installed in the system yet.
> > + // This will avoid conflicts with the universal watchdog //
> > + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL,
> > + &gEfiWatchdogTimerArchProtocolGuid);
> > +
> > + // Register for an ExitBootServicesEvent Status = gBS->CreateEvent
> > + (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
> > + ExitBootServicesEvent, NULL,
> > + &EfiExitBootServicesEvent); if (EFI_ERROR (Status)) {
> > + Status = EFI_OUT_OF_RESOURCES;
> > + return Status;
> > + }
> > +
> > + //
> > + // Start the timer to feed Watchdog with maximum timeout value.
> > + //
> > + Status = gBS->CreateEvent (
> > + EVT_TIMER | EVT_NOTIFY_SIGNAL,
> > + TPL_NOTIFY,
> > + WdogFeed,
> > + NULL,
> > + &WdogFeedEvent
> > + );
> > + if (EFI_ERROR (Status)) {
> > + return Status;
> > + }
> > +
> > + Status = gBS->SetTimer (WdogFeedEvent, TimerPeriodic,
> > + WT_FEED_INTERVAL); if (EFI_ERROR (Status)) {
> > + return Status;
> > + }
> > +
> > + // Install the Timer Architectural Protocol onto a new handle
> > + Handle = NULL; Status = gBS->InstallMultipleProtocolInterfaces (
> > + &Handle,
> > + &gEfiWatchdogTimerArchProtocolGuid, &gWatchdogTimer,
> > + NULL
> > + );
> > + if (EFI_ERROR (Status)) {
> > + gBS->CloseEvent (EfiExitBootServicesEvent);
> > + Status = EFI_OUT_OF_RESOURCES;
> > + return Status;
> > + }
> > +
> > + WdogPing ();
> > +
> > + return Status;
> > +}
> > diff --git a/Silicon/NXP/Drivers/WatchDog/WatchDog.h
> > b/Silicon/NXP/Drivers/WatchDog/WatchDog.h
> > new file mode 100644
> > index 0000000..9542608
> > --- /dev/null
> > +++ b/Silicon/NXP/Drivers/WatchDog/WatchDog.h
> > @@ -0,0 +1,39 @@
> > +/** WatchDog.h
> > +*
> > +* Copyright 2017 NXP
> > +*
> > +* 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
> > +*
> > +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fope
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi
> >
> +.aggarwal%40nxp.com%7Cc5cb603beadb4855f07608d6644624a1%7C686ea1d
> 3bc2b
> >
> +4c6fa92cd99c5c301635%7C0%7C0%7C636806649758902154&sdata=RLV
> E%2Bxi
> > +qQaQnHRKR7Spc6QYdx1pHPnKyqheLBqIinU4%3D&reserved=0
> > +*
> > +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > +BASIS,
> > +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> > +*
> > +**/
> > +
> > +#ifndef __WATCHDOG_H__
> > +#define __WATCHDOG_H__
> > +
> > +#define WDOG_SIZE 0x1000
> > +#define WDOG_WCR_OFFSET 0
> > +#define WDOG_WSR_OFFSET 2
> > +#define WDOG_WRSR_OFFSET 4
> > +#define WDOG_WICR_OFFSET 6
> > +#define WDOG_WCR_WT (0xFF << 8)
> > +#define WDOG_WCR_WDE (1 << 2)
> > +#define WDOG_SERVICE_SEQ1 0x5555
> > +#define WDOG_SERVICE_SEQ2 0xAAAA
> > +#define WDOG_WCR_WDZST 0x1
> > +#define WDOG_WCR_WRE (1 << 3) /* -> WDOG Reset Enable */
> > +
> > +#define WT_MAX_TIME 128
>
> WT?
>
> > +#define WD_COUNT(Sec) (((Sec) * 2 - 1) << 8)
> > +#define WD_COUNT_MASK 0xff00
> > +#define WD_SEC(Cnt) (((Cnt) + 1) / 2)
>
> WD?
>
> /
> Leif
>
> > +
> > +#define NANO_SECOND_BASE 10000000
> > +
> > +#define WT_FEED_INTERVAL (WT_MAX_TIME * NANO_SECOND_BASE)
> > +
> > +#endif //__WATCHDOG_H__
> > diff --git a/Silicon/NXP/Drivers/WatchDog/WatchDogDxe.inf
> > b/Silicon/NXP/Drivers/WatchDog/WatchDogDxe.inf
> > new file mode 100644
> > index 0000000..a311bdc
> > --- /dev/null
> > +++ b/Silicon/NXP/Drivers/WatchDog/WatchDogDxe.inf
> > @@ -0,0 +1,47 @@
> > +# WatchDog.inf
> > +#
> > +# Component description file for WatchDog module # # Copyright
> > +2017 NXP # # 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 #
> > +https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fope
> > +nsource.org%2Flicenses%2Fbsd-
> license.php&data=02%7C01%7Cmeenakshi
> >
> +.aggarwal%40nxp.com%7Cc5cb603beadb4855f07608d6644624a1%7C686ea1d
> 3bc2b
> >
> +4c6fa92cd99c5c301635%7C0%7C0%7C636806649758902154&sdata=RLV
> E%2Bxi
> > +qQaQnHRKR7Spc6QYdx1pHPnKyqheLBqIinU4%3D&reserved=0
> > +#
> > +# 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 = 0x0001001A
> > + BASE_NAME = WatchDogDxe
> > + FILE_GUID = 0358b544-ec65-4339-89cd-cad60a3dd787
> > + MODULE_TYPE = DXE_DRIVER
> > + VERSION_STRING = 1.0
> > + ENTRY_POINT = WdogInitialize
> > +
> > +[Sources.common]
> > + WatchDog.c
> > +
> > +[Packages]
> > + MdePkg/MdePkg.dec
> > + Silicon/NXP/NxpQoriqLs.dec
> > +
> > +[LibraryClasses]
> > + BaseLib
> > + IoAccessLib
> > + PcdLib
> > + UefiBootServicesTableLib
> > + UefiDriverEntryPoint
> > +
> > +[Pcd]
> > + gNxpQoriqLsTokenSpaceGuid.PcdWdog1BaseAddr
> > + gNxpQoriqLsTokenSpaceGuid.PcdWdogBigEndian
> > +
> > +[Protocols]
> > + gEfiWatchdogTimerArchProtocolGuid
> > +
> > +[Depex]
> > + TRUE
> > --
> > 1.9.1
> >
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel