| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 1 | -- |
| Nico Huber | 247adf3 | 2017-06-12 14:39:11 +0200 | [diff] [blame] | 2 | -- Copyright (C) 2015-2017 secunet Security Networks AG |
| Nico Huber | 194e57e | 2017-07-15 21:15:46 +0200 | [diff] [blame] | 3 | -- Copyright (C) 2017 Nico Huber <nico.h@gmx.de> |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 4 | -- |
| 5 | -- This program is free software; you can redistribute it and/or modify |
| 6 | -- it under the terms of the GNU General Public License as published by |
| Nico Huber | 125a29e | 2016-10-18 00:23:54 +0200 | [diff] [blame] | 7 | -- the Free Software Foundation; either version 2 of the License, or |
| 8 | -- (at your option) any later version. |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 9 | -- |
| 10 | -- This program is distributed in the hope that it will be useful, |
| 11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | -- GNU General Public License for more details. |
| 14 | -- |
| 15 | |
| Nico Huber | 194e57e | 2017-07-15 21:15:46 +0200 | [diff] [blame] | 16 | with HW.Config; |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 17 | with HW.Time; |
| 18 | with HW.Port_IO; |
| 19 | |
| 20 | package HW.GFX.GMA |
| 21 | with |
| 22 | Abstract_State => |
| 23 | (State, |
| 24 | Init_State, |
| 25 | Config_State, |
| 26 | (Device_State with External)), |
| 27 | Initializes => |
| 28 | (Init_State, |
| 29 | Config_State) |
| 30 | is |
| 31 | |
| 32 | type CPU_Type is |
| 33 | (Ironlake, |
| 34 | Sandybridge, |
| 35 | Ivybridge, |
| 36 | Haswell, |
| 37 | Broadwell, |
| Nico Huber | 21da574 | 2017-01-20 14:00:53 +0100 | [diff] [blame] | 38 | Broxton, |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 39 | Skylake); |
| 40 | |
| 41 | type CPU_Variant is (Normal, ULT); |
| 42 | |
| 43 | type Port_Type is |
| 44 | (Disabled, |
| 45 | Internal, |
| 46 | DP1, |
| 47 | DP2, |
| 48 | DP3, |
| Nico Huber | 0d454cd | 2016-11-21 13:33:43 +0100 | [diff] [blame] | 49 | HDMI1, -- or DVI |
| 50 | HDMI2, -- or DVI |
| 51 | HDMI3, -- or DVI |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 52 | Analog); |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 53 | |
| Nico Huber | 99f10f3 | 2016-11-20 00:34:05 +0100 | [diff] [blame] | 54 | type Pipe_Config is record |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 55 | Port : Port_Type; |
| 56 | Framebuffer : Framebuffer_Type; |
| 57 | Mode : Mode_Type; |
| 58 | end record; |
| Nico Huber | 99f10f3 | 2016-11-20 00:34:05 +0100 | [diff] [blame] | 59 | type Pipe_Index is (Primary, Secondary, Tertiary); |
| 60 | type Pipe_Configs is array (Pipe_Index) of Pipe_Config; |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 61 | |
| Nico Huber | 3675db5 | 2016-11-04 16:27:29 +0100 | [diff] [blame] | 62 | -- Special framebuffer offset to indicate legacy VGA plane. |
| 63 | -- Only valid on primary pipe. |
| 64 | VGA_PLANE_FRAMEBUFFER_OFFSET : constant := 16#ffff_ffff#; |
| 65 | |
| Nico Huber | bebca13 | 2017-06-12 23:04:46 +0200 | [diff] [blame] | 66 | pragma Warnings (GNATprove, Off, "unused variable ""Write_Delay""", |
| 67 | Reason => "Write_Delay is used for debugging only"); |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 68 | procedure Initialize |
| Nico Huber | 2b6f699 | 2017-07-09 18:11:34 +0200 | [diff] [blame] | 69 | (Write_Delay : in Word64 := 0; |
| Nico Huber | 793a8d4 | 2016-11-21 18:57:03 +0100 | [diff] [blame] | 70 | Clean_State : in Boolean := False; |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 71 | Success : out Boolean) |
| 72 | with |
| 73 | Global => |
| 74 | (In_Out => (Config_State, Device_State, Port_IO.State), |
| 75 | Output => (State, Init_State), |
| 76 | Input => (Time.State)), |
| 77 | Post => Success = Is_Initialized; |
| 78 | function Is_Initialized return Boolean |
| 79 | with |
| 80 | Global => (Input => Init_State); |
| Nico Huber | bebca13 | 2017-06-12 23:04:46 +0200 | [diff] [blame] | 81 | pragma Warnings (GNATprove, On, "unused variable ""Write_Delay"""); |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 82 | |
| Nico Huber | 42fb2d0 | 2017-09-01 17:01:51 +0200 | [diff] [blame] | 83 | pragma Warnings (GNATprove, Off, "subprogram ""Power_Up_VGA"" has no effect", |
| 84 | Reason => "Effect depends on the platform compiled for"); |
| 85 | procedure Power_Up_VGA |
| 86 | with |
| 87 | Pre => Is_Initialized; |
| 88 | |
| Nico Huber | 99f10f3 | 2016-11-20 00:34:05 +0100 | [diff] [blame] | 89 | procedure Update_Outputs (Configs : Pipe_Configs); |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 90 | |
| 91 | pragma Warnings (GNATprove, Off, "subprogram ""Dump_Configs"" has no effect", |
| 92 | Reason => "It's only used for debugging"); |
| Nico Huber | 99f10f3 | 2016-11-20 00:34:05 +0100 | [diff] [blame] | 93 | procedure Dump_Configs (Configs : Pipe_Configs); |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 94 | |
| Nico Huber | 194e57e | 2017-07-15 21:15:46 +0200 | [diff] [blame] | 95 | GTT_Page_Size : constant := 4096; |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 96 | type GTT_Address_Type is mod 2 ** 39; |
| Nico Huber | 194e57e | 2017-07-15 21:15:46 +0200 | [diff] [blame] | 97 | subtype GTT_Range is Natural range 0 .. 16#8_0000# - 1; |
| Nico Huber | 9b47941 | 2017-08-27 11:55:56 +0200 | [diff] [blame] | 98 | GTT_Rotation_Offset : constant GTT_Range := GTT_Range'Last / 2 + 1; |
| 99 | |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 100 | procedure Write_GTT |
| 101 | (GTT_Page : GTT_Range; |
| 102 | Device_Address : GTT_Address_Type; |
| 103 | Valid : Boolean); |
| 104 | |
| Nico Huber | 5374c3a | 2017-07-15 21:48:06 +0200 | [diff] [blame] | 105 | procedure Setup_Default_FB |
| 106 | (FB : in Framebuffer_Type; |
| 107 | Clear : in Boolean := True; |
| 108 | Success : out Boolean) |
| Nico Huber | 194e57e | 2017-07-15 21:15:46 +0200 | [diff] [blame] | 109 | with |
| Nico Huber | 5374c3a | 2017-07-15 21:48:06 +0200 | [diff] [blame] | 110 | Pre => Is_Initialized and HW.Config.Dynamic_MMIO; |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 111 | |
| Nico Huber | c3f66f6 | 2017-07-16 21:39:54 +0200 | [diff] [blame] | 112 | procedure Map_Linear_FB (Linear_FB : out Word64; FB : in Framebuffer_Type) |
| 113 | with |
| 114 | Pre => Is_Initialized and HW.Config.Dynamic_MMIO; |
| 115 | |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 116 | private |
| 117 | |
| Nico Huber | 8c45bcf | 2016-11-20 17:30:57 +0100 | [diff] [blame] | 118 | ---------------------------------------------------------------------------- |
| 119 | -- State tracking for the currently configured pipes |
| 120 | |
| 121 | Cur_Configs : Pipe_Configs with Part_Of => State; |
| 122 | |
| 123 | ---------------------------------------------------------------------------- |
| 124 | -- Internal representation of a single pipe's configuration |
| 125 | |
| 126 | subtype Active_Port_Type is Port_Type |
| 127 | range Port_Type'Succ (Disabled) .. Port_Type'Last; |
| 128 | |
| Arthur Heymans | 5d08a93 | 2018-03-28 17:00:18 +0200 | [diff] [blame] | 129 | type GPU_Port is (DIGI_A, DIGI_B, DIGI_C, DIGI_D, DIGI_E, LVDS, VGA); |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 130 | |
| 131 | subtype Digital_Port is GPU_Port range DIGI_A .. DIGI_E; |
| Arthur Heymans | 5d08a93 | 2018-03-28 17:00:18 +0200 | [diff] [blame] | 132 | subtype GMCH_DP_Port is GPU_Port range DIGI_B .. DIGI_D; |
| 133 | subtype GMCH_HDMI_Port is GPU_Port range DIGI_B .. DIGI_C; |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 134 | |
| 135 | type PCH_Port is |
| 136 | (PCH_DAC, PCH_LVDS, |
| 137 | PCH_HDMI_B, PCH_HDMI_C, PCH_HDMI_D, |
| 138 | PCH_DP_B, PCH_DP_C, PCH_DP_D); |
| 139 | |
| 140 | subtype PCH_HDMI_Port is PCH_Port range PCH_HDMI_B .. PCH_HDMI_D; |
| 141 | subtype PCH_DP_Port is PCH_Port range PCH_DP_B .. PCH_DP_D; |
| 142 | |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 143 | type Port_Config is |
| 144 | record |
| 145 | Port : GPU_Port; |
| 146 | PCH_Port : GMA.PCH_Port; |
| 147 | Display : Display_Type; |
| 148 | Mode : Mode_Type; |
| 149 | Is_FDI : Boolean; |
| 150 | FDI : DP_Link; |
| 151 | DP : DP_Link; |
| 152 | end record; |
| 153 | |
| 154 | type FDI_Training_Type is (Simple_Training, Full_Training, Auto_Training); |
| 155 | |
| 156 | ---------------------------------------------------------------------------- |
| 157 | |
| 158 | type DP_Port is (DP_A, DP_B, DP_C, DP_D); |
| 159 | |
| Nico Huber | 247adf3 | 2017-06-12 14:39:11 +0200 | [diff] [blame] | 160 | ---------------------------------------------------------------------------- |
| 161 | |
| 162 | subtype DDI_HDMI_Buf_Trans_Range is Integer range 0 .. 11; |
| 163 | |
| Nico Huber | 0164b02 | 2017-08-24 15:12:51 +0200 | [diff] [blame] | 164 | ---------------------------------------------------------------------------- |
| 165 | |
| 166 | Tile_Width : constant array (Tiling_Type) of Pos32 := |
| 167 | (Linear => 16, X_Tiled => 128, Y_Tiled => 32); |
| Nico Huber | 9b47941 | 2017-08-27 11:55:56 +0200 | [diff] [blame] | 168 | Tile_Rows : constant array (Tiling_Type) of Pos32 := |
| 169 | (Linear => 1, X_Tiled => 8, Y_Tiled => 32); |
| Nico Huber | 0164b02 | 2017-08-24 15:12:51 +0200 | [diff] [blame] | 170 | |
| 171 | function FB_Pitch (Px : Pixel_Type; FB : Framebuffer_Type) return Natural is |
| 172 | (Natural (Div_Round_Up |
| 173 | (Pixel_To_Bytes (Px, FB), Tile_Width (FB.Tiling) * 4))); |
| 174 | |
| 175 | function Valid_Stride (FB : Framebuffer_Type) return Boolean is |
| 176 | (FB.Width <= FB.Stride and |
| Nico Huber | 9b47941 | 2017-08-27 11:55:56 +0200 | [diff] [blame] | 177 | Pixel_To_Bytes (FB.Stride, FB) mod (Tile_Width (FB.Tiling) * 4) = 0 and |
| 178 | FB.Height <= FB.V_Stride and |
| 179 | FB.V_Stride mod Tile_Rows (FB.Tiling) = 0); |
| Nico Huber | 0164b02 | 2017-08-24 15:12:51 +0200 | [diff] [blame] | 180 | |
| Nico Huber | 83693c8 | 2016-10-08 22:17:55 +0200 | [diff] [blame] | 181 | end HW.GFX.GMA; |