diff --git a/common/haswell/hw-gfx-gma-pch-lynxpoint.adb b/common/haswell/hw-gfx-gma-pch-lynxpoint.adb
new file mode 100644
index 0000000..9a89a58
--- /dev/null
+++ b/common/haswell/hw-gfx-gma-pch-lynxpoint.adb
@@ -0,0 +1,177 @@
+--
+-- Copyright (C) 2020 Angel Pons <th3fanbus@gmail.com>
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 2 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+
+with HW.GFX.GMA.Config;
+with HW.GFX.GMA.Registers;
+with HW.GFX.GMA.PCH.Sideband;
+
+with HW.Debug;
+with GNAT.Source_Info;
+
+package body HW.GFX.GMA.PCH.Lynxpoint is
+
+   FDI_MPHY_IOSFSB_RESET_CTL     : constant := 1 * 2 ** 12;
+   FDI_MPHY_IOSFSB_RESET_STATUS  : constant := 1 * 2 ** 13;
+
+   procedure Reset_FDI_mPHY is
+   begin
+      Registers.Set_Mask
+        (Register => Registers.QUIRK_C2004,
+         Mask     => FDI_MPHY_IOSFSB_RESET_CTL);
+
+      Registers.Wait_Set_Mask
+        (Register => Registers.QUIRK_C2004,
+         Mask     => FDI_MPHY_IOSFSB_RESET_STATUS,
+         TOut_MS  => 1); -- 100 us
+
+      Registers.Unset_Mask
+        (Register => Registers.QUIRK_C2004,
+         Mask     => FDI_MPHY_IOSFSB_RESET_CTL);
+
+      Registers.Wait_Unset_Mask
+        (Register => Registers.QUIRK_C2004,
+         Mask     => FDI_MPHY_IOSFSB_RESET_STATUS,
+         TOut_MS  => 1); -- 100 us
+   end Reset_FDI_mPHY;
+
+   -- WaMPhyProgramming:hsw
+   procedure Program_FDI_mPHY
+   is
+      use Sideband;
+      subtype Bit_Index is Natural range 0 .. Word32'Size - 1;
+
+      procedure mPHY_Update_Field
+        (High_Bit : in Bit_Index;
+         Low_Bit  : in Bit_Index;
+         Value    : in Word32;
+         Register : in Register_Type)
+      with
+         Pre => High_Bit >= Low_Bit
+      is
+      begin
+         Unset_And_Set_Mask
+           (Dest       => SBI_MPHY,
+            Register   => Register,
+            Mask_Unset => 2 ** (High_Bit + 1) - 2 ** Low_Bit,
+            Mask_Set   => Value * 2 ** Low_Bit);
+      end mPHY_Update_Field;
+
+      procedure mPHY_Update_Lanes
+        (High_Bit    : in Bit_Index;
+         Low_Bit     : in Bit_Index;
+         Value       : in Word32;
+         Reg_Lane_0  : in Register_Type;
+         Reg_Lane_1  : in Register_Type)
+      with
+         Pre => High_Bit >= Low_Bit
+      is
+      begin
+         mPHY_Update_Field (High_Bit, Low_Bit, Value, Reg_Lane_0);
+         mPHY_Update_Field (High_Bit, Low_Bit, Value, Reg_Lane_1);
+      end mPHY_Update_Lanes;
+   begin
+      mPHY_Update_Field (31, 24, 16#12#, SBI_MPHY_8008);
+      mPHY_Update_Lanes (11, 11,      1, SBI_MPHY_2008, SBI_MPHY_2108);
+      mPHY_Update_Lanes (24, 24,      1, SBI_MPHY_206C, SBI_MPHY_216C);
+      mPHY_Update_Lanes (21, 21,      1, SBI_MPHY_206C, SBI_MPHY_216C);
+      mPHY_Update_Lanes (18, 18,      1, SBI_MPHY_206C, SBI_MPHY_216C);
+      mPHY_Update_Lanes (15, 13, 16#05#, SBI_MPHY_2080, SBI_MPHY_2180);
+      mPHY_Update_Lanes ( 7,  0, 16#1c#, SBI_MPHY_208C, SBI_MPHY_218C);
+      mPHY_Update_Lanes (23, 16, 16#1c#, SBI_MPHY_2098, SBI_MPHY_2198);
+      mPHY_Update_Lanes (27, 27,      1, SBI_MPHY_20C4, SBI_MPHY_21C4);
+      mPHY_Update_Lanes (31, 28, 16#04#, SBI_MPHY_20EC, SBI_MPHY_21EC);
+   end Program_FDI_mPHY;
+
+   ----------------------------------------------------------------------------
+
+   SBI_SSCCTL_DISABLE               : constant := 1 * 2 **  0;
+   SBI_SSCCTL_PATHALT               : constant := 1 * 2 **  3;
+   SBI_GEN0_CFG_BUFFENABLE_DISABLE  : constant := 1 * 2 **  0;
+
+   procedure Enable_Clkout_DP_And_FDI_mPHY is
+   begin
+      pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
+
+      Sideband.Unset_And_Set_Mask
+        (Dest        => Sideband.SBI_ICLK,
+         Register    => Sideband.SBI_SSCCTL,
+         Mask_Unset  => SBI_SSCCTL_DISABLE,
+         Mask_Set    => SBI_SSCCTL_PATHALT);
+
+      Time.U_Delay (24);
+
+      Sideband.Unset_Mask
+        (Dest     => Sideband.SBI_ICLK,
+         Register => Sideband.SBI_SSCCTL,
+         Mask     => SBI_SSCCTL_PATHALT);
+
+      Reset_FDI_mPHY;
+      Program_FDI_mPHY;
+
+      Sideband.Set_Mask
+        (Dest     => Sideband.SBI_ICLK,
+         Register => (if Config.Is_LP then Sideband.SBI_GEN0 else Sideband.SBI_DBUFF0),
+         Mask     => SBI_GEN0_CFG_BUFFENABLE_DISABLE);
+   end Enable_Clkout_DP_And_FDI_mPHY;
+
+   procedure Disable_Clkout_DP
+   is
+      function Is_Mask_Set (Value, Mask : Word32) return Boolean is
+        ((Value and Mask) = Mask);
+      SSC_Ctl  : Word32;
+   begin
+      pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
+
+      Sideband.Unset_Mask
+        (Dest     => Sideband.SBI_ICLK,
+         Register => (if Config.Is_LP then Sideband.SBI_GEN0 else Sideband.SBI_DBUFF0),
+         Mask     => SBI_GEN0_CFG_BUFFENABLE_DISABLE);
+
+      Sideband.Read
+        (Dest     => Sideband.SBI_ICLK,
+         Register => Sideband.SBI_SSCCTL,
+         Value    => SSC_Ctl);
+
+      if not Is_Mask_Set (SSC_Ctl, SBI_SSCCTL_DISABLE) then
+         if not Is_Mask_Set (SSC_Ctl, SBI_SSCCTL_PATHALT) then
+            Sideband.Set_Mask
+              (Dest     => Sideband.SBI_ICLK,
+               Register => Sideband.SBI_SSCCTL,
+               Mask     => SBI_SSCCTL_PATHALT);
+            Time.U_Delay (32);
+         end if;
+         Sideband.Set_Mask
+           (Dest     => Sideband.SBI_ICLK,
+            Register => Sideband.SBI_SSCCTL,
+            Mask     => SBI_SSCCTL_DISABLE);
+      end if;
+   end Disable_Clkout_DP;
+
+   procedure Unbend_Clkout_DP is
+   begin
+      pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
+
+      Sideband.Write
+        (Dest     => Sideband.SBI_ICLK,
+         Register => Sideband.SBI_SSCDITHPHASE,
+         Value    => 0);
+
+      Sideband.Unset_And_Set_Mask
+        (Dest        => Sideband.SBI_ICLK,
+         Register    => Sideband.SBI_SSCDIVINTPHASE,
+         Mask_Unset  => 16#ffff#,
+         Mask_Set    => 16#0025#);
+   end Unbend_Clkout_DP;
+
+end HW.GFX.GMA.PCH.Lynxpoint;
