summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNico Huber <nico.huber@secunet.com>2020-01-14 15:21:45 +0100
committerFelix Held <felix-coreboot@felixheld.de>2024-09-30 11:01:09 +0000
commit520f20ef52fee0922d6eae491f0b929ca8598e94 (patch)
tree29ce68d0209a78bb9f62f2d86d3b67e2c287a33c /src
parentec7e41dd75ad11cc06a767758f1c69b8d005cc59 (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/device/Kconfig33
-rw-r--r--src/drivers/intel/gma/hires_fb/gma-gfx_init.adb30
2 files changed, 59 insertions, 4 deletions
diff --git a/src/device/Kconfig b/src/device/Kconfig
index 243e23e52a..bcff6fd8b0 100644
--- a/src/device/Kconfig
+++ b/src/device/Kconfig
@@ -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
diff --git a/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb b/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
index 49d0ca495a..66269b22d7 100644
--- a/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
+++ b/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
@@ -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;