Nico Huber has uploaded this change for review.

View Change

libgfxinit: Allow to configure screen rotation

This allows us to configure a default screen rotation in 90 degree
steps. The framebuffer contents will then be displayed by the same
amount in the other direction.

The 90 and 270 degree settings are only supported by newer display
engines, from Skylake / Apollo Lake on.

Change-Id: Iac75cefbd34f28c55ec20ee152fe67351cc48653
Signed-off-by: Nico Huber <nico.huber@secunet.com>
---
M src/device/Kconfig
M src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
2 files changed, 47 insertions(+), 4 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/22/38922/1
diff --git a/src/device/Kconfig b/src/device/Kconfig
index a25bb91..6859c24 100644
--- a/src/device/Kconfig
+++ b/src/device/Kconfig
@@ -478,6 +478,27 @@
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 rotation"
+ depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT
+ default DEFAULT_SCREEN_ROTATION_NONE
+
+config DEFAULT_SCREEN_ROTATION_NONE
+ bool "None"
+
+config DEFAULT_SCREEN_ROTATION_90
+ bool "90 degrees CCW"
+ depends on GFX_GMA_GENERATION = "Broxton" || GFX_GMA_GENERATION = "Skylake"
+
+config DEFAULT_SCREEN_ROTATION_180
+ bool "180 degrees"
+
+config DEFAULT_SCREEN_ROTATION_270
+ bool "90 degrees CW"
+ depends on GFX_GMA_GENERATION = "Broxton" || GFX_GMA_GENERATION = "Skylake"
+
+endchoice
+
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 1393784..014e92b 100644
--- a/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
+++ b/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
@@ -54,9 +54,20 @@

----------------------------------------------------------------------------

+ procedure Screen_Rotation (rotation : out Rotation_Type)
+ is
+ begin
+ rotation :=
+ (if Config.DEFAULT_SCREEN_ROTATION_90 then Rotated_90
+ elsif Config.DEFAULT_SCREEN_ROTATION_180 then Rotated_180
+ elsif Config.DEFAULT_SCREEN_ROTATION_270 then Rotated_270
+ else No_Rotation);
+ end Screen_Rotation;
+
procedure gfxinit (lightup_ok : out Interfaces.C.int)
is
use type pos32;
+ use type word32;
use type word64;

ports : Port_List;
@@ -84,10 +95,21 @@
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;

To view, visit change 38922. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Iac75cefbd34f28c55ec20ee152fe67351cc48653
Gerrit-Change-Number: 38922
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h@gmx.de>
Gerrit-MessageType: newchange