[coreboot-gerrit] Change in libgfxinit[master]: Use (Width|Height)_Type for modeline sizes

Nico Huber (Code Review) gerrit at coreboot.org
Mon Jun 4 23:07:42 CEST 2018


Nico Huber has uploaded this change for review. ( https://review.coreboot.org/26849


Change subject: Use (Width|Height)_Type for modeline sizes
......................................................................

Use (Width|Height)_Type for modeline sizes

Saves us a lot of conversions and explicit contracts.

Change-Id: I32c06ca87b18c25e3c519fa608c4b9b36dbc0449
Signed-off-by: Nico Huber <nico.h at gmx.de>
---
M common/hw-gfx-edid.adb
M common/hw-gfx-gma-config.ads.template
M common/hw-gfx-gma-pch-transcoder.adb
M common/hw-gfx-gma-pipe_setup.adb
M common/hw-gfx-gma-transcoder.adb
M common/hw-gfx-gma.adb
M common/hw-gfx-gma.ads
M common/hw-gfx.ads
M gfxtest/hw-gfx-gma-gfx_test.adb
9 files changed, 85 insertions(+), 96 deletions(-)



  git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/49/26849/1

diff --git a/common/hw-gfx-edid.adb b/common/hw-gfx-edid.adb
index 83e9cf6..f1fae58 100644
--- a/common/hw-gfx-edid.adb
+++ b/common/hw-gfx-edid.adb
@@ -18,7 +18,6 @@
 with GNAT.Source_Info;
 
 use type HW.Byte;
-use type HW.Pos16;
 use type HW.Word16;
 
 package body HW.GFX.EDID is
@@ -138,14 +137,14 @@
    begin
       Mode := Mode_Type'
         (Dotclock             => Pos64 (Read_LE16 (Raw_EDID, Base)) * 10_000,
-         H_Visible            => Pos16 (Read_12 (Base +  2, Base +  4, 4)),
-         H_Sync_Begin         => Pos16 (Read_10 (Base +  8, Base + 11, 2)),
-         H_Sync_End           => Pos16 (Read_10 (Base +  9, Base + 11, 4)),
-         H_Total              => Pos16 (Read_12 (Base +  3, Base +  4, 8)),
-         V_Visible            => Pos16 (Read_12 (Base +  5, Base +  7, 4)),
-         V_Sync_Begin         => Pos16 (Read_6  (Base + 10, 4, Base + 11, 2)),
-         V_Sync_End           => Pos16 (Read_6  (Base + 10, 0, Base + 11, 4)),
-         V_Total              => Pos16 (Read_12 (Base +  6, Base +  7, 8)),
+         H_Visible            => Width_Type (Read_12 (Base +  2, Base +  4, 4)),
+         H_Sync_Begin         => Width_Type (Read_10 (Base +  8, Base + 11, 2)),
+         H_Sync_End           => Width_Type (Read_10 (Base +  9, Base + 11, 4)),
+         H_Total              => Width_Type (Read_12 (Base +  3, Base +  4, 8)),
+         V_Visible            => Height_Type (Read_12 (Base +  5, Base +  7, 4)),
+         V_Sync_Begin         => Height_Type (Read_6  (Base + 10, 4, Base + 11, 2)),
+         V_Sync_End           => Height_Type (Read_6  (Base + 10, 0, Base + 11, 4)),
+         V_Total              => Height_Type (Read_12 (Base +  6, Base +  7, 8)),
          H_Sync_Active_High   => (Raw_EDID (Base + 17) and 16#02#) /= 0,
          V_Sync_Active_High   => (Raw_EDID (Base + 17) and 16#04#) /= 0,
          BPC                  =>
diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template
index dba10aa..8a61d81 100644
--- a/common/hw-gfx-gma-config.ads.template
+++ b/common/hw-gfx-gma-config.ads.template
@@ -270,14 +270,14 @@
    -- Maximum source width with enabled scaler. This only accounts
    -- for simple 1:1 pipe:scaler mappings.
 
-   type Width_Per_Pipe is array (Pipe_Index) of Pos16;
+   type Width_Per_Pipe is array (Pipe_Index) of Width_Type;
 
    Maximum_Scalable_Width : constant Width_Per_Pipe :=
      (case CPU is
          when G45 => -- TODO: Is this true?
            (Primary     => 4096,
             Secondary   => 2048,
-            Tertiary    => Pos16'First),
+            Tertiary    => Pos32'First),
          when Ironlake..Haswell =>
            (Primary     => 4096,
             Secondary   => 2048,
diff --git a/common/hw-gfx-gma-pch-transcoder.adb b/common/hw-gfx-gma-pch-transcoder.adb
index 29fbaf6..eb1715f 100644
--- a/common/hw-gfx-gma-pch-transcoder.adb
+++ b/common/hw-gfx-gma-pch-transcoder.adb
@@ -153,7 +153,7 @@
    is
       Mode : constant Mode_Type := Port_Cfg.Mode;
 
-      function Encode (LSW, MSW : Pos16) return Word32 is
+      function Encode (LSW, MSW : Pos32) return Word32 is
       begin
          return (Word32 (LSW) - 1) or ((Word32 (MSW) - 1) * 2 ** 16);
       end Encode;
diff --git a/common/hw-gfx-gma-pipe_setup.adb b/common/hw-gfx-gma-pipe_setup.adb
index e0be5fb..1be2a1a 100644
--- a/common/hw-gfx-gma-pipe_setup.adb
+++ b/common/hw-gfx-gma-pipe_setup.adb
@@ -146,7 +146,7 @@
 
    ---------------------------------------------------------------------------
 
-   function Encode (LSW, MSW : Pos16) return Word32 is
+   function Encode (LSW, MSW : Pos32) return Word32 is
    begin
       return Shift_Left (Word32 (MSW) - 1, 16) or (Word32 (LSW) - 1);
    end Encode;
@@ -220,8 +220,8 @@
       if Config.Has_Plane_Control then
          declare
             Stride, Offset : Word32;
-            Width : constant Pos16 := Rotated_Width (FB);
-            Height : constant Pos16 := Rotated_Height (FB);
+            Width : constant Width_Type := Rotated_Width (FB);
+            Height : constant Width_Type := Rotated_Height (FB);
          begin
             if Rotation_90 (FB) then
                Stride   := Word32 (FB_Pitch (FB.V_Stride, FB));
@@ -376,7 +376,7 @@
    begin
       -- off-screen cursor needs special care
       if X <= -Width or Y <= -Width or
-         X >= Int32 (Rotated_Width (FB)) or Y >= Int32 (Rotated_Height (FB)) or
+         X >= Rotated_Width (FB) or Y >= Rotated_Height (FB) or
          X > Config.Maximum_Cursor_X or Y > Config.Maximum_Cursor_Y
       then
          X := -Width;
@@ -394,29 +394,27 @@
    ----------------------------------------------------------------------------
 
    procedure Scale_Keep_Aspect
-     (Width       :    out Pos32;
-      Height      :    out Pos32;
-      Max_Width   : in     Pos32;
-      Max_Height  : in     Pos32;
+     (Width       :    out Width_Type;
+      Height      :    out Height_Type;
+      Max_Width   : in     Width_Type;
+      Max_Height  : in     Height_Type;
       Framebuffer : in     Framebuffer_Type)
    with
       Pre =>
-         Max_Width <= Pos32 (Pos16'Last) and
-         Max_Height <= Pos32 (Pos16'Last) and
-         Pos32 (Rotated_Width (Framebuffer)) <= Max_Width and
-         Pos32 (Rotated_Height (Framebuffer)) <= Max_Height,
+         Rotated_Width (Framebuffer) <= Max_Width and
+         Rotated_Height (Framebuffer) <= Max_Height,
       Post =>
          Width <= Max_Width and Height <= Max_Height
    is
-      Src_Width : constant Pos32 := Pos32 (Rotated_Width (Framebuffer));
-      Src_Height : constant Pos32 := Pos32 (Rotated_Height (Framebuffer));
+      Src_Width : constant Width_Type := Rotated_Width (Framebuffer);
+      Src_Height : constant Height_Type := Rotated_Height (Framebuffer);
    begin
       case Scaling_Type (Src_Width, Src_Height, Max_Width, Max_Height) is
          when Letterbox =>
             Width  := Max_Width;
             Height := (Max_Width * Src_Height) / Src_Width;
          when Pillarbox =>
-            pragma Assert ((Max_Height * Src_Width) / Src_Height <= Max_Width);
+            --pragma Assert ((Max_Height * Src_Width) / Src_Height <= Max_Width);
             Width  := (Max_Height * Src_Width) / Src_Height;
             Height := Max_Height;
          when Uniform =>
@@ -441,8 +439,8 @@
         (if Controller.PS_CTRL_2 /= Registers.Invalid_Register then
             PS_CTRL_SCALER_MODE_7X5_EXTENDED else 0);
 
-      Width_In    : constant Pos32 := Pos32 (Rotated_Width (Framebuffer));
-      Height_In   : constant Pos32 := Pos32 (Rotated_Height (Framebuffer));
+      Width_In    : constant Width_Type   := Rotated_Width (Framebuffer);
+      Height_In   : constant Height_Type  := Rotated_Height (Framebuffer);
 
       -- We can scale up to 2.99x horizontally:
       Horizontal_Limit : constant Pos32 := (Width_In * 299) / 100;
@@ -457,15 +455,16 @@
             else
                299)) / 100;
 
-      Width, Height : Pos32;
+      Width : Width_Type;
+      Height : Height_Type;
    begin
       -- Writes to WIN_SZ arm the PS registers.
 
       Scale_Keep_Aspect
         (Width       => Width,
          Height      => Height,
-         Max_Width   => Pos32'Min (Horizontal_Limit, Pos32 (Mode.H_Visible)),
-         Max_Height  => Pos32'Min (Vertical_Limit, Pos32 (Mode.V_Visible)),
+         Max_Width   => Pos32'Min (Horizontal_Limit, Mode.H_Visible),
+         Max_Height  => Pos32'Min (Vertical_Limit, Mode.V_Visible),
          Framebuffer => Framebuffer);
 
       Registers.Write
@@ -474,8 +473,8 @@
       Registers.Write
         (Register => Controller.PS_WIN_POS_1,
          Value    =>
-            Shift_Left (Word32 (Pos32 (Mode.H_Visible) - Width) / 2, 16) or
-            Word32 (Pos32 (Mode.V_Visible) - Height) / 2);
+            Shift_Left (Word32 (Mode.H_Visible - Width) / 2, 16) or
+            Word32 (Mode.V_Visible - Height) / 2);
       Registers.Write
         (Register => Controller.PS_WIN_SZ_1,
          Value    => Shift_Left (Word32 (Width), 16) or Word32 (Height));
@@ -499,7 +498,8 @@
                when Registers.PFC_CTL_1 => 2 * 2 ** 29,
                when others              => 0) else 0);
 
-      Width, Height : Pos32;
+      Width : Width_Type;
+      Height : Height_Type;
       X, Y : Int32;
    begin
       -- Writes to WIN_SZ arm the PF registers.
@@ -507,21 +507,21 @@
       Scale_Keep_Aspect
         (Width       => Width,
          Height      => Height,
-         Max_Width   => Pos32 (Mode.H_Visible),
-         Max_Height  => Pos32 (Mode.V_Visible),
+         Max_Width   => Mode.H_Visible,
+         Max_Height  => Mode.V_Visible,
          Framebuffer => Framebuffer);
 
       -- Do not scale to odd width (at least Haswell has trouble with this).
-      if Width < Pos32 (Mode.H_Visible) and Width mod 2 = 1 then
+      if Width < Mode.H_Visible and Width mod 2 = 1 then
          Width := Width + 1;
       end if;
 
-      X := (Int32 (Mode.H_Visible) - Width) / 2;
-      Y := (Int32 (Mode.V_Visible) - Height) / 2;
+      X := (Mode.H_Visible - Width) / 2;
+      Y := (Mode.V_Visible - Height) / 2;
 
       -- Hardware is picky about minimal horizontal gaps.
-      if Pos32 (Mode.H_Visible) - Width <= 3 then
-         Width := Pos32(Mode.H_Visible);
+      if Mode.H_Visible - Width <= 3 then
+         Width := Mode.H_Visible;
          X := 0;
       end if;
 
diff --git a/common/hw-gfx-gma-transcoder.adb b/common/hw-gfx-gma-transcoder.adb
index daa5deb..1e4952d 100644
--- a/common/hw-gfx-gma-transcoder.adb
+++ b/common/hw-gfx-gma-transcoder.adb
@@ -138,12 +138,7 @@
 
    ----------------------------------------------------------------------------
 
-   function Encode (LSW, MSW : Pos16) return Word32
-   is
-      pragma Warnings (GNAT, Off, """Integer_16"" is already use-visible *",
-                       Reason => "Needed for older compiler versions");
-      use type HW.Pos16;
-      pragma Warnings (GNAT, On, """Integer_16"" is already use-visible *");
+   function Encode (LSW, MSW : Pos32) return Word32 is
    begin
       return Shift_Left (Word32 (MSW - 1), 16) or Word32 (LSW - 1);
    end Encode;
diff --git a/common/hw-gfx-gma.adb b/common/hw-gfx-gma.adb
index ab4e1e2..f135a5e 100644
--- a/common/hw-gfx-gma.adb
+++ b/common/hw-gfx-gma.adb
@@ -858,28 +858,28 @@
          Debug.Put_Int64 (Configs (Pipe).Mode.Dotclock);
          Debug.Put_Line (",");
          Debug.Put ("         H_Visible          => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.H_Visible);
+         Debug.Put_Int32 (Configs (Pipe).Mode.H_Visible);
          Debug.Put_Line (",");
          Debug.Put ("         H_Sync_Begin       => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.H_Sync_Begin);
+         Debug.Put_Int32 (Configs (Pipe).Mode.H_Sync_Begin);
          Debug.Put_Line (",");
          Debug.Put ("         H_Sync_End         => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.H_Sync_End);
+         Debug.Put_Int32 (Configs (Pipe).Mode.H_Sync_End);
          Debug.Put_Line (",");
          Debug.Put ("         H_Total            => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.H_Total);
+         Debug.Put_Int32 (Configs (Pipe).Mode.H_Total);
          Debug.Put_Line (",");
          Debug.Put ("         V_Visible          => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.V_Visible);
+         Debug.Put_Int32 (Configs (Pipe).Mode.V_Visible);
          Debug.Put_Line (",");
          Debug.Put ("         V_Sync_Begin       => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.V_Sync_Begin);
+         Debug.Put_Int32 (Configs (Pipe).Mode.V_Sync_Begin);
          Debug.Put_Line (",");
          Debug.Put ("         V_Sync_End         => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.V_Sync_End);
+         Debug.Put_Int32 (Configs (Pipe).Mode.V_Sync_End);
          Debug.Put_Line (",");
          Debug.Put ("         V_Total            => ");
-         Debug.Put_Int16 (Configs (Pipe).Mode.V_Total);
+         Debug.Put_Int32 (Configs (Pipe).Mode.V_Total);
          Debug.Put_Line (",");
          Debug.Put_Line ("         H_Sync_Active_High => " &
            (if Configs (Pipe).Mode.H_Sync_Active_High
diff --git a/common/hw-gfx-gma.ads b/common/hw-gfx-gma.ads
index 410f411..1f81ece 100644
--- a/common/hw-gfx-gma.ads
+++ b/common/hw-gfx-gma.ads
@@ -210,9 +210,9 @@
 
    ----------------------------------------------------------------------------
 
-   Tile_Width : constant array (Tiling_Type) of Pos32 :=
+   Tile_Width : constant array (Tiling_Type) of Width_Type :=
      (Linear => 16, X_Tiled => 128, Y_Tiled => 32);
-   Tile_Rows : constant array (Tiling_Type) of Pos32 :=
+   Tile_Rows : constant array (Tiling_Type) of Height_Type :=
      (Linear => 1, X_Tiled => 8, Y_Tiled => 32);
 
    function FB_Pitch (Px : Pos_Pixel_Type; FB : Framebuffer_Type) return Natural
diff --git a/common/hw-gfx.ads b/common/hw-gfx.ads
index beb111f..cff3e18 100644
--- a/common/hw-gfx.ads
+++ b/common/hw-gfx.ads
@@ -121,14 +121,14 @@
    type Mode_Type is
    record
       Dotclock             : Frequency_Type;
-      H_Visible            : Pos16;
-      H_Sync_Begin         : Pos16;
-      H_Sync_End           : Pos16;
-      H_Total              : Pos16;
-      V_Visible            : Pos16;
-      V_Sync_Begin         : Pos16;
-      V_Sync_End           : Pos16;
-      V_Total              : Pos16;
+      H_Visible            : Width_Type;
+      H_Sync_Begin         : Width_Type;
+      H_Sync_End           : Width_Type;
+      H_Total              : Width_Type;
+      V_Visible            : Height_Type;
+      V_Sync_Begin         : Height_Type;
+      V_Sync_End           : Height_Type;
+      V_Total              : Height_Type;
       H_Sync_Active_High   : Boolean;
       V_Sync_Active_High   : Boolean;
       BPC                  : BPC_Type;
@@ -182,15 +182,15 @@
    function Rotation_90 (FB : Framebuffer_Type) return Boolean is
      (FB.Rotation = Rotated_90 or FB.Rotation = Rotated_270);
 
-   function Rotated_Width (FB : Framebuffer_Type) return Pos16 is
-     (if Rotation_90 (FB) then Pos16 (FB.Height) else Pos16 (FB.Width));
-   function Rotated_Height (FB : Framebuffer_Type) return Pos16 is
-     (if Rotation_90 (FB) then Pos16 (FB.Width) else Pos16 (FB.Height));
+   function Rotated_Width (FB : Framebuffer_Type) return Width_Type is
+     (if Rotation_90 (FB) then FB.Height else FB.Width);
+   function Rotated_Height (FB : Framebuffer_Type) return Height_Type is
+     (if Rotation_90 (FB) then FB.Width else FB.Height);
 
    function Pixel_To_Bytes (Pixel : Pixel_Type; FB : Framebuffer_Type)
       return Int32 is (Pixel * Pos32 (FB.BPC) / (8 / 4));
-   function FB_Size (FB : Framebuffer_Type) return Pos32 is
-     (Pixel_To_Bytes (FB.Stride * FB.V_Stride, FB));
+   function FB_Size (FB : Framebuffer_Type)
+      return Pos32 is (Pixel_To_Bytes (FB.Stride * FB.V_Stride, FB));
 
    function Requires_Scaling (FB : Framebuffer_Type; Mode : Mode_Type)
       return Boolean is
@@ -198,22 +198,17 @@
       Rotated_Height (FB) /= Mode.V_Visible);
 
    type Scaling_Aspect is (Uniform, Letterbox, Pillarbox);
-   function Scaling_Type (Width, Height, Scaled_Width, Scaled_Height : Pos32)
+   function Scaling_Type
+     (Width          : Width_Type;
+      Height         : Height_Type;
+      Scaled_Width   : Width_Type;
+      Scaled_Height  : Height_Type)
       return Scaling_Aspect is
      (if    Scaled_Width * Height < Scaled_Height * Width   then Letterbox
       elsif Scaled_Width * Height > Scaled_Height * Width   then Pillarbox
-      else                                                       Uniform)
-   with
-      Pre =>
-         Width <= Pos32 (Pos16'Last) and
-         Height <= Pos32 (Pos16'Last) and
-         Scaled_Width <= Pos32 (Pos16'Last) and
-         Scaled_Height <= Pos32 (Pos16'Last);
+      else                                                       Uniform);
    function Scaling_Type (FB : Framebuffer_Type; Mode : Mode_Type)
       return Scaling_Aspect is (Scaling_Type
-     (Width          => Pos32 (Rotated_Width (FB)),
-      Height         => Pos32 (Rotated_Height (FB)),
-      Scaled_Width   => Pos32 (Mode.H_Visible),
-      Scaled_Height  => Pos32 (Mode.V_Visible)));
+     (Rotated_Width (FB), Rotated_Height (FB), Mode.H_Visible, Mode.V_Visible));
 
 end HW.GFX;
diff --git a/gfxtest/hw-gfx-gma-gfx_test.adb b/gfxtest/hw-gfx-gma-gfx_test.adb
index d5071c6..6839dc3 100644
--- a/gfxtest/hw-gfx-gma-gfx_test.adb
+++ b/gfxtest/hw-gfx-gma-gfx_test.adb
@@ -267,19 +267,19 @@
       Rotation : in     Rotation_Type;
       Offset   : in out Word32)
    is
-      Width : constant Width_Type := Width_Type (Mode.H_Visible);
-      Height : constant Height_Type := Height_Type (Mode.V_Visible);
+      Width : constant Width_Type := Mode.H_Visible;
+      Height : constant Height_Type := Mode.V_Visible;
    begin
       Offset := (Offset + FB_Align - 1) and not (FB_Align - 1);
       if Rotation = Rotated_90 or Rotation = Rotated_270 then
          FB :=
-           (Width    => Width_Type (Height),
-            Height   => Height_Type (Width),
+           (Width    => Height,
+            Height   => Width,
             Start_X  => Start_X,
             Start_Y  => Start_Y,
             BPC      => 8,
-            Stride   => Div_Round_Up (Pos32 (Height + 2 * Start_X), 32) * 32,
-            V_Stride => Div_Round_Up (Pos32 (Width + 2 * Start_Y), 32) * 32,
+            Stride   => Div_Round_Up (Height + 2 * Start_X, 32) * 32,
+            V_Stride => Div_Round_Up (Width + 2 * Start_Y, 32) * 32,
             Tiling   => Y_Tiled,
             Rotation => Rotation,
             Offset   => Offset + Word32 (GTT_Rotation_Offset) * GTT_Page_Size);
@@ -401,8 +401,8 @@
             declare
                C : Cursor_Type renames Pipes (Pipe).Cursor;
                FB : Framebuffer_Type renames Pipes (Pipe).Framebuffer;
-               Width : constant Int32 := Int32 (Rotated_Width (FB));
-               Height : constant Int32 := Int32 (Rotated_Height (FB));
+               Width : constant Width_Type := Rotated_Width (FB);
+               Height : constant Height_Type := Rotated_Height (FB);
                CS : Cursor_Script_Entry renames Cursor_Script
                  (Natural (Cnt) mod (Cursor_Script'Last + 1));
             begin
@@ -480,8 +480,8 @@
                C : Cursor_Type renames Pipes (Pipe).Cursor;
                CI : Cursor_Info renames Cursor_Infos (Pipe);
                FB : Framebuffer_Type renames Pipes (Pipe).Framebuffer;
-               Width : constant Int32 := Int32 (Rotated_Width (FB));
-               Height : constant Int32 := Int32 (Rotated_Height (FB));
+               Width : constant Width_Type := Rotated_Width (FB);
+               Height : constant Height_Type := Rotated_Height (FB);
 
                Update : Boolean := False;
             begin
@@ -649,8 +649,8 @@
                         New_FB.Height := Height_Type'Max
                           (320, Height - New_FB.Start_Y - Rand_Div (Height));
 
-                        Cursor.Center_X := Int32 (Rotated_Width (New_FB)) / 2;
-                        Cursor.Center_Y := Int32 (Rotated_Height (New_FB)) / 2;
+                        Cursor.Center_X := Rotated_Width (New_FB) / 2;
+                        Cursor.Center_Y := Rotated_Height (New_FB) / 2;
                         GMA.Update_Cursor (Pipe, Cursor);
                      end;
                   end loop;

-- 
To view, visit https://review.coreboot.org/26849
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: libgfxinit
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I32c06ca87b18c25e3c519fa608c4b9b36dbc0449
Gerrit-Change-Number: 26849
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h at gmx.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180604/8ded48e6/attachment-0001.html>


More information about the coreboot-gerrit mailing list