gma hsw+: Add boilerplate for DDI buffer translations

Change-Id: I8fcba64a3c663b9eea7fb11088c62ea584d63e04
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/20129
Tested-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/common/broxton/Makefile.inc b/common/broxton/Makefile.inc
index 90241b2..0197c6a 100644
--- a/common/broxton/Makefile.inc
+++ b/common/broxton/Makefile.inc
@@ -1,3 +1,4 @@
+gfxinit-y += hw-gfx-gma-connectors-ddi-buffers.ads
 gfxinit-y += hw-gfx-gma-ddi_phy.adb
 gfxinit-y += hw-gfx-gma-ddi_phy.ads
 gfxinit-y += hw-gfx-gma-plls.adb
diff --git a/common/broxton/hw-gfx-gma-connectors-ddi-buffers.ads b/common/broxton/hw-gfx-gma-connectors-ddi-buffers.ads
new file mode 100644
index 0000000..499226a
--- /dev/null
+++ b/common/broxton/hw-gfx-gma-connectors-ddi-buffers.ads
@@ -0,0 +1,21 @@
+--
+-- Copyright (C) 2017 secunet Security Networks AG
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+
+private package HW.GFX.GMA.Connectors.DDI.Buffers
+is
+
+   procedure Translations (Trans : out Buf_Trans_Array; Port : Digital_Port)
+      is null;
+
+end HW.GFX.GMA.Connectors.DDI.Buffers;
diff --git a/common/haswell/Makefile.inc b/common/haswell/Makefile.inc
index 7ba430e..dda1fc9 100644
--- a/common/haswell/Makefile.inc
+++ b/common/haswell/Makefile.inc
@@ -1,3 +1,4 @@
+gfxinit-y += hw-gfx-gma-connectors-ddi-buffers.ads
 gfxinit-y += hw-gfx-gma-ddi_phy.ads
 gfxinit-y += hw-gfx-gma-plls-lcpll.ads
 gfxinit-y += hw-gfx-gma-plls-wrpll.adb
diff --git a/common/haswell/hw-gfx-gma-connectors-ddi-buffers.ads b/common/haswell/hw-gfx-gma-connectors-ddi-buffers.ads
new file mode 100644
index 0000000..499226a
--- /dev/null
+++ b/common/haswell/hw-gfx-gma-connectors-ddi-buffers.ads
@@ -0,0 +1,21 @@
+--
+-- Copyright (C) 2017 secunet Security Networks AG
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+
+private package HW.GFX.GMA.Connectors.DDI.Buffers
+is
+
+   procedure Translations (Trans : out Buf_Trans_Array; Port : Digital_Port)
+      is null;
+
+end HW.GFX.GMA.Connectors.DDI.Buffers;
diff --git a/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb b/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
index a7c1b9e..091f36d 100644
--- a/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
+++ b/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
@@ -1,5 +1,5 @@
 --
--- Copyright (C) 2015-2016 secunet Security Networks AG
+-- Copyright (C) 2015-2017 secunet Security Networks AG
 --
 -- This program is free software; you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 with HW.GFX.GMA.DP_Aux_Ch;
 with HW.GFX.GMA.SPLL;
 with HW.GFX.GMA.DDI_Phy;
+with HW.GFX.GMA.Connectors.DDI.Buffers;
 
 with HW.Debug;
 with GNAT.Source_Info;
@@ -94,8 +95,12 @@
       HW.GFX.DP_Bandwidth_2_7  => PORT_CLK_SEL_LCPLL1350,
       HW.GFX.DP_Bandwidth_5_4  => PORT_CLK_SEL_LCPLL2700);
 
+   type DDI_Buf_Trans_Regs_Array
+      is array (Buf_Trans_Range) of Registers.Registers_Index;
+
    type DDI_Registers is record
       BUF_CTL        : Registers.Registers_Index;
+      BUF_TRANS      : DDI_Buf_Trans_Regs_Array;
       DP_TP_CTL      : Registers.Registers_Index;
       DP_TP_STATUS   : Registers.Registers_Invalid_Index;
       PORT_CLK_SEL   : Registers.Registers_Index;
@@ -106,26 +111,131 @@
    DDI_Regs : constant DDI_Registers_Array := DDI_Registers_Array'
      (DIGI_A => DDI_Registers'
         (BUF_CTL        => Registers.DDI_BUF_CTL_A,
+         BUF_TRANS      => DDI_Buf_Trans_Regs_Array'
+                          (Registers.DDI_BUF_TRANS_A_S0T1,
+                           Registers.DDI_BUF_TRANS_A_S0T2,
+                           Registers.DDI_BUF_TRANS_A_S1T1,
+                           Registers.DDI_BUF_TRANS_A_S1T2,
+                           Registers.DDI_BUF_TRANS_A_S2T1,
+                           Registers.DDI_BUF_TRANS_A_S2T2,
+                           Registers.DDI_BUF_TRANS_A_S3T1,
+                           Registers.DDI_BUF_TRANS_A_S3T2,
+                           Registers.DDI_BUF_TRANS_A_S4T1,
+                           Registers.DDI_BUF_TRANS_A_S4T2,
+                           Registers.DDI_BUF_TRANS_A_S5T1,
+                           Registers.DDI_BUF_TRANS_A_S5T2,
+                           Registers.DDI_BUF_TRANS_A_S6T1,
+                           Registers.DDI_BUF_TRANS_A_S6T2,
+                           Registers.DDI_BUF_TRANS_A_S7T1,
+                           Registers.DDI_BUF_TRANS_A_S7T2,
+                           Registers.DDI_BUF_TRANS_A_S8T1,
+                           Registers.DDI_BUF_TRANS_A_S8T2,
+                           Registers.DDI_BUF_TRANS_A_S9T1,
+                           Registers.DDI_BUF_TRANS_A_S9T2),
          DP_TP_CTL      => Registers.DP_TP_CTL_A,
          DP_TP_STATUS   => Registers.Invalid_Register,
          PORT_CLK_SEL   => Registers.PORT_CLK_SEL_DDIA),
       DIGI_B => DDI_Registers'
         (BUF_CTL        => Registers.DDI_BUF_CTL_B,
+         BUF_TRANS      => DDI_Buf_Trans_Regs_Array'
+                          (Registers.DDI_BUF_TRANS_B_S0T1,
+                           Registers.DDI_BUF_TRANS_B_S0T2,
+                           Registers.DDI_BUF_TRANS_B_S1T1,
+                           Registers.DDI_BUF_TRANS_B_S1T2,
+                           Registers.DDI_BUF_TRANS_B_S2T1,
+                           Registers.DDI_BUF_TRANS_B_S2T2,
+                           Registers.DDI_BUF_TRANS_B_S3T1,
+                           Registers.DDI_BUF_TRANS_B_S3T2,
+                           Registers.DDI_BUF_TRANS_B_S4T1,
+                           Registers.DDI_BUF_TRANS_B_S4T2,
+                           Registers.DDI_BUF_TRANS_B_S5T1,
+                           Registers.DDI_BUF_TRANS_B_S5T2,
+                           Registers.DDI_BUF_TRANS_B_S6T1,
+                           Registers.DDI_BUF_TRANS_B_S6T2,
+                           Registers.DDI_BUF_TRANS_B_S7T1,
+                           Registers.DDI_BUF_TRANS_B_S7T2,
+                           Registers.DDI_BUF_TRANS_B_S8T1,
+                           Registers.DDI_BUF_TRANS_B_S8T2,
+                           Registers.DDI_BUF_TRANS_B_S9T1,
+                           Registers.DDI_BUF_TRANS_B_S9T2),
          DP_TP_CTL      => Registers.DP_TP_CTL_B,
          DP_TP_STATUS   => Registers.DP_TP_STATUS_B,
          PORT_CLK_SEL   => Registers.PORT_CLK_SEL_DDIB),
       DIGI_C => DDI_Registers'
         (BUF_CTL        => Registers.DDI_BUF_CTL_C,
+         BUF_TRANS      => DDI_Buf_Trans_Regs_Array'
+                          (Registers.DDI_BUF_TRANS_C_S0T1,
+                           Registers.DDI_BUF_TRANS_C_S0T2,
+                           Registers.DDI_BUF_TRANS_C_S1T1,
+                           Registers.DDI_BUF_TRANS_C_S1T2,
+                           Registers.DDI_BUF_TRANS_C_S2T1,
+                           Registers.DDI_BUF_TRANS_C_S2T2,
+                           Registers.DDI_BUF_TRANS_C_S3T1,
+                           Registers.DDI_BUF_TRANS_C_S3T2,
+                           Registers.DDI_BUF_TRANS_C_S4T1,
+                           Registers.DDI_BUF_TRANS_C_S4T2,
+                           Registers.DDI_BUF_TRANS_C_S5T1,
+                           Registers.DDI_BUF_TRANS_C_S5T2,
+                           Registers.DDI_BUF_TRANS_C_S6T1,
+                           Registers.DDI_BUF_TRANS_C_S6T2,
+                           Registers.DDI_BUF_TRANS_C_S7T1,
+                           Registers.DDI_BUF_TRANS_C_S7T2,
+                           Registers.DDI_BUF_TRANS_C_S8T1,
+                           Registers.DDI_BUF_TRANS_C_S8T2,
+                           Registers.DDI_BUF_TRANS_C_S9T1,
+                           Registers.DDI_BUF_TRANS_C_S9T2),
          DP_TP_CTL      => Registers.DP_TP_CTL_C,
          DP_TP_STATUS   => Registers.DP_TP_STATUS_C,
          PORT_CLK_SEL   => Registers.PORT_CLK_SEL_DDIC),
       DIGI_D => DDI_Registers'
         (BUF_CTL        => Registers.DDI_BUF_CTL_D,
+         BUF_TRANS      => DDI_Buf_Trans_Regs_Array'
+                          (Registers.DDI_BUF_TRANS_D_S0T1,
+                           Registers.DDI_BUF_TRANS_D_S0T2,
+                           Registers.DDI_BUF_TRANS_D_S1T1,
+                           Registers.DDI_BUF_TRANS_D_S1T2,
+                           Registers.DDI_BUF_TRANS_D_S2T1,
+                           Registers.DDI_BUF_TRANS_D_S2T2,
+                           Registers.DDI_BUF_TRANS_D_S3T1,
+                           Registers.DDI_BUF_TRANS_D_S3T2,
+                           Registers.DDI_BUF_TRANS_D_S4T1,
+                           Registers.DDI_BUF_TRANS_D_S4T2,
+                           Registers.DDI_BUF_TRANS_D_S5T1,
+                           Registers.DDI_BUF_TRANS_D_S5T2,
+                           Registers.DDI_BUF_TRANS_D_S6T1,
+                           Registers.DDI_BUF_TRANS_D_S6T2,
+                           Registers.DDI_BUF_TRANS_D_S7T1,
+                           Registers.DDI_BUF_TRANS_D_S7T2,
+                           Registers.DDI_BUF_TRANS_D_S8T1,
+                           Registers.DDI_BUF_TRANS_D_S8T2,
+                           Registers.DDI_BUF_TRANS_D_S9T1,
+                           Registers.DDI_BUF_TRANS_D_S9T2),
          DP_TP_CTL      => Registers.DP_TP_CTL_D,
          DP_TP_STATUS   => Registers.DP_TP_STATUS_D,
          PORT_CLK_SEL   => Registers.PORT_CLK_SEL_DDID),
       DIGI_E => DDI_Registers'
         (BUF_CTL        => Registers.DDI_BUF_CTL_E,
+         BUF_TRANS      => DDI_Buf_Trans_Regs_Array'
+                          (Registers.DDI_BUF_TRANS_E_S0T1,
+                           Registers.DDI_BUF_TRANS_E_S0T2,
+                           Registers.DDI_BUF_TRANS_E_S1T1,
+                           Registers.DDI_BUF_TRANS_E_S1T2,
+                           Registers.DDI_BUF_TRANS_E_S2T1,
+                           Registers.DDI_BUF_TRANS_E_S2T2,
+                           Registers.DDI_BUF_TRANS_E_S3T1,
+                           Registers.DDI_BUF_TRANS_E_S3T2,
+                           Registers.DDI_BUF_TRANS_E_S4T1,
+                           Registers.DDI_BUF_TRANS_E_S4T2,
+                           Registers.DDI_BUF_TRANS_E_S5T1,
+                           Registers.DDI_BUF_TRANS_E_S5T2,
+                           Registers.DDI_BUF_TRANS_E_S6T1,
+                           Registers.DDI_BUF_TRANS_E_S6T2,
+                           Registers.DDI_BUF_TRANS_E_S7T1,
+                           Registers.DDI_BUF_TRANS_E_S7T2,
+                           Registers.DDI_BUF_TRANS_E_S8T1,
+                           Registers.DDI_BUF_TRANS_E_S8T2,
+                           Registers.DDI_BUF_TRANS_E_S9T1,
+                           Registers.DDI_BUF_TRANS_E_S9T2),
          DP_TP_CTL      => Registers.DP_TP_CTL_E,
          DP_TP_STATUS   => Registers.DP_TP_STATUS_E,
          PORT_CLK_SEL   => Registers.PORT_CLK_SEL_DDIE));
@@ -174,6 +284,33 @@
 
    ----------------------------------------------------------------------------
 
+   procedure Program_Buffer_Translations (Port : Digital_Port)
+   is
+      Buffer_Translations : Buf_Trans_Array;
+   begin
+      Buffers.Translations (Buffer_Translations, Port);
+      for I in Buf_Trans_Range loop
+         Registers.Write
+           (Register => DDI_Regs (Port).BUF_TRANS (I),
+            Value    => Buffer_Translations (I));
+      end loop;
+   end Program_Buffer_Translations;
+
+   procedure Initialize
+   is
+   begin
+      if Config.Has_DDI_Buffer_Trans then
+         for Port in Digital_Port range DIGI_A .. Config.Last_Digital_Port loop
+            Program_Buffer_Translations (Port);
+         end loop;
+         if Config.Is_FDI_Port (Analog) then
+            Program_Buffer_Translations (DIGI_E);
+         end if;
+      end if;
+   end Initialize;
+
+   ----------------------------------------------------------------------------
+
    function Max_V_Swing
      (Port : Digital_Port)
       return DP_Info.DP_Voltage_Swing
diff --git a/common/haswell_shared/hw-gfx-gma-connectors-ddi.ads b/common/haswell_shared/hw-gfx-gma-connectors-ddi.ads
index 465e7eb..4ccd995 100644
--- a/common/haswell_shared/hw-gfx-gma-connectors-ddi.ads
+++ b/common/haswell_shared/hw-gfx-gma-connectors-ddi.ads
@@ -1,5 +1,5 @@
 --
--- Copyright (C) 2015 secunet Security Networks AG
+-- Copyright (C) 2015-2017 secunet Security Networks AG
 --
 -- This program is free software; you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -17,6 +17,8 @@
 private package HW.GFX.GMA.Connectors.DDI
 is
 
+   procedure Initialize;
+
    procedure Pre_On
      (Port_Cfg : in     Port_Config;
       PLL_Hint : in     Word32;
@@ -26,4 +28,8 @@
 
    procedure Off (Port : Digital_Port);
 
+private
+   type Buf_Trans_Range is range 0 .. 19;
+   type Buf_Trans_Array is array (Buf_Trans_Range) of Word32;
+
 end HW.GFX.GMA.Connectors.DDI;
diff --git a/common/haswell_shared/hw-gfx-gma-connectors.adb b/common/haswell_shared/hw-gfx-gma-connectors.adb
index 1af86ac..f5e2e01 100644
--- a/common/haswell_shared/hw-gfx-gma-connectors.adb
+++ b/common/haswell_shared/hw-gfx-gma-connectors.adb
@@ -1,5 +1,5 @@
 --
--- Copyright (C) 2015-2016 secunet Security Networks AG
+-- Copyright (C) 2015-2017 secunet Security Networks AG
 --
 -- This program is free software; you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@
    procedure Initialize
    is
    begin
-      null;
+      DDI.Initialize;
    end Initialize;
 
    procedure Pre_On
diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template
index 7d6806a..f9fe429 100644
--- a/common/hw-gfx-gma-config.ads.template
+++ b/common/hw-gfx-gma-config.ads.template
@@ -1,5 +1,5 @@
 --
--- Copyright (C) 2015-2016 secunet Security Networks AG
+-- Copyright (C) 2015-2017 secunet Security Networks AG
 --
 -- This program is free software; you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -92,6 +92,7 @@
                                                   and CPU_Var = Normal)
                                                  or CPU >= Skylake;
 
+   Has_DDI_Buffer_Trans    : constant Boolean := False;
    Has_Low_Voltage_Swing   : constant Boolean := CPU >= Broxton;
 
    Need_DP_Aux_Mutex       : constant Boolean := False; -- Skylake & (PSR | GTC)
diff --git a/common/hw-gfx-gma-registers.ads b/common/hw-gfx-gma-registers.ads
index 70c27cc..ef25770 100644
--- a/common/hw-gfx-gma-registers.ads
+++ b/common/hw-gfx-gma-registers.ads
@@ -1,5 +1,5 @@
 --
--- Copyright (C) 2015-2016 secunet Security Networks AG
+-- Copyright (C) 2015-2017 secunet Security Networks AG
 --
 -- This program is free software; you can redistribute it and/or modify
 -- it under the terms of the GNU General Public License as published by
@@ -220,6 +220,106 @@
       BXT_PHY_CTL_C,
       BXT_PHY_CTL_FAM_EDP,
       BXT_PHY_CTL_FAM_DDI,
+      DDI_BUF_TRANS_A_S0T1,
+      DDI_BUF_TRANS_A_S0T2,
+      DDI_BUF_TRANS_A_S1T1,
+      DDI_BUF_TRANS_A_S1T2,
+      DDI_BUF_TRANS_A_S2T1,
+      DDI_BUF_TRANS_A_S2T2,
+      DDI_BUF_TRANS_A_S3T1,
+      DDI_BUF_TRANS_A_S3T2,
+      DDI_BUF_TRANS_A_S4T1,
+      DDI_BUF_TRANS_A_S4T2,
+      DDI_BUF_TRANS_A_S5T1,
+      DDI_BUF_TRANS_A_S5T2,
+      DDI_BUF_TRANS_A_S6T1,
+      DDI_BUF_TRANS_A_S6T2,
+      DDI_BUF_TRANS_A_S7T1,
+      DDI_BUF_TRANS_A_S7T2,
+      DDI_BUF_TRANS_A_S8T1,
+      DDI_BUF_TRANS_A_S8T2,
+      DDI_BUF_TRANS_A_S9T1,
+      DDI_BUF_TRANS_A_S9T2,
+      DDI_BUF_TRANS_B_S0T1,
+      DDI_BUF_TRANS_B_S0T2,
+      DDI_BUF_TRANS_B_S1T1,
+      DDI_BUF_TRANS_B_S1T2,
+      DDI_BUF_TRANS_B_S2T1,
+      DDI_BUF_TRANS_B_S2T2,
+      DDI_BUF_TRANS_B_S3T1,
+      DDI_BUF_TRANS_B_S3T2,
+      DDI_BUF_TRANS_B_S4T1,
+      DDI_BUF_TRANS_B_S4T2,
+      DDI_BUF_TRANS_B_S5T1,
+      DDI_BUF_TRANS_B_S5T2,
+      DDI_BUF_TRANS_B_S6T1,
+      DDI_BUF_TRANS_B_S6T2,
+      DDI_BUF_TRANS_B_S7T1,
+      DDI_BUF_TRANS_B_S7T2,
+      DDI_BUF_TRANS_B_S8T1,
+      DDI_BUF_TRANS_B_S8T2,
+      DDI_BUF_TRANS_B_S9T1,
+      DDI_BUF_TRANS_B_S9T2,
+      DDI_BUF_TRANS_C_S0T1,
+      DDI_BUF_TRANS_C_S0T2,
+      DDI_BUF_TRANS_C_S1T1,
+      DDI_BUF_TRANS_C_S1T2,
+      DDI_BUF_TRANS_C_S2T1,
+      DDI_BUF_TRANS_C_S2T2,
+      DDI_BUF_TRANS_C_S3T1,
+      DDI_BUF_TRANS_C_S3T2,
+      DDI_BUF_TRANS_C_S4T1,
+      DDI_BUF_TRANS_C_S4T2,
+      DDI_BUF_TRANS_C_S5T1,
+      DDI_BUF_TRANS_C_S5T2,
+      DDI_BUF_TRANS_C_S6T1,
+      DDI_BUF_TRANS_C_S6T2,
+      DDI_BUF_TRANS_C_S7T1,
+      DDI_BUF_TRANS_C_S7T2,
+      DDI_BUF_TRANS_C_S8T1,
+      DDI_BUF_TRANS_C_S8T2,
+      DDI_BUF_TRANS_C_S9T1,
+      DDI_BUF_TRANS_C_S9T2,
+      DDI_BUF_TRANS_D_S0T1,
+      DDI_BUF_TRANS_D_S0T2,
+      DDI_BUF_TRANS_D_S1T1,
+      DDI_BUF_TRANS_D_S1T2,
+      DDI_BUF_TRANS_D_S2T1,
+      DDI_BUF_TRANS_D_S2T2,
+      DDI_BUF_TRANS_D_S3T1,
+      DDI_BUF_TRANS_D_S3T2,
+      DDI_BUF_TRANS_D_S4T1,
+      DDI_BUF_TRANS_D_S4T2,
+      DDI_BUF_TRANS_D_S5T1,
+      DDI_BUF_TRANS_D_S5T2,
+      DDI_BUF_TRANS_D_S6T1,
+      DDI_BUF_TRANS_D_S6T2,
+      DDI_BUF_TRANS_D_S7T1,
+      DDI_BUF_TRANS_D_S7T2,
+      DDI_BUF_TRANS_D_S8T1,
+      DDI_BUF_TRANS_D_S8T2,
+      DDI_BUF_TRANS_D_S9T1,
+      DDI_BUF_TRANS_D_S9T2,
+      DDI_BUF_TRANS_E_S0T1,
+      DDI_BUF_TRANS_E_S0T2,
+      DDI_BUF_TRANS_E_S1T1,
+      DDI_BUF_TRANS_E_S1T2,
+      DDI_BUF_TRANS_E_S2T1,
+      DDI_BUF_TRANS_E_S2T2,
+      DDI_BUF_TRANS_E_S3T1,
+      DDI_BUF_TRANS_E_S3T2,
+      DDI_BUF_TRANS_E_S4T1,
+      DDI_BUF_TRANS_E_S4T2,
+      DDI_BUF_TRANS_E_S5T1,
+      DDI_BUF_TRANS_E_S5T2,
+      DDI_BUF_TRANS_E_S6T1,
+      DDI_BUF_TRANS_E_S6T2,
+      DDI_BUF_TRANS_E_S7T1,
+      DDI_BUF_TRANS_E_S7T2,
+      DDI_BUF_TRANS_E_S8T1,
+      DDI_BUF_TRANS_E_S8T2,
+      DDI_BUF_TRANS_E_S9T1,
+      DDI_BUF_TRANS_E_S9T2,
       AUD_VID_DID,
       PFA_WIN_POS,
       PFA_WIN_SZ,
@@ -858,6 +958,26 @@
 
       -- DDI registers
       DDI_BUF_CTL_A         => 16#06_4000# / Register_Width, -- aliased by DP_CTL_A
+      DDI_BUF_TRANS_A_S0T1  => 16#06_4e00# / Register_Width,
+      DDI_BUF_TRANS_A_S0T2  => 16#06_4e04# / Register_Width,
+      DDI_BUF_TRANS_A_S1T1  => 16#06_4e08# / Register_Width,
+      DDI_BUF_TRANS_A_S1T2  => 16#06_4e0c# / Register_Width,
+      DDI_BUF_TRANS_A_S2T1  => 16#06_4e10# / Register_Width,
+      DDI_BUF_TRANS_A_S2T2  => 16#06_4e14# / Register_Width,
+      DDI_BUF_TRANS_A_S3T1  => 16#06_4e18# / Register_Width,
+      DDI_BUF_TRANS_A_S3T2  => 16#06_4e1c# / Register_Width,
+      DDI_BUF_TRANS_A_S4T1  => 16#06_4e20# / Register_Width,
+      DDI_BUF_TRANS_A_S4T2  => 16#06_4e24# / Register_Width,
+      DDI_BUF_TRANS_A_S5T1  => 16#06_4e28# / Register_Width,
+      DDI_BUF_TRANS_A_S5T2  => 16#06_4e2c# / Register_Width,
+      DDI_BUF_TRANS_A_S6T1  => 16#06_4e30# / Register_Width,
+      DDI_BUF_TRANS_A_S6T2  => 16#06_4e34# / Register_Width,
+      DDI_BUF_TRANS_A_S7T1  => 16#06_4e38# / Register_Width,
+      DDI_BUF_TRANS_A_S7T2  => 16#06_4e3c# / Register_Width,
+      DDI_BUF_TRANS_A_S8T1  => 16#06_4e40# / Register_Width,
+      DDI_BUF_TRANS_A_S8T2  => 16#06_4e44# / Register_Width,
+      DDI_BUF_TRANS_A_S9T1  => 16#06_4e48# / Register_Width,
+      DDI_BUF_TRANS_A_S9T2  => 16#06_4e4c# / Register_Width,
       DDI_AUX_CTL_A         => 16#06_4010# / Register_Width, -- aliased by DP_AUX_CTL_A
       DDI_AUX_DATA_A_1      => 16#06_4014# / Register_Width, -- aliased by DP_AUX_DATA_A_1
       DDI_AUX_DATA_A_2      => 16#06_4018# / Register_Width, -- aliased by DP_AUX_DATA_A_2
@@ -865,7 +985,28 @@
       DDI_AUX_DATA_A_4      => 16#06_4020# / Register_Width, -- aliased by DP_AUX_DATA_A_4
       DDI_AUX_DATA_A_5      => 16#06_4024# / Register_Width, -- aliased by DP_AUX_DATA_A_5
       DDI_AUX_MUTEX_A       => 16#06_402c# / Register_Width,
+
       DDI_BUF_CTL_B         => 16#06_4100# / Register_Width,
+      DDI_BUF_TRANS_B_S0T1  => 16#06_4e60# / Register_Width,
+      DDI_BUF_TRANS_B_S0T2  => 16#06_4e64# / Register_Width,
+      DDI_BUF_TRANS_B_S1T1  => 16#06_4e68# / Register_Width,
+      DDI_BUF_TRANS_B_S1T2  => 16#06_4e6c# / Register_Width,
+      DDI_BUF_TRANS_B_S2T1  => 16#06_4e70# / Register_Width,
+      DDI_BUF_TRANS_B_S2T2  => 16#06_4e74# / Register_Width,
+      DDI_BUF_TRANS_B_S3T1  => 16#06_4e78# / Register_Width,
+      DDI_BUF_TRANS_B_S3T2  => 16#06_4e7c# / Register_Width,
+      DDI_BUF_TRANS_B_S4T1  => 16#06_4e80# / Register_Width,
+      DDI_BUF_TRANS_B_S4T2  => 16#06_4e84# / Register_Width,
+      DDI_BUF_TRANS_B_S5T1  => 16#06_4e88# / Register_Width,
+      DDI_BUF_TRANS_B_S5T2  => 16#06_4e8c# / Register_Width,
+      DDI_BUF_TRANS_B_S6T1  => 16#06_4e90# / Register_Width,
+      DDI_BUF_TRANS_B_S6T2  => 16#06_4e94# / Register_Width,
+      DDI_BUF_TRANS_B_S7T1  => 16#06_4e98# / Register_Width,
+      DDI_BUF_TRANS_B_S7T2  => 16#06_4e9c# / Register_Width,
+      DDI_BUF_TRANS_B_S8T1  => 16#06_4ea0# / Register_Width,
+      DDI_BUF_TRANS_B_S8T2  => 16#06_4ea4# / Register_Width,
+      DDI_BUF_TRANS_B_S9T1  => 16#06_4ea8# / Register_Width,
+      DDI_BUF_TRANS_B_S9T2  => 16#06_4eac# / Register_Width,
       DDI_AUX_CTL_B         => 16#06_4110# / Register_Width,
       DDI_AUX_DATA_B_1      => 16#06_4114# / Register_Width,
       DDI_AUX_DATA_B_2      => 16#06_4118# / Register_Width,
@@ -873,7 +1014,28 @@
       DDI_AUX_DATA_B_4      => 16#06_4120# / Register_Width,
       DDI_AUX_DATA_B_5      => 16#06_4124# / Register_Width,
       DDI_AUX_MUTEX_B       => 16#06_412c# / Register_Width,
+
       DDI_BUF_CTL_C         => 16#06_4200# / Register_Width,
+      DDI_BUF_TRANS_C_S0T1  => 16#06_4ec0# / Register_Width,
+      DDI_BUF_TRANS_C_S0T2  => 16#06_4ec4# / Register_Width,
+      DDI_BUF_TRANS_C_S1T1  => 16#06_4ec8# / Register_Width,
+      DDI_BUF_TRANS_C_S1T2  => 16#06_4ecc# / Register_Width,
+      DDI_BUF_TRANS_C_S2T1  => 16#06_4ed0# / Register_Width,
+      DDI_BUF_TRANS_C_S2T2  => 16#06_4ed4# / Register_Width,
+      DDI_BUF_TRANS_C_S3T1  => 16#06_4ed8# / Register_Width,
+      DDI_BUF_TRANS_C_S3T2  => 16#06_4edc# / Register_Width,
+      DDI_BUF_TRANS_C_S4T1  => 16#06_4ee0# / Register_Width,
+      DDI_BUF_TRANS_C_S4T2  => 16#06_4ee4# / Register_Width,
+      DDI_BUF_TRANS_C_S5T1  => 16#06_4ee8# / Register_Width,
+      DDI_BUF_TRANS_C_S5T2  => 16#06_4eec# / Register_Width,
+      DDI_BUF_TRANS_C_S6T1  => 16#06_4ef0# / Register_Width,
+      DDI_BUF_TRANS_C_S6T2  => 16#06_4ef4# / Register_Width,
+      DDI_BUF_TRANS_C_S7T1  => 16#06_4ef8# / Register_Width,
+      DDI_BUF_TRANS_C_S7T2  => 16#06_4efc# / Register_Width,
+      DDI_BUF_TRANS_C_S8T1  => 16#06_4f00# / Register_Width,
+      DDI_BUF_TRANS_C_S8T2  => 16#06_4f04# / Register_Width,
+      DDI_BUF_TRANS_C_S9T1  => 16#06_4f08# / Register_Width,
+      DDI_BUF_TRANS_C_S9T2  => 16#06_4f0c# / Register_Width,
       DDI_AUX_CTL_C         => 16#06_4210# / Register_Width,
       DDI_AUX_DATA_C_1      => 16#06_4214# / Register_Width,
       DDI_AUX_DATA_C_2      => 16#06_4218# / Register_Width,
@@ -881,7 +1043,28 @@
       DDI_AUX_DATA_C_4      => 16#06_4220# / Register_Width,
       DDI_AUX_DATA_C_5      => 16#06_4224# / Register_Width,
       DDI_AUX_MUTEX_C       => 16#06_422c# / Register_Width,
+
       DDI_BUF_CTL_D         => 16#06_4300# / Register_Width,
+      DDI_BUF_TRANS_D_S0T1  => 16#06_4f20# / Register_Width,
+      DDI_BUF_TRANS_D_S0T2  => 16#06_4f24# / Register_Width,
+      DDI_BUF_TRANS_D_S1T1  => 16#06_4f28# / Register_Width,
+      DDI_BUF_TRANS_D_S1T2  => 16#06_4f2c# / Register_Width,
+      DDI_BUF_TRANS_D_S2T1  => 16#06_4f30# / Register_Width,
+      DDI_BUF_TRANS_D_S2T2  => 16#06_4f34# / Register_Width,
+      DDI_BUF_TRANS_D_S3T1  => 16#06_4f38# / Register_Width,
+      DDI_BUF_TRANS_D_S3T2  => 16#06_4f3c# / Register_Width,
+      DDI_BUF_TRANS_D_S4T1  => 16#06_4f40# / Register_Width,
+      DDI_BUF_TRANS_D_S4T2  => 16#06_4f44# / Register_Width,
+      DDI_BUF_TRANS_D_S5T1  => 16#06_4f48# / Register_Width,
+      DDI_BUF_TRANS_D_S5T2  => 16#06_4f4c# / Register_Width,
+      DDI_BUF_TRANS_D_S6T1  => 16#06_4f50# / Register_Width,
+      DDI_BUF_TRANS_D_S6T2  => 16#06_4f54# / Register_Width,
+      DDI_BUF_TRANS_D_S7T1  => 16#06_4f58# / Register_Width,
+      DDI_BUF_TRANS_D_S7T2  => 16#06_4f5c# / Register_Width,
+      DDI_BUF_TRANS_D_S8T1  => 16#06_4f60# / Register_Width,
+      DDI_BUF_TRANS_D_S8T2  => 16#06_4f64# / Register_Width,
+      DDI_BUF_TRANS_D_S9T1  => 16#06_4f68# / Register_Width,
+      DDI_BUF_TRANS_D_S9T2  => 16#06_4f6c# / Register_Width,
       DDI_AUX_CTL_D         => 16#06_4310# / Register_Width,
       DDI_AUX_DATA_D_1      => 16#06_4314# / Register_Width,
       DDI_AUX_DATA_D_2      => 16#06_4318# / Register_Width,
@@ -889,7 +1072,28 @@
       DDI_AUX_DATA_D_4      => 16#06_4320# / Register_Width,
       DDI_AUX_DATA_D_5      => 16#06_4324# / Register_Width,
       DDI_AUX_MUTEX_D       => 16#06_432c# / Register_Width,
+
       DDI_BUF_CTL_E         => 16#06_4400# / Register_Width,
+      DDI_BUF_TRANS_E_S0T1  => 16#06_4f80# / Register_Width,
+      DDI_BUF_TRANS_E_S0T2  => 16#06_4f84# / Register_Width,
+      DDI_BUF_TRANS_E_S1T1  => 16#06_4f88# / Register_Width,
+      DDI_BUF_TRANS_E_S1T2  => 16#06_4f8c# / Register_Width,
+      DDI_BUF_TRANS_E_S2T1  => 16#06_4f90# / Register_Width,
+      DDI_BUF_TRANS_E_S2T2  => 16#06_4f94# / Register_Width,
+      DDI_BUF_TRANS_E_S3T1  => 16#06_4f98# / Register_Width,
+      DDI_BUF_TRANS_E_S3T2  => 16#06_4f9c# / Register_Width,
+      DDI_BUF_TRANS_E_S4T1  => 16#06_4fa0# / Register_Width,
+      DDI_BUF_TRANS_E_S4T2  => 16#06_4fa4# / Register_Width,
+      DDI_BUF_TRANS_E_S5T1  => 16#06_4fa8# / Register_Width,
+      DDI_BUF_TRANS_E_S5T2  => 16#06_4fac# / Register_Width,
+      DDI_BUF_TRANS_E_S6T1  => 16#06_4fb0# / Register_Width,
+      DDI_BUF_TRANS_E_S6T2  => 16#06_4fb4# / Register_Width,
+      DDI_BUF_TRANS_E_S7T1  => 16#06_4fb8# / Register_Width,
+      DDI_BUF_TRANS_E_S7T2  => 16#06_4fbc# / Register_Width,
+      DDI_BUF_TRANS_E_S8T1  => 16#06_4fc0# / Register_Width,
+      DDI_BUF_TRANS_E_S8T2  => 16#06_4fc4# / Register_Width,
+      DDI_BUF_TRANS_E_S9T1  => 16#06_4fc8# / Register_Width,
+      DDI_BUF_TRANS_E_S9T2  => 16#06_4fcc# / Register_Width,
       DP_TP_CTL_A           => 16#06_4040# / Register_Width,
       DP_TP_CTL_B           => 16#06_4140# / Register_Width,
       DP_TP_CTL_C           => 16#06_4240# / Register_Width,
diff --git a/common/skylake/Makefile.inc b/common/skylake/Makefile.inc
index 36e4e0d..c59ab8e 100644
--- a/common/skylake/Makefile.inc
+++ b/common/skylake/Makefile.inc
@@ -1,3 +1,4 @@
+gfxinit-y += hw-gfx-gma-connectors-ddi-buffers.ads
 gfxinit-y += hw-gfx-gma-ddi_phy.ads
 gfxinit-y += hw-gfx-gma-plls-dpll.adb
 gfxinit-y += hw-gfx-gma-plls-dpll.ads
diff --git a/common/skylake/hw-gfx-gma-connectors-ddi-buffers.ads b/common/skylake/hw-gfx-gma-connectors-ddi-buffers.ads
new file mode 100644
index 0000000..499226a
--- /dev/null
+++ b/common/skylake/hw-gfx-gma-connectors-ddi-buffers.ads
@@ -0,0 +1,21 @@
+--
+-- Copyright (C) 2017 secunet Security Networks AG
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+
+private package HW.GFX.GMA.Connectors.DDI.Buffers
+is
+
+   procedure Translations (Trans : out Buf_Trans_Array; Port : Digital_Port)
+      is null;
+
+end HW.GFX.GMA.Connectors.DDI.Buffers;