--
-- 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;
      Update   : Boolean := False);

   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_KEYVAL      : Registers.Registers_Index;
         PLANE_KEYMSK      : 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_KEYVAL    : Registers.Registers_Index;
         PLANE_2_KEYMSK    : 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_KEYVAL      => Registers.PLANE_KEYVAL_1_A,
         PLANE_KEYMSK      => Registers.PLANE_KEYMSK_1_A,
         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_KEYVAL    => Registers.PLANE_KEYVAL_2_A,
         PLANE_2_KEYMSK    => Registers.PLANE_KEYMSK_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_KEYVAL      => Registers.PLANE_KEYVAL_1_B,
         PLANE_KEYMSK      => Registers.PLANE_KEYMSK_1_B,
         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_KEYVAL    => Registers.PLANE_KEYVAL_2_B,
         PLANE_2_KEYMSK    => Registers.PLANE_KEYMSK_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_KEYVAL      => Registers.PLANE_KEYVAL_1_C,
         PLANE_KEYMSK      => Registers.PLANE_KEYMSK_1_C,
         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_KEYVAL    => Registers.PLANE_KEYVAL_2_C,
         PLANE_2_KEYMSK    => Registers.PLANE_KEYMSK_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;
