[coreboot-gerrit] New patch to review for coreboot: drivers/intel/gma: Add textmode support with libgfxinit

Nico Huber (nico.h@gmx.de) gerrit at coreboot.org
Tue Nov 8 11:49:17 CET 2016


Nico Huber (nico.h at gmx.de) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17279

-gerrit

commit d1bbb14f6d5ded1ad1c1b49ad5407d354e726545
Author: Nico Huber <nico.huber at secunet.com>
Date:   Mon Nov 7 17:24:47 2016 +0100

    drivers/intel/gma: Add textmode support with libgfxinit
    
    Add an alternative gfxinit implementation for textmode. The legacy VGA
    plane and textmode is configured through coreboot provided functions.
    libgfxinit uses this plane as alternative to the usual high resolution
    plane.
    
    Needs updates in 3rdparty/libgfxinit.
    
    Change-Id: Iad0754c50fc6faec35f49583fe1c7cb50ac6c0c5
    Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
 3rdparty/libgfxinit                    |   2 +-
 src/device/Kconfig                     |   1 +
 src/drivers/intel/gma/Makefile.inc     |   6 +-
 src/drivers/intel/gma/gma.adb          | 117 ---------------------------------
 src/drivers/intel/gma/hires_fb/gma.adb | 117 +++++++++++++++++++++++++++++++++
 src/drivers/intel/gma/text_fb/gma.adb  |  75 +++++++++++++++++++++
 6 files changed, 199 insertions(+), 119 deletions(-)

diff --git a/3rdparty/libgfxinit b/3rdparty/libgfxinit
index 6a35667..b6e3b35 160000
--- a/3rdparty/libgfxinit
+++ b/3rdparty/libgfxinit
@@ -1 +1 @@
-Subproject commit 6a3566773f3b52550ebf0d042154958a2403bb40
+Subproject commit b6e3b35918765d303985d21ae08b8ffad3f2ecc7
diff --git a/src/device/Kconfig b/src/device/Kconfig
index dd31cba..21e1abc 100644
--- a/src/device/Kconfig
+++ b/src/device/Kconfig
@@ -45,6 +45,7 @@ config MAINBOARD_DO_NATIVE_VGA_INIT
 config MAINBOARD_HAS_LIBGFXINIT
 	def_bool n
 	select MAINBOARD_HAS_NATIVE_VGA_INIT
+	select MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG
 	help
 	  Selected by mainboards that implement support for `libgfxinit`.
 	  Usually this requires a list of ports to be probed for displays.
diff --git a/src/drivers/intel/gma/Makefile.inc b/src/drivers/intel/gma/Makefile.inc
index a4e007c..d4d6c08 100644
--- a/src/drivers/intel/gma/Makefile.inc
+++ b/src/drivers/intel/gma/Makefile.inc
@@ -40,6 +40,10 @@ CONFIG_GFX_GMA_DEFAULT_MMIO := 0 # dummy, will be overwritten at runtime
 subdirs-y += ../../../../3rdparty/libgfxinit
 
 ramstage-y += gma.ads
-ramstage-y += gma.adb
+ifeq ($(CONFIG_FRAMEBUFFER_KEEP_VESA_MODE),y)
+ramstage-y += hires_fb/gma.adb
+else
+ramstage-y += text_fb/gma.adb
+endif
 
 endif # CONFIG_MAINBOARD_USE_LIBGFXINIT
diff --git a/src/drivers/intel/gma/gma.adb b/src/drivers/intel/gma/gma.adb
deleted file mode 100644
index 7ebc4f8..0000000
--- a/src/drivers/intel/gma/gma.adb
+++ /dev/null
@@ -1,117 +0,0 @@
-with HW.GFX;
-with HW.GFX.Framebuffer_Filler;
-with HW.GFX.GMA;
-
-use HW.GFX;
-use HW.GFX.GMA;
-
-with GMA.Mainboard;
-
-package body GMA
-is
-
-   vbe_valid : boolean := false;
-
-   linear_fb_addr : word64;
-
-   fb : Framebuffer_Type;
-
-   function vbe_mode_info_valid return Interfaces.C.int
-   is
-   begin
-      return (if vbe_valid then 1 else 0);
-   end vbe_mode_info_valid;
-
-   procedure fill_lb_framebuffer (framebuffer : out lb_framebuffer)
-   is
-      use type word32;
-   begin
-      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);
-   end fill_lb_framebuffer;
-
-   ----------------------------------------------------------------------------
-
-   procedure gfxinit
-     (mmio_base   : in     word64;
-      linear_fb   : in     word64;
-      phys_fb     : in     word32;
-      lightup_ok  :    out Interfaces.C.int)
-   is
-      use type pos32;
-
-      ports : Port_List;
-      configs : Configs_Type;
-
-      success : boolean;
-
-      stride : Width_Type;
-      max_h : pos16 := 1;
-      max_v : pos16 := 1;
-   begin
-      lightup_ok := 0;
-
-      HW.GFX.GMA.Initialize
-        (MMIO_Base   => mmio_base,
-         Success     => success);
-
-      if success then
-         ports := Mainboard.ports;
-         HW.GFX.GMA.Scan_Ports (configs, ports);
-
-         if configs (Primary).Port /= Disabled then
-            for i in Config_Index loop
-               exit when configs (i).Port = Disabled;
-
-               max_h := pos16'max (max_h, configs (i).Mode.H_Visible);
-               max_v := pos16'max (max_v, configs (i).Mode.V_Visible);
-            end loop;
-
-            stride := ((Width_Type (max_h) + 63) / 64) * 64;
-            for i in Config_Index loop
-               exit when configs (i).Port = Disabled;
-
-               configs (i).Framebuffer :=
-                 (Width    => Width_Type (configs (i).Mode.H_Visible),
-                  Height   => Height_Type (configs (i).Mode.V_Visible),
-                  BPC      => 8,
-                  Stride   => stride,
-                  Offset   => 0);
-            end loop;
-
-            HW.GFX.GMA.Dump_Configs (configs);
-
-            fb :=
-               (Width   => Width_Type (max_h),
-                Height  => Height_Type (max_v),
-                BPC     => 8,
-                Stride  => stride,
-                Offset  => 0);
-            HW.GFX.GMA.Setup_Default_GTT (fb, phys_fb);
-            HW.GFX.Framebuffer_Filler.Fill (linear_fb, fb);
-
-            HW.GFX.GMA.Update_Outputs (configs);
-
-            linear_fb_addr := linear_fb;
-            vbe_valid := true;
-
-            lightup_ok := 1;
-         end if;
-      end if;
-   end gfxinit;
-
-end GMA;
diff --git a/src/drivers/intel/gma/hires_fb/gma.adb b/src/drivers/intel/gma/hires_fb/gma.adb
new file mode 100644
index 0000000..7ebc4f8
--- /dev/null
+++ b/src/drivers/intel/gma/hires_fb/gma.adb
@@ -0,0 +1,117 @@
+with HW.GFX;
+with HW.GFX.Framebuffer_Filler;
+with HW.GFX.GMA;
+
+use HW.GFX;
+use HW.GFX.GMA;
+
+with GMA.Mainboard;
+
+package body GMA
+is
+
+   vbe_valid : boolean := false;
+
+   linear_fb_addr : word64;
+
+   fb : Framebuffer_Type;
+
+   function vbe_mode_info_valid return Interfaces.C.int
+   is
+   begin
+      return (if vbe_valid then 1 else 0);
+   end vbe_mode_info_valid;
+
+   procedure fill_lb_framebuffer (framebuffer : out lb_framebuffer)
+   is
+      use type word32;
+   begin
+      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);
+   end fill_lb_framebuffer;
+
+   ----------------------------------------------------------------------------
+
+   procedure gfxinit
+     (mmio_base   : in     word64;
+      linear_fb   : in     word64;
+      phys_fb     : in     word32;
+      lightup_ok  :    out Interfaces.C.int)
+   is
+      use type pos32;
+
+      ports : Port_List;
+      configs : Configs_Type;
+
+      success : boolean;
+
+      stride : Width_Type;
+      max_h : pos16 := 1;
+      max_v : pos16 := 1;
+   begin
+      lightup_ok := 0;
+
+      HW.GFX.GMA.Initialize
+        (MMIO_Base   => mmio_base,
+         Success     => success);
+
+      if success then
+         ports := Mainboard.ports;
+         HW.GFX.GMA.Scan_Ports (configs, ports);
+
+         if configs (Primary).Port /= Disabled then
+            for i in Config_Index loop
+               exit when configs (i).Port = Disabled;
+
+               max_h := pos16'max (max_h, configs (i).Mode.H_Visible);
+               max_v := pos16'max (max_v, configs (i).Mode.V_Visible);
+            end loop;
+
+            stride := ((Width_Type (max_h) + 63) / 64) * 64;
+            for i in Config_Index loop
+               exit when configs (i).Port = Disabled;
+
+               configs (i).Framebuffer :=
+                 (Width    => Width_Type (configs (i).Mode.H_Visible),
+                  Height   => Height_Type (configs (i).Mode.V_Visible),
+                  BPC      => 8,
+                  Stride   => stride,
+                  Offset   => 0);
+            end loop;
+
+            HW.GFX.GMA.Dump_Configs (configs);
+
+            fb :=
+               (Width   => Width_Type (max_h),
+                Height  => Height_Type (max_v),
+                BPC     => 8,
+                Stride  => stride,
+                Offset  => 0);
+            HW.GFX.GMA.Setup_Default_GTT (fb, phys_fb);
+            HW.GFX.Framebuffer_Filler.Fill (linear_fb, fb);
+
+            HW.GFX.GMA.Update_Outputs (configs);
+
+            linear_fb_addr := linear_fb;
+            vbe_valid := true;
+
+            lightup_ok := 1;
+         end if;
+      end if;
+   end gfxinit;
+
+end GMA;
diff --git a/src/drivers/intel/gma/text_fb/gma.adb b/src/drivers/intel/gma/text_fb/gma.adb
new file mode 100644
index 0000000..bbb6d74
--- /dev/null
+++ b/src/drivers/intel/gma/text_fb/gma.adb
@@ -0,0 +1,75 @@
+with HW.GFX;
+with HW.GFX.GMA;
+
+use HW.GFX;
+use HW.GFX.GMA;
+
+with GMA.Mainboard;
+
+package body GMA
+is
+
+   function vbe_mode_info_valid return Interfaces.C.int
+   is
+   begin
+      return 0;
+   end vbe_mode_info_valid;
+
+   procedure fill_lb_framebuffer (framebuffer : out lb_framebuffer)
+   is
+   begin
+      null;
+   end fill_lb_framebuffer;
+
+   ----------------------------------------------------------------------------
+
+   procedure gfxinit
+     (mmio_base   : in     word64;
+      linear_fb   : in     word64;
+      phys_fb     : in     word32;
+      lightup_ok  :    out Interfaces.C.int)
+   is
+      ports : Port_List;
+      configs : Configs_Type;
+
+      success : boolean;
+
+      -- from pc80/vga driver
+      procedure vga_io_init;
+      pragma Import (C, vga_io_init, "vga_io_init");
+      procedure vga_textmode_init;
+      pragma Import (C, vga_textmode_init, "vga_textmode_init");
+   begin
+      lightup_ok := 0;
+
+      HW.GFX.GMA.Initialize
+        (MMIO_Base   => mmio_base,
+         Success     => success);
+
+      if success then
+         ports := Mainboard.ports;
+         HW.GFX.GMA.Scan_Ports
+           (Configs  => configs,
+            Ports    => ports,
+            Max_Pipe => Primary);
+
+         if configs (Primary).Port /= Disabled then
+            vga_io_init;
+            vga_textmode_init;
+
+            configs (Primary).Framebuffer :=
+              (Width    => 640,
+               Height   => 400,
+               BPC      => Auto_BPC,   -- ignored for VGA plane
+               Stride   => 320,        -- ignored
+               Offset   => VGA_PLANE_FRAMEBUFFER_OFFSET);
+
+            HW.GFX.GMA.Dump_Configs (configs);
+            HW.GFX.GMA.Update_Outputs (configs);
+
+            lightup_ok := 1;
+         end if;
+      end if;
+   end gfxinit;
+
+end GMA;



More information about the coreboot-gerrit mailing list