On Sun, Jun 17, 2018 at 10:12:03PM +0200, Marcin Wojtas wrote: > Introduce new callback that can provide information > about I2C controllers to the I2c driver. > > Extend ArmadaBoardDescLib with new structure MV_BOARD_I2C_DESC, > for holding board specific data. In further steps it should > be extended and replace PCD I2C devices' representation with the > appropriate structures. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Marcin Wojtas <m...@semihalf.com>
Reviewed-by: Leif Lindholm <leif.lindh...@linaro.org> > --- > Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf | 1 + > Silicon/Marvell/Include/Library/ArmadaBoardDescLib.h | 8 +++ > Silicon/Marvell/Include/Protocol/BoardDesc.h | 8 +++ > Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c | 66 > ++++++++++++++++++++ > 4 files changed, 83 insertions(+) > > diff --git a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf > b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf > index dea99fd..41f72d6 100644 > --- a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf > +++ b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf > @@ -58,6 +58,7 @@ > > [Pcd] > gMarvellTokenSpaceGuid.PcdComPhyDevices > + gMarvellTokenSpaceGuid.PcdI2cControllersEnabled > gMarvellTokenSpaceGuid.PcdPciEAhci > gMarvellTokenSpaceGuid.PcdPciESdhci > gMarvellTokenSpaceGuid.PcdPciEXhci > diff --git a/Silicon/Marvell/Include/Library/ArmadaBoardDescLib.h > b/Silicon/Marvell/Include/Library/ArmadaBoardDescLib.h > index b11fa9d..ee8e06e 100644 > --- a/Silicon/Marvell/Include/Library/ArmadaBoardDescLib.h > +++ b/Silicon/Marvell/Include/Library/ArmadaBoardDescLib.h > @@ -25,6 +25,14 @@ typedef struct { > } MV_BOARD_COMPHY_DESC; > > // > +// I2C devices per-board description > +// > +typedef struct { > + MV_SOC_I2C_DESC *SoC; > + UINTN I2cDevCount; > +} MV_BOARD_I2C_DESC; > + > +// > // MDIO devices per-board description > // > typedef struct { > diff --git a/Silicon/Marvell/Include/Protocol/BoardDesc.h > b/Silicon/Marvell/Include/Protocol/BoardDesc.h > index 55297f5..1d57a16 100644 > --- a/Silicon/Marvell/Include/Protocol/BoardDesc.h > +++ b/Silicon/Marvell/Include/Protocol/BoardDesc.h > @@ -50,6 +50,13 @@ EFI_STATUS > > typedef > EFI_STATUS > +(EFIAPI *MV_BOARD_DESC_I2C_GET) ( > + IN MARVELL_BOARD_DESC_PROTOCOL *This, > + IN OUT MV_BOARD_I2C_DESC **I2cDesc > + ); > + > +typedef > +EFI_STATUS > (EFIAPI *MV_BOARD_DESC_MDIO_GET) ( > IN MARVELL_BOARD_DESC_PROTOCOL *This, > IN OUT MV_BOARD_MDIO_DESC **MdioDesc > @@ -99,6 +106,7 @@ VOID > struct _MARVELL_BOARD_DESC_PROTOCOL { > MV_BOARD_DESC_AHCI_GET BoardDescAhciGet; > MV_BOARD_DESC_COMPHY_GET BoardDescComPhyGet; > + MV_BOARD_DESC_I2C_GET BoardDescI2cGet; > MV_BOARD_DESC_MDIO_GET BoardDescMdioGet; > MV_BOARD_DESC_PP2_GET BoardDescPp2Get; > MV_BOARD_DESC_SDMMC_GET BoardDescSdMmcGet; > diff --git a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c > b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c > index 5dfc559..39dc06c 100644 > --- a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c > +++ b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c > @@ -100,6 +100,71 @@ MvBoardDescComPhyGet ( > > STATIC > EFI_STATUS > +MvBoardDescI2cGet ( > + IN MARVELL_BOARD_DESC_PROTOCOL *This, > + IN OUT MV_BOARD_I2C_DESC **I2cDesc > + ) > +{ > + UINT8 *I2cDeviceEnabled; > + UINTN I2cCount, I2cDeviceEnabledSize, I2cIndex, Index; > + MV_BOARD_I2C_DESC *BoardDesc; > + MV_SOC_I2C_DESC *SoCDesc; > + EFI_STATUS Status; > + > + /* Get SoC data about all available I2C controllers */ > + Status = ArmadaSoCDescI2cGet (&SoCDesc, &I2cCount); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + /* > + * Obtain table with enabled I2C controllers > + * which is represented as an array of UINT8 values > + * (0x0 - disabled, 0x1 enabled). > + */ > + I2cDeviceEnabled = PcdGetPtr (PcdI2cControllersEnabled); > + if (I2cDeviceEnabled == NULL) { > + /* No I2C on platform */ > + return EFI_SUCCESS; > + } > + > + I2cDeviceEnabledSize = PcdGetSize (PcdI2cControllersEnabled); > + > + /* Check if PCD with I2C controllers is correctly defined */ > + if (I2cDeviceEnabledSize > I2cCount) { > + DEBUG ((DEBUG_ERROR, > + "%a: Wrong PcdI2cControllersEnabled format\n", > + __FUNCTION__)); > + return EFI_INVALID_PARAMETER; > + } > + > + /* Allocate and fill board description */ > + BoardDesc = AllocateZeroPool (I2cDeviceEnabledSize * sizeof > (MV_BOARD_I2C_DESC)); > + if (BoardDesc == NULL) { > + DEBUG ((DEBUG_ERROR, "%a: Cannot allocate memory\n", __FUNCTION__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + I2cIndex = 0; > + for (Index = 0; Index < I2cDeviceEnabledSize; Index++) { > + if (!I2cDeviceEnabled[Index]) { > + DEBUG ((DEBUG_INFO, "%a: Skip I2c controller %d\n", __FUNCTION__, > Index)); > + continue; > + } > + > + BoardDesc[I2cIndex].SoC = &SoCDesc[Index]; > + I2cIndex++; > + } > + > + BoardDesc->I2cDevCount = I2cIndex; > + > + *I2cDesc = BoardDesc; > + > + return EFI_SUCCESS; > +} > + > +STATIC > +EFI_STATUS > MvBoardDescMdioGet ( > IN MARVELL_BOARD_DESC_PROTOCOL *This, > IN OUT MV_BOARD_MDIO_DESC **MdioDesc > @@ -491,6 +556,7 @@ MvBoardDescInitProtocol ( > { > BoardDescProtocol->BoardDescAhciGet = MvBoardDescAhciGet; > BoardDescProtocol->BoardDescComPhyGet = MvBoardDescComPhyGet; > + BoardDescProtocol->BoardDescI2cGet = MvBoardDescI2cGet; > BoardDescProtocol->BoardDescMdioGet = MvBoardDescMdioGet; > BoardDescProtocol->BoardDescPp2Get = MvBoardDescPp2Get; > BoardDescProtocol->BoardDescSdMmcGet = MvBoardDescSdMmcGet; > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel