blob: 79be8f718ed4f204cb320d5d3803d555898e8e97 [file] [log] [blame]
Nico Huber7ad2d652016-12-07 15:19:32 +01001--
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; either version 2 of the License, or
7-- (at your option) any later version.
8--
9-- This program is distributed in the hope that it will be useful,
10-- but WITHOUT ANY WARRANTY; without even the implied warranty of
11-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12-- GNU General Public License for more details.
13--
14
15with HW.GFX.GMA.Registers;
Arthur Heymans636390c2018-03-28 16:52:13 +020016with HW.GFX.GMA.Config;
Nico Huber7ad2d652016-12-07 15:19:32 +010017
18private package HW.GFX.GMA.Transcoder
19is
20
21 procedure Setup (Pipe : Pipe_Index; Port_Cfg : Port_Config);
22 procedure On (Pipe : Pipe_Index; Port_Cfg : Port_Config; Dither : Boolean);
23
24 procedure Off (Pipe : Pipe_Index);
25 procedure Clk_Off (Pipe : Pipe_Index);
26
27 function BPC_Conf (BPC : BPC_Type; Dither : Boolean) return Word32;
28
29private
30
31 type Transcoder_Index is (Trans_EDP, Trans_A, Trans_B, Trans_C);
32
33 type Transcoder_Regs is
34 record
35 HTOTAL : Registers.Registers_Index;
36 HBLANK : Registers.Registers_Index;
37 HSYNC : Registers.Registers_Index;
38 VTOTAL : Registers.Registers_Index;
39 VBLANK : Registers.Registers_Index;
40 VSYNC : Registers.Registers_Index;
41 CONF : Registers.Registers_Index;
42 DATA_M1 : Registers.Registers_Index;
43 DATA_N1 : Registers.Registers_Index;
44 LINK_M1 : Registers.Registers_Index;
45 LINK_N1 : Registers.Registers_Index;
46 DDI_FUNC_CTL : Registers.Registers_Index;
47 MSA_MISC : Registers.Registers_Index;
48 CLK_SEL : Registers.Registers_Invalid_Index;
49 end record;
50
51 type Transcoder_Array is array (Transcoder_Index) of Transcoder_Regs;
52
Arthur Heymans636390c2018-03-28 16:52:13 +020053 PIPE_DATA_M1 : constant array (0 .. 1) of Registers.Registers_Index :=
54 (if Config.Has_GMCH_DP_Transcoder then
55 (0 => Registers.PIPEA_GMCH_DATA_M,
56 1 => Registers.PIPEB_GMCH_DATA_M)
57 else
58 (0 => Registers.PIPEA_DATA_M1,
59 1 => Registers.PIPEB_DATA_M1));
60 PIPE_DATA_N1 : constant array (0 .. 1) of Registers.Registers_Index :=
61 (if Config.Has_GMCH_DP_Transcoder then
62 (0 => Registers.PIPEA_GMCH_DATA_N,
63 1 => Registers.PIPEB_GMCH_DATA_N)
64 else
65 (0 => Registers.PIPEA_DATA_N1,
66 1 => Registers.PIPEB_DATA_N1));
67 PIPE_LINK_M1 : constant array (0 .. 1) of Registers.Registers_Index :=
68 (if Config.Has_GMCH_DP_Transcoder then
69 (0 => Registers.PIPEA_GMCH_LINK_M,
70 1 => Registers.PIPEB_GMCH_LINK_M)
71 else
72 (0 => Registers.PIPEA_LINK_M1,
73 1 => Registers.PIPEB_LINK_M1));
74 PIPE_LINK_N1 : constant array (0 .. 1) of Registers.Registers_Index :=
75 (if Config.Has_GMCH_DP_Transcoder then
76 (0 => Registers.PIPEA_GMCH_LINK_N,
77 1 => Registers.PIPEB_GMCH_LINK_N)
78 else
79 (0 => Registers.PIPEA_LINK_N1,
80 1 => Registers.PIPEB_LINK_N1));
81
Nico Huber7ad2d652016-12-07 15:19:32 +010082 Transcoders : constant Transcoder_Array :=
83 (Trans_EDP =>
84 (HTOTAL => Registers.HTOTAL_EDP,
85 HBLANK => Registers.HBLANK_EDP,
86 HSYNC => Registers.HSYNC_EDP,
87 VTOTAL => Registers.VTOTAL_EDP,
88 VBLANK => Registers.VBLANK_EDP,
89 VSYNC => Registers.VSYNC_EDP,
90 CONF => Registers.PIPE_EDP_CONF,
91 DATA_M1 => Registers.PIPE_EDP_DATA_M1,
92 DATA_N1 => Registers.PIPE_EDP_DATA_N1,
93 LINK_M1 => Registers.PIPE_EDP_LINK_M1,
94 LINK_N1 => Registers.PIPE_EDP_LINK_N1,
95 DDI_FUNC_CTL => Registers.PIPE_EDP_DDI_FUNC_CTL,
96 MSA_MISC => Registers.PIPE_EDP_MSA_MISC,
97 CLK_SEL => Registers.Invalid_Register),
98 Trans_A =>
99 (HTOTAL => Registers.HTOTAL_A,
100 HBLANK => Registers.HBLANK_A,
101 HSYNC => Registers.HSYNC_A,
102 VTOTAL => Registers.VTOTAL_A,
103 VBLANK => Registers.VBLANK_A,
104 VSYNC => Registers.VSYNC_A,
105 CONF => Registers.PIPEACONF,
Arthur Heymans636390c2018-03-28 16:52:13 +0200106 DATA_M1 => PIPE_DATA_M1 (0),
107 DATA_N1 => PIPE_DATA_N1 (0),
108 LINK_M1 => PIPE_LINK_M1 (0),
109 LINK_N1 => PIPE_LINK_N1 (0),
Nico Huber7ad2d652016-12-07 15:19:32 +0100110 DDI_FUNC_CTL => Registers.PIPEA_DDI_FUNC_CTL,
111 MSA_MISC => Registers.PIPEA_MSA_MISC,
112 CLK_SEL => Registers.TRANSA_CLK_SEL),
113 Trans_B =>
114 (HTOTAL => Registers.HTOTAL_B,
115 HBLANK => Registers.HBLANK_B,
116 HSYNC => Registers.HSYNC_B,
117 VTOTAL => Registers.VTOTAL_B,
118 VBLANK => Registers.VBLANK_B,
119 VSYNC => Registers.VSYNC_B,
120 CONF => Registers.PIPEBCONF,
Arthur Heymans636390c2018-03-28 16:52:13 +0200121 DATA_M1 => PIPE_DATA_M1 (1),
122 DATA_N1 => PIPE_DATA_N1 (1),
123 LINK_M1 => PIPE_LINK_M1 (1),
124 LINK_N1 => PIPE_LINK_N1 (1),
Nico Huber7ad2d652016-12-07 15:19:32 +0100125 DDI_FUNC_CTL => Registers.PIPEB_DDI_FUNC_CTL,
126 MSA_MISC => Registers.PIPEB_MSA_MISC,
127 CLK_SEL => Registers.TRANSB_CLK_SEL),
128 Trans_C =>
129 (HTOTAL => Registers.HTOTAL_C,
130 HBLANK => Registers.HBLANK_C,
131 HSYNC => Registers.HSYNC_C,
132 VTOTAL => Registers.VTOTAL_C,
133 VBLANK => Registers.VBLANK_C,
134 VSYNC => Registers.VSYNC_C,
135 CONF => Registers.PIPECCONF,
136 DATA_M1 => Registers.PIPEC_DATA_M1,
137 DATA_N1 => Registers.PIPEC_DATA_N1,
138 LINK_M1 => Registers.PIPEC_LINK_M1,
139 LINK_N1 => Registers.PIPEC_LINK_N1,
140 DDI_FUNC_CTL => Registers.PIPEC_DDI_FUNC_CTL,
141 MSA_MISC => Registers.PIPEC_MSA_MISC,
142 CLK_SEL => Registers.TRANSC_CLK_SEL));
143
144end HW.GFX.GMA.Transcoder;