Implement SerialPortLib and PlatformHookLib with System76EcLib
This commit is contained in:
committed by
Jeremy Soller
parent
c6f1c4e654
commit
e30d17a0d2
@@ -17,7 +17,6 @@
|
|||||||
#include <Library/PciLib.h>
|
#include <Library/PciLib.h>
|
||||||
#include <Library/PlatformHookLib.h>
|
#include <Library/PlatformHookLib.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/System76EcLib.h>
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// PCI Defintions.
|
// PCI Defintions.
|
||||||
@@ -602,8 +601,6 @@ SerialPortWrite (
|
|||||||
UINTN Result;
|
UINTN Result;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN FifoSize;
|
UINTN FifoSize;
|
||||||
UINT8 *BufPtr = Buffer;
|
|
||||||
UINTN Bytes = NumberOfBytes;
|
|
||||||
|
|
||||||
if (Buffer == NULL) {
|
if (Buffer == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -666,9 +663,6 @@ SerialPortWrite (
|
|||||||
SerialPortWriteRegister (SerialRegisterBase, R_UART_TXBUF, *Buffer);
|
SerialPortWriteRegister (SerialRegisterBase, R_UART_TXBUF, *Buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
System76EcWrite(BufPtr, Bytes);
|
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,14 +18,12 @@
|
|||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
MdeModulePkg/MdeModulePkg.dec
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
UefiPayloadPkg/UefiPayloadPkg.dec
|
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
PcdLib
|
PcdLib
|
||||||
IoLib
|
IoLib
|
||||||
PlatformHookLib
|
PlatformHookLib
|
||||||
PciLib
|
PciLib
|
||||||
System76EcLib
|
|
||||||
|
|
||||||
[Sources]
|
[Sources]
|
||||||
BaseSerialPortLib16550.c
|
BaseSerialPortLib16550.c
|
||||||
|
@@ -1,26 +0,0 @@
|
|||||||
/** @file
|
|
||||||
System76 EC logging
|
|
||||||
|
|
||||||
Copyright (c) 2020 System76, Inc.
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef __SYSTEM76_EC_LIB__
|
|
||||||
#define __SYSTEM76_EC_LIB__
|
|
||||||
|
|
||||||
/**
|
|
||||||
Write data to the embedded controller using SMFI command interface.
|
|
||||||
|
|
||||||
@param Buffer Pointer to the data buffer to be written.
|
|
||||||
@param NumberOfBytes Number of bytes to write.
|
|
||||||
|
|
||||||
@return -1 if the command failed, else the number of data bytes written.
|
|
||||||
**/
|
|
||||||
INTN
|
|
||||||
System76EcWrite (
|
|
||||||
IN UINT8 *Buffer,
|
|
||||||
IN UINTN NumberOfBytes
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* __SYSTEM76_EC_LIB__ */
|
|
@@ -6,98 +6,139 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include <Library/System76EcLib.h>
|
|
||||||
#include <Library/IoLib.h>
|
#include <Library/IoLib.h>
|
||||||
#include <Library/TimerLib.h>
|
|
||||||
|
|
||||||
#define SYSTEM76_EC_BASE 0xE00
|
// From coreboot/src/drivers/system76_ec/system76_ec.c {
|
||||||
#define CMD_PRINT 0x4
|
#define SYSTEM76_EC_BASE 0x0E00
|
||||||
|
|
||||||
/**
|
static inline UINT8 system76_ec_read(UINT8 addr) {
|
||||||
@param Offset The offset into the SFMI RAM window to read from.
|
return IoRead8(SYSTEM76_EC_BASE + (UINT16)addr);
|
||||||
|
|
||||||
@return The value read.
|
|
||||||
**/
|
|
||||||
STATIC
|
|
||||||
UINT8
|
|
||||||
System76EcReadByte (
|
|
||||||
UINT8 Offset
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return IoRead8 (SYSTEM76_EC_BASE + Offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static inline void system76_ec_write(UINT8 addr, UINT8 data) {
|
||||||
@param Offset The offset into the SFMI RAM window to write to.
|
IoWrite8(SYSTEM76_EC_BASE + (UINT16)addr, data);
|
||||||
@param Value The value to write.
|
|
||||||
|
|
||||||
@return The value written back to the I/O port.
|
|
||||||
**/
|
|
||||||
STATIC
|
|
||||||
UINT8
|
|
||||||
System76EcWriteByte (
|
|
||||||
UINT8 Offset,
|
|
||||||
UINT8 Value
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return IoWrite8 (SYSTEM76_EC_BASE + Offset, Value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void system76_ec_init(void) {
|
||||||
Write data to the embedded controller using SMFI command interface.
|
// Clear entire command region
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
@param Buffer Pointer to the data buffer to be written.
|
system76_ec_write((UINT8)i, 0);
|
||||||
@param NumberOfBytes Number of bytes to write.
|
|
||||||
|
|
||||||
@return -1 if the command failed, else the number of data bytes written.
|
|
||||||
**/
|
|
||||||
INTN
|
|
||||||
System76EcWrite (
|
|
||||||
IN UINT8 *Buffer,
|
|
||||||
IN UINTN NumberOfBytes
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Index;
|
|
||||||
UINTN Index2;
|
|
||||||
UINTN Timeout;
|
|
||||||
|
|
||||||
if (Buffer == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Index = 0; Index < NumberOfBytes;) {
|
|
||||||
if (System76EcReadByte (0) == 0) {
|
|
||||||
|
|
||||||
// Can write 256 bytes of data at a time
|
|
||||||
for (Index2 = 0; (Index2 < NumberOfBytes) && ((Index2 + 4) < 256); Index++, Index2++) {
|
|
||||||
System76EcWriteByte ((Index + 4), Buffer[Index]);
|
|
||||||
}
|
|
||||||
// Flags
|
|
||||||
System76EcWriteByte (2, 0);
|
|
||||||
// Length
|
|
||||||
System76EcWriteByte (3, Index2);
|
|
||||||
// Command
|
|
||||||
System76EcWriteByte (0, CMD_PRINT);
|
|
||||||
|
|
||||||
// Wait for command completion, for up to 1 second
|
|
||||||
for (Timeout = 1000000; Timeout > 0; Timeout--) {
|
|
||||||
if (System76EcReadByte (0) == 0)
|
|
||||||
break;
|
|
||||||
MicroSecondDelay (1);
|
|
||||||
}
|
|
||||||
if (Timeout == 0) {
|
|
||||||
// Error: Timeout occured
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (System76EcReadByte (1) != 0) {
|
|
||||||
// Error: Command failed
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Error: Command already running
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return Index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void system76_ec_flush(void) {
|
||||||
|
// Send command
|
||||||
|
system76_ec_write(0, 4);
|
||||||
|
|
||||||
|
// Wait for command completion
|
||||||
|
while (system76_ec_read(0) != 0) {}
|
||||||
|
|
||||||
|
// Clear length
|
||||||
|
system76_ec_write(3, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void system76_ec_print(UINT8 byte) {
|
||||||
|
// Read length
|
||||||
|
UINT8 len = system76_ec_read(3);
|
||||||
|
// Write data at offset
|
||||||
|
system76_ec_write(len + 4, byte);
|
||||||
|
// Update length
|
||||||
|
system76_ec_write(3, len + 1);
|
||||||
|
|
||||||
|
// If we hit the end of the buffer, or were given a newline, flush
|
||||||
|
if (byte == '\n' || len >= 128) {
|
||||||
|
system76_ec_flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// } From coreboot/src/drivers/system76_ec/system76_ec.c
|
||||||
|
|
||||||
|
// Implement SerialPortLib {
|
||||||
|
#include <Library/SerialPortLib.h>
|
||||||
|
|
||||||
|
RETURN_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SerialPortInitialize (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
system76_ec_init();
|
||||||
|
return RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINTN
|
||||||
|
EFIAPI
|
||||||
|
SerialPortWrite (
|
||||||
|
IN UINT8 *Buffer,
|
||||||
|
IN UINTN NumberOfBytes
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (Buffer == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NumberOfBytes == 0) {
|
||||||
|
system76_ec_flush();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(UINTN i = 0; i < NumberOfBytes; i++) {
|
||||||
|
system76_ec_print(Buffer[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NumberOfBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
EFIAPI
|
||||||
|
SerialPortPoll (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SerialPortGetControl (
|
||||||
|
OUT UINT32 *Control
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RETURN_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SerialPortSetControl (
|
||||||
|
IN UINT32 Control
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RETURN_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SerialPortSetAttributes (
|
||||||
|
IN OUT UINT64 *BaudRate,
|
||||||
|
IN OUT UINT32 *ReceiveFifoDepth,
|
||||||
|
IN OUT UINT32 *Timeout,
|
||||||
|
IN OUT EFI_PARITY_TYPE *Parity,
|
||||||
|
IN OUT UINT8 *DataBits,
|
||||||
|
IN OUT EFI_STOP_BITS_TYPE *StopBits
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RETURN_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
// } Implement SerialPortLib
|
||||||
|
|
||||||
|
// Implement PlatformHookLib {
|
||||||
|
#include <Library/PlatformHookLib.h>
|
||||||
|
|
||||||
|
RETURN_STATUS
|
||||||
|
EFIAPI
|
||||||
|
PlatformHookSerialPortInitialize (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
// } Implement PlatformHookLib
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
IoLib
|
IoLib
|
||||||
TimerLib
|
|
||||||
|
|
||||||
[Sources]
|
[Sources]
|
||||||
System76EcLib.c
|
System76EcLib.c
|
||||||
|
@@ -1,18 +0,0 @@
|
|||||||
/** @file
|
|
||||||
System76 EC logging
|
|
||||||
|
|
||||||
Copyright (c) 2020 System76, Inc.
|
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <Library/System76EcLib.h>
|
|
||||||
|
|
||||||
INTN
|
|
||||||
System76EcWrite (
|
|
||||||
IN UINT8 *Buffer,
|
|
||||||
IN UINTN NumberOfBytes
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
@@ -1,27 +0,0 @@
|
|||||||
## @file
|
|
||||||
# System76 EC logging.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2020, System76, Inc.
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
##
|
|
||||||
|
|
||||||
[Defines]
|
|
||||||
INF_VERSION = 0x00010005
|
|
||||||
BASE_NAME = System76EcLibNull
|
|
||||||
MODULE_UNI_FILE = System76EcLibNull.uni
|
|
||||||
FILE_GUID = 76ECF0DD-148B-4E48-8589-FC998823F8C2
|
|
||||||
MODULE_TYPE = BASE
|
|
||||||
VERSION_STRING = 0.1
|
|
||||||
LIBRARY_CLASS = System76EcLibNull
|
|
||||||
|
|
||||||
[Packages]
|
|
||||||
MdePkg/MdePkg.dec
|
|
||||||
MdeModulePkg/MdeModulePkg.dec
|
|
||||||
UefiPayloadPkg/UefiPayloadPkg.dec
|
|
||||||
|
|
||||||
[LibraryClasses]
|
|
||||||
|
|
||||||
[Sources]
|
|
||||||
System76EcLibNull.c
|
|
||||||
|
|
||||||
[Pcd]
|
|
@@ -1,13 +0,0 @@
|
|||||||
// /** @file
|
|
||||||
// System76 EC logging.
|
|
||||||
//
|
|
||||||
// Copyright (c) 2020, System76, Inc.
|
|
||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
//
|
|
||||||
// **/
|
|
||||||
|
|
||||||
|
|
||||||
#string STR_MODULE_ABSTRACT #language en-US "System76 EC logging"
|
|
||||||
|
|
||||||
#string STR_MODULE_DESCRIPTION #language en-US "System76 EC logging."
|
|
||||||
|
|
@@ -27,6 +27,11 @@
|
|||||||
DEFINE SOURCE_DEBUG_ENABLE = FALSE
|
DEFINE SOURCE_DEBUG_ENABLE = FALSE
|
||||||
DEFINE PS2_KEYBOARD_ENABLE = TRUE
|
DEFINE PS2_KEYBOARD_ENABLE = TRUE
|
||||||
|
|
||||||
|
#
|
||||||
|
# Send logs to System76 EC
|
||||||
|
#
|
||||||
|
DEFINE SYSTEM76_EC_LOGGING = FALSE
|
||||||
|
|
||||||
#
|
#
|
||||||
# SBL: UEFI payload for Slim Bootloader
|
# SBL: UEFI payload for Slim Bootloader
|
||||||
# COREBOOT: UEFI payload for coreboot
|
# COREBOOT: UEFI payload for coreboot
|
||||||
@@ -176,8 +181,13 @@
|
|||||||
#
|
#
|
||||||
TimerLib|UefiPayloadPkg/Library/AcpiTimerLib/AcpiTimerLib.inf
|
TimerLib|UefiPayloadPkg/Library/AcpiTimerLib/AcpiTimerLib.inf
|
||||||
ResetSystemLib|UefiPayloadPkg/Library/ResetSystemLib/ResetSystemLib.inf
|
ResetSystemLib|UefiPayloadPkg/Library/ResetSystemLib/ResetSystemLib.inf
|
||||||
|
!if $(SYSTEM76_EC_LOGGING) == TRUE
|
||||||
|
SerialPortLib|UefiPayloadPkg/Library/System76EcLib/System76EcLib.inf
|
||||||
|
PlatformHookLib|UefiPayloadPkg/Library/System76EcLib/System76EcLib.inf
|
||||||
|
!else
|
||||||
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
|
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
|
||||||
PlatformHookLib|UefiPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf
|
PlatformHookLib|UefiPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf
|
||||||
|
!endif
|
||||||
PlatformBootManagerLib|UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
PlatformBootManagerLib|UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
||||||
IoApicLib|PcAtChipsetPkg/Library/BaseIoApicLib/BaseIoApicLib.inf
|
IoApicLib|PcAtChipsetPkg/Library/BaseIoApicLib/BaseIoApicLib.inf
|
||||||
|
|
||||||
|
@@ -181,8 +181,13 @@
|
|||||||
#
|
#
|
||||||
TimerLib|UefiPayloadPkg/Library/AcpiTimerLib/AcpiTimerLib.inf
|
TimerLib|UefiPayloadPkg/Library/AcpiTimerLib/AcpiTimerLib.inf
|
||||||
ResetSystemLib|UefiPayloadPkg/Library/ResetSystemLib/ResetSystemLib.inf
|
ResetSystemLib|UefiPayloadPkg/Library/ResetSystemLib/ResetSystemLib.inf
|
||||||
|
!if $(SYSTEM76_EC_LOGGING) == TRUE
|
||||||
|
SerialPortLib|UefiPayloadPkg/Library/System76EcLib/System76EcLib.inf
|
||||||
|
PlatformHookLib|UefiPayloadPkg/Library/System76EcLib/System76EcLib.inf
|
||||||
|
!else
|
||||||
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
|
SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf
|
||||||
PlatformHookLib|UefiPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf
|
PlatformHookLib|UefiPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf
|
||||||
|
!endif
|
||||||
PlatformBootManagerLib|UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
PlatformBootManagerLib|UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
||||||
IoApicLib|PcAtChipsetPkg/Library/BaseIoApicLib/BaseIoApicLib.inf
|
IoApicLib|PcAtChipsetPkg/Library/BaseIoApicLib/BaseIoApicLib.inf
|
||||||
|
|
||||||
@@ -212,12 +217,6 @@
|
|||||||
TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
|
TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
|
||||||
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
|
VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf
|
||||||
|
|
||||||
!if $(SYSTEM76_EC_LOGGING) == TRUE
|
|
||||||
System76EcLib|UefiPayloadPkg/Library/System76EcLib/System76EcLib.inf
|
|
||||||
!else
|
|
||||||
System76EcLib|UefiPayloadPkg/Library/System76EcLibNull/System76EcLibNull.inf
|
|
||||||
!endif
|
|
||||||
|
|
||||||
[LibraryClasses.IA32.SEC]
|
[LibraryClasses.IA32.SEC]
|
||||||
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
|
DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
|
||||||
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
||||||
@@ -236,8 +235,6 @@
|
|||||||
DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
|
DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgentLib.inf
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
System76EcLib|UefiPayloadPkg/Library/System76EcLibNull/System76EcLibNull.inf
|
|
||||||
|
|
||||||
[LibraryClasses.common.DXE_CORE]
|
[LibraryClasses.common.DXE_CORE]
|
||||||
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
|
||||||
HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
|
HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf
|
||||||
|
Reference in New Issue
Block a user