]> git.proxmox.com Git - mirror_edk2.git/commitdiff
CorebootPayloadPkg/PlatformBdsLib: Pass more serial parameters
authorLeahy, Leroy P <leroy.p.leahy@intel.com>
Mon, 9 May 2016 17:57:55 +0000 (10:57 -0700)
committerPrince Agyeman <prince.agyeman@intel.com>
Tue, 10 May 2016 17:13:40 +0000 (10:13 -0700)
Pass the serial port baudrate, register stride, input clock rate and
ID from coreboot to CorebootPayloadPkg.

Change-Id: I37111d23216e4effa2909337af7e8a6de36b61f7
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Lee Leahy <leroy.p.leahy@intel.com>
Reviewed-by: Prince Agyeman <prince.agyeman@intel.com>
CorebootModulePkg/Include/Coreboot.h
CorebootModulePkg/Include/Library/CbParseLib.h
CorebootModulePkg/Library/CbParseLib/CbParseLib.c
CorebootPayloadPkg/Library/PlatformBdsLib/BdsPlatform.c
CorebootPayloadPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
CorebootPayloadPkg/Library/PlatformHookLib/PlatformHookLib.c
CorebootPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf

index f2f18be2ccbc77af9493a8dfcca9a6d7c5f6d99d..784e0b128a7cd0b633c444c8cf9374bd5598eae0 100644 (file)
@@ -80,7 +80,7 @@ struct imd_root {
   UINT32 max_entries;\r
   UINT32 num_entries;\r
   UINT32 flags;\r
-  UINT32 entry_align;        \r
+  UINT32 entry_align;
   UINT32 max_offset;\r
   struct imd_entry entries[0];\r
 };\r
@@ -165,6 +165,21 @@ struct cb_serial {
   UINT32 type;\r
   UINT32 baseaddr;\r
   UINT32 baud;\r
+  UINT32 regwidth;
+
+  // Crystal or input frequency to the chip containing the UART.
+  // Provide the board specific details to allow the payload to
+  // initialize the chip containing the UART and make independent
+  // decisions as to which dividers to select and their values
+  // to eventually arrive at the desired console baud-rate.
+  UINT32 input_hertz;
+
+  // UART PCI address: bus, device, function
+  // 1 << 31 - Valid bit, PCI UART in use
+  // Bus << 20
+  // Device << 15
+  // Function << 12
+  UINT32 uart_pci_addr;
 };\r
 \r
 #define CB_TAG_CONSOLE       0x00010\r
index 170375b365b0ccd85817ddf3bb9928f1a4f9fdb0..a023246d71cd5deb9d49e0ab6a66542c2c674e18 100644 (file)
@@ -30,7 +30,7 @@ CbParseMemoryInfo (
   IN UINT64*    pLowMemorySize,\r
   IN UINT64*    pHighMemorySize\r
   );\r
-  \r
+
 /**\r
   Acquire the coreboot memory table with the given table id\r
 \r
@@ -45,11 +45,11 @@ CbParseMemoryInfo (
 **/\r
 RETURN_STATUS\r
 CbParseCbMemTable (\r
-  IN UINT32     TableId, \r
+  IN UINT32     TableId,
   IN VOID**     pMemTable,\r
   IN UINT32*    pMemTableSize\r
   );\r
-  \r
+
 /**\r
   Acquire the acpi table from coreboot\r
 \r
@@ -66,7 +66,7 @@ CbParseAcpiTable (
   IN VOID**     pMemTable,\r
   IN UINT32*    pMemTableSize\r
   );\r
-  \r
+
 /**\r
   Acquire the smbios table from coreboot\r
 \r
@@ -83,7 +83,7 @@ CbParseSmbiosTable (
   IN VOID**     pMemTable,\r
   IN UINT32*    pMemTableSize\r
   );\r
-  \r
+
 /**\r
   Find the required fadt information\r
 \r
@@ -107,13 +107,16 @@ CbParseFadtInfo (
   IN UINTN*     pPmEvtReg,\r
   IN UINTN*     pPmGpeEnReg\r
   );\r
-  \r
+
 /**\r
   Find the serial port information\r
 \r
   @param  pRegBase           Pointer to the base address of serial port registers\r
   @param  pRegAccessType     Pointer to the access type of serial port registers\r
+  @param  pRegWidth          Pointer to the register width in bytes
   @param  pBaudrate          Pointer to the serial port baudrate\r
+  @param  pInputHertz        Pointer to the input clock frequency
+  @param  pUartPciAddr       Pointer to the UART PCI bus, dev and func address
 \r
   @retval RETURN_SUCCESS     Successfully find the serial port information.\r
   @retval RETURN_NOT_FOUND   Failed to find the serial port information .\r
@@ -121,9 +124,12 @@ CbParseFadtInfo (
 **/\r
 RETURN_STATUS\r
 CbParseSerialInfo (\r
-  IN UINT32*     pRegBase,\r
-  IN UINT32*     pRegAccessType,\r
-  IN UINT32*     pBaudrate\r
+  OUT UINT32     *pRegBase,
+  OUT UINT32     *pRegAccessType,
+  OUT UINT32     *pRegWidth,
+  OUT UINT32     *pBaudrate,
+  OUT UINT32     *pInputHertz,
+  OUT UINT32     *pUartPciAddr
   );\r
 \r
 /**\r
@@ -141,7 +147,7 @@ CbParseGetCbHeader (
   IN UINTN  Level,\r
   IN VOID** HeaderPtr\r
   );\r
-  \r
+
 /**\r
   Find the video frame buffer information\r
 \r
index 377abf3c6771e26f5ec4218ce9a398700769ad9f..7c81a51054298c213ccb981e9547c78d406b2da5 100644 (file)
@@ -33,7 +33,7 @@
   @return          the UNIT64 value after convertion.\r
 \r
 **/\r
-UINT64 \r
+UINT64
 cb_unpack64 (\r
   IN struct cbuint64 val\r
   )\r
@@ -469,12 +469,12 @@ CbParseFadtInfo (
         }\r
         DEBUG ((EFI_D_INFO, "Reset Value 0x%x\n", Fadt->ResetValue));\r
 \r
-        if (pPmEvtReg != NULL) {   \r
+        if (pPmEvtReg != NULL) {
           *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
           DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
         }\r
 \r
-        if (pPmGpeEnReg != NULL) {   \r
+        if (pPmGpeEnReg != NULL) {
           *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
           DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
         }\r
@@ -519,15 +519,15 @@ CbParseFadtInfo (
           *pResetValue = Fadt->ResetValue;\r
         DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
 \r
-        if (pPmEvtReg != NULL) {   \r
+        if (pPmEvtReg != NULL) {
           *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
            DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
         }\r
 \r
-        if (pPmGpeEnReg != NULL) {   \r
+        if (pPmGpeEnReg != NULL) {
           *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
           DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
-        }        \r
+        }
         return RETURN_SUCCESS;\r
       }\r
     }\r
@@ -541,7 +541,10 @@ CbParseFadtInfo (
 \r
   @param  pRegBase           Pointer to the base address of serial port registers\r
   @param  pRegAccessType     Pointer to the access type of serial port registers\r
+  @param  pRegWidth          Pointer to the register width in bytes
   @param  pBaudrate          Pointer to the serial port baudrate\r
+  @param  pInputHertz        Pointer to the input clock frequency
+  @param  pUartPciAddr       Pointer to the UART PCI bus, dev and func address
 \r
   @retval RETURN_SUCCESS     Successfully find the serial port information.\r
   @retval RETURN_NOT_FOUND   Failed to find the serial port information .\r
@@ -551,7 +554,10 @@ RETURN_STATUS
 CbParseSerialInfo (\r
   OUT UINT32      *pRegBase,\r
   OUT UINT32      *pRegAccessType,\r
-  OUT UINT32      *pBaudrate\r
+  OUT UINT32      *pRegWidth,
+  OUT UINT32      *pBaudrate,
+  OUT UINT32      *pInputHertz,
+  OUT UINT32      *pUartPciAddr
   )\r
 {\r
   struct cb_serial    *CbSerial;\r
@@ -569,6 +575,10 @@ CbParseSerialInfo (
     *pRegBase = CbSerial->baseaddr;\r
   }\r
 \r
+  if (pRegWidth != NULL) {
+    *pRegWidth = CbSerial->regwidth;
+  }
+
   if (pRegAccessType != NULL) {\r
     *pRegAccessType = CbSerial->type;\r
   }\r
@@ -577,6 +587,14 @@ CbParseSerialInfo (
     *pBaudrate = CbSerial->baud;\r
   }\r
 \r
+  if (pInputHertz != NULL) {
+    *pInputHertz = CbSerial->input_hertz;
+  }
+
+  if (pUartPciAddr != NULL) {
+    *pUartPciAddr = CbSerial->uart_pci_addr;
+  }
+
   return RETURN_SUCCESS;\r
 }\r
 \r
index ef6a1b26ca578f373b5af588c19eb7299b1720b8..c0a2b19645304995da20523f54c91e891daa51a2 100644 (file)
@@ -78,6 +78,10 @@ PlatformBdsInit (
   VOID\r
   )\r
 {\r
+  gUartDeviceNode.BaudRate = PcdGet64 (PcdUartDefaultBaudRate);
+  gUartDeviceNode.DataBits = PcdGet8 (PcdUartDefaultDataBits);
+  gUartDeviceNode.Parity   = PcdGet8 (PcdUartDefaultParity);
+  gUartDeviceNode.StopBits = PcdGet8 (PcdUartDefaultStopBits);
 }\r
 \r
 \r
@@ -786,6 +790,7 @@ PlatformBdsPolicyBehavior (
 \r
   DEBUG ((EFI_D_INFO, "PlatformBdsPolicyBehavior\n"));\r
   \r
+  PlatformBdsInit();
   ConnectRootBridge ();\r
 \r
   //\r
index 9c102721d5707e4c4041763c10b4870662c163a5..b1a79b866cb399cee30dc6ce22fe2ed33869fc55 100644 (file)
   DebugLib\r
   PcdLib\r
   GenericBdsLib\r
+  PlatformHookLib
+
 [Pcd]\r
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut\r
   gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile\r
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits
index 84499970503eaf0d164865e07677bf308c9c43ce..b1cfb8e2c09e8d287db30a630c310c6f2042809b 100644 (file)
 \r
 #include <Base.h>\r
 #include <Uefi/UefiBaseType.h>\r
+#include <Library/PciLib.h>
 #include <Library/PlatformHookLib.h>\r
 #include <Library/CbParseLib.h>\r
 #include <Library/PcdLib.h>\r
 \r
+typedef struct {
+  UINT16  VendorId;          ///< Vendor ID to match the PCI device.  The value 0xFFFF terminates the list of entries.
+  UINT16  DeviceId;          ///< Device ID to match the PCI device
+  UINT32  ClockRate;         ///< UART clock rate.  Set to 0 for default clock rate of 1843200 Hz
+  UINT64  Offset;            ///< The byte offset into to the BAR
+  UINT8   BarIndex;          ///< Which BAR to get the UART base address
+  UINT8   RegisterStride;    ///< UART register stride in bytes.  Set to 0 for default register stride of 1 byte.
+  UINT16  ReceiveFifoDepth;  ///< UART receive FIFO depth in bytes. Set to 0 for a default FIFO depth of 16 bytes.
+  UINT16  TransmitFifoDepth; ///< UART transmit FIFO depth in bytes. Set to 0 for a default FIFO depth of 16 bytes.
+  UINT8   Reserved[2];
+} PCI_SERIAL_PARAMETER;
+
 /**\r
   Performs platform specific initialization required for the CPU to access\r
   the hardware associated with a SerialPortLib instance.  This function does\r
@@ -38,8 +51,16 @@ PlatformHookSerialPortInitialize (
   RETURN_STATUS     Status;\r
   UINT32            SerialRegBase;\r
   UINT32            SerialRegAccessType;\r
+  UINT32            BaudRate;
+  UINT32            RegWidth;
+  UINT32            InputHertz;
+  UINT32            PayloadParam;
+  UINT32            DeviceVendor;
+  PCI_SERIAL_PARAMETER *SerialParam;
 \r
-  Status = CbParseSerialInfo (&SerialRegBase, &SerialRegAccessType, NULL);\r
+  Status = CbParseSerialInfo (&SerialRegBase, &SerialRegAccessType,
+                              &RegWidth, &BaudRate, &InputHertz,
+                              &PayloadParam);
   if (RETURN_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -57,6 +78,34 @@ PlatformHookSerialPortInitialize (
     return Status;\r
   }\r
 \r
+  Status = PcdSet32S (PcdSerialRegisterStride, RegWidth);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = PcdSet32S (PcdSerialBaudRate, BaudRate);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = PcdSet64S (PcdUartDefaultBaudRate, BaudRate);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = PcdSet32S (PcdSerialClockRate, InputHertz);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  if (PayloadParam >= 0x80000000) {
+    DeviceVendor = PciRead32 (PayloadParam & 0x0ffff000);
+    SerialParam = PcdGetPtr(PcdPciSerialParameters);
+    SerialParam->VendorId = (UINT16)DeviceVendor;
+    SerialParam->DeviceId = DeviceVendor >> 16;
+    SerialParam->ClockRate = InputHertz;
+    SerialParam->RegisterStride = (UINT8)RegWidth;
+  }
+
   return RETURN_SUCCESS;\r
 }\r
-\r
index e5db75fa95b092f982f9b2bf2b5532d4d29dec72..32301059017993b48d1c488901bcb38b026d0564 100644 (file)
@@ -19,6 +19,7 @@
   MODULE_TYPE                    = BASE\r
   VERSION_STRING                 = 1.0\r
   LIBRARY_CLASS                  = PlatformHookLib\r
+  CONSTRUCTOR                    = PlatformHookSerialPortInitialize
 \r
 [Sources]\r
   PlatformHookLib.c\r
@@ -26,6 +27,7 @@
 [LibraryClasses]\r
   CbParseLib\r
   PcdLib\r
+  PciLib
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
   CorebootModulePkg/CorebootModulePkg.dec\r
 \r
 [Pcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio       ## PRODUCES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase  ## PRODUCES\r
-\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio         ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase    ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate        ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride  ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate       ## PRODUCES
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate         ## PRODUCES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters   ## PRODUCES