blob: 25f30eb57e7d9e8102366b024398d475dd269aef [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
39 type Fia_Regs_Record is record
40 PORT_TX_DFLEXDPMLE1 : Registers.Registers_Index;
41 PORT_TX_DFLEXDPSP : Registers.Registers_Index;
42 PORT_TX_DFLEXDPPMS : Registers.Registers_Index;
43 PORT_TX_DFLEXDPCSSS : Registers.Registers_Index;
44 PORT_TX_DFLEXPA1 : Registers.Registers_Index;
45 end record;
46
47 type Fia_Regs_Array is array (USBC_Port) of Fia_Regs_Record;
48 Fia_Regs : constant Fia_Regs_Array :=
49 (DDI_TC1 =>
50 (Registers.PORT_TX_DFLEXDPMLE1_FIA1,
51 Registers.PORT_TX_DFLEXDPSP_FIA1,
52 Registers.PORT_TX_DFLEXDPPMS_FIA1,
53 Registers.PORT_TX_DFLEXDPCSSS_FIA1,
54 Registers.PORT_TX_DFLEXPA1_FIA1),
55 DDI_TC2 =>
56 (Registers.PORT_TX_DFLEXDPMLE1_FIA1,
57 Registers.PORT_TX_DFLEXDPSP_FIA1,
58 Registers.PORT_TX_DFLEXDPPMS_FIA1,
59 Registers.PORT_TX_DFLEXDPCSSS_FIA1,
60 Registers.PORT_TX_DFLEXPA1_FIA1),
61 DDI_TC3 =>
62 (Registers.PORT_TX_DFLEXDPMLE1_FIA2,
63 Registers.PORT_TX_DFLEXDPSP_FIA2,
64 Registers.PORT_TX_DFLEXDPPMS_FIA2,
65 Registers.PORT_TX_DFLEXDPCSSS_FIA2,
66 Registers.PORT_TX_DFLEXPA1_FIA2),
67 DDI_TC4 =>
68 (Registers.PORT_TX_DFLEXDPMLE1_FIA2,
69 Registers.PORT_TX_DFLEXDPSP_FIA2,
70 Registers.PORT_TX_DFLEXDPPMS_FIA2,
71 Registers.PORT_TX_DFLEXDPCSSS_FIA2,
72 Registers.PORT_TX_DFLEXPA1_FIA2),
73 DDI_TC5 =>
74 (Registers.PORT_TX_DFLEXDPMLE1_FIA3,
75 Registers.PORT_TX_DFLEXDPSP_FIA3,
76 Registers.PORT_TX_DFLEXDPPMS_FIA3,
77 Registers.PORT_TX_DFLEXDPCSSS_FIA3,
78 Registers.PORT_TX_DFLEXPA1_FIA3),
79 DDI_TC6 =>
80 (Registers.PORT_TX_DFLEXDPMLE1_FIA3,
81 Registers.PORT_TX_DFLEXDPSP_FIA3,
82 Registers.PORT_TX_DFLEXDPPMS_FIA3,
83 Registers.PORT_TX_DFLEXDPCSSS_FIA3,
84 Registers.PORT_TX_DFLEXPA1_FIA3));
85
86 function Fia_Index (Port : USBC_Port) return Natural
87 is
88 (case Port is
89 when DDI_TC1 | DDI_TC3 | DDI_TC5 => 0,
90 when DDI_TC2 | DDI_TC4 | DDI_TC6 => 1);
91
92 function DFLEXDPMLE1_DPMLETC_MASK (Port : USBC_Port) return Word32 is
93 (Shift_Left (15, 4 * Fia_Index (Port)));
94 function DFLEXDPMLE1_DPMLETC_ML0 (Port : USBC_Port) return Word32 is
95 (Shift_Left (1, 4 * Fia_Index (Port)));
96 function DFLEXDPMLE1_DPMLETC_ML1_0 (Port : USBC_Port) return Word32 is
97 (Shift_Left (3, 4 * Fia_Index (Port)));
98 function DFLEXDPMLE1_DPMLETC_ML3 (Port : USBC_Port) return Word32 is
99 (Shift_Left (8, 4 * Fia_Index (Port)));
100 function DFLEXDPMLE1_DPMLETC_ML3_2 (Port : USBC_Port) return Word32 is
101 (Shift_Left (12, 4 * Fia_Index (Port)));
102 function DFLEXDPMLE1_DPMLETC_ML3_0 (Port : USBC_Port) return Word32 is
103 (Shift_Left (15, 4 * Fia_Index (Port)));
104 function DP_PHY_MODE_STATUS_COMPLETE (Port : USBC_Port) return Word32 is
105 (Shift_Left (1, Fia_Index (Port)));
106 function DP_PHY_MODE_STATUS_NOT_SAFE (Port : USBC_Port) return Word32 is
107 (Shift_Left (1, Fia_Index (Port)));
108 function TC_LIVE_STATE_TC (Port : USBC_Port) return Word32 is
109 (Shift_Left (1, Fia_Index (Port) * 8 + 5));
110 function DP_LANE_ASSIGNMENT_MASK (Port : USBC_Port) return Word32 is
111 (Shift_Left (16#f#, Fia_Index (Port) * 8));
112 function DP_LANE_ASSIGNMENT_SHIFT (Port : USBC_Port) return Natural is
113 (Fia_Index (Port) * 8);
114
115 procedure Get_Lane_Assignment_Count
116 (Port : in USBC_Port;
117 Lanes : out DP_Lane_Count);
118 procedure Set_Lane_Count (Port : USBC_Port; Lanes : DP_Lane_Count);
119
Tim Wawrzynczak5473d292023-02-06 16:46:33 -0700120end HW.GFX.GMA.Connectors.TC;