Introduce new callback that can provide information about GPIO SoC controllers, as well as on-board I2C IO expanders. According ArmadaSoCDescLib ArmadaBoardDescLib routines are used for obtaining required data.
Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Marcin Wojtas <m...@semihalf.com> --- Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf | 1 + Silicon/Marvell/Include/Protocol/BoardDesc.h | 8 ++++ Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c | 48 ++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf index 41f72d6..0b93948 100644 --- a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf +++ b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.inf @@ -47,6 +47,7 @@ Silicon/Marvell/Marvell.dec [LibraryClasses] + ArmadaBoardDescLib ArmadaSoCDescLib DebugLib MemoryAllocationLib diff --git a/Silicon/Marvell/Include/Protocol/BoardDesc.h b/Silicon/Marvell/Include/Protocol/BoardDesc.h index 1d57a16..e06d689 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_GPIO_GET) ( + IN MARVELL_BOARD_DESC_PROTOCOL *This, + IN OUT MV_BOARD_GPIO_DESC **GpioDesc + ); + +typedef +EFI_STATUS (EFIAPI *MV_BOARD_DESC_I2C_GET) ( IN MARVELL_BOARD_DESC_PROTOCOL *This, IN OUT MV_BOARD_I2C_DESC **I2cDesc @@ -106,6 +113,7 @@ VOID struct _MARVELL_BOARD_DESC_PROTOCOL { MV_BOARD_DESC_AHCI_GET BoardDescAhciGet; MV_BOARD_DESC_COMPHY_GET BoardDescComPhyGet; + MV_BOARD_DESC_GPIO_GET BoardDescGpioGet; MV_BOARD_DESC_I2C_GET BoardDescI2cGet; MV_BOARD_DESC_MDIO_GET BoardDescMdioGet; MV_BOARD_DESC_PP2_GET BoardDescPp2Get; diff --git a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c index 39dc06c..948a6a0 100644 --- a/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c +++ b/Silicon/Marvell/Drivers/BoardDesc/MvBoardDescDxe.c @@ -100,6 +100,53 @@ MvBoardDescComPhyGet ( STATIC EFI_STATUS +MvBoardDescGpioGet ( + IN MARVELL_BOARD_DESC_PROTOCOL *This, + IN OUT MV_BOARD_GPIO_DESC **GpioDesc + ) +{ + MV_I2C_IO_EXPANDER_DESC *I2cIoExpanderDesc; + UINTN SoCGpioCount, I2cIoExpanderCount; + STATIC MV_BOARD_GPIO_DESC *BoardDesc; + MV_SOC_GPIO_DESC *SoCDesc; + EFI_STATUS Status; + + if (BoardDesc != NULL) { + *GpioDesc = BoardDesc; + return EFI_SUCCESS; + } + + /* Get SoC data about all available GPIO controllers */ + Status = ArmadaSoCDescGpioGet (&SoCDesc, &SoCGpioCount); + if (EFI_ERROR (Status)) { + return Status; + } + + /* Get per-board information about all available I2C IO expanders */ + Status = ArmadaBoardDescGpioGet (&I2cIoExpanderDesc, &I2cIoExpanderCount); + if (EFI_ERROR (Status)) { + return Status; + } + + /* Allocate and fill board description */ + BoardDesc = AllocateZeroPool (sizeof (MV_BOARD_GPIO_DESC)); + if (BoardDesc == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Cannot allocate memory\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + BoardDesc->SoC = SoCDesc; + BoardDesc->GpioDevCount = SoCGpioCount; + BoardDesc->I2cIoExpanderDesc = I2cIoExpanderDesc; + BoardDesc->I2cIoExpanderCount = I2cIoExpanderCount; + + *GpioDesc = BoardDesc; + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS MvBoardDescI2cGet ( IN MARVELL_BOARD_DESC_PROTOCOL *This, IN OUT MV_BOARD_I2C_DESC **I2cDesc @@ -556,6 +603,7 @@ MvBoardDescInitProtocol ( { BoardDescProtocol->BoardDescAhciGet = MvBoardDescAhciGet; BoardDescProtocol->BoardDescComPhyGet = MvBoardDescComPhyGet; + BoardDescProtocol->BoardDescGpioGet = MvBoardDescGpioGet; BoardDescProtocol->BoardDescI2cGet = MvBoardDescI2cGet; BoardDescProtocol->BoardDescMdioGet = MvBoardDescMdioGet; BoardDescProtocol->BoardDescPp2Get = MvBoardDescPp2Get; -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel