Initial upstream commit

The history contained unlicensed code so everything got squashed, sorry.

Change-Id: I9f5775208f9df6fb29074bf3bc498f68cb17b3a0
Signed-off-by: Nico Huber <nico.huber@secunet.com>
diff --git a/common/hw-gfx-gma-connector_info.adb b/common/hw-gfx-gma-connector_info.adb
new file mode 100644
index 0000000..bec59fa
--- /dev/null
+++ b/common/hw-gfx-gma-connector_info.adb
@@ -0,0 +1,136 @@
+--
+-- Copyright (C) 2015-2016 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; version 2 of the License.
+--
+-- 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.
+--
+
+with HW.GFX.I2C;
+with HW.GFX.GMA.Config;
+with HW.GFX.GMA.Panel;
+with HW.GFX.GMA.I2C;
+with HW.GFX.GMA.DP_Info;
+with HW.GFX.GMA.DP_Aux_Ch;
+
+with HW.Debug;
+with GNAT.Source_Info;
+
+package body HW.GFX.GMA.Connector_Info is
+
+   function To_DP (Port_Cfg : Port_Config) return DP_Port
+   is
+   begin
+      return
+        (if Port_Cfg.Port = DIGI_A then
+            DP_A
+         else
+           (case Port_Cfg.PCH_Port is
+               when PCH_DP_B  => DP_B,
+               when PCH_DP_C  => DP_C,
+               when PCH_DP_D  => DP_D,
+               when others    => DP_Port'First));
+   end To_DP;
+
+   ----------------------------------------------------------------------------
+
+   procedure Read_EDID
+     (Raw_EDID    :    out EDID.Raw_EDID_Data;
+      Port_Cfg    : in     Port_Config;
+      Success     :    out Boolean)
+   is
+      Raw_EDID_Length : GFX.I2C.Transfer_Length := Raw_EDID'Length;
+   begin
+      pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
+
+      for I in 1 .. 2 loop
+         if Port_Cfg.Display = DP then
+            DP_Aux_Ch.I2C_Read
+              (Port     => To_DP (Port_Cfg),
+               Address  => 16#50#,
+               Length   => Raw_EDID_Length,
+               Data     => Raw_EDID,
+               Success  => Success);
+         else
+            I2C.I2C_Read
+              (Port     => Port_Cfg.PCH_Port,
+               Address  => 16#50#,
+               Length   => Raw_EDID_Length,
+               Data     => Raw_EDID,
+               Success  => Success);
+         end if;
+         exit when not Success;  -- don't retry if reading itself failed
+
+         pragma Debug (Debug.Put_Buffer ("EDID", Raw_EDID, Raw_EDID_Length));
+         Success := EDID.Valid (Raw_EDID);
+         exit when Success;
+      end loop;
+   end Read_EDID;
+
+   ----------------------------------------------------------------------------
+
+   procedure Preferred_Link_Setting
+     (Port_Cfg    : in out Port_Config;
+      Success     :    out Boolean) is
+   begin
+      pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
+
+      if Port_Cfg.Display = DP then
+         if Port_Cfg.Port = DIGI_A then
+            if GMA.Config.Use_PP_VDD_Override then
+               Panel.VDD_Override;
+            else
+               Panel.On;
+            end if;
+         end if;
+
+         DP_Info.Read_Caps
+           (Link     => Port_Cfg.DP,
+            Port     => To_DP (Port_Cfg),
+            Success  => Success);
+         if Success then
+            DP_Info.Preferred_Link_Setting
+              (Link     => Port_Cfg.DP,
+               Mode     => Port_Cfg.Mode,
+               Success  => Success);
+         end if;
+      else
+         Success := True;
+      end if;
+   end Preferred_Link_Setting;
+
+   procedure Next_Link_Setting
+     (Port_Cfg : in out Port_Config;
+      Success  :    out Boolean)
+   is
+   begin
+      pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
+
+      if Port_Cfg.Display = DP then
+         DP_Info.Next_Link_Setting
+           (Link     => Port_Cfg.DP,
+            Mode     => Port_Cfg.Mode,
+            Success  => Success);
+      else
+         Success := False;
+      end if;
+   end Next_Link_Setting;
+
+   ----------------------------------------------------------------------------
+
+   function Default_BPC (Port_Cfg : Port_Config) return HW.GFX.BPC_Type
+   is
+   begin
+      return
+        (if Port_Cfg.Port = DIGI_A or
+            (Port_Cfg.Is_FDI and Port_Cfg.PCH_Port = PCH_LVDS)
+         then 6
+         else 8);
+   end Default_BPC;
+
+end HW.GFX.GMA.Connector_Info;