libgfxinit: Allow to configure screen rotation

This allows to configure a default screen rotation in 90-degree
steps. The framebuffer contents will then be displayed rotated,
by the same amount in the other direction; i.e. if you turn the
screen to the left, the picture has to be rotated to the right
to accommodate.

This is only supported by libgfxinit from Skylake / Apollo Lake
on (earlier GPUs didn't support the 90-degree steps anyway) and
it only works with the linear-framebuffer option.

Change-Id: Iac75cefbd34f28c55ec20ee152fe67351cc48653
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38922
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Nico Huber 2020-01-14 15:21:45 +01:00 committed by Felix Held
commit 520f20ef52
2 changed files with 59 additions and 4 deletions

View file

@ -519,6 +519,39 @@ config LINEAR_FRAMEBUFFER_MAX_HEIGHT
Set the maximum height of the framebuffer. This may help with
default fonts too tiny for high-resolution displays.
choice DEFAULT_SCREEN_ROTATION
prompt "Default screen orientation"
depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT
depends on GFX_GMA_GENERATION = "Broxton" || GFX_GMA_GENERATION = "Skylake"
default DEFAULT_SCREEN_ROTATION_NONE
help
This allows to configure how the physical screen is mounted in
90 degree steps (counter-clockwise). The framebuffer contents
will then be displayed rotated by the same amount in the other
direction; i.e. if you turn the screen to the left, the picture
has to be rotated to the right to accommodate.
config DEFAULT_SCREEN_ROTATION_NONE
bool "Non-rotated"
config DEFAULT_SCREEN_ROTATION_90
bool "Rotated 90 degrees (rotate framebuffer to the right)"
config DEFAULT_SCREEN_ROTATION_180
bool "Rotated 180 degrees"
config DEFAULT_SCREEN_ROTATION_270
bool "Rotated 270 degrees (rotate framebuffer to the left)"
endchoice
config DEFAULT_SCREEN_ROTATION_INT
int
default 90 if DEFAULT_SCREEN_ROTATION_90
default 180 if DEFAULT_SCREEN_ROTATION_180
default 270 if DEFAULT_SCREEN_ROTATION_270
default 0
endmenu # "Display"
config PCI

View file

@ -21,6 +21,17 @@ is
configs : Pipe_Configs;
----------------------------------------------------------------------------
procedure Screen_Rotation (rotation : out Rotation_Type)
is
begin
rotation :=
(case Config.DEFAULT_SCREEN_ROTATION_INT is
when 90 => Rotated_90,
when 180 => Rotated_180,
when 270 => Rotated_270,
when others => No_Rotation);
end Screen_Rotation;
procedure gfxinit (lightup_ok : out Interfaces.C.int)
is
use type pos32;
@ -60,10 +71,21 @@ is
end loop;
fb := configs (Primary).Framebuffer;
fb.Width := Width_Type (min_h);
fb.Height := Height_Type (min_v);
fb.Stride := Div_Round_Up (fb.Width, 16) * 16;
fb.V_Stride := fb.Height;
Screen_Rotation (fb.Rotation);
if fb.Rotation = Rotated_90 or fb.Rotation = Rotated_270 then
fb.Width := Width_Type (min_v);
fb.Height := Height_Type (min_h);
fb.Stride := Div_Round_Up (fb.Width, 32) * 32;
fb.V_Stride := Div_Round_Up (fb.Height, 32) * 32;
fb.Tiling := Y_Tiled;
fb.Offset := word32 (GTT_Rotation_Offset) * GTT_Page_Size;
else
fb.Width := Width_Type (min_h);
fb.Height := Height_Type (min_v);
fb.Stride := Div_Round_Up (fb.Width, 16) * 16;
fb.V_Stride := fb.Height;
end if;
for i in Pipe_Index loop
exit when configs (i).Port = Disabled;