gma: Add flag to use GMCH GMBUS registers

Change-Id: Id5d115c7a4711f634171e6e163439ebab4ee6076
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/25405
Reviewed-by: Nico Huber <nico.h@gmx.de>
diff --git a/common/hw-gfx-gma-i2c.adb b/common/hw-gfx-gma-i2c.adb
index 4b58dde..d8cdf44 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;