--
-- Copyright (C) 2015-2016 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.Config_Helpers;
with HW.GFX.GMA.Registers;


private package HW.GFX.GMA.Pipe_Setup
is

   procedure On
     (Pipe        : Pipe_Index;
      Pipe_Cfg    : Pipe_Config;
      Port_Cfg    : Port_Config)
   with
      Pre => Config_Helpers.Valid_FB (Pipe_Cfg.Framebuffer, Port_Cfg.Mode);

   procedure Off (Pipe : Pipe_Index);

   procedure Legacy_VGA_Off;

   procedure All_Off;

   -- TODO: Passing `Pipe_Cfg` and `Mode` seems redundant. However,
   --       the `Pipe_Cfg.Mode` is what the user requested and we
   --       may have altered that in `Mode`. This should be refac-
   --       tored to always have a single, synchronized `Mode`.
   procedure Setup_FB
     (Pipe        : Pipe_Index;
      Pipe_Cfg    : Pipe_Config;
      Mode        : Mode_Type)
   with
      Pre => Config_Helpers.Valid_FB (Pipe_Cfg.Framebuffer, Mode);

   procedure Update_Cursor
     (Pipe     : Pipe_Index;
      FB       : Framebuffer_Type;
      Cursor   : Cursor_Type);
   procedure Place_Cursor
     (Pipe     : Pipe_Index;
      FB       : Framebuffer_Type;
      Cursor   : Cursor_Type;
      Center   : Cursor_Coord);

   type Scaler_Reservation is private;
   Null_Scaler_Reservation : constant Scaler_Reservation;
   procedure Reserve_Scaler
     (Success     :    out Boolean;
      Reservation : in out Scaler_Reservation;
      Pipe        : in     Pipe_Index);

private

   type Scaler_Reservation is record
      Reserved : Boolean;
      Pipe     : Pipe_Index;
   end record;
   Null_Scaler_Reservation : constant Scaler_Reservation :=
     (Reserved => False, Pipe => Pipe_Index'First);

   subtype WM_Levels is Natural range 0 .. 7;
   type PLANE_WM_Type is array (WM_Levels) of Registers.Registers_Index;

   type Controller_Type is
      record
         Pipe              : Pipe_Index;
         PIPESRC           : Registers.Registers_Index;
         PIPEMISC          : Registers.Registers_Index;
         PF_CTRL           : Registers.Registers_Index;
         PF_WIN_POS        : Registers.Registers_Index;
         PF_WIN_SZ         : Registers.Registers_Index;
         DSPCNTR           : Registers.Registers_Index;
         DSPLINOFF         : Registers.Registers_Index;
         DSPSTRIDE         : Registers.Registers_Index;
         DSPSURF           : Registers.Registers_Index;
         DSPTILEOFF        : Registers.Registers_Index;
         DSPSIZE           : Registers.Registers_Index;
         DSPPOS            : Registers.Registers_Index;
         -- Skylake registers (partially aliased)
         PLANE_CTL         : Registers.Registers_Index;
         PLANE_OFFSET      : Registers.Registers_Index;
         PLANE_POS         : Registers.Registers_Index;
         PLANE_SIZE        : Registers.Registers_Index;
         PLANE_STRIDE      : Registers.Registers_Index;
         PLANE_SURF        : Registers.Registers_Index;
         PS_CTRL_1         : Registers.Registers_Index;
         PS_WIN_POS_1      : Registers.Registers_Index;
         PS_WIN_SZ_1       : Registers.Registers_Index;
         PS_CTRL_2         : Registers.Registers_Invalid_Index;
         PS_WIN_SZ_2       : Registers.Registers_Invalid_Index;
         WM_LINETIME       : Registers.Registers_Index;
         PLANE_BUF_CFG     : Registers.Registers_Index;
         PLANE_COLOR_CTL   : Registers.Registers_Index;
         PLANE_WM          : PLANE_WM_Type;
         PLANE_2_CTL       : Registers.Registers_Index;
         PLANE_2_OFFSET    : Registers.Registers_Index;
         PLANE_2_POS       : Registers.Registers_Index;
         PLANE_2_SIZE      : Registers.Registers_Index;
         PLANE_2_STRIDE    : Registers.Registers_Index;
         PLANE_2_SURF      : Registers.Registers_Index;
         PLANE_2_BUF_CFG   : Registers.Registers_Index;
         PLANE_2_COLOR_CTL : Registers.Registers_Index;
         PLANE_2_WM        : PLANE_WM_Type;
         CUR_BUF_CFG       : Registers.Registers_Index;
         CUR_WM            : PLANE_WM_Type;
         MBUS_DBOX_CTL     : Registers.Registers_Index;
         PIPE_CHICKEN      : Registers.Registers_Index;
         PLANE_AUX_DIST    : Registers.Registers_Index;
      end record;

   type Controller_Array is array (Pipe_Index) of Controller_Type;

   --  On Gen3 (i945), FBC only works with Plane A, but LVDS and the
   --  panel fitter are hooked to Pipe B. Hence we want Plane A feeding
   --  Pipe B, which means swapping the plane register assignments:
   --  Primary (Pipe A) gets Plane B, Secondary (Pipe B) gets Plane A.

   Controllers : constant Controller_Array :=
     (Primary => Controller_Type'
        (Pipe              => Primary,
         PIPESRC           => Registers.PIPEASRC,
         PIPEMISC          => Registers.PIPEAMISC,
         PF_CTRL           => Registers.PFA_CTL_1,
         PF_WIN_POS        => Registers.PFA_WIN_POS,
         PF_WIN_SZ         => Registers.PFA_WIN_SZ,
         DSPCNTR           =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPBCNTR else Registers.DSPACNTR),
         DSPLINOFF         =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPBLINOFF else Registers.DSPALINOFF),
         DSPSTRIDE         =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPBSTRIDE else Registers.DSPASTRIDE),
         DSPSURF           =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPBSURF else Registers.DSPASURF),
         DSPTILEOFF        =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPBTILEOFF else Registers.DSPATILEOFF),
         DSPSIZE           =>
           (if Config.Planes_Pipes_Swapped
            then Registers.PLANE_SIZE_1_B else Registers.PLANE_SIZE_1_A),
         DSPPOS            =>
           (if Config.Planes_Pipes_Swapped
            then Registers.PLANE_POS_1_B else Registers.PLANE_POS_1_A),
         PLANE_CTL         => Registers.DSPACNTR,
         PLANE_OFFSET      => Registers.DSPATILEOFF,
         PLANE_POS         => Registers.PLANE_POS_1_A,
         PLANE_SIZE        => Registers.PLANE_SIZE_1_A,
         PLANE_STRIDE      => Registers.DSPASTRIDE,
         PLANE_SURF        => Registers.DSPASURF,
         PS_CTRL_1         => Registers.PS_CTRL_1_A,
         PS_WIN_POS_1      => Registers.PS_WIN_POS_1_A,
         PS_WIN_SZ_1       => Registers.PS_WIN_SZ_1_A,
         PS_CTRL_2         => Registers.PS_CTRL_2_A,
         PS_WIN_SZ_2       => Registers.PS_WIN_SZ_2_A,
         WM_LINETIME       => Registers.WM_LINETIME_A,
         PLANE_BUF_CFG     => Registers.PLANE_BUF_CFG_1_A,
         PLANE_COLOR_CTL   => Registers.PLANE_COLOR_CTL_1_A,
         PLANE_WM          => PLANE_WM_Type'(
                              Registers.PLANE_WM_1_A_0,
                              Registers.PLANE_WM_1_A_1,
                              Registers.PLANE_WM_1_A_2,
                              Registers.PLANE_WM_1_A_3,
                              Registers.PLANE_WM_1_A_4,
                              Registers.PLANE_WM_1_A_5,
                              Registers.PLANE_WM_1_A_6,
                              Registers.PLANE_WM_1_A_7),
         PLANE_2_CTL       => Registers.PLANE_CTL_2_A,
         PLANE_2_OFFSET    => Registers.PLANE_OFFSET_2_A,
         PLANE_2_POS       => Registers.PLANE_POS_2_A,
         PLANE_2_SIZE      => Registers.PLANE_SIZE_2_A,
         PLANE_2_STRIDE    => Registers.PLANE_STRIDE_2_A,
         PLANE_2_SURF      => Registers.PLANE_SURF_2_A,
         PLANE_2_BUF_CFG   => Registers.PLANE_BUF_CFG_2_A,
         PLANE_2_COLOR_CTL => Registers.PLANE_COLOR_CTL_2_A,
         PLANE_2_WM        => PLANE_WM_Type'(
                              Registers.PLANE_WM_2_A_0,
                              Registers.PLANE_WM_2_A_1,
                              Registers.PLANE_WM_2_A_2,
                              Registers.PLANE_WM_2_A_3,
                              Registers.PLANE_WM_2_A_4,
                              Registers.PLANE_WM_2_A_5,
                              Registers.PLANE_WM_2_A_6,
                              Registers.PLANE_WM_2_A_7),
         CUR_BUF_CFG       => Registers.CUR_BUF_CFG_A,
         CUR_WM            => PLANE_WM_Type'(
                              Registers.CUR_WM_A_0,
                              Registers.CUR_WM_A_1,
                              Registers.CUR_WM_A_2,
                              Registers.CUR_WM_A_3,
                              Registers.CUR_WM_A_4,
                              Registers.CUR_WM_A_5,
                              Registers.CUR_WM_A_6,
                              Registers.CUR_WM_A_7),
         MBUS_DBOX_CTL     => Registers.PIPE_MBUS_DBOX_CTL_A,
         PIPE_CHICKEN      => Registers.PIPEA_CHICKEN,
         PLANE_AUX_DIST    => Registers.PLANE_AUX_DIST_1_A),
      Secondary => Controller_Type'
        (Pipe              => Secondary,
         PIPESRC           => Registers.PIPEBSRC,
         PIPEMISC          => Registers.PIPEBMISC,
         PF_CTRL           => Registers.PFB_CTL_1,
         PF_WIN_POS        => Registers.PFB_WIN_POS,
         PF_WIN_SZ         => Registers.PFB_WIN_SZ,
         DSPCNTR           =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPACNTR else Registers.DSPBCNTR),
         DSPLINOFF         =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPALINOFF else Registers.DSPBLINOFF),
         DSPSTRIDE         =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPASTRIDE else Registers.DSPBSTRIDE),
         DSPSURF           =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPASURF else Registers.DSPBSURF),
         DSPTILEOFF        =>
           (if Config.Planes_Pipes_Swapped
            then Registers.DSPATILEOFF else Registers.DSPBTILEOFF),
         DSPSIZE           =>
           (if Config.Planes_Pipes_Swapped
            then Registers.PLANE_SIZE_1_A else Registers.PLANE_SIZE_1_B),
         DSPPOS            =>
           (if Config.Planes_Pipes_Swapped
            then Registers.PLANE_POS_1_A else Registers.PLANE_POS_1_B),
         PLANE_CTL         => Registers.DSPBCNTR,
         PLANE_OFFSET      => Registers.DSPBTILEOFF,
         PLANE_POS         => Registers.PLANE_POS_1_B,
         PLANE_SIZE        => Registers.PLANE_SIZE_1_B,
         PLANE_STRIDE      => Registers.DSPBSTRIDE,
         PLANE_SURF        => Registers.DSPBSURF,
         PS_CTRL_1         => Registers.PS_CTRL_1_B,
         PS_WIN_POS_1      => Registers.PS_WIN_POS_1_B,
         PS_WIN_SZ_1       => Registers.PS_WIN_SZ_1_B,
         PS_CTRL_2         => Registers.PS_CTRL_2_B,
         PS_WIN_SZ_2       => Registers.PS_WIN_SZ_2_B,
         WM_LINETIME       => Registers.WM_LINETIME_B,
         PLANE_BUF_CFG     => Registers.PLANE_BUF_CFG_1_B,
         PLANE_COLOR_CTL   => Registers.PLANE_COLOR_CTL_1_B,
         PLANE_WM          => PLANE_WM_Type'(
                              Registers.PLANE_WM_1_B_0,
                              Registers.PLANE_WM_1_B_1,
                              Registers.PLANE_WM_1_B_2,
                              Registers.PLANE_WM_1_B_3,
                              Registers.PLANE_WM_1_B_4,
                              Registers.PLANE_WM_1_B_5,
                              Registers.PLANE_WM_1_B_6,
                              Registers.PLANE_WM_1_B_7),
         PLANE_2_CTL       => Registers.PLANE_CTL_2_B,
         PLANE_2_OFFSET    => Registers.PLANE_OFFSET_2_B,
         PLANE_2_POS       => Registers.PLANE_POS_2_B,
         PLANE_2_SIZE      => Registers.PLANE_SIZE_2_B,
         PLANE_2_STRIDE    => Registers.PLANE_STRIDE_2_B,
         PLANE_2_SURF      => Registers.PLANE_SURF_2_B,
         PLANE_2_BUF_CFG   => Registers.PLANE_BUF_CFG_2_B,
         PLANE_2_COLOR_CTL => Registers.PLANE_COLOR_CTL_2_B,
         PLANE_2_WM        => PLANE_WM_Type'(
                              Registers.PLANE_WM_2_B_0,
                              Registers.PLANE_WM_2_B_1,
                              Registers.PLANE_WM_2_B_2,
                              Registers.PLANE_WM_2_B_3,
                              Registers.PLANE_WM_2_B_4,
                              Registers.PLANE_WM_2_B_5,
                              Registers.PLANE_WM_2_B_6,
                              Registers.PLANE_WM_2_B_7),
         CUR_BUF_CFG       => Registers.CUR_BUF_CFG_B,
         CUR_WM            => PLANE_WM_Type'(
                              Registers.CUR_WM_B_0,
                              Registers.CUR_WM_B_1,
                              Registers.CUR_WM_B_2,
                              Registers.CUR_WM_B_3,
                              Registers.CUR_WM_B_4,
                              Registers.CUR_WM_B_5,
                              Registers.CUR_WM_B_6,
                              Registers.CUR_WM_B_7),
         MBUS_DBOX_CTL     => Registers.PIPE_MBUS_DBOX_CTL_B,
         PIPE_CHICKEN      => Registers.PIPEB_CHICKEN,
         PLANE_AUX_DIST    => Registers.PLANE_AUX_DIST_1_B),
      Tertiary => Controller_Type'
        (Pipe              => Tertiary,
         PIPESRC           => Registers.PIPECSRC,
         PIPEMISC          => Registers.PIPECMISC,
         PF_CTRL           => Registers.PFC_CTL_1,
         PF_WIN_POS        => Registers.PFC_WIN_POS,
         PF_WIN_SZ         => Registers.PFC_WIN_SZ,
         DSPCNTR           => Registers.DSPCCNTR,
         DSPLINOFF         => Registers.DSPCLINOFF,
         DSPSTRIDE         => Registers.DSPCSTRIDE,
         DSPSURF           => Registers.DSPCSURF,
         DSPTILEOFF        => Registers.DSPCTILEOFF,
         DSPSIZE           => Registers.PLANE_SIZE_1_C,
         DSPPOS            => Registers.PLANE_POS_1_C,
         PLANE_CTL         => Registers.DSPCCNTR,
         PLANE_OFFSET      => Registers.DSPCTILEOFF,
         PLANE_POS         => Registers.PLANE_POS_1_C,
         PLANE_SIZE        => Registers.PLANE_SIZE_1_C,
         PLANE_STRIDE      => Registers.DSPCSTRIDE,
         PLANE_SURF        => Registers.DSPCSURF,
         PS_CTRL_1         => Registers.PS_CTRL_1_C,
         PS_WIN_POS_1      => Registers.PS_WIN_POS_1_C,
         PS_WIN_SZ_1       => Registers.PS_WIN_SZ_1_C,
         PS_CTRL_2         => Registers.Invalid_Register,
         PS_WIN_SZ_2       => Registers.Invalid_Register,
         WM_LINETIME       => Registers.WM_LINETIME_C,
         PLANE_BUF_CFG     => Registers.PLANE_BUF_CFG_1_C,
         PLANE_COLOR_CTL   => Registers.PLANE_COLOR_CTL_1_C,
         PLANE_WM          => PLANE_WM_Type'(
                              Registers.PLANE_WM_1_C_0,
                              Registers.PLANE_WM_1_C_1,
                              Registers.PLANE_WM_1_C_2,
                              Registers.PLANE_WM_1_C_3,
                              Registers.PLANE_WM_1_C_4,
                              Registers.PLANE_WM_1_C_5,
                              Registers.PLANE_WM_1_C_6,
                              Registers.PLANE_WM_1_C_7),
         PLANE_2_CTL       => Registers.PLANE_CTL_2_C,
         PLANE_2_OFFSET    => Registers.PLANE_OFFSET_2_C,
         PLANE_2_POS       => Registers.PLANE_POS_2_C,
         PLANE_2_SIZE      => Registers.PLANE_SIZE_2_C,
         PLANE_2_STRIDE    => Registers.PLANE_STRIDE_2_C,
         PLANE_2_SURF      => Registers.PLANE_SURF_2_C,
         PLANE_2_BUF_CFG   => Registers.PLANE_BUF_CFG_2_C,
         PLANE_2_COLOR_CTL => Registers.PLANE_COLOR_CTL_2_C,
         PLANE_2_WM        => PLANE_WM_Type'(
                              Registers.PLANE_WM_2_C_0,
                              Registers.PLANE_WM_2_C_1,
                              Registers.PLANE_WM_2_C_2,
                              Registers.PLANE_WM_2_C_3,
                              Registers.PLANE_WM_2_C_4,
                              Registers.PLANE_WM_2_C_5,
                              Registers.PLANE_WM_2_C_6,
                              Registers.PLANE_WM_2_C_7),
         CUR_BUF_CFG       => Registers.CUR_BUF_CFG_C,
         CUR_WM            => PLANE_WM_Type'(
                              Registers.CUR_WM_C_0,
                              Registers.CUR_WM_C_1,
                              Registers.CUR_WM_C_2,
                              Registers.CUR_WM_C_3,
                              Registers.CUR_WM_C_4,
                              Registers.CUR_WM_C_5,
                              Registers.CUR_WM_C_6,
                              Registers.CUR_WM_C_7),
         MBUS_DBOX_CTL     => Registers.PIPE_MBUS_DBOX_CTL_C,
         PIPE_CHICKEN      => Registers.PIPEC_CHICKEN,
         PLANE_AUX_DIST    => Registers.PLANE_AUX_DIST_1_C));

   type Cursor_Regs is record
      CTL      : Registers.Registers_Index;
      BASE     : Registers.Registers_Index;
      POS      : Registers.Registers_Index;
      FBC_CTL  : Registers.Registers_Invalid_Index;
   end record;

   function Cursors (Pipe : Pipe_Index) return Cursor_Regs is
     (if not Config.Has_Ivybridge_Cursors then
        (if Pipe = Primary then
           (CTL      => Registers.CURACNTR,
            BASE     => Registers.CURABASE,
            POS      => Registers.CURAPOS,
            FBC_CTL  => Registers.Invalid_Register)
         else
           (CTL      => Registers.CURBCNTR,
            BASE     => Registers.CURBBASE,
            POS      => Registers.CURBPOS,
            FBC_CTL  => Registers.Invalid_Register))
      else
        (if Pipe = Primary then
           (CTL      => Registers.CUR_CTL_A,
            BASE     => Registers.CUR_BASE_A,
            POS      => Registers.CUR_POS_A,
            FBC_CTL  => Registers.CUR_FBC_CTL_A)
         elsif Pipe = Secondary then
           (CTL      => Registers.CUR_CTL_B,
            BASE     => Registers.CUR_BASE_B,
            POS      => Registers.CUR_POS_B,
            FBC_CTL  => Registers.CUR_FBC_CTL_B)
         else
           (CTL      => Registers.CUR_CTL_C,
            BASE     => Registers.CUR_BASE_C,
            POS      => Registers.CUR_POS_C,
            FBC_CTL  => Registers.CUR_FBC_CTL_C)));

end HW.GFX.GMA.Pipe_Setup;
