blob: 6bebc7352fed07a97928bf18ed1e8a5f851af68b [file] [log] [blame]
Tim Wawrzynczak5473d292023-02-06 16:46:33 -07001--
2-- Copyright (C) 2022 Google, LLC
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
Nico Huberc74eafd2024-07-23 12:38:02 +020015with HW.GFX.GMA.Config;
Tim Wawrzynczak5473d292023-02-06 16:46:33 -070016with HW.GFX.GMA.DP_Info;
Nico Huberc74eafd2024-07-23 12:38:02 +020017with HW.GFX.GMA.Registers;
Tim Wawrzynczak5473d292023-02-06 16:46:33 -070018
19package HW.GFX.GMA.Connectors.TC is
20
Tim Wawrzynczak5473d292023-02-06 16:46:33 -070021 procedure Program_DP_Mode (P : USBC_Port; Lane_Count : Natural);
22 procedure Enable_HDMI (Port : USBC_Port);
23
24 procedure Set_Signal_Levels
25 (Port : USBC_Port;
26 Link : DP_Link;
27 Train_Set : DP_Info.Train_Set);
28
29 type TC_Cold_Request_Type is (Block, Unblock);
30 procedure TC_Cold_Request
31 (Request : in TC_Cold_Request_Type;
32 Success : out Boolean);
33
Nico Huberc74eafd2024-07-23 12:38:02 +020034private
35 -- Some of the Connectors code only supports 4 ports.
36 -- And so far, no SKU needs more.
37 subtype Valid_TC_Port is USBC_Port range DDI_TC1 .. Config.Last_TC_Port;
38
Nico Huber80b25df2024-08-28 00:03:29 +020039 type Port_Regs_Array is
40 array (USBC_Port) of Registers.Registers_Invalid_Index;
Nico Huberdea094a2024-08-19 21:31:23 +020041
42 DDI_BUF_CTL_BUFFER_ENABLE : constant := 1 * 2 ** 31;
43 DDI_BUF_CTL_TRANS_SELECT_MASK : constant := 16#f# * 2 ** 24;
44 DDI_BUF_CTL_PORT_REVERSAL : constant := 1 * 2 ** 16;
45 DDI_BUF_CTL_PORT_WIDTH_MASK : constant := 7 * 2 ** 1;
46 DDI_BUF_CTL_PORT_WIDTH_1_LANE : constant := 0 * 2 ** 1;
47 DDI_BUF_CTL_PORT_WIDTH_2_LANES : constant := 1 * 2 ** 1;
48 DDI_BUF_CTL_PORT_WIDTH_4_LANES : constant := 3 * 2 ** 1;
49 DDI_BUF_CTL_IDLE_STATUS : constant := 1 * 2 ** 7;
50 DDI_BUF_CTL_TC_PHY_OWNERSHIP : constant := 1 * 2 ** 6;
51
52 DDI_BUF_CTL_PORT_WIDTH : constant array (DP_Lane_Count) of Word32 :=
53 (HW.GFX.DP_Lane_Count_1 => DDI_BUF_CTL_PORT_WIDTH_1_LANE,
54 HW.GFX.DP_Lane_Count_2 => DDI_BUF_CTL_PORT_WIDTH_2_LANES,
55 HW.GFX.DP_Lane_Count_4 => DDI_BUF_CTL_PORT_WIDTH_4_LANES);
56 DDI_BUF_CTL : constant Port_Regs_Array :=
57 (DDI_TC1 => Registers.DDI_BUF_CTL_USBC1,
58 DDI_TC2 => Registers.DDI_BUF_CTL_USBC2,
59 DDI_TC3 => Registers.DDI_BUF_CTL_USBC3,
60 DDI_TC4 => Registers.DDI_BUF_CTL_USBC4,
61 DDI_TC5 => Registers.DDI_BUF_CTL_USBC5,
62 DDI_TC6 => Registers.DDI_BUF_CTL_USBC6);
63
Nico Huberc74eafd2024-07-23 12:38:02 +020064 type Fia_Regs_Record is record
65 PORT_TX_DFLEXDPMLE1 : Registers.Registers_Index;
66 PORT_TX_DFLEXDPSP : Registers.Registers_Index;
67 PORT_TX_DFLEXDPPMS : Registers.Registers_Index;
68 PORT_TX_DFLEXDPCSSS : Registers.Registers_Index;
69 PORT_TX_DFLEXPA1 : Registers.Registers_Index;
70 end record;
71
72 type Fia_Regs_Array is array (USBC_Port) of Fia_Regs_Record;
73 Fia_Regs : constant Fia_Regs_Array :=
74 (DDI_TC1 =>
75 (Registers.PORT_TX_DFLEXDPMLE1_FIA1,
76 Registers.PORT_TX_DFLEXDPSP_FIA1,
77 Registers.PORT_TX_DFLEXDPPMS_FIA1,
78 Registers.PORT_TX_DFLEXDPCSSS_FIA1,
79 Registers.PORT_TX_DFLEXPA1_FIA1),
80 DDI_TC2 =>
81 (Registers.PORT_TX_DFLEXDPMLE1_FIA1,
82 Registers.PORT_TX_DFLEXDPSP_FIA1,
83 Registers.PORT_TX_DFLEXDPPMS_FIA1,
84 Registers.PORT_TX_DFLEXDPCSSS_FIA1,
85 Registers.PORT_TX_DFLEXPA1_FIA1),
86 DDI_TC3 =>
87 (Registers.PORT_TX_DFLEXDPMLE1_FIA2,
88 Registers.PORT_TX_DFLEXDPSP_FIA2,
89 Registers.PORT_TX_DFLEXDPPMS_FIA2,
90 Registers.PORT_TX_DFLEXDPCSSS_FIA2,
91 Registers.PORT_TX_DFLEXPA1_FIA2),
92 DDI_TC4 =>
93 (Registers.PORT_TX_DFLEXDPMLE1_FIA2,
94 Registers.PORT_TX_DFLEXDPSP_FIA2,
95 Registers.PORT_TX_DFLEXDPPMS_FIA2,
96 Registers.PORT_TX_DFLEXDPCSSS_FIA2,
97 Registers.PORT_TX_DFLEXPA1_FIA2),
98 DDI_TC5 =>
99 (Registers.PORT_TX_DFLEXDPMLE1_FIA3,
100 Registers.PORT_TX_DFLEXDPSP_FIA3,
101 Registers.PORT_TX_DFLEXDPPMS_FIA3,
102 Registers.PORT_TX_DFLEXDPCSSS_FIA3,
103 Registers.PORT_TX_DFLEXPA1_FIA3),
104 DDI_TC6 =>
105 (Registers.PORT_TX_DFLEXDPMLE1_FIA3,
106 Registers.PORT_TX_DFLEXDPSP_FIA3,
107 Registers.PORT_TX_DFLEXDPPMS_FIA3,
108 Registers.PORT_TX_DFLEXDPCSSS_FIA3,
109 Registers.PORT_TX_DFLEXPA1_FIA3));
110
111 function Fia_Index (Port : USBC_Port) return Natural
112 is
113 (case Port is
114 when DDI_TC1 | DDI_TC3 | DDI_TC5 => 0,
115 when DDI_TC2 | DDI_TC4 | DDI_TC6 => 1);
116
117 function DFLEXDPMLE1_DPMLETC_MASK (Port : USBC_Port) return Word32 is
118 (Shift_Left (15, 4 * Fia_Index (Port)));
119 function DFLEXDPMLE1_DPMLETC_ML0 (Port : USBC_Port) return Word32 is
120 (Shift_Left (1, 4 * Fia_Index (Port)));
121 function DFLEXDPMLE1_DPMLETC_ML1_0 (Port : USBC_Port) return Word32 is
122 (Shift_Left (3, 4 * Fia_Index (Port)));
123 function DFLEXDPMLE1_DPMLETC_ML3 (Port : USBC_Port) return Word32 is
124 (Shift_Left (8, 4 * Fia_Index (Port)));
125 function DFLEXDPMLE1_DPMLETC_ML3_2 (Port : USBC_Port) return Word32 is
126 (Shift_Left (12, 4 * Fia_Index (Port)));
127 function DFLEXDPMLE1_DPMLETC_ML3_0 (Port : USBC_Port) return Word32 is
128 (Shift_Left (15, 4 * Fia_Index (Port)));
129 function DP_PHY_MODE_STATUS_COMPLETE (Port : USBC_Port) return Word32 is
130 (Shift_Left (1, Fia_Index (Port)));
131 function DP_PHY_MODE_STATUS_NOT_SAFE (Port : USBC_Port) return Word32 is
132 (Shift_Left (1, Fia_Index (Port)));
133 function TC_LIVE_STATE_TC (Port : USBC_Port) return Word32 is
134 (Shift_Left (1, Fia_Index (Port) * 8 + 5));
135 function DP_LANE_ASSIGNMENT_MASK (Port : USBC_Port) return Word32 is
136 (Shift_Left (16#f#, Fia_Index (Port) * 8));
137 function DP_LANE_ASSIGNMENT_SHIFT (Port : USBC_Port) return Natural is
138 (Fia_Index (Port) * 8);
139
140 procedure Get_Lane_Assignment_Count
141 (Port : in USBC_Port;
142 Lanes : out DP_Lane_Count);
143 procedure Set_Lane_Count (Port : USBC_Port; Lanes : DP_Lane_Count);
144
Tim Wawrzynczak5473d292023-02-06 16:46:33 -0700145end HW.GFX.GMA.Connectors.TC;