gma registers: Add generic Wait() procedure
Add a more generic Wait() procedure that waits for some masked bits of
a register to hold a specific value.
Change-Id: Iafefce3da8907e7edf00c68e7a8b650aa7bcd372
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/18419
Tested-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
diff --git a/common/hw-gfx-gma-registers.adb b/common/hw-gfx-gma-registers.adb
index df666d1..3c4ad57 100644
--- a/common/hw-gfx-gma-registers.adb
+++ b/common/hw-gfx-gma-registers.adb
@@ -186,6 +186,43 @@
----------------------------------------------------------------------------
-- TODO: Should have Success parameter
+ -- Wait for the bits in @Register@ indicated by @Mask@ to be of @Value@
+ procedure Wait
+ (Register : Registers_Index;
+ Mask : Word32;
+ Value : Word32;
+ TOut_MS : Natural := Default_Timeout_MS;
+ Verbose : Boolean := False)
+ is
+ Current : Word32;
+ Timeout : Time.T;
+ Timed_Out : Boolean;
+ begin
+ pragma Debug (Debug.Put (GNAT.Source_Info.Enclosing_Entity & ": "));
+ pragma Debug (Debug.Put_Word32 (Value));
+ pragma Debug (Debug.Put (" <- "));
+ pragma Debug (Debug.Put_Word32 (Mask));
+ pragma Debug (Debug.Put (" & "));
+ pragma Debug (Debug.Put_Word32 (Register'Enum_Rep * Register_Width));
+ pragma Debug (Debug.Put (":"));
+ pragma Debug (Debug.Put_Line (Registers_Index'Image (Register)));
+
+ Timeout := Time.MS_From_Now (TOut_MS);
+ loop
+ Timed_Out := Time.Timed_Out (Timeout);
+ Read (Register, Current, Verbose);
+ if (Current and Mask) = Value then
+ exit;
+ end if;
+ pragma Debug (Timed_Out, Debug.Put (GNAT.Source_Info.Enclosing_Entity));
+ pragma Debug (Timed_Out, Debug.Put_Line (": Timed Out!"));
+ exit when Timed_Out;
+ end loop;
+ end Wait;
+
+ ----------------------------------------------------------------------------
+
+ -- TODO: Should have Success parameter
-- Wait for all bits in @Register@ indicated by @Mask@ to be set
procedure Wait_Set_Mask
(Register : in Registers_Index;
@@ -193,25 +230,8 @@
TOut_MS : in Natural := Default_Timeout_MS;
Verbose : in Boolean := False)
is
- Value : Word32;
- Timeout : Time.T;
- Timed_Out : Boolean;
begin
- pragma Debug (Debug.Put (GNAT.Source_Info.Enclosing_Entity & ": "));
- pragma Debug (Debug.Put_Line (Registers_Index'Image (Register)));
-
- Timeout := Time.MS_From_Now (TOut_MS);
- loop
- Timed_Out := Time.Timed_Out (Timeout);
- Read (Register, Value, Verbose);
- if (Value and Mask) = Mask then
- exit;
- end if;
- pragma Debug (Timed_Out, Debug.Put (GNAT.Source_Info.Enclosing_Entity));
- pragma Debug (Timed_Out, Debug.Put_Line (": Timed Out!"));
- exit when Timed_Out;
- end loop;
-
+ Wait (Register, Mask, Mask, TOut_MS, Verbose);
end Wait_Set_Mask;
----------------------------------------------------------------------------
@@ -224,25 +244,8 @@
TOut_MS : in Natural := Default_Timeout_MS;
Verbose : in Boolean := False)
is
- Value : Word32;
- Timeout : Time.T;
- Timed_Out : Boolean;
begin
- pragma Debug (Debug.Put (GNAT.Source_Info.Enclosing_Entity & ": "));
- pragma Debug (Debug.Put_Line (Registers_Index'Image (Register)));
-
- Timeout := Time.MS_From_Now (TOut_MS);
- loop
- Timed_Out := Time.Timed_Out (Timeout);
- Read (Register, Value, Verbose);
- if (Value and Mask) = 0 then
- exit;
- end if;
- pragma Debug (Timed_Out, Debug.Put (GNAT.Source_Info.Enclosing_Entity));
- pragma Debug (Timed_Out, Debug.Put_Line (": Timed Out!"));
- exit when Timed_Out;
- end loop;
-
+ Wait (Register, Mask, 0, TOut_MS, Verbose);
end Wait_Unset_Mask;
----------------------------------------------------------------------------