From 504d1eff4bd324915f5c44223ab03086b0cbbd2c Mon Sep 17 00:00:00 2001 From: Nico Huber Date: Sun, 16 Jul 2017 16:40:41 +0200 Subject: [PATCH] 3rdparty/lib{hwbase,gfxinit}: Update to latest master Simplifies our C interface function gma_gfxinit(), due to the following changes: * *libgfxinit* knows about the underlying PCI device now and can probe MMIO addresses by itself. * The framebuffer mapping is now completely handled inside the library where we validate that we neither overflow - the stolen memory, - the GTT address space, the GTT itself nor - the aperture window (i.e. resource2 of the PCI device) that we use to access the framebuffer. Other changes: * Fixes and a quirk for DP training. * Fix for DP-VGA adapters that report an analog display in EDID. * Fixes for Skylake support with coreboot. * DDI Buffer drive-strength configuration for Haswell, Broadwell and Skylake. * `gfx_test` can now be run from X windows (with glitches). * Compatibility with GCC 7 and SPARK GPL 2017. TEST=Booted lenovo/t420 and verified that everything works as usual. Change-Id: I001ba973d864811503410579fd7ad55ab8612759 Signed-off-by: Nico Huber Reviewed-on: https://review.coreboot.org/20606 Tested-by: build bot (Jenkins) Reviewed-by: Arthur Heymans --- 3rdparty/libgfxinit | 2 +- 3rdparty/libhwbase | 2 +- Documentation/gfx/libgfxinit.md | 13 ++---------- src/drivers/intel/gma/gma.ads | 6 +----- src/drivers/intel/gma/hires_fb/gma.adb | 27 ++++++++++++------------- src/drivers/intel/gma/libgfxinit.h | 2 +- src/drivers/intel/gma/text_fb/gma.adb | 10 ++------- src/northbridge/intel/haswell/gma.c | 10 +-------- src/northbridge/intel/nehalem/gma.c | 3 +-- src/northbridge/intel/sandybridge/gma.c | 3 +-- 10 files changed, 24 insertions(+), 54 deletions(-) diff --git a/3rdparty/libgfxinit b/3rdparty/libgfxinit index fb4f8ce26a..3a0e2a08f5 160000 --- a/3rdparty/libgfxinit +++ b/3rdparty/libgfxinit @@ -1 +1 @@ -Subproject commit fb4f8ce26a05c2304367c066b806519941658373 +Subproject commit 3a0e2a08f5489f3bb5c6e9f97b903e6e10c31a6c diff --git a/3rdparty/libhwbase b/3rdparty/libhwbase index 3bf6759dc0..66859712e4 160000 --- a/3rdparty/libhwbase +++ b/3rdparty/libhwbase @@ -1 +1 @@ -Subproject commit 3bf6759dc09d27c06b3533fd536e667356853d3d +Subproject commit 66859712e4817288591908d737dbf41ddea31c3a diff --git a/Documentation/gfx/libgfxinit.md b/Documentation/gfx/libgfxinit.md index 8e7473df89..472e967972 100644 --- a/Documentation/gfx/libgfxinit.md +++ b/Documentation/gfx/libgfxinit.md @@ -39,22 +39,13 @@ GMA: Hook-up in Chipset Initialization Both configurations described above implement a procedure `GMA.gfxinit()`: - procedure gfxinit - (mmio_base : in word64; - linear_fb : in word64; - phys_fb : in word32; - lightup_ok : out int); + procedure gfxinit (lightup_ok : out int); This procedure is exported as the C function `gma_gfxinit()` as follows: - void gma_gfxinit(uint64_t mmio_base, uint64_t linear_fb, - uint32_t phys_fb, int *lightup_ok); + void gma_gfxinit(int *lightup_ok); -* `mmio_base`: the base address of the GMA's MMIO resource -* `linear_fb`: the base address of the GMA's GTT window resource -* `phys_fb`: the physical address where the framebuffer should be - stored (usually the GMA's stolen memory) * `lightup_ok`: returns whether the initialization succeeded `1` or failed `0`. Currently, only the case that no display could be found counts as failure. A failure at a la- diff --git a/src/drivers/intel/gma/gma.ads b/src/drivers/intel/gma/gma.ads index 157ec89fcc..7286e7e568 100644 --- a/src/drivers/intel/gma/gma.ads +++ b/src/drivers/intel/gma/gma.ads @@ -6,11 +6,7 @@ use HW; package GMA is - procedure gfxinit - (mmio_base : in word64; - linear_fb : in word64; - phys_fb : in word32; - lightup_ok : out Interfaces.C.int); + procedure gfxinit (lightup_ok : out Interfaces.C.int); pragma Export (C, gfxinit, "gma_gfxinit"); ---------------------------------------------------------------------------- diff --git a/src/drivers/intel/gma/hires_fb/gma.adb b/src/drivers/intel/gma/hires_fb/gma.adb index 7fe4e1200d..b1168acd4d 100644 --- a/src/drivers/intel/gma/hires_fb/gma.adb +++ b/src/drivers/intel/gma/hires_fb/gma.adb @@ -50,13 +50,10 @@ is ---------------------------------------------------------------------------- - procedure gfxinit - (mmio_base : in word64; - linear_fb : in word64; - phys_fb : in word32; - lightup_ok : out Interfaces.C.int) + procedure gfxinit (lightup_ok : out Interfaces.C.int) is use type pos32; + use type word64; ports : Port_List; configs : Pipe_Configs; @@ -68,9 +65,7 @@ is begin lightup_ok := 0; - HW.GFX.GMA.Initialize - (MMIO_Base => mmio_base, - Success => success); + HW.GFX.GMA.Initialize (Success => success); if success then ports := Mainboard.ports; @@ -98,15 +93,19 @@ is HW.GFX.GMA.Dump_Configs (configs); - HW.GFX.GMA.Setup_Default_GTT (fb, phys_fb); - HW.GFX.Framebuffer_Filler.Fill (linear_fb, fb); + HW.GFX.GMA.Setup_Default_FB + (FB => fb, + Clear => true, + Success => success); - HW.GFX.GMA.Update_Outputs (configs); + if success then + HW.GFX.GMA.Update_Outputs (configs); - linear_fb_addr := linear_fb; - fb_valid := true; + HW.GFX.GMA.Map_Linear_FB (linear_fb_addr, fb); + fb_valid := linear_fb_addr /= 0; - lightup_ok := 1; + lightup_ok := (if fb_valid then 1 else 0); + end if; end if; end if; end gfxinit; diff --git a/src/drivers/intel/gma/libgfxinit.h b/src/drivers/intel/gma/libgfxinit.h index 9b28f80b5f..c67870e4e0 100644 --- a/src/drivers/intel/gma/libgfxinit.h +++ b/src/drivers/intel/gma/libgfxinit.h @@ -14,6 +14,6 @@ #ifndef DRIVERS_INTEL_GMA_LIBGFXINIT_H #define DRIVERS_INTEL_GMA_LIBGFXINIT_H -void gma_gfxinit(u64 mmio_base, u64 linear_fb, u32 phys_fb, int *success); +void gma_gfxinit(int *lightup_ok); #endif diff --git a/src/drivers/intel/gma/text_fb/gma.adb b/src/drivers/intel/gma/text_fb/gma.adb index 6453571d8c..ded7b9ee62 100644 --- a/src/drivers/intel/gma/text_fb/gma.adb +++ b/src/drivers/intel/gma/text_fb/gma.adb @@ -22,11 +22,7 @@ is ---------------------------------------------------------------------------- - procedure gfxinit - (mmio_base : in word64; - linear_fb : in word64; - phys_fb : in word32; - lightup_ok : out Interfaces.C.int) + procedure gfxinit (lightup_ok : out Interfaces.C.int) is ports : Port_List; configs : Pipe_Configs; @@ -41,9 +37,7 @@ is begin lightup_ok := 0; - HW.GFX.GMA.Initialize - (MMIO_Base => mmio_base, - Success => success); + HW.GFX.GMA.Initialize (Success => success); if success then ports := Mainboard.ports; diff --git a/src/northbridge/intel/haswell/gma.c b/src/northbridge/intel/haswell/gma.c index 535a7f0af0..c7319fbec8 100644 --- a/src/northbridge/intel/haswell/gma.c +++ b/src/northbridge/intel/haswell/gma.c @@ -456,12 +456,6 @@ static void gma_func0_init(struct device *dev) { int lightup_ok = 0; u32 reg32; - u64 physbase; - const struct resource *const linearfb_res = - find_resource(dev, PCI_BASE_ADDRESS_2); - - if (!linearfb_res || !linearfb_res->base) - return; /* IGD needs to be Bus Master */ reg32 = pci_read_config32(dev, PCI_COMMAND); @@ -476,9 +470,7 @@ static void gma_func0_init(struct device *dev) if (IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) { printk(BIOS_SPEW, "NATIVE graphics, run native enable\n"); - physbase = pci_read_config32(dev, 0x5c) & ~0xf; - gma_gfxinit(gtt_res->base, linearfb_res->base, - physbase, &lightup_ok); + gma_gfxinit(&lightup_ok); gfx_set_init_done(1); } diff --git a/src/northbridge/intel/nehalem/gma.c b/src/northbridge/intel/nehalem/gma.c index 591a2d6f56..0db8f3c88a 100644 --- a/src/northbridge/intel/nehalem/gma.c +++ b/src/northbridge/intel/nehalem/gma.c @@ -1061,8 +1061,7 @@ static void gma_func0_init(struct device *dev) gtt_res->base); if (IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) { int lightup_ok; - gma_gfxinit(gtt_res->base, lfb_res->base, - physbase, &lightup_ok); + gma_gfxinit(&lightup_ok); } else { intel_gma_init(conf, res2mmio(gtt_res, 0, 0), physbase, pio_res->base, lfb_res->base); diff --git a/src/northbridge/intel/sandybridge/gma.c b/src/northbridge/intel/sandybridge/gma.c index 4cda965f4e..61b9008467 100644 --- a/src/northbridge/intel/sandybridge/gma.c +++ b/src/northbridge/intel/sandybridge/gma.c @@ -648,8 +648,7 @@ static void gma_func0_init(struct device *dev) int lightup_ok; if (IS_ENABLED(CONFIG_MAINBOARD_USE_LIBGFXINIT)) { - gma_gfxinit((uintptr_t)mmiobase, graphics_base, - physbase, &lightup_ok); + gma_gfxinit(&lightup_ok); } else { lightup_ok = i915lightup_sandy(&conf->gfx, physbase, iobase, mmiobase, graphics_base);