/** @file * * Copyright (c) 2018, ARM Limited. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include #include #include #include #include #include #include /** This function returns the System ID of the platform This functions locates the NtFwConfig PPI and gets the base address of NT_FW_CONFIG DT from which the platform ID and config ID is obtained using FDT helper functions @param[out] Pointer to the SGI_PLATFORM_DESCRIPTOR HoB @return returns EFI_SUCCESS on success and EFI_INVALID_PARAMETER on error **/ STATIC EFI_STATUS GetSgiSystemId ( OUT SGI_PLATFORM_DESCRIPTOR *HobData ) { CONST UINT32 *Property; INT32 Offset; CONST VOID *NtFwCfgDtBlob; SGI_NT_FW_CONFIG_INFO_PPI *NtFwConfigInfoPpi; EFI_STATUS Status; Status = PeiServicesLocatePpi (&gNtFwConfigDtInfoPpiGuid, 0, NULL, (VOID**)&NtFwConfigInfoPpi); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "PeiServicesLocatePpi failed with error %r\n", Status)); return EFI_INVALID_PARAMETER; } NtFwCfgDtBlob = (VOID *)(UINTN)NtFwConfigInfoPpi->NtFwConfigDtAddr; if (fdt_check_header (NtFwCfgDtBlob) != 0) { DEBUG ((DEBUG_ERROR, "Invalid DTB file %p passed\n", NtFwCfgDtBlob)); return EFI_INVALID_PARAMETER; } Offset = fdt_subnode_offset (NtFwCfgDtBlob, 0, "system-id"); if (Offset == -FDT_ERR_NOTFOUND) { DEBUG ((DEBUG_ERROR, "Invalid DTB : system-id node not found\n")); return EFI_INVALID_PARAMETER; } Property = fdt_getprop (NtFwCfgDtBlob, Offset, "platform-id", NULL); if (Property == NULL) { DEBUG ((DEBUG_ERROR, "platform-id property not found\n")); return EFI_INVALID_PARAMETER; } HobData->PlatformId = fdt32_to_cpu (*Property); Property = fdt_getprop (NtFwCfgDtBlob, Offset, "config-id", NULL); if (Property == NULL) { DEBUG ((DEBUG_ERROR, "config-id property not found\n")); return EFI_INVALID_PARAMETER; } HobData->ConfigId = fdt32_to_cpu (*Property); Property = fdt_getprop (NtFwCfgDtBlob, Offset, "multi-chip-mode", NULL); if (Property == NULL) { DEBUG ((DEBUG_WARN, "multi-chip-mode property not found\n")); HobData->MultiChipMode = 0; } else { HobData->MultiChipMode = fdt32_to_cpu (*Property); } return EFI_SUCCESS; } /** This function creates a System ID HOB and assigns PlatformId and ConfigId as the HobData @return asserts on error and returns EFI_INVALID_PARAMETER. On success returns EFI_SUCCESS **/ EFI_STATUS EFIAPI SgiPlatformPeim ( IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices ) { SGI_PLATFORM_DESCRIPTOR *HobData; EFI_STATUS Status; // Create platform descriptor HOB HobData = (SGI_PLATFORM_DESCRIPTOR *)BuildGuidHob ( &gArmSgiPlatformIdDescriptorGuid, sizeof (SGI_PLATFORM_DESCRIPTOR)); // Get the system id from the platform specific nt_fw_config device tree if (HobData == NULL) { DEBUG ((DEBUG_ERROR, "Platform HOB is NULL\n")); ASSERT (FALSE); return EFI_OUT_OF_RESOURCES; } Status = GetSgiSystemId (HobData); if (EFI_ERROR (Status)) { ASSERT_EFI_ERROR (Status); return EFI_INVALID_PARAMETER; } if (HobData->PlatformId == 0) { ASSERT (FALSE); return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; }