--
-- 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
-- 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.
--

with HW.GFX.GMA.Config;
with HW.GFX.GMA.Panel;
with HW.GFX.GMA.DP_Info;

with HW.Debug;
with GNAT.Source_Info;

package body HW.GFX.GMA.Connector_Info is

   procedure Preferred_Link_Setting
     (Port_Cfg    : in out Port_Config;
      Success     :    out Boolean)
   is
      DP_Port : constant GMA.DP_Port :=
        (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    => GMA.DP_Port'First));
   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     => DP_Port,
            Success  => Success);
         if Success then
            DP_Info.Read_eDP_Rates
              (Link     => Port_Cfg.DP,
               Port     => DP_Port);

            DP_Info.Preferred_Link_Setting
              (Link     => Port_Cfg.DP,
               Mode     => Port_Cfg.Mode,
               Success  => Success);
            pragma Debug (Success, DP_Info.Dump_Link_Setting (Port_Cfg.DP));
         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);
         pragma Debug (Success, DP_Info.Dump_Link_Setting (Port_Cfg.DP));
      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) or
           Port_Cfg.Port = LVDS
         then 6
         else 8);
   end Default_BPC;

end HW.GFX.GMA.Connector_Info;
