--
-- Copyright (C) 2017, 2019 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_Y_Trans_EDP : constant Buf_Trans_Array :=
     (16#0000_0018#, 16#0000_00a8#,
      16#0000_4013#, 16#0000_00ab#,
      16#0000_7011#, 16#0000_00a4#,
      16#0000_9010#, 16#0000_00df#,
      16#0000_0018#, 16#0000_00aa#,
      16#0000_6013#, 16#0000_00a4#,
      16#0000_7011#, 16#0000_009d#,
      16#0000_0018#, 16#0000_00a0#,
      16#0000_6012#, 16#0000_00df#,
      16#0000_0018#, 16#0000_008a#);

   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_Y_Trans_DP : constant Buf_Trans_Array :=
     (16#0000_0018#, 16#0000_00a2#,
      16#0000_5012#, 16#0000_0088#,
      16#8000_7011#, 16#0000_00cd#,
      16#8000_9010#, 16#0000_00c0#,
      16#0000_0018#, 16#0000_009d#,
      16#8000_5012#, 16#0000_00c0#,
      16#8000_7011#, 16#0000_00c0#,
      16#0000_0018#, 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#));

   Skylake_Y_Trans_HDMI : constant HDMI_Buf_Trans_Array :=
     ((16#0000_0018#, 16#0000_00a1#),
      (16#0000_5012#, 16#0000_00df#),
      (16#8000_7011#, 16#0000_00cb#),
      (16#0000_0018#, 16#0000_00a4#),
      (16#0000_0018#, 16#0000_009d#),
      (16#0000_4013#, 16#0000_0080#),
      (16#8000_6013#, 16#0000_00c0#),
      (16#0000_0018#, 16#0000_008a#),
      (16#8000_3015#, 16#0000_00c0#),
      (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 Config.Is_ULX then
           (if DDIA_Low_Voltage_Swing
            then Skylake_Y_Trans_EDP
            else Skylake_Y_Trans_DP)
         elsif Config.Is_ULT then
           (if DDIA_Low_Voltage_Swing
            then Skylake_U_Trans_EDP
            else Skylake_U_Trans_DP)
         else
           (if DDIA_Low_Voltage_Swing
            then Skylake_Trans_EDP
            else Skylake_Trans_DP));
      if not DDIA_Low_Voltage_Swing then
         if Config.Is_ULX then
            Trans (18) := Skylake_Y_Trans_HDMI (HDMI_Trans).Trans1;
            Trans (19) := Skylake_Y_Trans_HDMI (HDMI_Trans).Trans2;
         else
            Trans (18) := Skylake_Trans_HDMI (HDMI_Trans).Trans1;
            Trans (19) := Skylake_Trans_HDMI (HDMI_Trans).Trans2;
         end if;
      end if;
   end Translations;

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