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

private generic

   type T (<>) is limited private;

   with package Aux_Ch is new DP_Aux_Ch (T => T, others => <>);

package HW.GFX.DP_Info is

   type DP_Voltage_Swing is (VS_Level_0, VS_Level_1, VS_Level_2, VS_Level_3);

   type DP_Pre_Emph is (Emph_Level_0, Emph_Level_1, Emph_Level_2, Emph_Level_3);

   type Train_Set is record
      Voltage_Swing  : DP_Voltage_Swing;
      Pre_Emph       : DP_Pre_Emph;
   end record;

   type Training_Pattern is (TP_1, TP_2, TP_3, TP_Idle, TP_None);

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

   type Lane_Index is new Natural range 0 .. 3;

   type Lane_Status is record
      CR_Done           : Boolean;
      Channel_EQ_Done   : Boolean;
      Symbol_Locked     : Boolean;
      Reserved          : Boolean;
   end record;
   for Lane_Status use record
      CR_Done           at 16#00# range 0 .. 0;
      Channel_EQ_Done   at 16#00# range 1 .. 1;
      Symbol_Locked     at 16#00# range 2 .. 2;
      Reserved          at 16#00# range 3 .. 3;
   end record;
   type Lanes_Status is array (Lane_Index) of Lane_Status;
   pragma Pack (Lanes_Status);

   type Adjust_Request is record
      Voltage_Swing  : DP_Voltage_Swing;
      Pre_Emph       : DP_Pre_Emph;
   end record;
   for Adjust_Request use record
      Voltage_Swing  at 16#00# range 0 .. 1;
      Pre_Emph       at 16#00# range 2 .. 3;
   end record;
   type Adjust_Requests_Array is array (Lane_Index) of Adjust_Request;
   pragma Pack (Adjust_Requests_Array);

   type Link_Status is record
      Lanes                : Lanes_Status;
      Interlane_Align_Done : Boolean;
      Adjust_Requests      : Adjust_Requests_Array;
   end record;
   for Link_Status use record
      Lanes                at 16#00# range 0 .. 15;
      Interlane_Align_Done at 16#02# range 0 ..  0;
      Adjust_Requests      at 16#04# range 0 .. 15;
   end record;

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

   procedure Read_Caps
     (Link     : in out DP_Link;
      Port     : in     T;
      Success  :    out Boolean);

   procedure Read_eDP_Rates
     (Link     : in out DP_Link;
      Port     : in     T);

   procedure Preferred_Link_Setting
     (Link        : in out DP_Link;
      Mode        : in     Mode_Type;
      Success     :    out Boolean);

   procedure Next_Link_Setting
     (Link        : in out DP_Link;
      Mode        : in     Mode_Type;
      Success     :    out Boolean);

   pragma Warnings
     (GNATprove, Off, "subprogram ""Dump_Link_Setting"" has no effect",
      Reason => "It's only used for debugging");
   procedure Dump_Link_Setting (Link : DP_Link);

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

   M_N_Max : constant := 2 ** 24 - 1;

   subtype M_Type is Int64 range 0 .. M_N_Max;
   subtype N_Type is Int64 range 0 .. M_N_Max;

   procedure Calculate_M_N
     (Link     : in     DP_Link;
      Mode     : in     Mode_Type;
      Data_M   :    out M_Type;
      Data_N   :    out N_Type;
      Link_M   :    out M_Type;
      Link_N   :    out N_Type);

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

   procedure Read_Link_Status
     (Port     : in     T;
      Status   :    out Link_Status;
      Success  :    out Boolean);

   function All_CR_Done
     (Status   : Link_Status;
      Link     : DP_Link)
      return Boolean;

   function All_EQ_Done
     (Status   : Link_Status;
      Link     : DP_Link)
      return Boolean;

   function Max_Requested_VS
     (Status   : Link_Status;
      Link     : DP_Link)
      return DP_Voltage_Swing;

   function Max_Requested_Emph
     (Status   : Link_Status;
      Link     : DP_Link)
      return DP_Pre_Emph;

end HW.GFX.DP_Info;
