/** @file Initializes Serial IO Controllers. Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include typedef struct { ACPI_HID_DEVICE_PATH RootPort; ACPI_EXTENDED_HID_DEVICE_PATH AcpiDev; CHAR8 HidString[8]; CHAR8 UidString; CHAR8 CidString; EFI_DEVICE_PATH_PROTOCOL End; } SERIALIO_DEVICE_PATH; #define gPciRootBridge {{ACPI_DEVICE_PATH, ACPI_DP, {(UINT8)(sizeof(ACPI_HID_DEVICE_PATH)), 0}}, EISA_PNP_ID (0x0A03), 0} #define gAcpiDev {{ACPI_DEVICE_PATH,ACPI_EXTENDED_DP,{(UINT8)(sizeof(ACPI_EXTENDED_HID_DEVICE_PATH)+SERIALIO_TOTAL_ID_LENGTH),0}},0,0,0} #define gEndEntire {END_DEVICE_PATH_TYPE,END_ENTIRE_DEVICE_PATH_SUBTYPE,{END_DEVICE_PATH_LENGTH,0}} GLOBAL_REMOVE_IF_UNREFERENCED SERIALIO_DEVICE_PATH gSerialIoPath = { gPciRootBridge, gAcpiDev, "\0\0\0\0\0\0\0", '\0', '\0', gEndEntire }; /** Mark memory used by SerialIo devices in ACPI mode as allocated @retval EFI_SUCCESS The function completed successfully **/ EFI_STATUS AllocateSerialIoMemory ( VOID ) { PCH_SERIAL_IO_CONTROLLER i; UINT8 BarNumber; UINTN Bar; EFI_STATUS Status; for (i=0; iSerialIo.DevMode[i] == PchSerialIoAcpiHidden || mPchConfigHob->SerialIo.DevMode[i] == PchSerialIoLegacyUart || mPchConfigHob->SerialIo.DevMode[i] == PchSerialIoAcpi) { for (BarNumber = 0; BarNumber<=1; BarNumber++) { Bar = FindSerialIoBar (i,BarNumber); Status = gDS->AddMemorySpace ( EfiGcdMemoryTypeReserved, Bar, V_PCH_SERIAL_IO_BAR_SIZE, 0 ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } Status = gDS->AllocateMemorySpace ( EfiGcdAllocateAddress, EfiGcdMemoryTypeReserved, N_PCH_SERIAL_IO_BAR_ALIGNMENT, V_PCH_SERIAL_IO_BAR_SIZE, &Bar, mImageHandle, NULL ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return Status; } } } } return EFI_SUCCESS; } VOID CreateSerialIoHandles ( VOID ) { EFI_HANDLE NewHandle; EFI_DEVICE_PATH_PROTOCOL *NewPath; EFI_STATUS Status; UINT32 Controller; for (Controller = 0; Controller < PchSerialIoIndexMax; Controller++) { if (mPchConfigHob->SerialIo.DevMode[Controller] == PchSerialIoAcpi) { NewHandle = NULL; CopyMem (gSerialIoPath.HidString, GetSerialIoAcpiHID (Controller), SERIALIO_HID_LENGTH); NewPath = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL*)&gSerialIoPath); Status = gBS->InstallMultipleProtocolInterfaces ( &NewHandle, &gEfiDevicePathProtocolGuid, NewPath, NULL ); } } }