[edk2-devel] [PATCH v2 03/28] Silicon/NXP/I2cDxe: Fix I2c Timeout with RTC
Leif Lindholm
leif at nuviainc.com
Tue Mar 31 11:58:33 UTC 2020
On Fri, Mar 20, 2020 at 20:05:18 +0530, Pankaj Bansal wrote:
> From: Pankaj Bansal <pankaj.bansal at nxp.com>
>
> With latest edk2 codebase, sometimes i2c timeout is observed when
> Network devices are being probed.
> This is happening when gRT->GetTime request is ongoing.
> gRT->GetTime triggers a read request to Real Time Clock which is
> connected to I2c bus.
> In between read request, if an event occurs, which also triggers
> gRT->GetTime (i.e. RTC read), the I2c bus goes into unrecovered state.
>
> This state is not even recovered, when rebooting the board.
> We need to power off the board completely to recover i2c bus.
>
> To prevent this, TPL level of I2c read is being raised to high, so that
> no other event can preempt this. with this solution no timeout has been
> observed so far.
>
> Signed-off-by: Pankaj Bansal <pankaj.bansal at nxp.com>
Reviewed-by: Leif Lindholm <leif at nuviainc.com>
> ---
> Silicon/NXP/Drivers/I2cDxe/I2cDxe.c | 12 ++++++++++++
> Silicon/NXP/Drivers/I2cDxe/I2cDxe.inf | 3 ++-
> 2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/Silicon/NXP/Drivers/I2cDxe/I2cDxe.c b/Silicon/NXP/Drivers/I2cDxe/I2cDxe.c
> index 848e707c1673..a5aba47b3ed4 100644
> --- a/Silicon/NXP/Drivers/I2cDxe/I2cDxe.c
> +++ b/Silicon/NXP/Drivers/I2cDxe/I2cDxe.c
> @@ -16,6 +16,7 @@
> #include <Library/TimerLib.h>
> #include <Library/UefiBootServicesTableLib.h>
> #include <Library/UefiLib.h>
> +#include <Library/UefiRuntimeLib.h>
>
> #include "I2cDxe.h"
>
> @@ -88,6 +89,13 @@ StartRequest (
> NXP_I2C_MASTER *I2c;
> UINTN I2cBase;
> EFI_STATUS Status;
> + EFI_TPL Tpl;
> + BOOLEAN AtRuntime;
> +
> + AtRuntime = EfiAtRuntime ();
> + if (!AtRuntime) {
> + Tpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
> + }
>
> I2c = NXP_I2C_FROM_THIS (This);
>
> @@ -95,6 +103,10 @@ StartRequest (
>
> Status = I2cBusXfer (I2cBase, SlaveAddress, RequestPacket);
>
> + if (!AtRuntime) {
> + gBS->RestoreTPL (Tpl);
> + }
> +
> return Status;
> }
>
> diff --git a/Silicon/NXP/Drivers/I2cDxe/I2cDxe.inf b/Silicon/NXP/Drivers/I2cDxe/I2cDxe.inf
> index 84adb837c249..867376044656 100644
> --- a/Silicon/NXP/Drivers/I2cDxe/I2cDxe.inf
> +++ b/Silicon/NXP/Drivers/I2cDxe/I2cDxe.inf
> @@ -13,7 +13,7 @@ [Defines]
> INF_VERSION = 0x0001001A
> BASE_NAME = I2cDxe
> FILE_GUID = 5f2927ba-1b04-4d5f-8bef-2b50c635d1e7
> - MODULE_TYPE = DXE_DRIVER
> + MODULE_TYPE = DXE_RUNTIME_DRIVER
> VERSION_STRING = 1.0
> ENTRY_POINT = I2cDxeEntryPoint
> UNLOAD = I2cDxeUnload
> @@ -36,6 +36,7 @@ [LibraryClasses]
> UefiBootServicesTableLib
> UefiDriverEntryPoint
> UefiLib
> + UefiRuntimeLib
>
> [Guids]
> gNxpNonDiscoverableI2cMasterGuid
> --
> 2.17.1
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#56752): https://edk2.groups.io/g/devel/message/56752
Mute This Topic: https://groups.io/mt/72077424/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list