diff options
author | Nico Huber <nico.h@gmx.de> | 2019-02-18 01:21:11 +0100 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2019-03-27 08:31:07 +0000 |
commit | 7458629de369a220ea24afdfbf5f1dc9fdc36a5e (patch) | |
tree | cc1ced64184e7f69914d52a438d01e4c4f777b36 /src/drivers/intel/gma/hires_fb/gma-gfx_init.adb | |
parent | fde7c317c2a6db0c35005b598042dd5509743207 (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.adb | 117 |
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; |