<p>Nico Huber has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/22708">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gma registers: Add procedures to set fence registers<br><br>Through fence registers, we can tell the hardware which parts of the<br>aperture cover tiled framebuffers. Only legacy X and Y tiling is sup-<br>ported. According to `i915_reg.h` there are 16 fence registers from<br>G4x on and 32 from Ivy Bridge on (this only partially matches docu-<br>mentation: Haswell has 16 regs documented and the fence registers<br>were not documented at all before).<br><br>Change-Id: I02edc99b315e24dc175c6f93aff627e59cb1ff0b<br>Signed-off-by: Nico Huber <nico.huber@secunet.com><br>---<br>M common/hw-gfx-gma-config.ads.template<br>M common/hw-gfx-gma-registers.adb<br>M common/hw-gfx-gma-registers.ads<br>M common/hw-gfx.ads<br>4 files changed, 90 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/08/22708/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template<br>index e82b133..252b023 100644<br>--- a/common/hw-gfx-gma-config.ads.template<br>+++ b/common/hw-gfx-gma-config.ads.template<br>@@ -287,4 +287,12 @@<br>                                     when Ironlake .. Haswell   => 4,<br>                                     when Broadwell .. Skylake  => 8);<br> <br>+   Fence_Base : constant := (case CPU is<br>+                              when Ironlake                 => 16#0000_3000#,<br>+                              when Sandybridge .. Skylake   => 16#0010_0000#);<br>+<br>+   Fence_Count : constant := (case CPU is<br>+                                 when Ironlake .. Sandybridge  => 16,<br>+                                 when Ivybridge .. Skylake     => 32);<br>+<br> end HW.GFX.GMA.Config;<br>diff --git a/common/hw-gfx-gma-registers.adb b/common/hw-gfx-gma-registers.adb<br>index 4a22564..94965d5 100644<br>--- a/common/hw-gfx-gma-registers.adb<br>+++ b/common/hw-gfx-gma-registers.adb<br>@@ -61,19 +61,84 @@<br> <br>    ----------------------------------------------------------------------------<br> <br>+   subtype Fence_Range is Registers_Range range 0 .. Config.Fence_Count - 1;<br>+<br>+   FENCE_PAGE_SHIFT                    : constant := 12;<br>+   FENCE_PAGE_MASK                     : constant := 16#ffff_f000#;<br>+   FENCE_TILE_WALK_YMAJOR              : constant := 1 * 2 ** 1;<br>+   FENCE_VALID                         : constant := 1 * 2 ** 0;<br>+<br>+   function Fence_Lower_Idx (Fence : Fence_Range) return Registers_Range is<br>+      (Config.Fence_Base / Register_Width + 2 * Fence);<br>+   function Fence_Upper_Idx (Fence : Fence_Range) return Registers_Range is<br>+      (Fence_Lower_Idx (Fence) + 1);<br>+<br>    procedure Clear_Fences<br>    is<br>-      Fence_Regs_Base : constant :=<br>-        (case Config.CPU is<br>-            when Ironlake                 => 16#00_3000#,<br>-            when Sandybridge .. Skylake   => 16#10_0000#);<br>-      subtype Fence_Range is Registers_Range range 0 .. 63;<br>    begin<br>-      for Idx in Fence_Range loop<br>-         Regs.Write (Fence_Regs_Base / Register_Width + Idx, 0);<br>+      for Fence in Fence_Range loop<br>+         Regs.Write (Fence_Lower_Idx (Fence), 0);<br>       end loop;<br>    end Clear_Fences;<br> <br>+   procedure Add_Fence<br>+     (First_Page  : in     GTT_Range;<br>+      Last_Page   : in     GTT_Range;<br>+      Tiling      : in     XY_Tiling;<br>+      Pitch       : in     Natural;<br>+      Success     :    out Boolean)<br>+   is<br>+      Y_Tiles : constant Boolean := Tiling = Y_Tiled;<br>+      Reg32 : Word32;<br>+   begin<br>+      pragma Debug (Debug.Put (GNAT.Source_Info.Enclosing_Entity & ": "));<br>+      pragma Debug (Debug.Put_Word32 (Shift_Left (Word32 (First_Page), 12)));<br>+      pragma Debug (Debug.Put (":"));<br>+      pragma Debug (Debug.Put_Word32 (Shift_Left (Word32 (Last_Page), 12)));<br>+      pragma Debug (not Y_Tiles, Debug.Put (" X tiled in "));<br>+      pragma Debug (    Y_Tiles, Debug.Put (" Y tiled in "));<br>+      pragma Debug (Debug.Put_Int32 (Int32 (Pitch)));<br>+      pragma Debug (Debug.Put_Line (" tiles per row."));<br>+<br>+      Success := False;<br>+      for Fence in Fence_Range loop<br>+         Regs.Read (Reg32, Fence_Lower_Idx (Fence));<br>+         if (Reg32 and FENCE_VALID) = 0 then<br>+            Regs.Write<br>+              (Index => Fence_Lower_Idx (Fence),<br>+               Value => Shift_Left (Word32 (First_Page), FENCE_PAGE_SHIFT) or<br>+                        (if Y_Tiles then FENCE_TILE_WALK_YMAJOR else 0) or<br>+                        FENCE_VALID);<br>+            Regs.Write<br>+              (Index => Fence_Upper_Idx (Fence),<br>+               Value => Shift_Left (Word32 (Last_Page), FENCE_PAGE_SHIFT) or<br>+                        Word32 (Pitch) * (if Y_Tiles then 1 else 4) - 1);<br>+            Success := True;<br>+            exit;<br>+         end if;<br>+      end loop;<br>+   end Add_Fence;<br>+<br>+   procedure Remove_Fence (First_Page, Last_Page : GTT_Range)<br>+   is<br>+      Page_Lower : constant Word32 :=<br>+         Shift_Left (Word32 (First_Page), FENCE_PAGE_SHIFT);<br>+      Page_Upper : constant Word32 :=<br>+         Shift_Left (Word32 (Last_Page), FENCE_PAGE_SHIFT);<br>+      Fence_Upper, Fence_Lower : Word32;<br>+   begin<br>+      for Fence in Fence_Range loop<br>+         Regs.Read (Fence_Lower, Fence_Lower_Idx (Fence));<br>+         Regs.Read (Fence_Upper, Fence_Upper_Idx (Fence));<br>+         if (Fence_Lower and FENCE_PAGE_MASK) = Page_Lower and<br>+            (Fence_Upper and FENCE_PAGE_MASK) = Page_Upper<br>+         then<br>+            Regs.Write (Fence_Lower_Idx (Fence), 0);<br>+            exit;<br>+         end if;<br>+      end loop;<br>+   end Remove_Fence;<br>+<br>    ----------------------------------------------------------------------------<br> <br>    procedure Write_GTT<br>diff --git a/common/hw-gfx-gma-registers.ads b/common/hw-gfx-gma-registers.ads<br>index 2a01aab..87c8069 100644<br>--- a/common/hw-gfx-gma-registers.ads<br>+++ b/common/hw-gfx-gma-registers.ads<br>@@ -1531,6 +1531,15 @@<br> <br>    procedure Clear_Fences;<br> <br>+   procedure Add_Fence<br>+     (First_Page  : in     GTT_Range;<br>+      Last_Page   : in     GTT_Range;<br>+      Tiling      : in     XY_Tiling;<br>+      Pitch       : in     Natural;<br>+      Success     :    out Boolean);<br>+<br>+   procedure Remove_Fence (First_Page, Last_Page : GTT_Range);<br>+<br>    pragma Warnings (Off, "declaration of ""Write_GTT"" hides one at *");<br>    procedure Write_GTT<br>      (GTT_Page       : GTT_Range;<br>diff --git a/common/hw-gfx.ads b/common/hw-gfx.ads<br>index ae19235..c5d9631 100644<br>--- a/common/hw-gfx.ads<br>+++ b/common/hw-gfx.ads<br>@@ -28,6 +28,7 @@<br>    subtype BPC_Type    is Int64 range Auto_BPC .. 16;<br> <br>    type Tiling_Type is (Linear, X_Tiled, Y_Tiled);<br>+   subtype XY_Tiling is Tiling_Type range X_Tiled .. Y_Tiled;<br> <br>    type Framebuffer_Type is<br>    record<br></pre><p>To view, visit <a href="https://review.coreboot.org/22708">change 22708</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/22708"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libgfxinit </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I02edc99b315e24dc175c6f93aff627e59cb1ff0b </div>
<div style="display:none"> Gerrit-Change-Number: 22708 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Nico Huber <nico.h@gmx.de> </div>