Nico Huber has uploaded this change for review. ( https://review.coreboot.org/22905
Change subject: [UNTESTED] gma: Allow arbitary framebuffer updates ......................................................................
[UNTESTED] gma: Allow arbitary framebuffer updates
Change-Id: I780bd0a2733222008f5243483656655f1eb2b58e --- M common/hw-gfx-gma-config_helpers.adb M common/hw-gfx-gma-config_helpers.ads M common/hw-gfx-gma-pipe_setup.adb M common/hw-gfx-gma-pipe_setup.ads M common/hw-gfx-gma.adb M gfxtest/hw-gfx-gma-gfx_test.adb 6 files changed, 81 insertions(+), 36 deletions(-)
git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/05/22905/1
diff --git a/common/hw-gfx-gma-config_helpers.adb b/common/hw-gfx-gma-config_helpers.adb index f2b4ef6..5e5be5d 100644 --- a/common/hw-gfx-gma-config_helpers.adb +++ b/common/hw-gfx-gma-config_helpers.adb @@ -181,9 +181,9 @@ -- Validates that a given configuration should work with -- a given framebuffer. function Validate_Config - (FB : Framebuffer_Type; - Port_Cfg : Port_Config; - Pipe : Pipe_Index) + (FB : Framebuffer_Type; + Mode : Mode_Type; + Pipe : Pipe_Index) return Boolean is begin @@ -197,11 +197,11 @@ -- Plane_Control) -- 90 degree rotations are only supported with Y-tiling return - ((Rotated_Width (FB) = Port_Cfg.Mode.H_Visible and - Rotated_Height (FB) = Port_Cfg.Mode.V_Visible) or + ((Rotated_Width (FB) = Mode.H_Visible and + Rotated_Height (FB) = Mode.V_Visible) or (Rotated_Width (FB) <= Config.Maximum_Scalable_Width (Pipe) and - Rotated_Width (FB) <= Port_Cfg.Mode.H_Visible and - Rotated_Height (FB) <= Port_Cfg.Mode.V_Visible)) and + Rotated_Width (FB) <= Mode.H_Visible and + Rotated_Height (FB) <= Mode.V_Visible)) and (FB.Offset /= VGA_PLANE_FRAMEBUFFER_OFFSET or Pipe = Primary) and (FB.Offset = VGA_PLANE_FRAMEBUFFER_OFFSET or (FB.BPC = 8 and Valid_Stride (FB) and diff --git a/common/hw-gfx-gma-config_helpers.ads b/common/hw-gfx-gma-config_helpers.ads index 1dc2390..4853634 100644 --- a/common/hw-gfx-gma-config_helpers.ads +++ b/common/hw-gfx-gma-config_helpers.ads @@ -40,15 +40,15 @@ use type HW.Pos32; pragma Warnings (GNAT, On, """Integer_32"" is already use-visible *"); function Validate_Config - (FB : Framebuffer_Type; - Port_Cfg : Port_Config; - Pipe : Pipe_Index) + (FB : Framebuffer_Type; + Mode : Mode_Type; + Pipe : Pipe_Index) return Boolean with Post => (if Validate_Config'Result then - Rotated_Width (FB) <= Port_Cfg.Mode.H_Visible and - Rotated_Height (FB) <= Port_Cfg.Mode.V_Visible and + Rotated_Width (FB) <= Mode.H_Visible and + Rotated_Height (FB) <= Mode.V_Visible and (FB.Offset = VGA_PLANE_FRAMEBUFFER_OFFSET or FB.Height + FB.Start_Y <= FB.V_Stride));
diff --git a/common/hw-gfx-gma-pipe_setup.adb b/common/hw-gfx-gma-pipe_setup.adb index e64edc9..7c919c2 100644 --- a/common/hw-gfx-gma-pipe_setup.adb +++ b/common/hw-gfx-gma-pipe_setup.adb @@ -206,7 +206,6 @@
Registers.Write (Controller.DSPSTRIDE, Word32 (Pixel_To_Bytes (FB.Stride, FB))); - Registers.Write (Controller.DSPSURF, FB.Offset and 16#ffff_f000#); if Config.Has_DSP_Linoff then Registers.Write (Controller.DSPLINOFF, 0); end if; @@ -214,6 +213,7 @@ (Register => Controller.DSPTILEOFF, Value => Shift_Left (Word32 (FB.Start_Y), 16) or Word32 (FB.Start_X)); + Registers.Write (Controller.DSPSURF, FB.Offset and 16#ffff_f000#); end if; end Setup_Hires_Plane;
@@ -439,25 +439,34 @@
----------------------------------------------------------------------------
+ procedure Setup_Pipe + (Pipe : Pipe_Index; + Mode : Mode_Type; + Framebuffer : Framebuffer_Type) + is + -- Enable dithering if framebuffer BPC differs from port BPC, + -- as smooth gradients look really bad without. + Dither : constant Boolean := Framebuffer.BPC /= Mode.BPC; + begin + pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity)); + + Setup_Display (Controllers (Pipe), Framebuffer, Mode.BPC, Dither); + Setup_Scaling (Controllers (Pipe), Mode, Framebuffer); + end Setup_Pipe; + procedure On (Pipe : Pipe_Index; Port_Cfg : Port_Config; Framebuffer : Framebuffer_Type) is - -- Enable dithering if framebuffer BPC differs from port BPC, - -- as smooth gradients look really bad without. - Dither : constant Boolean := Framebuffer.BPC /= Port_Cfg.Mode.BPC; begin pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity));
Transcoder.Setup (Pipe, Port_Cfg);
- Setup_Display - (Controllers (Pipe), Framebuffer, Port_Cfg.Mode.BPC, Dither); + Setup_Pipe (Pipe, Port_Cfg.Mode, Framebuffer);
- Setup_Scaling (Controllers (Pipe), Port_Cfg.Mode, Framebuffer); - - Transcoder.On (Pipe, Port_Cfg, Dither); + Transcoder.On (Pipe, Port_Cfg, Framebuffer.BPC /= Port_Cfg.Mode.BPC); end On;
---------------------------------------------------------------------------- @@ -531,16 +540,5 @@ Transcoder.Clk_Off (Pipe); end loop; end All_Off; - - ---------------------------------------------------------------------------- - - procedure Update_Offset (Pipe : Pipe_Index; Framebuffer : Framebuffer_Type) - is - begin - pragma Debug (Debug.Put_Line (GNAT.Source_Info.Enclosing_Entity)); - - Registers.Write - (Controllers (Pipe).DSPSURF, Framebuffer.Offset and 16#ffff_f000#); - end Update_Offset;
end HW.GFX.GMA.Pipe_Setup; diff --git a/common/hw-gfx-gma-pipe_setup.ads b/common/hw-gfx-gma-pipe_setup.ads index 3ef5dcf..11c716a 100644 --- a/common/hw-gfx-gma-pipe_setup.ads +++ b/common/hw-gfx-gma-pipe_setup.ads @@ -36,7 +36,16 @@
procedure All_Off;
- procedure Update_Offset (Pipe : Pipe_Index; Framebuffer : Framebuffer_Type); + procedure Setup_Pipe + (Pipe : Pipe_Index; + Mode : Mode_Type; + Framebuffer : Framebuffer_Type) + with + Pre => + Rotated_Width (Framebuffer) <= Mode.H_Visible and + Rotated_Height (Framebuffer) <= Mode.V_Visible and + (Framebuffer.Offset = VGA_PLANE_FRAMEBUFFER_OFFSET or + Framebuffer.Height + Framebuffer.Start_Y <= Framebuffer.V_Stride);
private
diff --git a/common/hw-gfx-gma.adb b/common/hw-gfx-gma.adb index 420c1a3..798210a 100644 --- a/common/hw-gfx-gma.adb +++ b/common/hw-gfx-gma.adb @@ -109,7 +109,7 @@
if Success then Success := Config_Helpers.Validate_Config - (Pipe_Cfg.Framebuffer, Port_Cfg, Pipe); + (Pipe_Cfg.Framebuffer, Port_Cfg.Mode, Pipe); end if;
if Success then @@ -284,9 +284,12 @@
-- update framebuffer offset only elsif New_Config.Port /= Disabled and - Cur_Config.Framebuffer /= New_Config.Framebuffer + Cur_Config.Framebuffer /= New_Config.Framebuffer and + Config_Helpers.Validate_Config + (New_Config.Framebuffer, New_Config.Mode, Pipe) then - Display_Controller.Update_Offset (Pipe, New_Config.Framebuffer); + Display_Controller.Setup_Pipe + (Pipe, New_Config.Mode, New_Config.Framebuffer); Cur_Config := New_Config; end if; end; diff --git a/gfxtest/hw-gfx-gma-gfx_test.adb b/gfxtest/hw-gfx-gma-gfx_test.adb index 833240f..c3caade 100644 --- a/gfxtest/hw-gfx-gma-gfx_test.adb +++ b/gfxtest/hw-gfx-gma-gfx_test.adb @@ -1,3 +1,4 @@ +with Ada.Numerics.Discrete_Random; with Ada.Unchecked_Conversion; with Ada.Command_Line; with Interfaces.C; @@ -13,6 +14,8 @@ package body HW.GFX.GMA.GFX_Test is pragma Disable_Atomic_Synchronization; + + package R is new Ada.Numerics.Discrete_Random (Pos_Type);
Start_X : constant := 0; Start_Y : constant := 0; @@ -369,6 +372,38 @@ end if; end loop;
+ if Delay_S > 16 then -- getting bored? + declare + New_Pipes : GMA.Pipe_Configs := Pipes; + Gen : R.Generator; + begin + Time.M_Delay (12_000); + Delay_S := Delay_S - 12; + while Delay_S > 4 loop + Time.M_Delay (4_000); + Delay_S := Delay_S - 4; + for Pipe in GMA.Pipe_Index loop + New_Pipes (Pipe).Framebuffer.Start_X := + R.Random (Gen) mod Pipes (Pipe).Framebuffer.Width / 2; + New_Pipes (Pipe).Framebuffer.Start_Y := + R.Random (Gen) mod Pipes (Pipe).Framebuffer.Height / 2; + New_Pipes (Pipe).Framebuffer.Width := + Width_Type'Max (320, + Pipes (Pipe).Framebuffer.Width + - Pipes (Pipe).Framebuffer.Start_X + - R.Random (Gen) mod + Pipes (Pipe).Framebuffer.Width / 2); + New_Pipes (Pipe).Framebuffer.Height := + Height_Type'Max (200, + Pipes (Pipe).Framebuffer.Height + - Pipes (Pipe).Framebuffer.Start_Y + - R.Random (Gen) mod + Pipes (Pipe).Framebuffer.Height / 2); + end loop; + GMA.Update_Outputs (New_Pipes); + end loop; + end; + end if; Time.M_Delay (Delay_S * 1_000);
for Pipe in GMA.Pipe_Index loop