gma: Turn constants depending on Config.CPU* into functions
To reduce elaboration time dependencies, turn constants at package
level into functions. This will allow us to use the same code for
configurations with constant and non-constant `GMA.Config.CPU*`.
Change-Id: I0522f5c63c63080bf9633f3d1b6019f35e52d226
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/libgfxinit/+/27062
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
diff --git a/common/ironlake/hw-gfx-gma-connectors-fdi.adb b/common/ironlake/hw-gfx-gma-connectors-fdi.adb
index 4eec9c9..5b7f105 100644
--- a/common/ironlake/hw-gfx-gma-connectors-fdi.adb
+++ b/common/ironlake/hw-gfx-gma-connectors-fdi.adb
@@ -23,6 +23,8 @@
package body HW.GFX.GMA.Connectors.FDI
is
+ use all type PCH.FDI.Training_Pattern;
+
PCH_FDI_CHICKEN_B_AND_C : constant := 1 * 2 ** 12;
type TX_CTL_Regs is array (GPU_FDI_Port) of Registers.Registers_Index;
@@ -40,12 +42,19 @@
FDI_TX_CTL_AUTO_TRAIN_ENABLE : constant := 1 * 2 ** 10;
FDI_TX_CTL_AUTO_TRAIN_DONE : constant := 1 * 2 ** 1;
- TP_SHIFT : constant := (if Config.Has_New_FDI_Source then 8 else 28);
- FDI_TX_CTL_TRAINING_PATTERN_MASK : constant := 3 * 2 ** TP_SHIFT;
- FDI_TX_CTL_TRAINING_PATTERN_1 : constant := 0 * 2 ** TP_SHIFT;
- FDI_TX_CTL_TRAINING_PATTERN_2 : constant := 1 * 2 ** TP_SHIFT;
- FDI_TX_CTL_TRAINING_PATTERN_IDLE : constant := 2 * 2 ** TP_SHIFT;
- FDI_TX_CTL_TRAINING_PATTERN_NORMAL : constant := 3 * 2 ** TP_SHIFT;
+ function TP_SHIFT return Natural is
+ (if Config.Has_New_FDI_Source then 8 else 28);
+
+ function FDI_TX_CTL_TRAINING_PATTERN_MASK
+ return Word32 is (Shift_Left (3, TP_SHIFT));
+
+ function FDI_TX_CTL_TRAINING_PATTERN (TP : PCH.FDI.Training_Pattern)
+ return Word32 is
+ (case TP is
+ when TP_1 => Shift_Left (0, TP_SHIFT),
+ when TP_2 => Shift_Left (1, TP_SHIFT),
+ when TP_Idle => Shift_Left (2, TP_SHIFT),
+ when TP_None => Shift_Left (3, TP_SHIFT));
subtype FDI_TX_CTL_VP_T is Natural range 0 .. 3;
type Vswing_Preemph_Values is array (FDI_TX_CTL_VP_T) of Word32;
@@ -88,7 +97,7 @@
Mask_Set => FDI_TX_CTL_FDI_TX_ENABLE or
FDI_TX_CTL_VSWING_PREEMPH (VP2 / 2) or
FDI_TX_CTL_AUTO_TRAIN_ENABLE or
- FDI_TX_CTL_TRAINING_PATTERN_1);
+ FDI_TX_CTL_TRAINING_PATTERN (TP_1));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
PCH.FDI.Auto_Train (PCH_FDI_Port);
@@ -109,7 +118,7 @@
Mask_Unset => FDI_TX_CTL_FDI_TX_ENABLE or
FDI_TX_CTL_AUTO_TRAIN_ENABLE or
FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_1);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_1));
PCH.FDI.Off (PCH_FDI_Port, PCH.FDI.Rx_Off);
end loop;
@@ -149,19 +158,19 @@
FDI_TX_CTL_TRAINING_PATTERN_MASK,
Mask_Set => FDI_TX_CTL_FDI_TX_ENABLE or
FDI_TX_CTL_VSWING_PREEMPH (VP2 / 2) or
- FDI_TX_CTL_TRAINING_PATTERN_1);
+ FDI_TX_CTL_TRAINING_PATTERN (TP_1));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
- PCH.FDI.Train (PCH_FDI_Port, PCH.FDI.TP_1, Success);
+ PCH.FDI.Train (PCH_FDI_Port, TP_1, Success);
if Success then
Registers.Unset_And_Set_Mask
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_2);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_2));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
- PCH.FDI.Train (PCH_FDI_Port, PCH.FDI.TP_2, Success);
+ PCH.FDI.Train (PCH_FDI_Port, TP_2, Success);
end if;
exit when Success;
@@ -169,7 +178,7 @@
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_FDI_TX_ENABLE or
FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_1);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_1));
PCH.FDI.Off (PCH_FDI_Port, PCH.FDI.Rx_Off);
end loop;
@@ -178,10 +187,10 @@
Registers.Unset_And_Set_Mask
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_NORMAL);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_None));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
- PCH.FDI.Train (PCH_FDI_Port, PCH.FDI.TP_None, Success);
+ PCH.FDI.Train (PCH_FDI_Port, TP_None, Success);
else
Registers.Unset_Mask
(Register => TX_CTL (Port_Cfg.Port),
@@ -219,35 +228,35 @@
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_TRAINING_PATTERN_MASK,
Mask_Set => FDI_TX_CTL_FDI_TX_ENABLE or
- FDI_TX_CTL_TRAINING_PATTERN_1);
+ FDI_TX_CTL_TRAINING_PATTERN (TP_1));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
- PCH.FDI.Train (PCH_FDI_Port, PCH.FDI.TP_1, Success);
+ PCH.FDI.Train (PCH_FDI_Port, TP_1, Success);
if Success then
Registers.Unset_And_Set_Mask
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_2);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_2));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
- PCH.FDI.Train (PCH_FDI_Port, PCH.FDI.TP_2, Success);
+ PCH.FDI.Train (PCH_FDI_Port, TP_2, Success);
end if;
if Success then
Registers.Unset_And_Set_Mask
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_NORMAL);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_None));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
- PCH.FDI.Train (PCH_FDI_Port, PCH.FDI.TP_None, Success);
+ PCH.FDI.Train (PCH_FDI_Port, TP_None, Success);
else
Registers.Unset_And_Set_Mask
(Register => TX_CTL (Port_Cfg.Port),
Mask_Unset => FDI_TX_CTL_FDI_TX_ENABLE or
FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_1);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_1));
PCH.FDI.Off (PCH_FDI_Port, PCH.FDI.Rx_Off);
Registers.Unset_Mask
@@ -293,7 +302,7 @@
FDI_TX_CTL_ENHANCED_FRAMING_ENABLE or
FDI_TX_CTL_FDI_PLL_ENABLE or
Composite_Sel or
- FDI_TX_CTL_TRAINING_PATTERN_1);
+ FDI_TX_CTL_TRAINING_PATTERN (TP_1));
Registers.Posting_Read (TX_CTL (Port_Cfg.Port));
Time.U_Delay (100);
end Pre_On;
@@ -327,7 +336,7 @@
Mask_Unset => FDI_TX_CTL_FDI_TX_ENABLE or
FDI_TX_CTL_AUTO_TRAIN_ENABLE or
FDI_TX_CTL_TRAINING_PATTERN_MASK,
- Mask_Set => FDI_TX_CTL_TRAINING_PATTERN_1);
+ Mask_Set => FDI_TX_CTL_TRAINING_PATTERN (TP_1));
PCH.FDI.Off (PCH_FDI_Port, PCH.FDI.Rx_Off);