Reviewed-by: Nate DeSimone <nathaniel.l.desim...@intel.com>

-----Original Message-----
From: Benjamin Doron <benjamin.doro...@gmail.com> 
Sent: Friday, January 13, 2023 9:56 AM
To: devel@edk2.groups.io
Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>; Oram, Isaac W 
<isaac.w.o...@intel.com>; Desimone, Nathaniel L 
<nathaniel.l.desim...@intel.com>; Chiu, Chasel <chasel.c...@intel.com>
Subject: [edk2-devel][edk2-platforms][PATCH v2] 
KabylakeOpenBoardPkg/I2cHdmiDebugSerialPortLib: Configurable timings

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 
dependent, 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.chaga...@intel.com>
Cc: Isaac Oram <isaac.w.o...@intel.com>
Cc: Nate DeSimone <nathaniel.l.desim...@intel.com>
Cc: Chasel Chiu <chasel.c...@intel.com>
Signed-off-by: Benjamin Doron <benjamin.doro...@gmail.com>
---
 .../DxeI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../Library/I2cHdmiDebugSerialPortLib/Gmbus.c |  9 +++++++--
 .../I2cDebugPortProtocol.c                    | 12 +++++++++---
 .../PeiI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../SecI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../SmmI2cHdmiDebugSerialPortLib.inf          |  2 ++
 .../KabylakeOpenBoardPkg/OpenBoardPkg.dec     | 19 +++++++++++++++++++
 7 files changed, 43 insertions(+), 5 deletions(-)

diff --git 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf
 
b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf
index 736b11a561f0..e8af25161008 100644
--- 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/DxeI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPort
+++ Lib/DxeI2cHdmiDebugSerialPortLib.inf
@@ -51,3 +51,5 @@
 [Pcd]   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel   
 ## CONSUMES   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress              
       ## CONSUMES+  
gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## 
CONSUMES+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs 
   ## CONSUMESdiff --git 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c 
b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c
index c6453117843a..31965a1b3a54 100644
--- 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/Gmbus.c
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPort
+++ Lib/Gmbus.c
@@ -443,6 +443,7 @@ GmbusRead (
 {   EFI_STATUS              Status;   EFI_STATUS              Status2;+  UINT8 
                  GmbusClockRate;   UINT32                  Index;   UINT32     
             GmbusCmdSts;   UINT32                  GmbusStatus;@@ -472,7 
+473,8 @@ GmbusRead (
   //   // 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;   }@@ -607,6 +609,7 @@ GmbusWrite (
 {   EFI_STATUS              Status;   EFI_STATUS              Status2;+  UINT8 
                  GmbusClockRate;   UINT32                  Index;   UINT32     
             GmbusCmdSts;   UINT32                  GmbusStatus;@@ -637,7 
+640,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 f76bcf364cd1..d64251b75b4e 100644
--- 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/I2cDebugPortProtocol.c
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPort
+++ Lib/I2cDebugPortProtocol.c
@@ -38,6 +38,7 @@ I2cDebugPortWrite (
   UINT8       WriteBuffer[I2C_DEBUG_PORT_MAX_DATA_SIZE + 1];   EFI_STATUS  
Status;   UINT32      Index;+  UINT32      ImplementationDelayUs;   UINT8       
CurrentSize;   UINT8       DdcBusPinPair; @@ -51,9 +52,10 @@ I2cDebugPortWrite (
   if (EFI_ERROR (Status)) {     return Status;   }+  ImplementationDelayUs = 
FixedPcdGet32 (PcdI2cHdmiDebugPortPacketStallUs);  //BP: 3ms stall to catch up  
 RaiseTplForI2cDebugPortAccess ();   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 {@@ -95,6 +97,7 @@ I2cDebugPortRead (
   EFI_STATUS  Status;   UINT32      Index;   UINT32      BytesRead;+  UINT32   
   ImplementationDelayUs;   UINT32      CurrentSize;   UINT8       
DdcBusPinPair;   UINT8       GmbusIndexData;@@ -110,9 +113,10 @@ 
I2cDebugPortRead (
   if (EFI_ERROR (Status)) {     return Status;   }+  ImplementationDelayUs = 
FixedPcdGet32 (PcdI2cHdmiDebugPortPacketStallUs);  //BP: 3ms stall to catch up  
 RaiseTplForI2cDebugPortAccess ();   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 {@@ -163,6 +167,7 @@ I2cDebugPortReadyToRead (
   EFI_STATUS  Status;   UINT32      BytesRead;   UINT8       DdcBusPinPair;+  
UINT32      ImplementationDelayUs;   UINT8       GmbusIndexData;    BytesRead = 
1;@@ -173,7 +178,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 c82e0c9e9b76..c141521a0cd9 100644
--- 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/PeiI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPort
+++ Lib/PeiI2cHdmiDebugSerialPortLib.inf
@@ -52,3 +52,5 @@
 [Pcd]   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel   
 ## CONSUMES   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress              
       ## CONSUMES+  
gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## 
CONSUMES+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs 
   ## CONSUMESdiff --git 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf
 
b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf
index 3b84b25c3148..ed755699c312 100644
--- 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SecI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPort
+++ Lib/SecI2cHdmiDebugSerialPortLib.inf
@@ -51,3 +51,5 @@
 [Pcd]   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel   
 ## CONSUMES   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress              
       ## CONSUMES+  
gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## 
CONSUMES+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs 
   ## CONSUMESdiff --git 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf
 
b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf
index 68ff31495071..9f46d45b8a38 100644
--- 
a/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPortLib/SmmI2cHdmiDebugSerialPortLib.inf
+++ b/Platform/Intel/KabylakeOpenBoardPkg/Library/I2cHdmiDebugSerialPort
+++ Lib/SmmI2cHdmiDebugSerialPortLib.inf
@@ -51,3 +51,5 @@
 [Pcd]   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortDdcI2cChannel   
 ## CONSUMES   gKabylakeOpenBoardPkgTokenSpaceGuid.PcdGttMmAddress              
       ## CONSUMES+  
gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortGmbusClockRate   ## 
CONSUMES+  gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs 
   ## CONSUMESdiff --git a/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec 
b/Platform/Intel/KabylakeOpenBoardPkg/OpenBoardPkg.dec
index 448eafacbfcd..401f6416aa1c 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. 
Increase internal baudrate generator for 100K, maybe 400K. Potentially less 
stable+#  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 
Stall in microsends between packets on the HDMI debug 
port+gKabylakeOpenBoardPkgTokenSpaceGuid.PcdI2cHdmiDebugPortPacketStallUs|3000|UINT32|0x90000037+
 [PcdsDynamic]  # Board GPIO Table--
2.39.0



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#98744): https://edk2.groups.io/g/devel/message/98744
Mute This Topic: https://groups.io/mt/96251636/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to