gma: Program PCH_RAWCLK_FREQ register
This seems to be a scratchpad register to tell later drivers which
frequency the platform uses. Linux reads this but never writes the
register.
Change-Id: I55af7c7b675da580c7f52d9997262b232019132c
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/17071
Tested-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template
index 4f374fd..cba1396 100644
--- a/common/hw-gfx-gma-config.ads.template
+++ b/common/hw-gfx-gma-config.ads.template
@@ -203,4 +203,18 @@
when Sandybridge => Full_Training,
when others => Auto_Training);
+ ----------------------------------------------------------------------------
+
+ Default_RawClk_Freq : constant Frequency_Type :=
+ (case CPU is
+ when Ironlake |
+ Sandybridge |
+ Ivybridge => 125_000_000,
+ when Haswell |
+ Broadwell => (if CPU_Var = Normal then
+ 125_000_000
+ else
+ 24_000_000),
+ when Skylake => 24_000_000);
+
end HW.GFX.GMA.Config;
diff --git a/common/hw-gfx-gma-registers.ads b/common/hw-gfx-gma-registers.ads
index d42d4bb..1633bac 100644
--- a/common/hw-gfx-gma-registers.ads
+++ b/common/hw-gfx-gma-registers.ads
@@ -349,7 +349,7 @@
PCH_FPB0,
PCH_FPB1,
PCH_DREF_CONTROL,
- RAWCLK_FREQ,
+ PCH_RAWCLK_FREQ,
PCH_DPLL_SEL,
PCH_PP_STATUS,
PCH_PP_CONTROL,
@@ -1014,7 +1014,7 @@
TRANS_VSYNCSHIFT_A => 16#0e_0028# / Register_Width,
TRANS_VSYNCSHIFT_B => 16#0e_1028# / Register_Width,
TRANS_VSYNCSHIFT_C => 16#0e_2028# / Register_Width,
- RAWCLK_FREQ => 16#0c_6204# / Register_Width,
+ PCH_RAWCLK_FREQ => 16#0c_6204# / Register_Width,
QUIRK_C2004 => 16#0c_2004# / Register_Width);
subtype Registers_Index is Registers_Invalid_Index range
diff --git a/common/hw-gfx-gma.adb b/common/hw-gfx-gma.adb
index 9e3bee9..416117b 100644
--- a/common/hw-gfx-gma.adb
+++ b/common/hw-gfx-gma.adb
@@ -78,6 +78,16 @@
----------------------------------------------------------------------------
+ PCH_RAWCLK_FREQ_MASK : constant := 16#3ff# * 2 ** 0;
+
+ function PCH_RAWCLK_FREQ (Freq : Frequency_Type) return Word32
+ is
+ begin
+ return Word32 (Freq / 1_000_000);
+ end PCH_RAWCLK_FREQ;
+
+ ----------------------------------------------------------------------------
+
function To_GPU_Port
(Configs : Configs_Type;
Idx : Config_Index)
@@ -712,6 +722,11 @@
-------------------- Now restart from a clean state ---------------------
Power_And_Clocks.Initialize;
+ Registers.Unset_And_Set_Mask
+ (Register => Registers.PCH_RAWCLK_FREQ,
+ Mask_Unset => PCH_RAWCLK_FREQ_MASK,
+ Mask_Set => PCH_RAWCLK_FREQ (Config.Default_RawClk_Freq));
+
Initialized := True;
end Initialize;
diff --git a/common/hw-gfx.ads b/common/hw-gfx.ads
index 8c1fcf7..b9d7225 100644
--- a/common/hw-gfx.ads
+++ b/common/hw-gfx.ads
@@ -42,7 +42,7 @@
Stride => 1,
Offset => 0);
- subtype Frequency_Type is Pos64 range 25_000_000 .. 600_000_000;
+ subtype Frequency_Type is Pos64 range 24_000_000 .. 600_000_000;
type DP_Lane_Count is (DP_Lane_Count_1, DP_Lane_Count_2, DP_Lane_Count_4);
subtype DP_Lane_Count_Type is Pos64 range 1 .. 4;