Juno has several serial ports, one of which may be used for a remote debug interface (e.g. gdb, WinDbg). The debug serial port needs to be distinct from that used for UEFI trace to prevent corruption of debugger protocol messaging. The UEFI spec requires that serial devices be initialised to default settings. (11.8 Serial I/O Protocol - "The default attributes for all UART-style serial device interfaces are: 115,200 baud, ..." and 17.3.3 EFI Debugport Variable - "These defaults must be used in the absence of a DEBUGPORT variable...") This change adds initialization of the serial device reported in the ACPI DBG2 table. The initialisation is done early in the boot to allow the possibility of remote debug of UEFI itself. NOTE: This is functionally dependent on the DBG2 table being updated in OpenPlatformPkg, but is required as a precursor to that change. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Evan Lloyd <evan.lloyd@arm.com> Tested-by: Ryan Harkin <ryan.harkin@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
194 lines
4.9 KiB
C
194 lines
4.9 KiB
C
/** @file
|
|
*
|
|
* Copyright (c) 2013-2016, ARM Limited. All rights reserved.
|
|
*
|
|
* This program and the accompanying materials
|
|
* are licensed and made available under the terms and conditions of the BSD License
|
|
* which accompanies this distribution. The full text of the license may be found at
|
|
* http://opensource.org/licenses/bsd-license.php
|
|
*
|
|
* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
*
|
|
**/
|
|
|
|
#include <Drivers/PL011Uart.h>
|
|
|
|
#include <Library/IoLib.h>
|
|
#include <Library/ArmPlatformLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/PcdLib.h>
|
|
|
|
#include <Ppi/ArmMpCoreInfo.h>
|
|
|
|
#include <ArmPlatform.h>
|
|
|
|
ARM_CORE_INFO mJunoInfoTable[] = {
|
|
{
|
|
// Cluster 0, Core 0
|
|
0x0, 0x0,
|
|
|
|
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
|
|
(UINT64)0xFFFFFFFF
|
|
},
|
|
{
|
|
// Cluster 0, Core 1
|
|
0x0, 0x1,
|
|
|
|
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
|
|
(UINT64)0xFFFFFFFF
|
|
},
|
|
{
|
|
// Cluster 1, Core 0
|
|
0x1, 0x0,
|
|
|
|
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
|
|
(UINT64)0xFFFFFFFF
|
|
},
|
|
{
|
|
// Cluster 1, Core 1
|
|
0x1, 0x1,
|
|
|
|
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
|
|
(UINT64)0xFFFFFFFF
|
|
},
|
|
{
|
|
// Cluster 1, Core 2
|
|
0x1, 0x2,
|
|
|
|
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
|
|
(UINT64)0xFFFFFFFF
|
|
},
|
|
{
|
|
// Cluster 1, Core 3
|
|
0x1, 0x3,
|
|
|
|
// MP Core MailBox Set/Get/Clear Addresses and Clear Value
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,
|
|
(EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,
|
|
(UINT64)0xFFFFFFFF
|
|
}
|
|
};
|
|
|
|
/**
|
|
Return the current Boot Mode
|
|
|
|
This function returns the boot reason on the platform
|
|
|
|
@return Return the current Boot Mode of the platform
|
|
|
|
**/
|
|
EFI_BOOT_MODE
|
|
ArmPlatformGetBootMode (
|
|
VOID
|
|
)
|
|
{
|
|
return BOOT_WITH_FULL_CONFIGURATION;
|
|
}
|
|
|
|
/**
|
|
Initialize controllers that must setup in the normal world
|
|
|
|
This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim
|
|
in the PEI phase.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
ArmPlatformInitialize (
|
|
IN UINTN MpId
|
|
)
|
|
{
|
|
RETURN_STATUS Status;
|
|
UINT64 BaudRate;
|
|
UINT32 ReceiveFifoDepth;
|
|
EFI_PARITY_TYPE Parity;
|
|
UINT8 DataBits;
|
|
EFI_STOP_BITS_TYPE StopBits;
|
|
|
|
Status = RETURN_SUCCESS;
|
|
|
|
//
|
|
// Initialize the Serial Debug UART
|
|
//
|
|
if (FixedPcdGet64 (PcdSerialDbgRegisterBase)) {
|
|
ReceiveFifoDepth = 0; // Use the default value for FIFO depth
|
|
Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);
|
|
DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);
|
|
StopBits = (EFI_STOP_BITS_TYPE)FixedPcdGet8 (PcdUartDefaultStopBits);
|
|
|
|
BaudRate = (UINTN)FixedPcdGet64 (PcdSerialDbgUartBaudRate);
|
|
Status = PL011UartInitializePort (
|
|
(UINTN)FixedPcdGet64 (PcdSerialDbgRegisterBase),
|
|
FixedPcdGet32 (PcdSerialDbgUartClkInHz),
|
|
&BaudRate,
|
|
&ReceiveFifoDepth,
|
|
&Parity,
|
|
&DataBits,
|
|
&StopBits
|
|
);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
Initialize the system (or sometimes called permanent) memory
|
|
|
|
This memory is generally represented by the DRAM.
|
|
|
|
**/
|
|
VOID
|
|
ArmPlatformInitializeSystemMemory (
|
|
VOID
|
|
)
|
|
{
|
|
}
|
|
|
|
EFI_STATUS
|
|
PrePeiCoreGetMpCoreInfo (
|
|
OUT UINTN *CoreCount,
|
|
OUT ARM_CORE_INFO **ArmCoreTable
|
|
)
|
|
{
|
|
// Only support one cluster
|
|
*CoreCount = sizeof(mJunoInfoTable) / sizeof(ARM_CORE_INFO);
|
|
*ArmCoreTable = mJunoInfoTable;
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
|
|
|
|
EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
|
|
{
|
|
EFI_PEI_PPI_DESCRIPTOR_PPI,
|
|
&gArmMpCoreInfoPpiGuid,
|
|
&mMpCoreInfoPpi
|
|
}
|
|
};
|
|
|
|
VOID
|
|
ArmPlatformGetPlatformPpiList (
|
|
OUT UINTN *PpiListSize,
|
|
OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
|
|
)
|
|
{
|
|
*PpiListSize = sizeof(gPlatformPpiTable);
|
|
*PpiList = gPlatformPpiTable;
|
|
}
|