blob: 416cf01fd253e29446fd06e79b6cd0c0bb621b8f [file] [log] [blame]
Nico Huber83693c82016-10-08 22:17:55 +02001--
2-- Copyright (C) 2015-2016 secunet Security Networks AG
3--
4-- This program is free software; you can redistribute it and/or modify
5-- it under the terms of the GNU General Public License as published by
6-- the Free Software Foundation; version 2 of the License.
7--
8-- This program is distributed in the hope that it will be useful,
9-- but WITHOUT ANY WARRANTY; without even the implied warranty of
10-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11-- GNU General Public License for more details.
12--
13
14with HW.GFX.GMA.Registers;
15
16private package HW.GFX.GMA.Pipe_Setup
17is
18
19 type Controller_Kind is (A, B, C);
20 type Controller_Type is private;
21 type Controller_Array is array (Controller_Kind) of Controller_Type;
22
23 type Pipe_Head is (Head_EDP, Head_A, Head_B, Head_C);
24 type Head_Type is private;
25 type Head_Array is array (Pipe_Head) of Head_Type;
26
27 procedure On
28 (Controller : Controller_Type;
29 Head : Head_Type;
30 Port_Cfg : Port_Config;
31 Framebuffer : Framebuffer_Type);
32
33 procedure Off
34 (Controller : Controller_Type;
35 Head : Head_Type);
36
37 procedure All_Off;
38
39 function Get_Pipe_Hint (Head : Head_Type) return Word32;
40
41 procedure Update_Offset
42 (Controller : Controller_Type;
43 Framebuffer : HW.GFX.Framebuffer_Type);
44
45 Controllers : constant Controller_Array;
46
47 Heads : constant Head_Array;
48
49 function Default_Pipe_Head (Kind : Controller_Kind) return Head_Type;
50
51private
52
53 subtype WM_Levels is Natural range 0 .. 7;
54 type PLANE_WM_Type is array (WM_Levels) of Registers.Registers_Index;
55
56 type Controller_Type is
57 record
58 Kind : Controller_Kind;
59 PIPESRC : Registers.Registers_Index;
60 PIPEMISC : Registers.Registers_Index;
61 PF_CTL_1 : Registers.Registers_Index;
62 PF_WIN_POS : Registers.Registers_Index;
63 PF_WIN_SZ : Registers.Registers_Index;
64 DSPCNTR : Registers.Registers_Index;
65 DSPLINOFF : Registers.Registers_Index;
66 DSPSTRIDE : Registers.Registers_Index;
67 DSPSURF : Registers.Registers_Index;
68 DSPTILEOFF : Registers.Registers_Index;
69 SPCNTR : Registers.Registers_Index;
70 TRANS_CLK_SEL : Registers.Registers_Index;
71 -- Skylake registers (partially aliased)
72 PLANE_CTL : Registers.Registers_Index;
73 PLANE_OFFSET : Registers.Registers_Index;
74 PLANE_POS : Registers.Registers_Index;
75 PLANE_SIZE : Registers.Registers_Index;
76 PLANE_STRIDE : Registers.Registers_Index;
77 PLANE_SURF : Registers.Registers_Index;
78 PS_CTRL_1 : Registers.Registers_Index;
79 PS_CTRL_2 : Registers.Registers_Invalid_Index;
80 PS_WIN_SZ_1 : Registers.Registers_Index;
81 PS_WIN_SZ_2 : Registers.Registers_Invalid_Index;
82 WM_LINETIME : Registers.Registers_Index;
83 PLANE_BUF_CFG : Registers.Registers_Index;
84 PLANE_WM : PLANE_WM_Type;
85 end record;
86
87 type Head_Type is
88 record
89 Head : Pipe_Head;
90 HTOTAL : Registers.Registers_Index;
91 HBLANK : Registers.Registers_Index;
92 HSYNC : Registers.Registers_Index;
93 VTOTAL : Registers.Registers_Index;
94 VBLANK : Registers.Registers_Index;
95 VSYNC : Registers.Registers_Index;
96 PIPECONF : Registers.Registers_Index;
97 PIPE_DATA_M1 : Registers.Registers_Index;
98 PIPE_DATA_N1 : Registers.Registers_Index;
99 PIPE_LINK_M1 : Registers.Registers_Index;
100 PIPE_LINK_N1 : Registers.Registers_Index;
101 PIPE_DDI_FUNC_CTL : Registers.Registers_Index;
102 PIPE_MSA_MISC : Registers.Registers_Index;
103 end record;
104
105 Controllers : constant Controller_Array := Controller_Array'
106 (A => Controller_Type'
107 (Kind => A,
108 PIPESRC => Registers.PIPEASRC,
109 PIPEMISC => Registers.PIPEAMISC,
110 PF_CTL_1 => Registers.PFA_CTL_1,
111 PF_WIN_POS => Registers.PFA_WIN_POS,
112 PF_WIN_SZ => Registers.PFA_WIN_SZ,
113 DSPCNTR => Registers.DSPACNTR,
114 DSPLINOFF => Registers.DSPALINOFF,
115 DSPSTRIDE => Registers.DSPASTRIDE,
116 DSPSURF => Registers.DSPASURF,
117 DSPTILEOFF => Registers.DSPATILEOFF,
118 SPCNTR => Registers.SPACNTR,
119 TRANS_CLK_SEL => Registers.TRANSA_CLK_SEL,
120 PLANE_CTL => Registers.DSPACNTR,
121 PLANE_OFFSET => Registers.DSPATILEOFF,
122 PLANE_POS => Registers.PLANE_POS_1_A,
123 PLANE_SIZE => Registers.PLANE_SIZE_1_A,
124 PLANE_STRIDE => Registers.DSPASTRIDE,
125 PLANE_SURF => Registers.DSPASURF,
126 PS_CTRL_1 => Registers.PS_CTRL_1_A,
127 PS_CTRL_2 => Registers.PS_CTRL_2_A,
128 PS_WIN_SZ_1 => Registers.PS_WIN_SZ_1_A,
129 PS_WIN_SZ_2 => Registers.PS_WIN_SZ_2_A,
130 WM_LINETIME => Registers.WM_LINETIME_A,
131 PLANE_BUF_CFG => Registers.PLANE_BUF_CFG_1_A,
132 PLANE_WM => PLANE_WM_Type'(
133 Registers.PLANE_WM_1_A_0,
134 Registers.PLANE_WM_1_A_1,
135 Registers.PLANE_WM_1_A_2,
136 Registers.PLANE_WM_1_A_3,
137 Registers.PLANE_WM_1_A_4,
138 Registers.PLANE_WM_1_A_5,
139 Registers.PLANE_WM_1_A_6,
140 Registers.PLANE_WM_1_A_7)),
141 B => Controller_Type'
142 (Kind => B,
143 PIPESRC => Registers.PIPEBSRC,
144 PIPEMISC => Registers.PIPEBMISC,
145 PF_CTL_1 => Registers.PFB_CTL_1,
146 PF_WIN_POS => Registers.PFB_WIN_POS,
147 PF_WIN_SZ => Registers.PFB_WIN_SZ,
148 DSPCNTR => Registers.DSPBCNTR,
149 DSPLINOFF => Registers.DSPBLINOFF,
150 DSPSTRIDE => Registers.DSPBSTRIDE,
151 DSPSURF => Registers.DSPBSURF,
152 DSPTILEOFF => Registers.DSPBTILEOFF,
153 SPCNTR => Registers.SPBCNTR,
154 TRANS_CLK_SEL => Registers.TRANSB_CLK_SEL,
155 PLANE_CTL => Registers.DSPBCNTR,
156 PLANE_OFFSET => Registers.DSPBTILEOFF,
157 PLANE_POS => Registers.PLANE_POS_1_B,
158 PLANE_SIZE => Registers.PLANE_SIZE_1_B,
159 PLANE_STRIDE => Registers.DSPBSTRIDE,
160 PLANE_SURF => Registers.DSPBSURF,
161 PS_CTRL_1 => Registers.PS_CTRL_1_B,
162 PS_CTRL_2 => Registers.PS_CTRL_2_B,
163 PS_WIN_SZ_1 => Registers.PS_WIN_SZ_1_B,
164 PS_WIN_SZ_2 => Registers.PS_WIN_SZ_2_B,
165 WM_LINETIME => Registers.WM_LINETIME_B,
166 PLANE_BUF_CFG => Registers.PLANE_BUF_CFG_1_B,
167 PLANE_WM => PLANE_WM_Type'(
168 Registers.PLANE_WM_1_B_0,
169 Registers.PLANE_WM_1_B_1,
170 Registers.PLANE_WM_1_B_2,
171 Registers.PLANE_WM_1_B_3,
172 Registers.PLANE_WM_1_B_4,
173 Registers.PLANE_WM_1_B_5,
174 Registers.PLANE_WM_1_B_6,
175 Registers.PLANE_WM_1_B_7)),
176 C => Controller_Type'
177 (Kind => C,
178 PIPESRC => Registers.PIPECSRC,
179 PIPEMISC => Registers.PIPECMISC,
180 PF_CTL_1 => Registers.PFC_CTL_1,
181 PF_WIN_POS => Registers.PFC_WIN_POS,
182 PF_WIN_SZ => Registers.PFC_WIN_SZ,
183 DSPCNTR => Registers.DSPCCNTR,
184 DSPLINOFF => Registers.DSPCLINOFF,
185 DSPSTRIDE => Registers.DSPCSTRIDE,
186 DSPSURF => Registers.DSPCSURF,
187 DSPTILEOFF => Registers.DSPCTILEOFF,
188 SPCNTR => Registers.SPCCNTR,
189 TRANS_CLK_SEL => Registers.TRANSC_CLK_SEL,
190 PLANE_CTL => Registers.DSPCCNTR,
191 PLANE_OFFSET => Registers.DSPCTILEOFF,
192 PLANE_POS => Registers.PLANE_POS_1_C,
193 PLANE_SIZE => Registers.PLANE_SIZE_1_C,
194 PLANE_STRIDE => Registers.DSPCSTRIDE,
195 PLANE_SURF => Registers.DSPCSURF,
196 PS_CTRL_1 => Registers.PS_CTRL_1_C,
197 PS_CTRL_2 => Registers.Invalid_Register,
198 PS_WIN_SZ_1 => Registers.PS_WIN_SZ_1_C,
199 PS_WIN_SZ_2 => Registers.Invalid_Register,
200 WM_LINETIME => Registers.WM_LINETIME_C,
201 PLANE_BUF_CFG => Registers.PLANE_BUF_CFG_1_C,
202 PLANE_WM => PLANE_WM_Type'(
203 Registers.PLANE_WM_1_C_0,
204 Registers.PLANE_WM_1_C_1,
205 Registers.PLANE_WM_1_C_2,
206 Registers.PLANE_WM_1_C_3,
207 Registers.PLANE_WM_1_C_4,
208 Registers.PLANE_WM_1_C_5,
209 Registers.PLANE_WM_1_C_6,
210 Registers.PLANE_WM_1_C_7)));
211
212 Heads : constant Head_Array := Head_Array'
213 (Head_EDP => Head_Type'
214 (Head => Head_EDP,
215 HTOTAL => Registers.HTOTAL_EDP,
216 HBLANK => Registers.HBLANK_EDP,
217 HSYNC => Registers.HSYNC_EDP,
218 VTOTAL => Registers.VTOTAL_EDP,
219 VBLANK => Registers.VBLANK_EDP,
220 VSYNC => Registers.VSYNC_EDP,
221 PIPECONF => Registers.PIPE_EDP_CONF,
222 PIPE_DATA_M1 => Registers.PIPE_EDP_DATA_M1,
223 PIPE_DATA_N1 => Registers.PIPE_EDP_DATA_N1,
224 PIPE_LINK_M1 => Registers.PIPE_EDP_LINK_M1,
225 PIPE_LINK_N1 => Registers.PIPE_EDP_LINK_N1,
226 PIPE_DDI_FUNC_CTL => Registers.PIPE_EDP_DDI_FUNC_CTL,
227 PIPE_MSA_MISC => Registers.PIPE_EDP_MSA_MISC),
228 Head_A => Head_Type'
229 (Head => Head_A,
230 HTOTAL => Registers.HTOTAL_A,
231 HBLANK => Registers.HBLANK_A,
232 HSYNC => Registers.HSYNC_A,
233 VTOTAL => Registers.VTOTAL_A,
234 VBLANK => Registers.VBLANK_A,
235 VSYNC => Registers.VSYNC_A,
236 PIPECONF => Registers.PIPEACONF,
237 PIPE_DATA_M1 => Registers.PIPEA_DATA_M1,
238 PIPE_DATA_N1 => Registers.PIPEA_DATA_N1,
239 PIPE_LINK_M1 => Registers.PIPEA_LINK_M1,
240 PIPE_LINK_N1 => Registers.PIPEA_LINK_N1,
241 PIPE_DDI_FUNC_CTL => Registers.PIPEA_DDI_FUNC_CTL,
242 PIPE_MSA_MISC => Registers.PIPEA_MSA_MISC),
243 Head_B => Head_Type'
244 (Head => Head_B,
245 HTOTAL => Registers.HTOTAL_B,
246 HBLANK => Registers.HBLANK_B,
247 HSYNC => Registers.HSYNC_B,
248 VTOTAL => Registers.VTOTAL_B,
249 VBLANK => Registers.VBLANK_B,
250 VSYNC => Registers.VSYNC_B,
251 PIPECONF => Registers.PIPEBCONF,
252 PIPE_DATA_M1 => Registers.PIPEB_DATA_M1,
253 PIPE_DATA_N1 => Registers.PIPEB_DATA_N1,
254 PIPE_LINK_M1 => Registers.PIPEB_LINK_M1,
255 PIPE_LINK_N1 => Registers.PIPEB_LINK_N1,
256 PIPE_DDI_FUNC_CTL => Registers.PIPEB_DDI_FUNC_CTL,
257 PIPE_MSA_MISC => Registers.PIPEB_MSA_MISC),
258 Head_C => Head_Type'
259 (Head => Head_C,
260 HTOTAL => Registers.HTOTAL_C,
261 HBLANK => Registers.HBLANK_C,
262 HSYNC => Registers.HSYNC_C,
263 VTOTAL => Registers.VTOTAL_C,
264 VBLANK => Registers.VBLANK_C,
265 VSYNC => Registers.VSYNC_C,
266 PIPECONF => Registers.PIPECCONF,
267 PIPE_DATA_M1 => Registers.PIPEC_DATA_M1,
268 PIPE_DATA_N1 => Registers.PIPEC_DATA_N1,
269 PIPE_LINK_M1 => Registers.PIPEC_LINK_M1,
270 PIPE_LINK_N1 => Registers.PIPEC_LINK_N1,
271 PIPE_DDI_FUNC_CTL => Registers.PIPEC_DDI_FUNC_CTL,
272 PIPE_MSA_MISC => Registers.PIPEC_MSA_MISC));
273
274end HW.GFX.GMA.Pipe_Setup;