[coreboot-gerrit] Change in libgfxinit[master]: Add flag to use GMCH GMBUS registers

Arthur Heymans (Code Review) gerrit at coreboot.org
Wed Mar 28 17:29:48 CEST 2018


Arthur Heymans has uploaded this change for review. ( https://review.coreboot.org/25405


Change subject: Add flag to use GMCH GMBUS registers
......................................................................

Add flag to use GMCH GMBUS registers

Change-Id: Id5d115c7a4711f634171e6e163439ebab4ee6076
Signed-off-by: Arthur Heymans <arthur at aheymans.xyz>
---
M common/hw-gfx-gma-config.ads.template
M common/hw-gfx-gma-i2c.adb
M common/hw-gfx-gma-registers.ads
3 files changed, 46 insertions(+), 17 deletions(-)



  git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/05/25405/1

diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template
index e6326de..076f681 100644
--- a/common/hw-gfx-gma-config.ads.template
+++ b/common/hw-gfx-gma-config.ads.template
@@ -110,6 +110,7 @@
    ----- GMBUS: -----------
    Ungate_GMBUS_Unit_Level : constant Boolean := CPU >= Skylake;
    GMBUS_Alternative_Pins  : constant Boolean := CPU = Broxton;
+   Has_PCH_GMBUS           : constant Boolean := CPU >= Ironlake;
 
    ----- Power: -----------
    Has_IPS                 : constant Boolean := (CPU = Haswell and
diff --git a/common/hw-gfx-gma-i2c.adb b/common/hw-gfx-gma-i2c.adb
index 4b58dde..742080f 100644
--- a/common/hw-gfx-gma-i2c.adb
+++ b/common/hw-gfx-gma-i2c.adb
@@ -71,6 +71,22 @@
 
    GMBUS5_2BYTE_INDEX_ENABLE        : constant :=   1 * 2 ** 31;
 
+   GMBUS_Regs : constant array (0 .. 5) of Registers.Registers_Index :=
+     (if Config.Has_PCH_GMBUS then
+	(0 => Registers.PCH_GMBUS0,
+	 1 => Registers.PCH_GMBUS1,
+	 2 => Registers.PCH_GMBUS2,
+	 3 => Registers.PCH_GMBUS3,
+	 4 => Registers.PCH_GMBUS4,
+	 5 => Registers.PCH_GMBUS5)
+      else
+	(0 => Registers.GMCH_GMBUS0,
+	 1 => Registers.GMCH_GMBUS1,
+	 2 => Registers.GMCH_GMBUS2,
+	 3 => Registers.GMCH_GMBUS3,
+	 4 => Registers.GMCH_GMBUS4,
+	 5 => Registers.GMCH_GMBUS5));
+
    function GMBUS1_TOTAL_BYTE_COUNT
      (Count : HW.GFX.I2C.Transfer_Length)
       return Word32 is
@@ -109,7 +125,7 @@
    is
       GMBUS2 : Word32;
    begin
-      Registers.Read (Registers.PCH_GMBUS2, GMBUS2);
+      Registers.Read (GMBUS_Regs(2), GMBUS2);
       Result := (GMBUS2 and (GMBUS2_HARDWARE_WAIT_PHASE or
                               GMBUS2_SLAVE_STALL_TIMEOUT_ERROR or
                               GMBUS2_GMBUS_INTERRUPT_STATUS or
@@ -120,9 +136,9 @@
    begin
       pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
 
-      Registers.Write (Registers.PCH_GMBUS1, GMBUS1_SOFTWARE_CLEAR_INTERRUPT);
-      Registers.Write (Registers.PCH_GMBUS1, 0);
-      Registers.Write (Registers.PCH_GMBUS0, GMBUS0_PIN_PAIR_SELECT_NONE);
+      Registers.Write (GMBUS_Regs(1), GMBUS1_SOFTWARE_CLEAR_INTERRUPT);
+      Registers.Write (GMBUS_Regs(1), 0);
+      Registers.Write (GMBUS_Regs(0), GMBUS0_PIN_PAIR_SELECT_NONE);
 
       GMBUS_Ready (Success);
    end Reset_GMBUS;
@@ -138,7 +154,7 @@
       end if;
 
       -- TODO: Refactor + check for timeout.
-      Registers.Wait_Unset_Mask (Registers.PCH_GMBUS2, GMBUS2_INUSE);
+      Registers.Wait_Unset_Mask (GMBUS_Regs(2), GMBUS2_INUSE);
 
       GMBUS_Ready (Success);
       if not Success then
@@ -147,14 +163,14 @@
 
       if Success then
          Registers.Write
-           (Register => Registers.PCH_GMBUS0,
+           (Register => GMBUS_Regs(0),
             Value    => GMBUS0_GMBUS_RATE_SELECT_100KHZ or
                         GMBUS0_PIN_PAIR_SELECT (Port));
          Registers.Write
-           (Register => Registers.PCH_GMBUS4,
+           (Register => GMBUS_Regs(4),
             Value    => 0);
          Registers.Write
-           (Register => Registers.PCH_GMBUS5,
+           (Register => GMBUS_Regs(5),
             Value    => 0);
       end if;
    end Init_GMBUS;
@@ -164,10 +180,10 @@
    begin
       pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
 
-      Registers.Write (Registers.PCH_GMBUS0, GMBUS0_PIN_PAIR_SELECT_NONE);
+      Registers.Write (GMBUS_Regs(0), GMBUS0_PIN_PAIR_SELECT_NONE);
 
       -- Clear INUSE. TODO: Don't do it, if timeout occured (see above).
-      Registers.Write (Registers.PCH_GMBUS2, GMBUS2_INUSE);
+      Registers.Write (GMBUS_Regs(2), GMBUS2_INUSE);
 
       if Config.Ungate_GMBUS_Unit_Level then
          Registers.Unset_Mask
@@ -196,7 +212,7 @@
       Init_GMBUS (Port, Success);
       if Success then
          Registers.Write
-           (Register => Registers.PCH_GMBUS1,
+           (Register => GMBUS_Regs(1),
             Value    => GMBUS1_SOFTWARE_READY or
                         GMBUS1_BUS_CYCLE_INDEX or
                         GMBUS1_BUS_CYCLE_WAIT or
@@ -206,17 +222,17 @@
 
          while Success and then Transfered < Length loop
             Registers.Wait_Set_Mask
-              (Register => Registers.PCH_GMBUS2,
+              (Register => GMBUS_Regs(2),
                Mask     => GMBUS2_HARDWARE_READY,
                TOut_MS  => 55);
 
-            Registers.Read (Registers.PCH_GMBUS2, GMBUS2);
+            Registers.Read (GMBUS_Regs(2), GMBUS2);
             Success :=  (GMBUS2 and GMBUS2_HARDWARE_READY) /= 0 and
                         (GMBUS2 and GMBUS2_NAK_INDICATOR) = 0;
             if Success then
                Current := GFX.I2C.Transfer_Length'Min (Length, Transfered + 4);
 
-               Registers.Read (Registers.PCH_GMBUS3, GMBUS3);
+               Registers.Read (GMBUS_Regs(3), GMBUS3);
                for I in Transfered .. Current - 1 loop
                   Data (I) := Byte (GMBUS3 and 16#ff#);
                   GMBUS3 := Shift_Right (GMBUS3, 8);
@@ -226,13 +242,13 @@
          end loop;
          if Success then
             Registers.Wait_Set_Mask
-              (Register => Registers.PCH_GMBUS2,
+              (Register => GMBUS_Regs(2),
                Mask     => GMBUS2_HARDWARE_WAIT_PHASE);
             Registers.Write
-              (Register => Registers.PCH_GMBUS1,
+              (Register => GMBUS_Regs(1),
                Value    => GMBUS1_SOFTWARE_READY or GMBUS1_BUS_CYCLE_STOP);
             Registers.Wait_Unset_Mask
-              (Register => Registers.PCH_GMBUS2,
+              (Register => GMBUS_Regs(2),
                Mask     => GMBUS2_GMBUS_ACTIVE);
          end if;
       end if;
diff --git a/common/hw-gfx-gma-registers.ads b/common/hw-gfx-gma-registers.ads
index 1515fab..37e62e8 100644
--- a/common/hw-gfx-gma-registers.ads
+++ b/common/hw-gfx-gma-registers.ads
@@ -44,6 +44,12 @@
       ARB_MODE,
       HWS_PGA,
       GAM_ECOCHK,
+      GMCH_GMBUS0,
+      GMCH_GMBUS1,
+      GMCH_GMBUS2,
+      GMCH_GMBUS3,
+      GMCH_GMBUS4,
+      GMCH_GMBUS5,
       MBCTL,
       UCGCTL1,
       UCGCTL2,
@@ -1347,6 +1353,12 @@
       SDEIER                => 16#0c_400c# / Register_Width,
 
       -- I2C stuff
+      GMCH_GMBUS0           => 16#00_5100# / Register_Width,
+      GMCH_GMBUS1           => 16#00_5104# / Register_Width,
+      GMCH_GMBUS2           => 16#00_5108# / Register_Width,
+      GMCH_GMBUS3           => 16#00_510c# / Register_Width,
+      GMCH_GMBUS4           => 16#00_5110# / Register_Width,
+      GMCH_GMBUS5           => 16#00_5120# / Register_Width,
       PCH_GMBUS0            => 16#0c_5100# / Register_Width,
       PCH_GMBUS1            => 16#0c_5104# / Register_Width,
       PCH_GMBUS2            => 16#0c_5108# / Register_Width,

-- 
To view, visit https://review.coreboot.org/25405
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: libgfxinit
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Id5d115c7a4711f634171e6e163439ebab4ee6076
Gerrit-Change-Number: 25405
Gerrit-PatchSet: 1
Gerrit-Owner: Arthur Heymans <arthur at aheymans.xyz>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180328/5877e31f/attachment-0001.html>


More information about the coreboot-gerrit mailing list