/** @file Implementation of BaseGpioCheckConflictLib. Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include /** Check Gpio PadMode conflict and report it. @retval none. **/ VOID GpioCheckConflict ( VOID ) { EFI_HOB_GUID_TYPE *GpioCheckConflictHob; GPIO_PAD_MODE_INFO *GpioCheckConflictHobData; UINT32 HobDataSize; UINT32 GpioCount; UINT32 GpioIndex; GPIO_CONFIG GpioActualConfig; GpioCheckConflictHob = NULL; GpioCheckConflictHobData = NULL; DEBUG ((DEBUG_INFO, "GpioCheckConflict Start..\n")); // //Use Guid to find HOB. // GpioCheckConflictHob = (EFI_HOB_GUID_TYPE *) GetFirstGuidHob (&gGpioCheckConflictHobGuid); if (GpioCheckConflictHob == NULL) { DEBUG ((DEBUG_INFO, "[Gpio Hob Check] Can't find Gpio Hob.\n")); } else { while (GpioCheckConflictHob != NULL) { // // Find the Data area pointer and Data size from the Hob // GpioCheckConflictHobData = (GPIO_PAD_MODE_INFO *) GET_GUID_HOB_DATA (GpioCheckConflictHob); HobDataSize = GET_GUID_HOB_DATA_SIZE (GpioCheckConflictHob); GpioCount = HobDataSize / sizeof (GPIO_PAD_MODE_INFO); DEBUG ((DEBUG_INFO, "[Hob Check] Hob : GpioCount = %d\n", GpioCount)); // // Probe Gpio entries in Hob and compare which are conflicted // for (GpioIndex = 0; GpioIndex < GpioCount ; GpioIndex++) { GpioGetPadConfig (GpioCheckConflictHobData[GpioIndex].GpioPad, &GpioActualConfig); if (GpioCheckConflictHobData[GpioIndex].GpioPadMode != GpioActualConfig.PadMode) { DEBUG ((DEBUG_ERROR, "[Gpio Check] Identified conflict on pad %a\n", GpioName (GpioCheckConflictHobData[GpioIndex].GpioPad))); } } // // Find next Hob and return the Hob pointer by the specific Hob Guid // GpioCheckConflictHob = GET_NEXT_HOB (GpioCheckConflictHob); GpioCheckConflictHob = GetNextGuidHob (&gGpioCheckConflictHobGuid, GpioCheckConflictHob); } DEBUG ((DEBUG_INFO, "GpioCheckConflict End.\n")); } return; } /** This libaray will create one Hob for each Gpio config table without PadMode is GpioHardwareDefault @param[in] GpioDefinition Point to Platform Gpio table @param[in] GpioTableCount Number of Gpio table entries @retval none. **/ VOID CreateGpioCheckConflictHob ( IN GPIO_INIT_CONFIG *GpioDefinition, IN UINT16 GpioTableCount ) { UINT32 Index; UINT32 GpioIndex; GPIO_PAD_MODE_INFO *GpioCheckConflictHobData; UINT16 GpioCount; GpioCount = 0; GpioIndex = 0; DEBUG ((DEBUG_INFO, "CreateGpioCheckConflictHob Start \n")); for (Index = 0; Index < GpioTableCount ; Index++) { if (GpioDefinition[Index].GpioConfig.PadMode == GpioHardwareDefault) { continue; } else { // // Calculate how big size the Hob Data needs // GpioCount++; } } // // Build a HOB tagged with a GUID for identification and returns // the start address of GUID HOB data. // GpioCheckConflictHobData = (GPIO_PAD_MODE_INFO *) BuildGuidHob (&gGpioCheckConflictHobGuid , GpioCount * sizeof (GPIO_PAD_MODE_INFO)); // // Record Non Default Gpio entries to the Hob // for (Index = 0; Index < GpioTableCount; Index++) { if (GpioDefinition[Index].GpioConfig.PadMode == GpioHardwareDefault) { continue; } else { GpioCheckConflictHobData[GpioIndex].GpioPad = GpioDefinition[Index].GpioPad; GpioCheckConflictHobData[GpioIndex].GpioPadMode = GpioDefinition[Index].GpioConfig.PadMode; GpioIndex++; } } DEBUG ((DEBUG_INFO, "CreateGpioCheckConflictHob End \n")); return; }