From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.24849.1591306553298868966 for ; Thu, 04 Jun 2020 14:35:53 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ard.biesheuvel@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 08EBA1FB; Thu, 4 Jun 2020 14:35:52 -0700 (PDT) Received: from localhost.localdomain (unknown [10.37.8.209]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id F1B813F52E; Thu, 4 Jun 2020 14:35:50 -0700 (PDT) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: mw@semihalf.com, leif@nuviainc.com, Ard Biesheuvel Subject: [RFT PATCH edk2-platforms] Silicon/Marvell/MvI2cDxe: connect all I2C masters at EndOfDxe Date: Thu, 4 Jun 2020 23:35:44 +0200 Message-Id: <20200604213544.279976-1-ard.biesheuvel@arm.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable To ensure that platforms incorporating MvI2cDxe will keep working as intended once the platform BDS code stops calling ConnectAll(), connect the I2C masters explicitly at EndOfDxe. Signed-off-by: Ard Biesheuvel ---=0D Build tested only.=0D Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.inf | 3 ++ Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.h | 1 + Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.c | 54 ++++++++++++++++++-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.inf b/Silicon/Ma= rvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.inf index e59fee0ac1b5..f631fbe797fc 100755 --- a/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.inf +++ b/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.inf @@ -45,5 +45,8 @@ [Pcd] gMarvellTokenSpaceGuid.PcdI2cBaudRate=0D gMarvellTokenSpaceGuid.PcdI2cBusCount=0D =0D +[Guids]=0D + gEfiEndOfDxeEventGroupGuid=0D +=0D [Depex]=0D TRUE=0D diff --git a/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.h b/Silicon/Marv= ell/Drivers/I2c/MvI2cDxe/MvI2cDxe.h index f5c2cdd8ab3a..6caaa45cece0 100644 --- a/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.h +++ b/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.h @@ -80,6 +80,7 @@ typedef struct { =0D typedef struct {=0D VENDOR_DEVICE_PATH Guid;=0D + UINTN Instance;=0D EFI_DEVICE_PATH_PROTOCOL End;=0D } MV_I2C_DEVICE_PATH;=0D =0D diff --git a/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.c b/Silicon/Marv= ell/Drivers/I2c/MvI2cDxe/MvI2cDxe.c index b13ab8f02c99..dfe8da9891a5 100755 --- a/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.c +++ b/Silicon/Marvell/Drivers/I2c/MvI2cDxe/MvI2cDxe.c @@ -30,12 +30,13 @@ STATIC MV_I2C_DEVICE_PATH MvI2cDevicePathProtocol =3D { HARDWARE_DEVICE_PATH,=0D HW_VENDOR_DP,=0D {=0D - (UINT8) (sizeof(VENDOR_DEVICE_PATH)),=0D - (UINT8) (sizeof(VENDOR_DEVICE_PATH) >> 8),=0D + (UINT8) (OFFSET_OF (MV_I2C_DEVICE_PATH, End)),=0D + (UINT8) (OFFSET_OF (MV_I2C_DEVICE_PATH, End) >> 8),=0D },=0D },=0D EFI_CALLER_ID_GUID=0D },=0D + 0, // Instance=0D {=0D END_DEVICE_PATH_TYPE,=0D END_ENTIRE_DEVICE_PATH_SUBTYPE,=0D @@ -86,7 +87,7 @@ MvI2cInitialiseController ( DEBUG((DEBUG_ERROR, "MvI2cDxe: I2C device path allocation failed\n"));= =0D return EFI_OUT_OF_RESOURCES;=0D }=0D - DevicePath->Guid.Guid.Data4[0] =3D Bus;=0D + DevicePath->Instance =3D Bus;=0D =0D /* if attachment succeeds, this gets freed at ExitBootServices */=0D I2cMasterContext =3D AllocateZeroPool (sizeof (I2C_MASTER_CONTEXT));=0D @@ -139,6 +140,47 @@ MvI2cInitialiseController ( return Status;=0D }=0D =0D +STATIC=0D +VOID=0D +EFIAPI=0D +OnEndOfDxe (=0D + IN EFI_EVENT Event,=0D + IN VOID *Context=0D + )=0D +{=0D + MV_I2C_DEVICE_PATH *DevicePath;=0D + EFI_DEVICE_PATH_PROTOCOL *DevicePathPointer;=0D + EFI_HANDLE DeviceHandle;=0D + EFI_STATUS Status;=0D +=0D + gBS->CloseEvent (Event);=0D +=0D + DevicePath =3D AllocateCopyPool (sizeof (MvI2cDevicePathProtocol),=0D + &MvI2cDevicePathProtocol);=0D + if (DevicePath =3D=3D NULL) {=0D + DEBUG ((DEBUG_ERROR, "MvI2cDxe: I2C device path allocation failed\n"))= ;=0D + return;=0D + }=0D +=0D + do {=0D + DevicePathPointer =3D (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;=0D + Status =3D gBS->LocateDevicePath (&gEfiI2cMasterProtocolGuid,=0D + &DevicePathPointer, &DeviceHandle);=0D + if (EFI_ERROR (Status)) {=0D + break;=0D + }=0D +=0D + Status =3D gBS->ConnectController (DeviceHandle, NULL, NULL, TRUE);=0D + DEBUG ((DEBUG_INFO, "%a: ConnectController () returned %r\n",=0D + __FUNCTION__, Status));=0D +=0D + DevicePath->Instance++;=0D + } while (TRUE);=0D +=0D + gBS->FreePool (DevicePath);=0D +}=0D +=0D +=0D EFI_STATUS=0D EFIAPI=0D MvI2cInitialise (=0D @@ -150,6 +192,8 @@ MvI2cInitialise ( MV_BOARD_I2C_DESC *Desc;=0D EFI_STATUS Status;=0D UINTN Index;=0D + EFI_EVENT EndOfDxeEvent;=0D +=0D =0D /* Obtain list of available controllers */=0D Status =3D gBS->LocateProtocol (&gMarvellBoardDescProtocolGuid,=0D @@ -177,6 +221,10 @@ MvI2cInitialise ( =0D BoardDescProtocol->BoardDescFree (Desc);=0D =0D + Status =3D gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, OnEndOfD= xe,=0D + NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent);=0D + ASSERT_EFI_ERROR (Status);=0D +=0D return EFI_SUCCESS;=0D }=0D =0D --=20 2.26.2