--
-- 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 Haswell_HDMI_Range is DDI_HDMI_Buf_Trans_Range range 0 .. 11;
   subtype Broadwell_HDMI_Range is DDI_HDMI_Buf_Trans_Range range 0 .. 9;

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

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

   Haswell_Trans_DP : constant Buf_Trans_Array :=
     (16#00ff_ffff#, 16#0006_000e#,
      16#00d7_5fff#, 16#0005_000a#,
      16#00c3_0fff#, 16#0004_0006#,
      16#80aa_afff#, 16#000b_0000#,
      16#00ff_ffff#, 16#0005_000a#,
      16#00d7_5fff#, 16#000c_0004#,
      16#80c3_0fff#, 16#000b_0000#,
      16#00ff_ffff#, 16#0004_0006#,
      16#80d7_5fff#, 16#000b_0000#,
      others => 0);

   Haswell_Trans_FDI : constant Buf_Trans_Array :=
     (16#00ff_ffff#, 16#0007_000e#,
      16#00d7_5fff#, 16#000f_000a#,
      16#00c3_0fff#, 16#0006_0006#,
      16#00aa_afff#, 16#001e_0000#,
      16#00ff_ffff#, 16#000f_000a#,
      16#00d7_5fff#, 16#0016_0004#,
      16#00c3_0fff#, 16#001e_0000#,
      16#00ff_ffff#, 16#0006_0006#,
      16#00d7_5fff#, 16#001e_0000#,
      others => 0);

   Haswell_Trans_HDMI : constant HDMI_Buf_Trans_Array :=
     ((16#00ff_ffff#, 16#0006_000e#),
      (16#00e7_9fff#, 16#000e_000c#),
      (16#00d7_5fff#, 16#0005_000a#),
      (16#00ff_ffff#, 16#0005_000a#),
      (16#00e7_9fff#, 16#001d_0007#),
      (16#00d7_5fff#, 16#000c_0004#),
      (16#00ff_ffff#, 16#0004_0006#),
      (16#80e7_9fff#, 16#0003_0002#),
      (16#00ff_ffff#, 16#0014_0005#),
      (16#00ff_ffff#, 16#000c_0004#),
      (16#00ff_ffff#, 16#001c_0003#),
      (16#80ff_ffff#, 16#0003_0002#));

   Broadwell_Trans_EDP : constant Buf_Trans_Array :=
     (16#00ff_ffff#, 16#0000_0012#,
      16#00eb_afff#, 16#0002_0011#,
      16#00c7_1fff#, 16#0006_000f#,
      16#00aa_afff#, 16#000e_000a#,
      16#00ff_ffff#, 16#0002_0011#,
      16#00db_6fff#, 16#0005_000f#,
      16#00be_efff#, 16#000a_000c#,
      16#00ff_ffff#, 16#0005_000f#,
      16#00db_6fff#, 16#000a_000c#,
      others => 0);

   Broadwell_Trans_DP : constant Buf_Trans_Array :=
     (16#00ff_ffff#, 16#0007_000e#,
      16#00d7_5fff#, 16#000e_000a#,
      16#00be_ffff#, 16#0014_0006#,
      16#80b2_cfff#, 16#001b_0002#,
      16#00ff_ffff#, 16#000e_000a#,
      16#00db_6fff#, 16#0016_0005#,
      16#80c7_1fff#, 16#001a_0002#,
      16#00f7_dfff#, 16#0018_0004#,
      16#80d7_5fff#, 16#001b_0002#,
      others => 0);

   Broadwell_Trans_FDI : constant Buf_Trans_Array :=
     (16#00ff_ffff#, 16#0001_000e#,
      16#00d7_5fff#, 16#0004_000a#,
      16#00c3_0fff#, 16#0007_0006#,
      16#00aa_afff#, 16#000c_0000#,
      16#00ff_ffff#, 16#0004_000a#,
      16#00d7_5fff#, 16#0009_0004#,
      16#00c3_0fff#, 16#000c_0000#,
      16#00ff_ffff#, 16#0007_0006#,
      16#00d7_5fff#, 16#000c_0000#,
      others => 0);

   Broadwell_Trans_HDMI : constant HDMI_Buf_Trans_Array :=
     ((16#00ff_ffff#, 16#0007_000e#),
      (16#00d7_5fff#, 16#000e_000a#),
      (16#00be_ffff#, 16#0014_0006#),
      (16#00ff_ffff#, 16#0009_000d#),
      (16#00ff_ffff#, 16#000e_000a#),
      (16#00d7_ffff#, 16#0014_0006#),
      (16#80cb_2fff#, 16#001b_0002#),
      (16#00ff_ffff#, 16#0014_0006#),
      (16#80e7_9fff#, 16#001b_0002#),
      (16#80ff_ffff#, 16#001b_0002#),
      others => (0, 0));

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

   procedure Translations (Trans : out Buf_Trans_Array; Port : Digital_Port)
   is
      HDMI_Trans : constant DDI_HDMI_Buf_Trans_Range :=
        (if Config.Have_HDMI_Buf_Override
         then Config.DDI_HDMI_Buffer_Translation
         else Config.Default_DDI_HDMI_Buffer_Translation);
   begin
      Trans :=
        (case Config.CPU is
            when Broadwell =>
              (case Port is
                  when DIGI_A =>
                    (if Config.EDP_Low_Voltage_Swing
                     then Broadwell_Trans_EDP
                     else Broadwell_Trans_DP),
                  when DIGI_B .. DIGI_D   => Broadwell_Trans_DP,
                  when DIGI_E             => Broadwell_Trans_FDI),
            when others =>
              (case Port is
                  when DIGI_A .. DIGI_D   => Haswell_Trans_DP,
                  when DIGI_E             => Haswell_Trans_FDI));
      case Config.CPU is
         when Broadwell =>
            Trans (18) := Broadwell_Trans_HDMI (HDMI_Trans).Trans1;
            Trans (19) := Broadwell_Trans_HDMI (HDMI_Trans).Trans2;
         when others =>
            Trans (18) := Haswell_Trans_HDMI (HDMI_Trans).Trans1;
            Trans (19) := Haswell_Trans_HDMI (HDMI_Trans).Trans2;
      end case;
   end Translations;

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