Felix Held has submitted this change. ( https://review.coreboot.org/c/coreboot/+/38922?usp=email )
Change subject: libgfxinit: Allow to configure screen rotation ......................................................................
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 --- M src/device/Kconfig M src/drivers/intel/gma/hires_fb/gma-gfx_init.adb 2 files changed, 59 insertions(+), 4 deletions(-)
Approvals: build bot (Jenkins): Verified Angel Pons: Looks good to me, approved
diff --git a/src/device/Kconfig b/src/device/Kconfig index 243e23e..bcff6fd 100644 --- a/src/device/Kconfig +++ b/src/device/Kconfig @@ -519,6 +519,39 @@ 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 49d0ca4..66269b2 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 @@ 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 @@ 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;