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

with HW.GFX.GMA.Config;

package body HW.GFX.GMA.Connectors.DDI.Buffers
is

   subtype Skylake_HDMI_Range is DDI_HDMI_Buf_Trans_Range range 0 .. 10;

   type HDMI_Buf_Trans is record
      Trans1 : Word32;
      Trans2 : Word32;
   end record;
   type HDMI_Buf_Trans_Array is array (Skylake_HDMI_Range) of HDMI_Buf_Trans;

   ----------------------------------------------------------------------------

   Skylake_Trans_EDP : constant Buf_Trans_Array :=
     (16#0000_0018#, 16#0000_00a8#,
      16#0000_4013#, 16#0000_00a9#,
      16#0000_7011#, 16#0000_00a2#,
      16#0000_9010#, 16#0000_009c#,
      16#0000_0018#, 16#0000_00a9#,
      16#0000_6013#, 16#0000_00a2#,
      16#0000_7011#, 16#0000_00a6#,
      16#0000_0018#, 16#0000_00ab#,
      16#0000_7013#, 16#0000_009f#,
      16#0000_0018#, 16#0000_00df#);

   Skylake_U_Trans_EDP : constant Buf_Trans_Array :=
     (16#0000_0018#, 16#0000_00a8#,
      16#0000_4013#, 16#0000_00a9#,
      16#0000_7011#, 16#0000_00a2#,
      16#0000_9010#, 16#0000_009c#,
      16#0000_0018#, 16#0000_00a9#,
      16#0000_6013#, 16#0000_00a2#,
      16#0000_7011#, 16#0000_00a6#,
      16#0000_2016#, 16#0000_00ab#,
      16#0000_5013#, 16#0000_009f#,
      16#0000_0018#, 16#0000_00df#);

   Skylake_Trans_DP : constant Buf_Trans_Array :=
     (16#0000_2016#, 16#0000_00a0#,
      16#0000_5012#, 16#0000_009b#,
      16#0000_7011#, 16#0000_0088#,
      16#8000_9010#, 16#0000_00c0#,
      16#0000_2016#, 16#0000_009b#,
      16#0000_5012#, 16#0000_0088#,
      16#8000_7011#, 16#0000_00c0#,
      16#0000_2016#, 16#0000_00df#,
      16#8000_5012#, 16#0000_00c0#,
      others => 0);

   Skylake_U_Trans_DP : constant Buf_Trans_Array :=
     (16#0000_201b#, 16#0000_00a2#,
      16#0000_5012#, 16#0000_0088#,
      16#8000_7011#, 16#0000_00cd#,
      16#8000_9010#, 16#0000_00c0#,
      16#0000_201b#, 16#0000_009d#,
      16#8000_5012#, 16#0000_00c0#,
      16#8000_7011#, 16#0000_00c0#,
      16#0000_2016#, 16#0000_0088#,
      16#8000_5012#, 16#0000_00c0#,
      others => 0);

   Skylake_Trans_HDMI : constant HDMI_Buf_Trans_Array :=
     ((16#0000_0018#, 16#0000_00ac#),
      (16#0000_5012#, 16#0000_009d#),
      (16#0000_7011#, 16#0000_0088#),
      (16#0000_0018#, 16#0000_00a1#),
      (16#0000_0018#, 16#0000_0098#),
      (16#0000_4013#, 16#0000_0088#),
      (16#8000_6012#, 16#0000_00cd#),
      (16#0000_0018#, 16#0000_00df#),
      (16#8000_3015#, 16#0000_00cd#),
      (16#8000_3015#, 16#0000_00c0#),
      (16#8000_0018#, 16#0000_00c0#));

   ----------------------------------------------------------------------------

   procedure Translations (Trans : out Buf_Trans_Array; Port : Digital_Port)
   is
      DDIA_Low_Voltage_Swing : constant Boolean :=
         Config.EDP_Low_Voltage_Swing and then Port = DIGI_A;

      HDMI_Trans : constant Skylake_HDMI_Range :=
        (if Config.DDI_HDMI_Buffer_Translation in Skylake_HDMI_Range
         then Config.DDI_HDMI_Buffer_Translation
         else Config.Default_DDI_HDMI_Buffer_Translation);
   begin
      Trans :=
        (if not Config.Is_ULT then
           (if DDIA_Low_Voltage_Swing
            then Skylake_Trans_EDP
            else Skylake_Trans_DP)
         else
           (if DDIA_Low_Voltage_Swing
            then Skylake_U_Trans_EDP
            else Skylake_U_Trans_DP));
      if not DDIA_Low_Voltage_Swing then
         Trans (18) := Skylake_Trans_HDMI (HDMI_Trans).Trans1;
         Trans (19) := Skylake_Trans_HDMI (HDMI_Trans).Trans2;
      end if;
   end Translations;

end HW.GFX.GMA.Connectors.DDI.Buffers;
