gfx, gma: Add helper to decide scaling aspect

Scaling_Type() returns the resulting scaling format, `Letterbox`,
`Pillarbox`, or `Evenly` when keeping aspect ratio.

Change-Id: I86fb15b03c2f4b55cb00e85b57dc7a64583557d0
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/26766
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
diff --git a/common/hw-gfx-gma.ads b/common/hw-gfx-gma.ads
index e800f7c..410f411 100644
--- a/common/hw-gfx-gma.ads
+++ b/common/hw-gfx-gma.ads
@@ -164,6 +164,9 @@
    function Requires_Scaling (Pipe_Cfg : Pipe_Config) return Boolean is
      (Requires_Scaling (Pipe_Cfg.Framebuffer, Pipe_Cfg.Mode));
 
+   function Scaling_Type (Pipe_Cfg : Pipe_Config) return Scaling_Aspect is
+     (Scaling_Type (Pipe_Cfg.Framebuffer, Pipe_Cfg.Mode));
+
    ----------------------------------------------------------------------------
    -- Internal representation of a single pipe's configuration
 
diff --git a/common/hw-gfx.ads b/common/hw-gfx.ads
index 71182da..a6c883e 100644
--- a/common/hw-gfx.ads
+++ b/common/hw-gfx.ads
@@ -197,4 +197,18 @@
      (Rotated_Width (FB) /= Mode.H_Visible or
       Rotated_Height (FB) /= Mode.V_Visible);
 
+   type Scaling_Aspect is (Uniform, Letterbox, Pillarbox);
+   function Scaling_Type (FB : Framebuffer_Type; Mode : Mode_Type)
+      return Scaling_Aspect is
+     (if Pos32 (Mode.H_Visible) * Pos32 (Rotated_Height (FB)) <
+         Pos32 (Mode.V_Visible) * Pos32 (Rotated_Width (FB))
+      then
+         Letterbox
+      elsif Pos32 (Mode.H_Visible) * Pos32 (Rotated_Height (FB)) >
+            Pos32 (Mode.V_Visible) * Pos32 (Rotated_Width (FB))
+      then
+         Pillarbox
+      else
+         Uniform);
+
 end HW.GFX;