<p>Nico Huber has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27154">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gma pipe setup: Fix secondary pipe cursors <= Sandy Bridge<br><br>The secondary cursor registers used to have a different offset.<br><br>Change-Id: I4d79f59a8cb693d73d6da666525f091021efb4fd<br>Signed-off-by: Nico Huber <nico.h@gmx.de><br>---<br>M common/hw-gfx-gma-config.ads.template<br>M common/hw-gfx-gma-pipe_setup.adb<br>M common/hw-gfx-gma-pipe_setup.ads<br>M common/hw-gfx-gma-registers.ads<br>M common/hw-gfx-gma.ads<br>5 files changed, 81 insertions(+), 35 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/54/27154/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template</span><br><span>index c4f68ea..f7eb59d 100644</span><br><span>--- a/common/hw-gfx-gma-config.ads.template</span><br><span>+++ b/common/hw-gfx-gma-config.ads.template</span><br><span>@@ -151,7 +151,7 @@</span><br><span>    Has_Plane_Control             : <genbool> := Broxton_On;</span><br><span>    Has_DSP_Linoff                : <genbool> := Up_To_Ironlake;</span><br><span>    Has_PF_Pipe_Select            : <ilkhswbool> := CPU_Ivybridge or CPU_Haswell;</span><br><span style="color: hsl(0, 100%, 40%);">-   Has_Cursor_FBC_Control        : <ilkbool> := Ivybridge_On;</span><br><span style="color: hsl(120, 100%, 40%);">+   Has_Ivybridge_Cursors         : <ilkbool> := Ivybridge_On;</span><br><span>    VGA_Plane_Workaround          : <ilkbool> := CPU_Ivybridge;</span><br><span>    Has_GMCH_DP_Transcoder        : <genbool> := Gen_G45;</span><br><span>    Has_GMCH_VGACNTRL             : <genbool> := Gen_G45;</span><br><span>diff --git a/common/hw-gfx-gma-pipe_setup.adb b/common/hw-gfx-gma-pipe_setup.adb</span><br><span>index 656eb13..93b5e05 100644</span><br><span>--- a/common/hw-gfx-gma-pipe_setup.adb</span><br><span>+++ b/common/hw-gfx-gma-pipe_setup.adb</span><br><span>@@ -15,7 +15,6 @@</span><br><span> with HW.Debug;</span><br><span> with GNAT.Source_Info;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-with HW.GFX.GMA.Config;</span><br><span> with HW.GFX.GMA.Transcoder;</span><br><span> </span><br><span> package body HW.GFX.GMA.Pipe_Setup is</span><br><span>@@ -352,7 +351,7 @@</span><br><span>       -- on some platforms writing CUR_CTL disables self-arming of CUR_POS</span><br><span>       -- so keep it first</span><br><span>       Registers.Write</span><br><span style="color: hsl(0, 100%, 40%);">-        (Register => Controllers (Pipe).CUR_CTL,</span><br><span style="color: hsl(120, 100%, 40%);">+        (Register => Cursors (Pipe).CTL,</span><br><span>          Value    => CUR_CTL_PIPE_SELECT (Pipe) or</span><br><span>                      CUR_CTL_MODE (Cursor.Mode, Cursor.Size));</span><br><span>       Place_Cursor (Pipe, FB, Cursor);</span><br><span>@@ -376,11 +375,11 @@</span><br><span>          Y := -Width;</span><br><span>       end if;</span><br><span>       Registers.Write</span><br><span style="color: hsl(0, 100%, 40%);">-        (Register => Controllers (Pipe).CUR_POS,</span><br><span style="color: hsl(120, 100%, 40%);">+        (Register => Cursors (Pipe).POS,</span><br><span>          Value    => CUR_POS_Y (Y) or CUR_POS_X (X));</span><br><span>       -- write to CUR_BASE always arms other CUR_* registers</span><br><span>       Registers.Write</span><br><span style="color: hsl(0, 100%, 40%);">-        (Register => Controllers (Pipe).CUR_BASE,</span><br><span style="color: hsl(120, 100%, 40%);">+        (Register => Cursors (Pipe).BASE,</span><br><span>          Value    => Shift_Left (Word32 (Cursor.GTT_Offset), 12));</span><br><span>    end Place_Cursor;</span><br><span> </span><br><span>@@ -692,11 +691,13 @@</span><br><span> </span><br><span>    ----------------------------------------------------------------------------</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   procedure Planes_Off (Controller : Controller_Type) is</span><br><span style="color: hsl(120, 100%, 40%);">+   procedure Planes_Off (Controller : Controller_Type; CUR : Cursor_Regs)</span><br><span style="color: hsl(120, 100%, 40%);">+   is</span><br><span style="color: hsl(120, 100%, 40%);">+      use type Registers.Registers_Invalid_Index;</span><br><span>    begin</span><br><span style="color: hsl(0, 100%, 40%);">-      Registers.Write (Controller.CUR_CTL, 16#0000_0000#);</span><br><span style="color: hsl(0, 100%, 40%);">-      if Config.Has_Cursor_FBC_Control then</span><br><span style="color: hsl(0, 100%, 40%);">-         Registers.Write (Controller.CUR_FBC_CTL, 16#0000_0000#);</span><br><span style="color: hsl(120, 100%, 40%);">+      Registers.Write (CUR.CTL, 16#0000_0000#);</span><br><span style="color: hsl(120, 100%, 40%);">+      if CUR.FBC_CTL /= Registers.Invalid_Register then</span><br><span style="color: hsl(120, 100%, 40%);">+         Registers.Write (CUR.FBC_CTL, 16#0000_0000#);</span><br><span>       end if;</span><br><span>       Registers.Unset_Mask (Controller.SPCNTR, DSPCNTR_ENABLE);</span><br><span>       if Config.Has_Plane_Control then</span><br><span>@@ -713,7 +714,7 @@</span><br><span>    begin</span><br><span>       pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      Planes_Off (Controllers (Pipe));</span><br><span style="color: hsl(120, 100%, 40%);">+      Planes_Off (Controllers (Pipe), Cursors (Pipe));</span><br><span>       Transcoder.Off (Pipe);</span><br><span>       Panel_Fitter_Off (Controllers (Pipe));</span><br><span>       Transcoder.Clk_Off (Pipe);</span><br><span>@@ -739,7 +740,7 @@</span><br><span>       Legacy_VGA_Off;</span><br><span> </span><br><span>       for Pipe in Pipe_Index loop</span><br><span style="color: hsl(0, 100%, 40%);">-         Planes_Off (Controllers (Pipe));</span><br><span style="color: hsl(120, 100%, 40%);">+         Planes_Off (Controllers (Pipe), Cursors (Pipe));</span><br><span>          Transcoder.Off (Pipe);</span><br><span>          Panel_Fitter_Off (Controllers (Pipe));</span><br><span>          Transcoder.Clk_Off (Pipe);</span><br><span>diff --git a/common/hw-gfx-gma-pipe_setup.ads b/common/hw-gfx-gma-pipe_setup.ads</span><br><span>index fe877ad..0edb0c9 100644</span><br><span>--- a/common/hw-gfx-gma-pipe_setup.ads</span><br><span>+++ b/common/hw-gfx-gma-pipe_setup.ads</span><br><span>@@ -12,6 +12,7 @@</span><br><span> -- GNU General Public License for more details.</span><br><span> --</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+with HW.GFX.GMA.Config;</span><br><span> with HW.GFX.GMA.Registers;</span><br><span> </span><br><span> use type HW.Int32;</span><br><span>@@ -78,10 +79,6 @@</span><br><span>          DSPSURF           : Registers.Registers_Index;</span><br><span>          DSPTILEOFF        : Registers.Registers_Index;</span><br><span>          SPCNTR            : Registers.Registers_Index;</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_CTL           : Registers.Registers_Index;</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_BASE          : Registers.Registers_Index;</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_POS           : Registers.Registers_Index;</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_FBC_CTL       : Registers.Registers_Index;</span><br><span>          -- Skylake registers (partially aliased)</span><br><span>          PLANE_CTL         : Registers.Registers_Index;</span><br><span>          PLANE_OFFSET      : Registers.Registers_Index;</span><br><span>@@ -117,10 +114,6 @@</span><br><span>          DSPSURF           => Registers.DSPASURF,</span><br><span>          DSPTILEOFF        => Registers.DSPATILEOFF,</span><br><span>          SPCNTR            => Registers.SPACNTR,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_CTL           => Registers.CUR_CTL_A,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_BASE          => Registers.CUR_BASE_A,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_POS           => Registers.CUR_POS_A,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_FBC_CTL       => Registers.CUR_FBC_CTL_A,</span><br><span>          PLANE_CTL         => Registers.DSPACNTR,</span><br><span>          PLANE_OFFSET      => Registers.DSPATILEOFF,</span><br><span>          PLANE_POS         => Registers.PLANE_POS_1_A,</span><br><span>@@ -166,10 +159,6 @@</span><br><span>          DSPSURF           => Registers.DSPBSURF,</span><br><span>          DSPTILEOFF        => Registers.DSPBTILEOFF,</span><br><span>          SPCNTR            => Registers.SPBCNTR,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_CTL           => Registers.CUR_CTL_B,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_BASE          => Registers.CUR_BASE_B,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_POS           => Registers.CUR_POS_B,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_FBC_CTL       => Registers.CUR_FBC_CTL_B,</span><br><span>          PLANE_CTL         => Registers.DSPBCNTR,</span><br><span>          PLANE_OFFSET      => Registers.DSPBTILEOFF,</span><br><span>          PLANE_POS         => Registers.PLANE_POS_1_B,</span><br><span>@@ -215,10 +204,6 @@</span><br><span>          DSPSURF           => Registers.DSPCSURF,</span><br><span>          DSPTILEOFF        => Registers.DSPCTILEOFF,</span><br><span>          SPCNTR            => Registers.SPCCNTR,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_CTL           => Registers.CUR_CTL_C,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_BASE          => Registers.CUR_BASE_C,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_POS           => Registers.CUR_POS_C,</span><br><span style="color: hsl(0, 100%, 40%);">-         CUR_FBC_CTL       => Registers.CUR_FBC_CTL_C,</span><br><span>          PLANE_CTL         => Registers.DSPCCNTR,</span><br><span>          PLANE_OFFSET      => Registers.DSPCTILEOFF,</span><br><span>          PLANE_POS         => Registers.PLANE_POS_1_C,</span><br><span>@@ -252,4 +237,40 @@</span><br><span>                               Registers.CUR_WM_C_6,</span><br><span>                               Registers.CUR_WM_C_7)));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   type Cursor_Regs is record</span><br><span style="color: hsl(120, 100%, 40%);">+      CTL      : Registers.Registers_Index;</span><br><span style="color: hsl(120, 100%, 40%);">+      BASE     : Registers.Registers_Index;</span><br><span style="color: hsl(120, 100%, 40%);">+      POS      : Registers.Registers_Index;</span><br><span style="color: hsl(120, 100%, 40%);">+      FBC_CTL  : Registers.Registers_Invalid_Index;</span><br><span style="color: hsl(120, 100%, 40%);">+   end record;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   function Cursors (Pipe : Pipe_Index) return Cursor_Regs is</span><br><span style="color: hsl(120, 100%, 40%);">+     (if not Config.Has_Ivybridge_Cursors then</span><br><span style="color: hsl(120, 100%, 40%);">+        (if Pipe = Primary then</span><br><span style="color: hsl(120, 100%, 40%);">+           (CTL      => Registers.CURACNTR,</span><br><span style="color: hsl(120, 100%, 40%);">+            BASE     => Registers.CURABASE,</span><br><span style="color: hsl(120, 100%, 40%);">+            POS      => Registers.CURAPOS,</span><br><span style="color: hsl(120, 100%, 40%);">+            FBC_CTL  => Registers.Invalid_Register)</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+           (CTL      => Registers.CURBCNTR,</span><br><span style="color: hsl(120, 100%, 40%);">+            BASE     => Registers.CURBBASE,</span><br><span style="color: hsl(120, 100%, 40%);">+            POS      => Registers.CURBPOS,</span><br><span style="color: hsl(120, 100%, 40%);">+            FBC_CTL  => Registers.Invalid_Register))</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+        (if Pipe = Primary then</span><br><span style="color: hsl(120, 100%, 40%);">+           (CTL      => Registers.CUR_CTL_A,</span><br><span style="color: hsl(120, 100%, 40%);">+            BASE     => Registers.CUR_BASE_A,</span><br><span style="color: hsl(120, 100%, 40%);">+            POS      => Registers.CUR_POS_A,</span><br><span style="color: hsl(120, 100%, 40%);">+            FBC_CTL  => Registers.CUR_FBC_CTL_A)</span><br><span style="color: hsl(120, 100%, 40%);">+         elsif Pipe = Secondary then</span><br><span style="color: hsl(120, 100%, 40%);">+           (CTL      => Registers.CUR_CTL_B,</span><br><span style="color: hsl(120, 100%, 40%);">+            BASE     => Registers.CUR_BASE_B,</span><br><span style="color: hsl(120, 100%, 40%);">+            POS      => Registers.CUR_POS_B,</span><br><span style="color: hsl(120, 100%, 40%);">+            FBC_CTL  => Registers.CUR_FBC_CTL_B)</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+           (CTL      => Registers.CUR_CTL_C,</span><br><span style="color: hsl(120, 100%, 40%);">+            BASE     => Registers.CUR_BASE_C,</span><br><span style="color: hsl(120, 100%, 40%);">+            POS      => Registers.CUR_POS_C,</span><br><span style="color: hsl(120, 100%, 40%);">+            FBC_CTL  => Registers.CUR_FBC_CTL_C)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> end HW.GFX.GMA.Pipe_Setup;</span><br><span>diff --git a/common/hw-gfx-gma-registers.ads b/common/hw-gfx-gma-registers.ads</span><br><span>index ac0f023..5cffe76 100644</span><br><span>--- a/common/hw-gfx-gma-registers.ads</span><br><span>+++ b/common/hw-gfx-gma-registers.ads</span><br><span>@@ -473,6 +473,9 @@</span><br><span>       CUR_BASE_A,</span><br><span>       CUR_POS_A,</span><br><span>       CUR_FBC_CTL_A,</span><br><span style="color: hsl(120, 100%, 40%);">+      CURBCNTR,</span><br><span style="color: hsl(120, 100%, 40%);">+      CURBBASE,</span><br><span style="color: hsl(120, 100%, 40%);">+      CURBPOS,</span><br><span>       CUR_WM_A_0,</span><br><span>       CUR_WM_A_1,</span><br><span>       CUR_WM_A_2,</span><br><span>@@ -927,6 +930,9 @@</span><br><span>       PS_CTRL_2_B           => 16#06_8a80# / Register_Width,</span><br><span> </span><br><span>       -- cursor control</span><br><span style="color: hsl(120, 100%, 40%);">+      CURBCNTR              => 16#07_00c0# / Register_Width,   -- <= SNB</span><br><span style="color: hsl(120, 100%, 40%);">+      CURBBASE              => 16#07_00c4# / Register_Width,   -- <= SNB</span><br><span style="color: hsl(120, 100%, 40%);">+      CURBPOS               => 16#07_00c8# / Register_Width,   -- <= SNB</span><br><span>       CUR_CTL_B             => 16#07_1080# / Register_Width,</span><br><span>       CUR_BASE_B            => 16#07_1084# / Register_Width,</span><br><span>       CUR_POS_B             => 16#07_1088# / Register_Width,</span><br><span>@@ -1632,6 +1638,9 @@</span><br><span>    GMCH_ADPA            : constant Registers_Index := FDI_TX_CTL_B;</span><br><span>    GMCH_HDMIB           : constant Registers_Index := GMCH_SDVOB;</span><br><span>    GMCH_HDMIC           : constant Registers_Index := GMCH_SDVOC;</span><br><span style="color: hsl(120, 100%, 40%);">+   CURACNTR             : constant Registers_Index := CUR_CTL_A;</span><br><span style="color: hsl(120, 100%, 40%);">+   CURABASE             : constant Registers_Index := CUR_BASE_A;</span><br><span style="color: hsl(120, 100%, 40%);">+   CURAPOS              : constant Registers_Index := CUR_POS_A;</span><br><span> </span><br><span>    ---------------------------------------------------------------------------</span><br><span> </span><br><span>diff --git a/common/hw-gfx-gma.ads b/common/hw-gfx-gma.ads</span><br><span>index 3804cd4..d1acc69 100644</span><br><span>--- a/common/hw-gfx-gma.ads</span><br><span>+++ b/common/hw-gfx-gma.ads</span><br><span>@@ -126,12 +126,19 @@</span><br><span>          Proof_In => (Init_State)),</span><br><span>       Pre => Is_Initialized;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   pragma Warnings (GNATprove, Off, "no check message justified by this",</span><br><span style="color: hsl(120, 100%, 40%);">+                    Reason => "see Annotate aspects.");</span><br><span>    procedure Update_Cursor (Pipe : Pipe_Index; Cursor : Cursor_Type)</span><br><span>    with</span><br><span>       Global =></span><br><span style="color: hsl(0, 100%, 40%);">-        (In_Out => (State, Device_State),</span><br><span style="color: hsl(120, 100%, 40%);">+        (Input => (Config_State),</span><br><span style="color: hsl(120, 100%, 40%);">+         In_Out => (State, Device_State),</span><br><span>          Proof_In => (Init_State)),</span><br><span style="color: hsl(0, 100%, 40%);">-      Pre => Is_Initialized;</span><br><span style="color: hsl(120, 100%, 40%);">+      Pre => Is_Initialized,</span><br><span style="color: hsl(120, 100%, 40%);">+      Annotate =></span><br><span style="color: hsl(120, 100%, 40%);">+        (GNATprove, Intentional,</span><br><span style="color: hsl(120, 100%, 40%);">+         "global input ""GMA.Config_State"" of ""Update_Cursor"" not read",</span><br><span style="color: hsl(120, 100%, 40%);">+         "Reading of Config_State depends on the platform configuration.");</span><br><span> </span><br><span>    procedure Place_Cursor</span><br><span>      (Pipe : Pipe_Index;</span><br><span>@@ -139,9 +146,14 @@</span><br><span>       Y : Cursor_Pos)</span><br><span>    with</span><br><span>       Global =></span><br><span style="color: hsl(0, 100%, 40%);">-        (In_Out => (State, Device_State),</span><br><span style="color: hsl(120, 100%, 40%);">+        (Input => (Config_State),</span><br><span style="color: hsl(120, 100%, 40%);">+         In_Out => (State, Device_State),</span><br><span>          Proof_In => (Init_State)),</span><br><span style="color: hsl(0, 100%, 40%);">-      Pre => Is_Initialized;</span><br><span style="color: hsl(120, 100%, 40%);">+      Pre => Is_Initialized,</span><br><span style="color: hsl(120, 100%, 40%);">+      Annotate =></span><br><span style="color: hsl(120, 100%, 40%);">+        (GNATprove, Intentional,</span><br><span style="color: hsl(120, 100%, 40%);">+         "global input ""GMA.Config_State"" of ""Place_Cursor"" not read",</span><br><span style="color: hsl(120, 100%, 40%);">+         "Reading of Config_State depends on the platform configuration.");</span><br><span> </span><br><span>    procedure Move_Cursor</span><br><span>      (Pipe : Pipe_Index;</span><br><span>@@ -149,9 +161,14 @@</span><br><span>       Y : Cursor_Pos)</span><br><span>    with</span><br><span>       Global =></span><br><span style="color: hsl(0, 100%, 40%);">-        (In_Out => (State, Device_State),</span><br><span style="color: hsl(120, 100%, 40%);">+        (Input => (Config_State),</span><br><span style="color: hsl(120, 100%, 40%);">+         In_Out => (State, Device_State),</span><br><span>          Proof_In => (Init_State)),</span><br><span style="color: hsl(0, 100%, 40%);">-      Pre => Is_Initialized;</span><br><span style="color: hsl(120, 100%, 40%);">+      Pre => Is_Initialized,</span><br><span style="color: hsl(120, 100%, 40%);">+      Annotate =></span><br><span style="color: hsl(120, 100%, 40%);">+        (GNATprove, Intentional,</span><br><span style="color: hsl(120, 100%, 40%);">+         "global input ""GMA.Config_State"" of ""Move_Cursor"" not read",</span><br><span style="color: hsl(120, 100%, 40%);">+         "Reading of Config_State depends on the platform configuration.");</span><br><span> </span><br><span>    ----------------------------------------------------------------------------</span><br><span> </span><br><span>@@ -188,8 +205,6 @@</span><br><span>          Proof_In => (Init_State)),</span><br><span>       Pre => Is_Initialized and HW.Config.Dynamic_MMIO;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   pragma Warnings (GNATprove, Off, "no check message justified by this",</span><br><span style="color: hsl(0, 100%, 40%);">-                    Reason => "see Annotate aspects.");</span><br><span>    procedure Map_Linear_FB (Linear_FB : out Word64; FB : in Framebuffer_Type)</span><br><span>    with</span><br><span>       Global =></span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27154">change 27154</a>. To unsubscribe, or for help writing mail filters, 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/27154"/><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: I4d79f59a8cb693d73d6da666525f091021efb4fd </div>
<div style="display:none"> Gerrit-Change-Number: 27154 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Nico Huber <nico.h@gmx.de> </div>