gma: Factor enabling of a single pipe out of Update_Outputs()
To make the flow easier to follow for both, human readers and analysis
tools.
Change-Id: I188fcc28b0b39d64e866b08ebe47737f5f22fd63
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/18118
Tested-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
diff --git a/common/hw-gfx-gma.adb b/common/hw-gfx-gma.adb
index 343a0cd..cbb18a6 100644
--- a/common/hw-gfx-gma.adb
+++ b/common/hw-gfx-gma.adb
@@ -80,29 +80,120 @@
----------------------------------------------------------------------------
+ procedure Check_HPD
+ (Port_Cfg : in Port_Config;
+ Port : in Port_Type;
+ Detected : out Boolean)
+ is
+ HPD_Delay_Over : constant Boolean := Time.Timed_Out (HPD_Delay (Port));
+ begin
+ if HPD_Delay_Over then
+ Port_Detect.Hotplug_Detect (Port_Cfg, Detected);
+ HPD_Delay (Port) := Time.MS_From_Now (333);
+ else
+ Detected := False;
+ end if;
+ end Check_HPD;
+
+ procedure Enable_Output
+ (Pipe : in Pipe_Index;
+ Pipe_Cfg : in Pipe_Config;
+ Success : out Boolean)
+ is
+ Port_Cfg : Port_Config;
+ begin
+ Config_Helpers.Fill_Port_Config
+ (Port_Cfg, Pipe, Pipe_Cfg.Port, Pipe_Cfg.Mode, Success);
+
+ if Success then
+ Success := Config_Helpers.Validate_Config
+ (Pipe_Cfg.Framebuffer, Port_Cfg, Pipe);
+ end if;
+
+ if Success and then Wait_For_HPD (Pipe_Cfg.Port) then
+ Check_HPD (Port_Cfg, Pipe_Cfg.Port, Success);
+ Wait_For_HPD (Pipe_Cfg.Port) := not Success;
+ end if;
+
+ if Success then
+ pragma Debug (Debug.New_Line);
+ pragma Debug (Debug.Put_Line
+ ("Trying to enable port " & Port_Names (Pipe_Cfg.Port)));
+
+ Connector_Info.Preferred_Link_Setting (Port_Cfg, Success);
+ end if;
+
+ -- loop over all possible DP-lane configurations
+ -- (non-DP ports use a single fake configuration)
+ while Success loop
+ pragma Loop_Invariant
+ (Pipe_Cfg.Port in Active_Port_Type and
+ Port_Cfg.Mode = Port_Cfg.Mode'Loop_Entry);
+
+ PLLs.Alloc
+ (Port_Cfg => Port_Cfg,
+ PLL => Allocated_PLLs (Pipe),
+ Success => Success);
+
+ if Success then
+ -- try each DP-lane configuration twice
+ for Try in 1 .. 2 loop
+ pragma Loop_Invariant
+ (Pipe_Cfg.Port in Active_Port_Type);
+
+ Connectors.Pre_On
+ (Pipe => Pipe,
+ Port_Cfg => Port_Cfg,
+ PLL_Hint => PLLs.Register_Value (Allocated_PLLs (Pipe)),
+ Success => Success);
+
+ if Success then
+ Display_Controller.On
+ (Pipe => Pipe,
+ Port_Cfg => Port_Cfg,
+ Framebuffer => Pipe_Cfg.Framebuffer);
+
+ Connectors.Post_On
+ (Port_Cfg => Port_Cfg,
+ PLL_Hint => PLLs.Register_Value (Allocated_PLLs (Pipe)),
+ Success => Success);
+
+ if not Success then
+ Display_Controller.Off (Pipe);
+ Connectors.Post_Off (Port_Cfg);
+ end if;
+ end if;
+
+ exit when Success;
+ end loop;
+ exit when Success; -- connection established => stop loop
+
+ -- connection failed
+ PLLs.Free (Allocated_PLLs (Pipe));
+ end if;
+
+ Connector_Info.Next_Link_Setting (Port_Cfg, Success);
+ end loop;
+
+ if Success then
+ pragma Debug (Debug.Put_Line
+ ("Enabled port " & Port_Names (Pipe_Cfg.Port)));
+ else
+ Wait_For_HPD (Pipe_Cfg.Port) := True;
+ if Pipe_Cfg.Port = Internal then
+ Panel.Off;
+ end if;
+ end if;
+ end Enable_Output;
+
procedure Update_Outputs (Configs : Pipe_Configs)
is
Did_Power_Up : Boolean := False;
- HPD, HPD_Delay_Over, Success : Boolean;
+ HPD, Success : Boolean;
Old_Config, New_Config : Pipe_Config;
Old_Configs : Pipe_Configs;
Port_Cfg : Port_Config;
-
- procedure Check_HPD
- (Port_Cfg : in Port_Config;
- Port : in Port_Type;
- Detected : out Boolean)
- is
- begin
- HPD_Delay_Over := Time.Timed_Out (HPD_Delay (Port));
- if HPD_Delay_Over then
- Port_Detect.Hotplug_Detect (Port_Cfg, Detected);
- HPD_Delay (Port) := Time.MS_From_Now (333);
- else
- Detected := False;
- end if;
- end Check_HPD;
begin
Old_Configs := Cur_Configs;
@@ -143,97 +234,15 @@
end if;
if New_Config.Port /= Disabled then
- Config_Helpers.Fill_Port_Config
- (Port_Cfg, I, Configs (I).Port, Configs (I).Mode, Success);
-
- if Success then
- Success := Config_Helpers.Validate_Config
- (New_Config.Framebuffer, Port_Cfg, I);
+ if not Did_Power_Up then
+ Power_And_Clocks.Power_Up (Old_Configs, Configs);
+ Did_Power_Up := True;
end if;
- if Success and then Wait_For_HPD (New_Config.Port) then
- Check_HPD (Port_Cfg, New_Config.Port, Success);
- Wait_For_HPD (New_Config.Port) := not Success;
- end if;
+ Enable_Output (I, New_Config, Success);
if Success then
- pragma Debug (Debug.New_Line);
- pragma Debug (Debug.Put_Line
- ("Trying to enable port " & Port_Names (New_Config.Port)));
-
- if not Did_Power_Up then
- Power_And_Clocks.Power_Up (Old_Configs, Configs);
- Did_Power_Up := True;
- end if;
- end if;
-
- if Success then
- Connector_Info.Preferred_Link_Setting
- (Port_Cfg => Port_Cfg,
- Success => Success);
- end if;
-
- while Success loop
- pragma Loop_Invariant
- (New_Config.Port in Active_Port_Type and
- Port_Cfg.Mode = Port_Cfg.Mode'Loop_Entry);
-
- PLLs.Alloc
- (Port_Cfg => Port_Cfg,
- PLL => Allocated_PLLs (I),
- Success => Success);
-
- if Success then
- for Try in 1 .. 2 loop
- pragma Loop_Invariant
- (New_Config.Port in Active_Port_Type);
-
- Connectors.Pre_On
- (Pipe => I,
- Port_Cfg => Port_Cfg,
- PLL_Hint => PLLs.Register_Value (Allocated_PLLs (I)),
- Success => Success);
-
- if Success then
- Display_Controller.On
- (Pipe => I,
- Port_Cfg => Port_Cfg,
- Framebuffer => New_Config.Framebuffer);
-
- Connectors.Post_On
- (Port_Cfg => Port_Cfg,
- PLL_Hint => PLLs.Register_Value
- (Allocated_PLLs (I)),
- Success => Success);
-
- if not Success then
- Display_Controller.Off (I);
- Connectors.Post_Off (Port_Cfg);
- end if;
- end if;
-
- exit when Success;
- end loop;
- exit when Success; -- connection established => stop loop
-
- -- connection failed
- PLLs.Free (Allocated_PLLs (I));
- end if;
-
- Connector_Info.Next_Link_Setting
- (Port_Cfg => Port_Cfg,
- Success => Success);
- end loop;
-
- if Success then
- pragma Debug (Debug.Put_Line
- ("Enabled port " & Port_Names (New_Config.Port)));
Cur_Configs (I) := New_Config;
- else
- Wait_For_HPD (New_Config.Port) := True;
- if New_Config.Port = Internal then
- Panel.Off;
- end if;
end if;
else
Cur_Configs (I) := New_Config;