[edk2-devel] [edk2-platforms][PATCH v1] KabylakeOpenBoardPkg/I2cHdmiDebugSerialPortLib: Configurable timings

Benjamin Doron posted 1 patch 1 year, 3 months ago
Failed in applying to current master (apply log)
There is a newer version of this series
.../DxeI2cHdmiDebugSerialPortLib.inf          |  2 ++
.../Library/I2cHdmiDebugSerialPortLib/Gmbus.c | 11 ++++++++---
.../I2cDebugPortProtocol.c                    | 13 ++++++++++---
.../PeiI2cHdmiDebugSerialPortLib.inf          |  2 ++
.../SecI2cHdmiDebugSerialPortLib.inf          |  2 ++
.../SmmI2cHdmiDebugSerialPortLib.inf          |  2 ++
.../KabylakeOpenBoardPkg/OpenBoardPkg.dec     | 19 +++++++++++++++++++
9 files changed, 49 insertions(+), 6 deletions(-)
[edk2-devel] [edk2-platforms][PATCH v1] KabylakeOpenBoardPkg/I2cHdmiDebugSerialPortLib: Configurable timings
Posted by Benjamin Doron 1 year, 3 months ago
Now that an implementation of the HDMI debug port is available at high
speed, make the timing parameters configurable. As this is
implementation-, not board-layer, perhaps these could become
dynamic PCDs.

Arduino sketch available at
https://github.com/benjamindoron/i2c_debug_port.

Tested on Adafruit ItsyBitsy M4, using 1 MHz clock and 60 us delay.

Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Signed-off-by: Benjamin Doron <benjamin.doron00@gmail.com>
---
 .../DxeI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../Library/I2cHdmiDebugSerialPortLib/Gmbus.c | 11 ++++++++---
 .../I2cDebugPortProtocol.c                    | 13 ++++++++++---
 .../PeiI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../SecI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../SmmI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../KabylakeOpenBoardPkg/OpenBoardPkg.dec     | 19 +++++++++++++++++++
 9 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf
index 327afdce519a..54c3c2fdcc24 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf
@@ -49,3 +49,5 @@
 [Pcd]
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel    ## CONSUMES
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress                     ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs    ## CONSUMES
diff --git a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c
index b673926dcc6b..b6d3bd1f8ce9 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c
@@ -444,6 +444,7 @@ GmbusRead (
 {
   EFI_STATUS              Status;
   EFI_STATUS              Status2;
+  UINT8                   GmbusClockRate;
   UINT32                  Index;
   UINT32                  GmbusCmdSts;
   UINT32                  GmbusStatus;
@@ -472,8 +473,9 @@ GmbusRead (
 
   //
   // Configure Gmbus port and clock speed
-  //GMBUS_CLOCK_RATE_100K @todo
-  Status = GmbusPrepare (GMBUS_CLOCK_RATE_50K, (DdcBusPinPair & B_SA_GTTMMADR_GMBUS0_PIN_PAIR_MASK));
+  //
+  GmbusClockRate = FixedPcdGet8 (PcdI2cHdmiDebugPortGmbusClockRate);
+  Status = GmbusPrepare (GmbusClockRate, (DdcBusPinPair & B_SA_GTTMMADR_GMBUS0_PIN_PAIR_MASK));
   if (EFI_ERROR (Status)) {
     goto Done;
   }
@@ -608,6 +610,7 @@ GmbusWrite (
 {
   EFI_STATUS              Status;
   EFI_STATUS              Status2;
+  UINT8                   GmbusClockRate;
   UINT32                  Index;
   UINT32                  GmbusCmdSts;
   UINT32                  GmbusStatus;
@@ -638,7 +641,9 @@ GmbusWrite (
 
   //
   // Configure Gmbus port and clock speed
-  Status = GmbusPrepare (GMBUS_CLOCK_RATE_50K, (DdcBusPinPair & B_SA_GTTMMADR_GMBUS0_PIN_PAIR_MASK));
+  //
+  GmbusClockRate = FixedPcdGet8 (PcdI2cHdmiDebugPortGmbusClockRate);
+  Status = GmbusPrepare (GmbusClockRate, (DdcBusPinPair & B_SA_GTTMMADR_GMBUS0_PIN_PAIR_MASK));
   if (EFI_ERROR (Status)) {
     goto Done;
   }
diff --git a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/I2cDebugPortProtocol.c b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/I2cDebugPortProtocol.c
index 52689c98d11d..56117bad8fb1 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/I2cDebugPortProtocol.c
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/I2cDebugPortProtocol.c
@@ -8,6 +8,7 @@
 
 #include <Base.h>
 #include <Library/BaseMemoryLib.h>
+#include <Library/PcdLib.h>
 #include <Library/TimerLib.h>
 
 #include <IgfxI2c.h>
@@ -36,6 +37,7 @@ I2cDebugPortWrite (
   UINT8       WriteBuffer[I2C_DEBUG_PORT_MAX_DATA_SIZE + 1];
   EFI_STATUS  Status;
   UINT32      Index;
+  UINTN       ImplementationDelayUs;
   UINT8       CurrentSize;
   UINT8       DdcBusPinPair;
 
@@ -50,8 +52,9 @@ I2cDebugPortWrite (
     return Status;
   }
   RaiseTplForI2cDebugPortAccess ();
+  ImplementationDelayUs = FixedPcdGet32 (PcdI2cHdmiDebugPortPacketStallUs);  //BP: 3ms stall to catch up
   for (Index = 0; Index < Count; Index += I2C_DEBUG_PORT_MAX_DATA_SIZE) {
-    MicroSecondDelay (3000);  //3ms stall to let the BusPirate catch up
+    MicroSecondDelay (ImplementationDelayUs);
     if ((Index + I2C_DEBUG_PORT_MAX_DATA_SIZE) >= Count) {
       CurrentSize = (UINT8) (Count - Index);
     } else {
@@ -93,6 +96,7 @@ I2cDebugPortRead (
   EFI_STATUS  Status;
   UINT32      Index;
   UINT32      BytesRead;
+  UINTN       ImplementationDelayUs;
   UINT32      CurrentSize;
   UINT8       DdcBusPinPair;
   UINT8       GmbusIndexData;
@@ -109,8 +113,9 @@ I2cDebugPortRead (
     return Status;
   }
   RaiseTplForI2cDebugPortAccess ();
+  ImplementationDelayUs = FixedPcdGet32 (PcdI2cHdmiDebugPortPacketStallUs);  //BP: 3ms stall to catch up
   for (Index = 0; Index < (*Count); Index += I2C_DEBUG_PORT_MAX_DATA_SIZE) {
-    MicroSecondDelay (3000);  //3ms stall to let the BusPirate catch up
+    MicroSecondDelay (ImplementationDelayUs);
     if ((Index + I2C_DEBUG_PORT_MAX_DATA_SIZE) >= (*Count)) {
       CurrentSize = (*Count) - Index;
     } else {
@@ -161,6 +166,7 @@ I2cDebugPortReadyToRead (
   EFI_STATUS  Status;
   UINT32      BytesRead;
   UINT8       DdcBusPinPair;
+  UINTN       ImplementationDelayUs;
   UINT8       GmbusIndexData;
 
   BytesRead = 1;
@@ -171,7 +177,8 @@ I2cDebugPortReadyToRead (
   if (EFI_ERROR (Status)) {
     return Status;
   }
-  MicroSecondDelay (3000);  //3ms stall to let the BusPirate catch up
+  ImplementationDelayUs = FixedPcdGet32 (PcdI2cHdmiDebugPortPacketStallUs);  //BP: 3ms stall to catch up
+  MicroSecondDelay (ImplementationDelayUs);
   GmbusIndexData  = (I2C_DEBUG_PORT_READY_TO_READ_COMMAND << I2C_DEBUG_PORT_COMMAND_BIT_POSITION) |
                     (1 & I2C_DEBUG_PORT_DATA_SIZE_BIT_MASK); //READY_TO_READ always returns 1 byte
   RaiseTplForI2cDebugPortAccess ();
diff --git a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/PeiI2cHdmiDebugSerialPortLib.inf b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/PeiI2cHdmiDebugSerialPortLib.inf
index 18aee1f91c92..da1f08dbccdd 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/PeiI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/PeiI2cHdmiDebugSerialPortLib.inf
@@ -51,3 +51,5 @@
 [Pcd]
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel    ## CONSUMES
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress                     ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs    ## CONSUMES
diff --git a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf
index d1593f6c3908..863a0eeee442 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf
@@ -46,3 +46,5 @@
 [Pcd]
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel    ## CONSUMES
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress                     ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs    ## CONSUMES
diff --git a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf
index 5bd1f52749a9..367646bebe02 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf
@@ -47,3 +47,5 @@
 [Pcd]
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel    ## CONSUMES
   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress                     ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## CONSUMES
+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs    ## CONSUMES
diff --git a/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec b/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec
index 448eafacbfcd..048b826e2994 100644
--- a/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec
+++ b/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec
@@ -102,6 +102,25 @@ gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortSerialTerminalEnable|FALS
 # @Prompt DDC I2C channel to claim as the HDMI debug port
 gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel|0x00000000|UINT32|0x90000035
 
+## Specifies the DDC I2C speed to use for the HDMI debug port
+#  The value is defined as below.
+#  0: I2C speed 100K
+#  1: I2C speed 50K
+#  2: I2C speed 400K
+#  3: I2C speed 1M
+#  Recommendations as below:
+#  BusPirate: 50K. Maybe 100K possible with more baudrate generator debug.
+#  Atmel SAMD boards: 1M.
+# @Prompt DDC I2C speed to use for the HDMI debug port
+gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate|0x01|UINT8|0x90000036
+
+## Specifies the stall in microsends between packets on the HDMI debug port
+#  Recommendations as below:
+#  BusPirate: 3000
+#  Atmel SAMD boards: 60
+# @Prompt DDC I2C speed to use for the HDMI debug port
+gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs|3000|UINT32|0x90000037
+
 [PcdsDynamic]
 
 # Board GPIO Table
-- 
2.38.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#98310): https://edk2.groups.io/g/devel/message/98310
Mute This Topic: https://groups.io/mt/96208330/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-