aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
diff options
context:
space:
mode:
authorNico Huber <nico.h@gmx.de>2019-02-18 01:21:11 +0100
committerPatrick Georgi <pgeorgi@google.com>2019-03-27 08:31:07 +0000
commit7458629de369a220ea24afdfbf5f1dc9fdc36a5e (patch)
treecc1ced64184e7f69914d52a438d01e4c4f777b36 /src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
parentfde7c317c2a6db0c35005b598042dd5509743207 (diff)
drivers/intel/gma: Move gfxinit into sub package
Move the actual graphics init provided by libgfxinit into a sub package `GMA.GFX_Init`. This way it can be compiled in individually. Change-Id: Ib413a0d70c8dc305f4476c1d5aee6b81ff880bec Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/31456 Reviewed-by: Patrick Georgi <pgeorgi@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/drivers/intel/gma/hires_fb/gma-gfx_init.adb')
-rw-r--r--src/drivers/intel/gma/hires_fb/gma-gfx_init.adb117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb b/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
new file mode 100644
index 0000000000..1393784d7b
--- /dev/null
+++ b/src/drivers/intel/gma/hires_fb/gma-gfx_init.adb
@@ -0,0 +1,117 @@
+with CB.Config;
+
+use CB;
+
+with HW.GFX;
+with HW.GFX.Framebuffer_Filler;
+with HW.GFX.GMA;
+with HW.GFX.GMA.Display_Probing;
+
+use HW.GFX;
+use HW.GFX.GMA;
+use HW.GFX.GMA.Display_Probing;
+
+with GMA.Mainboard;
+
+package body GMA.GFX_Init
+is
+
+ fb_valid : boolean := false;
+
+ linear_fb_addr : word64;
+
+ fb : Framebuffer_Type;
+
+ function fill_lb_framebuffer
+ (framebuffer : in out lb_framebuffer)
+ return Interfaces.C.int
+ is
+ use type word32;
+ use type Interfaces.C.int;
+ begin
+ if fb_valid then
+ framebuffer :=
+ (tag => 0,
+ size => 0,
+ physical_address => linear_fb_addr,
+ x_resolution => word32 (fb.Width),
+ y_resolution => word32 (fb.Height),
+ bytes_per_line => 4 * word32 (fb.Stride),
+ bits_per_pixel => 32,
+ reserved_mask_pos => 24,
+ reserved_mask_size => 8,
+ red_mask_pos => 16,
+ red_mask_size => 8,
+ green_mask_pos => 8,
+ green_mask_size => 8,
+ blue_mask_pos => 0,
+ blue_mask_size => 8);
+ return 0;
+ else
+ return -1;
+ end if;
+ end fill_lb_framebuffer;
+
+ ----------------------------------------------------------------------------
+
+ procedure gfxinit (lightup_ok : out Interfaces.C.int)
+ is
+ use type pos32;
+ use type word64;
+
+ ports : Port_List;
+ configs : Pipe_Configs;
+
+ success : boolean;
+
+ min_h : pos32 := Config.LINEAR_FRAMEBUFFER_MAX_WIDTH;
+ min_v : pos32 := Config.LINEAR_FRAMEBUFFER_MAX_HEIGHT;
+ begin
+ lightup_ok := 0;
+
+ HW.GFX.GMA.Initialize (Success => success);
+
+ if success then
+ ports := Mainboard.ports;
+ HW.GFX.GMA.Display_Probing.Scan_Ports (configs, ports);
+
+ if configs (Primary).Port /= Disabled then
+ for i in Pipe_Index loop
+ exit when configs (i).Port = Disabled;
+
+ min_h := pos32'min (min_h, configs (i).Mode.H_Visible);
+ min_v := pos32'min (min_v, configs (i).Mode.V_Visible);
+ 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;
+
+ for i in Pipe_Index loop
+ exit when configs (i).Port = Disabled;
+
+ configs (i).Framebuffer := fb;
+ end loop;
+
+ HW.GFX.GMA.Dump_Configs (configs);
+
+ HW.GFX.GMA.Setup_Default_FB
+ (FB => fb,
+ Clear => true,
+ Success => success);
+
+ if success then
+ HW.GFX.GMA.Update_Outputs (configs);
+
+ HW.GFX.GMA.Map_Linear_FB (linear_fb_addr, fb);
+ fb_valid := linear_fb_addr /= 0;
+
+ lightup_ok := (if fb_valid then 1 else 0);
+ end if;
+ end if;
+ end if;
+ end gfxinit;
+
+end GMA.GFX_Init;