Nico Huber has uploaded this change for review. ( https://review.coreboot.org/c/libgfxinit/+/31454
Change subject: gma: Publish Read_EDID()
......................................................................
gma: Publish Read_EDID()
Might be useful in coreboot to read the raw EDID.
Change-Id: I13d28a4434de3b0699a3475dd96febfdf75639f0
Signed-off-by: Nico Huber <nico.h(a)gmx.de>
---
M common/hw-gfx-gma-display_probing.adb
M common/hw-gfx-gma-display_probing.ads
M common/hw-gfx-gma.ads
3 files changed, 11 insertions(+), 6 deletions(-)
git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/54/31454/1
diff --git a/common/hw-gfx-gma-display_probing.adb b/common/hw-gfx-gma-display_probing.adb
index 9f756f6..cd2a452 100644
--- a/common/hw-gfx-gma-display_probing.adb
+++ b/common/hw-gfx-gma-display_probing.adb
@@ -13,7 +13,6 @@
--
with HW.GFX.I2C;
-with HW.GFX.EDID;
with HW.GFX.GMA.Config;
with HW.GFX.GMA.Config_Helpers;
with HW.GFX.GMA.I2C;
@@ -56,8 +55,6 @@
(Raw_EDID : out EDID.Raw_EDID_Data;
Port : in Active_Port_Type;
Success : out Boolean)
- with
- Post => (if Success then EDID.Valid (Raw_EDID))
is
Raw_EDID_Length : GFX.I2C.Transfer_Length := Raw_EDID'Length;
begin
diff --git a/common/hw-gfx-gma-display_probing.ads b/common/hw-gfx-gma-display_probing.ads
index f5cd839..e51de88 100644
--- a/common/hw-gfx-gma-display_probing.ads
+++ b/common/hw-gfx-gma-display_probing.ads
@@ -12,6 +12,8 @@
-- GNU General Public License for more details.
--
+with HW.GFX.EDID;
+
package HW.GFX.GMA.Display_Probing
is
@@ -20,6 +22,13 @@
All_Ports : constant Port_List :=
(DP1, DP2, DP3, HDMI1, HDMI2, HDMI3, Analog, Internal);
+ procedure Read_EDID
+ (Raw_EDID : out EDID.Raw_EDID_Data;
+ Port : in Active_Port_Type;
+ Success : out Boolean)
+ with
+ Post => (if Success then EDID.Valid (Raw_EDID));
+
procedure Scan_Ports
(Configs : out Pipe_Configs;
Ports : in Port_List := All_Ports;
diff --git a/common/hw-gfx-gma.ads b/common/hw-gfx-gma.ads
index 7ca0ca1..d3792a2 100644
--- a/common/hw-gfx-gma.ads
+++ b/common/hw-gfx-gma.ads
@@ -57,6 +57,8 @@
HDMI2, -- or DVI
HDMI3, -- or DVI
Analog);
+ subtype Active_Port_Type is Port_Type
+ range Port_Type'Succ (Disabled) .. Port_Type'Last;
type Cursor_Mode is (No_Cursor, ARGB_Cursor);
type Cursor_Size is (Cursor_64x64, Cursor_128x128, Cursor_256x256);
@@ -171,9 +173,6 @@
----------------------------------------------------------------------------
-- Internal representation of a single pipe's configuration
- subtype Active_Port_Type is Port_Type
- range Port_Type'Succ (Disabled) .. Port_Type'Last;
-
type GPU_Port is (DIGI_A, DIGI_B, DIGI_C, DIGI_D, DIGI_E, LVDS, VGA);
subtype Digital_Port is GPU_Port range DIGI_A .. DIGI_E;
--
To view, visit https://review.coreboot.org/c/libgfxinit/+/31454
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: libgfxinit
Gerrit-Branch: master
Gerrit-Change-Id: I13d28a4434de3b0699a3475dd96febfdf75639f0
Gerrit-Change-Number: 31454
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h(a)gmx.de>
Gerrit-MessageType: newchange
Nico Huber has uploaded this change for review. ( https://review.coreboot.org/c/libgfxinit/+/31452
Change subject: gma: Add support for ULX variants
......................................................................
gma: Add support for ULX variants
On Haswell and Broadwell, the ULX variants differ only in the available
CD clock frequencies and, on Haswell, the maximum DP link rate. On newer
generations (Skylake+), they differ only in output buffer tuning.
Also update the PCI IDs from Haswell to Skylake.
Still untested, which was the original reason to skip ULX.
Change-Id: I08e6689ff8c0f2d58b51363886d4cab956f44e03
Signed-off-by: Nico Huber <nico.h(a)gmx.de>
---
M common/haswell/hw-gfx-gma-plls.adb
M common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
M common/hw-gfx-gma-config.ads.template
M common/hw-gfx-gma.ads
M common/skylake/hw-gfx-gma-connectors-ddi-buffers.adb
5 files changed, 136 insertions(+), 46 deletions(-)
git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/52/31452/1
diff --git a/common/haswell/hw-gfx-gma-plls.adb b/common/haswell/hw-gfx-gma-plls.adb
index 3a91bdd..0450238 100644
--- a/common/haswell/hw-gfx-gma-plls.adb
+++ b/common/haswell/hw-gfx-gma-plls.adb
@@ -1,5 +1,5 @@
--
--- Copyright (C) 2015-2016 secunet Security Networks AG
+-- Copyright (C) 2015-2016, 2019 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
@@ -12,6 +12,7 @@
-- GNU General Public License for more details.
--
+with HW.GFX.GMA.Config;
with HW.GFX.GMA.PLLs.LCPLL;
with HW.GFX.GMA.PLLs.WRPLL;
@@ -87,8 +88,13 @@
PLL := Invalid;
Success := True;
elsif Port_Cfg.Display = DP then
- PLL := LCPLL.Fixed_LCPLLs (Port_Cfg.DP.Bandwidth);
- Success := True;
+ if Port_Cfg.DP.Bandwidth <= Config.DP_Max_Link_Rate then
+ PLL := LCPLL.Fixed_LCPLLs (Port_Cfg.DP.Bandwidth);
+ Success := True;
+ else
+ PLL := Invalid;
+ Success := False;
+ end if;
else
Alloc_Configurable (Port_Cfg.Mode, PLL, Success);
end if;
diff --git a/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb b/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
index 88f2b22..ef6d568 100644
--- a/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
+++ b/common/haswell_shared/hw-gfx-gma-connectors-ddi.adb
@@ -298,7 +298,7 @@
procedure Initialize
is
- Iboost_Value : constant Word32 := 1;
+ Iboost_Value : constant := Config.DDI_Buffer_Iboost;
begin
if Config.Has_DDI_Buffer_Trans then
declare
diff --git a/common/hw-gfx-gma-config.ads.template b/common/hw-gfx-gma-config.ads.template
index a922b05..b190a78 100644
--- a/common/hw-gfx-gma-config.ads.template
+++ b/common/hw-gfx-gma-config.ads.template
@@ -1,5 +1,5 @@
--
--- Copyright (C) 2015-2018 secunet Security Networks AG
+-- Copyright (C) 2015-2019 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
@@ -42,6 +42,8 @@
Have_DVI_I : constant Boolean := Analog_I2C_Port /= PCH_DAC;
Has_Presence_Straps : constant Boolean := CPU /= Broxton;
Is_ULT : constant Boolean := CPU_Var = ULT;
+ Is_ULX : constant Boolean := CPU_Var = ULX;
+ Is_LP : constant Boolean := Is_ULT or Is_ULX;
----- CPU pipe: --------
Has_Tertiary_Pipe : constant Boolean := CPU >= Ivybridge;
@@ -74,7 +76,7 @@
Has_PCH : constant Boolean := CPU /= Broxton and CPU /= G45;
Has_PCH_DAC : constant Boolean := CPU in Ironlake .. Ivybridge or
(CPU in Haswell .. Broadwell
- and not Is_ULT);
+ and not Is_LP);
Has_PCH_Aux_Channels : constant Boolean := CPU in Ironlake .. Broadwell;
@@ -98,13 +100,13 @@
Has_Per_DDI_Clock_Sel : constant Boolean := CPU in Haswell .. Broadwell;
Has_HOTPLUG_CTL : constant Boolean := CPU in Haswell .. Broadwell;
Has_SHOTPLUG_CTL_A : constant Boolean := (CPU in Haswell .. Broadwell
- and Is_ULT) or
+ and Is_LP) or
CPU >= Skylake;
Has_DDI_PHYs : constant Boolean := CPU = Broxton;
Has_DDI_D : constant Boolean := CPU >= Haswell and
- not Is_ULT and
+ not Is_LP and
not Has_DDI_PHYs;
Has_DDI_E : constant Boolean := -- might be disabled by x4 eDP
Has_DDI_D;
@@ -122,7 +124,7 @@
Has_PCH_GMBUS : constant Boolean := CPU >= Ironlake;
----- Power: -----------
- Has_IPS : constant Boolean := (CPU = Haswell and Is_ULT) or
+ Has_IPS : constant Boolean := (CPU = Haswell and Is_LP) or
CPU = Broadwell;
Has_IPS_CTL_Mailbox : constant Boolean := CPU = Broadwell;
@@ -220,6 +222,8 @@
----------------------------------------------------------------------------
+ DDI_Buffer_Iboost : constant := (if Is_ULX then 3 else 1);
+
Default_DDI_HDMI_Buffer_Translation : constant DDI_HDMI_Buf_Trans_Range :=
(case CPU is
when Haswell => 6,
@@ -233,11 +237,11 @@
Default_CDClk_Freq : constant Frequency_Type :=
(case CPU is
when G45 => 320_000_000, -- unused
- when Ironlake |
- Haswell |
- Broadwell => 450_000_000,
+ when Ironlake => 450_000_000,
when Sandybridge |
Ivybridge => 400_000_000,
+ when Haswell |
+ Broadwell => (if Is_ULX then 337_500_000 else 450_000_000),
when Broxton => 288_000_000,
when Skylake => 337_500_000);
@@ -248,7 +252,7 @@
Sandybridge |
Ivybridge => 125_000_000,
when Haswell |
- Broadwell => (if Is_ULT then 24_000_000 else 125_000_000),
+ Broadwell => (if Is_LP then 24_000_000 else 125_000_000),
when Broxton => Frequency_Type'First, -- none needed
when Skylake => 24_000_000);
@@ -286,6 +290,11 @@
----------------------------------------------------------------------------
+ DP_Max_Link_Rate : constant DP_Bandwidth :=
+ (if CPU < Haswell or (CPU = Haswell and Is_ULX)
+ then DP_Bandwidth_2_7
+ else DP_Bandwidth_5_4);
+
-- FIXME: Unknown for Broxton, Linux' i915 contains a fixme too :-D
HDMI_Max_Clock_24bpp : constant Frequency_Type :=
(if CPU >= Haswell then 300_000_000 else 225_000_000);
@@ -318,15 +327,50 @@
use type HW.Word16;
- function Is_Broadwell_H (Device_Id : Word16) return Boolean is
- (Device_Id = 16#1612# or Device_Id = 16#1622# or Device_Id = 16#162a#);
+ -- GMA PCI IDs:
+ --
+ -- Rather catch too much here than too little, it's
+ -- mostly used to distinguish generations. Best public
+ -- reference for these IDs is Linux' i915.
+ --
+ -- Since Sandybridge, bits 4 and 5 encode the compu-
+ -- tational capabilities and can mostly be ignored.
+ -- From Haswell on, we have to distinguish between
+ -- Normal, ULT (U CPU lines) and ULX (Y CPU lines).
+ function Is_Haswell_Y (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffef#) = 16#0a0e#);
+ function Is_Haswell_U (Device_Id : Word16) return Boolean is
+ (((Device_Id and 16#ffc3#) = 16#0a02# or
+ (Device_Id and 16#ffcf#) = 16#0a0b#) and
+ not Is_Haswell_Y (Device_Id));
+ function Is_Haswell (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffc3#) = 16#0402# or
+ (Device_Id and 16#ffcf#) = 16#040b# or
+ (Device_Id and 16#ffc3#) = 16#0c02# or
+ (Device_Id and 16#ffcf#) = 16#0c0b# or
+ (Device_Id and 16#ffc3#) = 16#0d02# or
+ (Device_Id and 16#ffcf#) = 16#0d0b#);
+
+ function Is_Broadwell_Y (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffcf#) = 16#160e#);
+ function Is_Broadwell_U (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffcf#) = 16#1606# or
+ (Device_Id and 16#ffcf#) = 16#160b#);
+ function Is_Broadwell (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffc7#) = 16#1602# or
+ (Device_Id and 16#ffcf#) = 16#160d#);
+
+ function Is_Skylake_Y (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffcf#) = 16#190e#);
function Is_Skylake_U (Device_Id : Word16) return Boolean is
- (Device_Id = 16#1906# or Device_Id = 16#1916# or Device_Id = 16#1923# or
- Device_Id = 16#1926# or Device_Id = 16#1927#);
+ ((Device_Id and 16#ffc9#) = 16#1901# or
+ (Device_Id and 16#ffcf#) = 16#1906#);
+ function Is_Skylake (Device_Id : Word16) return Boolean is
+ ((Device_Id and 16#ffc7#) = 16#1902# or
+ (Device_Id and 16#ffcf#) = 16#190b# or
+ (Device_Id and 16#ffcf#) = 16#190d#);
- -- Rather catch too much here than too little,
- -- it's only used to distinguish generations.
function Is_GPU (Device_Id : Word16; CPU : CPU_Type; CPU_Var : CPU_Variant)
return Boolean is
(case CPU is
@@ -335,25 +379,19 @@
when Ironlake => (Device_Id and 16#fff3#) = 16#0042#,
when Sandybridge => (Device_Id and 16#ffc2#) = 16#0102#,
when Ivybridge => (Device_Id and 16#ffc3#) = 16#0142#,
- when Haswell =>
- (case CPU_Var is
- when Normal => (Device_Id and 16#ffc3#) = 16#0402# or
- (Device_Id and 16#ffc3#) = 16#0d02#,
- when ULT => (Device_Id and 16#ffc3#) = 16#0a02#),
- when Broadwell => ((Device_Id and 16#ffc3#) = 16#1602# or
- (Device_Id and 16#ffcf#) = 16#160b# or
- (Device_Id and 16#ffcf#) = 16#160d#) and
- (case CPU_Var is
- when Normal => Is_Broadwell_H (Device_Id),
- when ULT => not Is_Broadwell_H (Device_Id)),
+ when Haswell => (case CPU_Var is
+ when Normal => Is_Haswell (Device_Id),
+ when ULT => Is_Haswell_U (Device_Id),
+ when ULX => Is_Haswell_Y (Device_Id)),
+ when Broadwell => (case CPU_Var is
+ when Normal => Is_Broadwell (Device_Id),
+ when ULT => Is_Broadwell_U (Device_Id),
+ when ULX => Is_Broadwell_Y (Device_Id)),
when Broxton => (Device_Id and 16#fffe#) = 16#5a84#,
- when Skylake => ((Device_Id and 16#ffc3#) = 16#1902# or
- (Device_Id and 16#ffcf#) = 16#190b# or
- (Device_Id and 16#ffcf#) = 16#190d# or
- (Device_Id and 16#fff9#) = 16#1921#) and
- (case CPU_Var is
- when Normal => not Is_Skylake_U (Device_Id),
- when ULT => Is_Skylake_U (Device_Id)));
+ when Skylake => (case CPU_Var is
+ when Normal => Is_Skylake (Device_Id),
+ when ULT => Is_Skylake_U (Device_Id),
+ when ULX => Is_Skylake_Y (Device_Id)));
function Compatible_GPU (Device_Id : Word16) return Boolean is
(Is_GPU (Device_Id, CPU, CPU_Var));
diff --git a/common/hw-gfx-gma.ads b/common/hw-gfx-gma.ads
index 1f81ece..d9023ad 100644
--- a/common/hw-gfx-gma.ads
+++ b/common/hw-gfx-gma.ads
@@ -44,7 +44,7 @@
Broxton,
Skylake);
- type CPU_Variant is (Normal, ULT);
+ type CPU_Variant is (Normal, ULT, ULX);
type Port_Type is
(Disabled,
diff --git a/common/skylake/hw-gfx-gma-connectors-ddi-buffers.adb b/common/skylake/hw-gfx-gma-connectors-ddi-buffers.adb
index 5e72a3b..6ab755b 100644
--- a/common/skylake/hw-gfx-gma-connectors-ddi-buffers.adb
+++ b/common/skylake/hw-gfx-gma-connectors-ddi-buffers.adb
@@ -1,5 +1,5 @@
--
--- Copyright (C) 2017 secunet Security Networks AG
+-- Copyright (C) 2017, 2019 secunet Security Networks AG
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
@@ -51,6 +51,18 @@
16#0000_5013#, 16#0000_009f#,
16#0000_0018#, 16#0000_00df#);
+ Skylake_Y_Trans_EDP : constant Buf_Trans_Array :=
+ (16#0000_0018#, 16#0000_00a8#,
+ 16#0000_4013#, 16#0000_00ab#,
+ 16#0000_7011#, 16#0000_00a4#,
+ 16#0000_9010#, 16#0000_00df#,
+ 16#0000_0018#, 16#0000_00aa#,
+ 16#0000_6013#, 16#0000_00a4#,
+ 16#0000_7011#, 16#0000_009d#,
+ 16#0000_0018#, 16#0000_00a0#,
+ 16#0000_6012#, 16#0000_00df#,
+ 16#0000_0018#, 16#0000_008a#);
+
Skylake_Trans_DP : constant Buf_Trans_Array :=
(16#0000_2016#, 16#0000_00a0#,
16#0000_5012#, 16#0000_009b#,
@@ -75,6 +87,18 @@
16#8000_5012#, 16#0000_00c0#,
others => 0);
+ Skylake_Y_Trans_DP : constant Buf_Trans_Array :=
+ (16#0000_0018#, 16#0000_00a2#,
+ 16#0000_5012#, 16#0000_0088#,
+ 16#8000_7011#, 16#0000_00cd#,
+ 16#8000_9010#, 16#0000_00c0#,
+ 16#0000_0018#, 16#0000_009d#,
+ 16#8000_5012#, 16#0000_00c0#,
+ 16#8000_7011#, 16#0000_00c0#,
+ 16#0000_0018#, 16#0000_0088#,
+ 16#8000_5012#, 16#0000_00c0#,
+ others => 0);
+
Skylake_Trans_HDMI : constant HDMI_Buf_Trans_Array :=
((16#0000_0018#, 16#0000_00ac#),
(16#0000_5012#, 16#0000_009d#),
@@ -88,6 +112,19 @@
(16#8000_3015#, 16#0000_00c0#),
(16#8000_0018#, 16#0000_00c0#));
+ Skylake_Y_Trans_HDMI : constant HDMI_Buf_Trans_Array :=
+ ((16#0000_0018#, 16#0000_00a1#),
+ (16#0000_5012#, 16#0000_00df#),
+ (16#8000_7011#, 16#0000_00cb#),
+ (16#0000_0018#, 16#0000_00a4#),
+ (16#0000_0018#, 16#0000_009d#),
+ (16#0000_4013#, 16#0000_0080#),
+ (16#8000_6013#, 16#0000_00c0#),
+ (16#0000_0018#, 16#0000_008a#),
+ (16#8000_3015#, 16#0000_00c0#),
+ (16#8000_3015#, 16#0000_00c0#),
+ (16#8000_0018#, 16#0000_00c0#));
+
----------------------------------------------------------------------------
procedure Translations (Trans : out Buf_Trans_Array; Port : Digital_Port)
@@ -101,17 +138,26 @@
else Config.Default_DDI_HDMI_Buffer_Translation);
begin
Trans :=
- (if not Config.Is_ULT then
+ (if Config.Is_ULX then
(if DDIA_Low_Voltage_Swing
- then Skylake_Trans_EDP
- else Skylake_Trans_DP)
- else
+ then Skylake_Y_Trans_EDP
+ else Skylake_Y_Trans_DP)
+ elsif Config.Is_ULT then
(if DDIA_Low_Voltage_Swing
then Skylake_U_Trans_EDP
- else Skylake_U_Trans_DP));
+ else Skylake_U_Trans_DP)
+ else
+ (if DDIA_Low_Voltage_Swing
+ then Skylake_Trans_EDP
+ else Skylake_Trans_DP));
if not DDIA_Low_Voltage_Swing then
- Trans (18) := Skylake_Trans_HDMI (HDMI_Trans).Trans1;
- Trans (19) := Skylake_Trans_HDMI (HDMI_Trans).Trans2;
+ if Config.Is_ULX then
+ Trans (18) := Skylake_Y_Trans_HDMI (HDMI_Trans).Trans1;
+ Trans (19) := Skylake_Y_Trans_HDMI (HDMI_Trans).Trans2;
+ else
+ Trans (18) := Skylake_Trans_HDMI (HDMI_Trans).Trans1;
+ Trans (19) := Skylake_Trans_HDMI (HDMI_Trans).Trans2;
+ end if;
end if;
end Translations;
--
To view, visit https://review.coreboot.org/c/libgfxinit/+/31452
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: libgfxinit
Gerrit-Branch: master
Gerrit-Change-Id: I08e6689ff8c0f2d58b51363886d4cab956f44e03
Gerrit-Change-Number: 31452
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h(a)gmx.de>
Gerrit-MessageType: newchange
Jacob Garber has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/33407
Change subject: nb/intel/pineview: Remove dead code in switch
......................................................................
nb/intel/pineview: Remove dead code in switch
This switch was likely copy-pasted from the one right above it. However,
the MEM_CLOCK_800MHz case isn't needed, since that is explicitly checked
and avoided before the while loop. With that gone, only the
667MHz/default case is left, which we don't need to switch over anymore.
Change-Id: Idfb9cc27dd8718f627d15ba92a9c74c51c2c1c2d
Signed-off-by: Jacob Garber <jgarber1(a)ualberta.ca>
Found-by: Coverity CID 1347372
---
M src/northbridge/intel/pineview/raminit.c
1 file changed, 6 insertions(+), 22 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/07/33407/1
diff --git a/src/northbridge/intel/pineview/raminit.c b/src/northbridge/intel/pineview/raminit.c
index 72063cb..cefa13c 100644
--- a/src/northbridge/intel/pineview/raminit.c
+++ b/src/northbridge/intel/pineview/raminit.c
@@ -498,28 +498,12 @@
lowcas = lsbp;
while (cas == 0 && highcas >= lowcas) {
FOR_EACH_POPULATED_DIMM(s->dimms, i) {
- switch (freq) {
- case MEM_CLOCK_800MHz:
- if ((s->dimms[i].spd_data[9] > 0x25) ||
- (s->dimms[i].spd_data[10] > 0x40)) {
- // CAS too fast, lower it
- highcas--;
- break;
- } else {
- cas = highcas;
- }
- break;
- case MEM_CLOCK_667MHz:
- default:
- if ((s->dimms[i].spd_data[9] > 0x30) ||
- (s->dimms[i].spd_data[10] > 0x45)) {
- // CAS too fast, lower it
- highcas--;
- break;
- } else {
- cas = highcas;
- }
- break;
+ if ((s->dimms[i].spd_data[9] > 0x30) ||
+ (s->dimms[i].spd_data[10] > 0x45)) {
+ // CAS too fast, lower it
+ highcas--;
+ } else {
+ cas = highcas;
}
}
}
--
To view, visit https://review.coreboot.org/c/coreboot/+/33407
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Idfb9cc27dd8718f627d15ba92a9c74c51c2c1c2d
Gerrit-Change-Number: 33407
Gerrit-PatchSet: 1
Gerrit-Owner: Jacob Garber <jgarber1(a)ualberta.ca>
Gerrit-MessageType: newchange
Subrata Banik has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/33737
Change subject: device/oprom: Add vbe return status support as per VBE spec 3.0
......................................................................
device/oprom: Add vbe return status support as per VBE spec 3.0
Existing coreboot oprom implementation relies on user selected vesa
mode through CONFIG_FRAMEBUFFER_VESA_MODE Kconfig option and expects
that all oprom might support user selected vesa mode.
Take an example:
Enabling AMD external radeon PCIE graphics card on ICLRVP with default
vesa mode 0x118. Unable to get valid X and Y resolution after executing
vbe_get_mode_info() with 0x4118, return data buffer shows 0x0 resolution.
It causes further hang while trying to draw bmpblk image at depthcharge.
This patch checks for output register AX in all vbe functions(0x3 and 0x4f00/1/2)
and list all supported vesa mode by oprom using Function 0x4F00 (return vbe controller
information). This information might be useful for user to select correct vesa mode
for oprom.
TEST=Enabling external pcie based graphics card on ICLRVP
Case 1: with unsupported vesa mode 0x118
Now coreboot will show below msg to user to know there is a potential issue with choosen
vesa mode and better user know the failure rather going to depthcharge and debug further.
Calling Option ROM...
... Option ROM returned.
VBE: Getting information about VESA mode 4118
VBE: Function call invalid with unsupported video mode 0x118!
User to select mode from below list -
Supported Video Mode list for OpRom are:
0x110
0x111
0x113
0x114
0x116
0x117
0x119
0x11a
0x165
0x166
0x121
0x122
0x123
0x124
0x145
0x146
0x175
0x176
0x1d2
0x1d4
Error: In vbe_get_mode_info function
Case 2: with supported vesa mode 0x116
Calling Option ROM...
... Option ROM returned.
VBE: Getting information about VESA mode 4116
VBE: resolution: 1024x768@16
VBE: framebuffer: a0000000
VBE: Setting VESA mode 4116
VGA Option ROM was run
Change-Id: Iacd2ce468e038a14424f029df3a0adec3e5fa15c
Signed-off-by: Subrata Banik <subrata.banik(a)intel.com>
---
M src/device/oprom/realmode/x86.c
M src/device/oprom/realmode/x86_asm.S
M src/include/vbe.h
3 files changed, 107 insertions(+), 5 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/37/33737/1
diff --git a/src/device/oprom/realmode/x86.c b/src/device/oprom/realmode/x86.c
index a7631a1..d1c7731 100644
--- a/src/device/oprom/realmode/x86.c
+++ b/src/device/oprom/realmode/x86.c
@@ -221,6 +221,90 @@
return mode_info_valid;
}
+static int vbe_check_for_failure(void);
+
+static vbe_info_t vbe_get_ctrl_info(void)
+{
+ char *buffer = PTR_TO_REAL_MODE(__realmode_buffer);
+ vbe_info_t info;
+ u16 buffer_seg = (((unsigned long)buffer) >> 4) & 0xff00;
+ u16 buffer_adr = ((unsigned long)buffer) & 0xffff;
+ realmode_interrupt(0x10, VESA_GET_INFO, 0x0000, 0x0000, 0x0000,
+ buffer_seg, buffer_adr);
+ if (vbe_check_for_failure())
+ die("\nError: In %s function\n", __func__);
+ memcpy(&info, buffer, sizeof(vbe_info_t));
+
+ return info;
+}
+
+static void vbe_opron_list_supported_mode(uint16_t *video_mode_ptr)
+{
+ uint16_t mode;
+ printk(BIOS_DEBUG,"Supported Video Mode list for OpRom are:\n");
+ do
+ {
+ mode = *video_mode_ptr++;
+ if (mode != 0xffff)
+ printk(BIOS_DEBUG,"%x\n", mode);
+ } while (mode != 0xffff);
+}
+
+static void vbe_oprom_supported_mode_list(void)
+{
+ vbe_info_t info = vbe_get_ctrl_info();
+ uint32_t video_mode_ptr = info.video_mode_list[1] << 16 |
+ info.video_mode_list[0];
+ vbe_opron_list_supported_mode((uint16_t *)video_mode_ptr);
+}
+
+/*
+ * EAX register is used to indicate the completion status upon return from
+ * VBE function in real mode.
+ * In x86_asm.S, store EAX into REALMODE_BASE before jumping into protected
+ * mode.
+ * If the VBE function completed successfully then 0x0 is returned in the AH
+ * register. Otherwise the AH register is set with the nature of the failure:
+ *
+ *AH == 0x00 : Function call successful
+ *AH == 0x01: Function call failed
+ *AH == 0x02: Function is not supported in the current HW configuration
+ *AH == 0x03: Functio call invalid in current video mode
+ *
+ *Return 0 on success else -1 for failure
+ */
+static int vbe_check_for_failure(void)
+{
+ uint32_t vbe_return_status;
+ int status;
+ vbe_return_status = *((unsigned int*)REALMODE_BASE);
+
+ switch ((vbe_return_status & 0xff00) >> 8) {
+ case 0x0:
+ status = 0;
+ break;
+ case 1:
+ printk(BIOS_DEBUG, "VBE: Function call failed!\n");
+ status = -1;
+ break;
+ case 2:
+ printk(BIOS_DEBUG, "VBE: Function is not supported!\n");
+ status = -1;
+ break;
+ case 3:
+ default:
+ printk(BIOS_DEBUG, "VBE: Function call invalid with"
+ " unsupported video mode %x!\n",
+ CONFIG_FRAMEBUFFER_VESA_MODE);
+ printk(BIOS_DEBUG, "User to select mode from below list - \n");
+ vbe_oprom_supported_mode_list();
+ status = -1;
+ break;
+ }
+
+ return status;
+}
+
static u8 vbe_get_mode_info(vbe_mode_info_t * mi)
{
printk(BIOS_DEBUG, "VBE: Getting information about VESA mode %04x\n",
@@ -230,20 +314,25 @@
u16 buffer_adr = ((unsigned long)buffer) & 0xffff;
realmode_interrupt(0x10, VESA_GET_MODE_INFO, 0x0000,
mi->video_mode, 0x0000, buffer_seg, buffer_adr);
+ if (vbe_check_for_failure())
+ die("\nError: In %s function\n", __func__);
memcpy(mi->mode_info_block, buffer, sizeof(mi->mode_info_block));
mode_info_valid = 1;
+
return 0;
}
static u8 vbe_set_mode(vbe_mode_info_t * mi)
{
printk(BIOS_DEBUG, "VBE: Setting VESA mode %04x\n", mi->video_mode);
- // request linear framebuffer mode
+ /* request linear framebuffer mode */
mi->video_mode |= (1 << 14);
- // request clearing of framebuffer
+ /* request clearing of framebuffer */
mi->video_mode &= ~(1 << 15);
realmode_interrupt(0x10, VESA_SET_MODE, mi->video_mode,
0x0000, 0x0000, 0x0000, 0x0000);
+ if (vbe_check_for_failure())
+ die("\nError: In %s function\n", __func__);
return 0;
}
@@ -253,6 +342,7 @@
void vbe_set_graphics(void)
{
mode_info.video_mode = (1 << 14) | CONFIG_FRAMEBUFFER_VESA_MODE;
+
vbe_get_mode_info(&mode_info);
unsigned char *framebuffer =
(unsigned char *)mode_info.vesa.phys_base_ptr;
@@ -288,6 +378,8 @@
delay(2);
realmode_interrupt(0x10, 0x0003, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000);
+ if (vbe_check_for_failure())
+ die("\nError: In %s function\n", __func__);
}
int fill_lb_framebuffer(struct lb_framebuffer *framebuffer)
diff --git a/src/device/oprom/realmode/x86_asm.S b/src/device/oprom/realmode/x86_asm.S
index 87348cd..ed3f897 100644
--- a/src/device/oprom/realmode/x86_asm.S
+++ b/src/device/oprom/realmode/x86_asm.S
@@ -291,6 +291,13 @@
__intXX_instr = RELOCATED(.)
.byte 0xcd, 0x00 /* This becomes intXX */
+ /*
+ * Here is end of real mode call and time to go back to protected mode.
+ * Before that its better to store current eax into some memory address
+ * so that context persist in protected mode too.
+ */
+ mov %eax, REALMODE_BASE
+
/* Ok, the job is done, now go back to protected mode coreboot */
movl %cr0, %eax
orl $PE, %eax
diff --git a/src/include/vbe.h b/src/include/vbe.h
index 2c40d05..fea55f5 100644
--- a/src/include/vbe.h
+++ b/src/include/vbe.h
@@ -14,6 +14,10 @@
#define VBE_H
#include <boot/coreboot_tables.h>
+
+/* Lets hope we never have more than 256 video modes. */
+#define MAX_VBE_FRAMEBUFFER_MODE 256
+
// these structs are for input from and output to OF
typedef struct {
u8 display_type; // 0 = NONE, 1 = analog, 2 = digital
@@ -41,10 +45,9 @@
u16 version;
u8 *oem_string_ptr;
u32 capabilities;
- u16 video_mode_list[256]; // lets hope we never have more than
- // 256 video modes...
+ u16 video_mode_list[MAX_VBE_FRAMEBUFFER_MODE];
u16 total_memory;
-} vbe_info_t;
+} __packed vbe_info_t;
typedef struct {
u16 mode_attributes; // 00
--
To view, visit https://review.coreboot.org/c/coreboot/+/33737
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Iacd2ce468e038a14424f029df3a0adec3e5fa15c
Gerrit-Change-Number: 33737
Gerrit-PatchSet: 1
Gerrit-Owner: Subrata Banik <subrata.banik(a)intel.com>
Gerrit-MessageType: newchange
Richard Spiegel has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/33622
Change subject: vendorcode/amd/pi: Add code for merlinfalcon
......................................................................
vendorcode/amd/pi: Add code for merlinfalcon
In preparation to commit code for board padmelon (SOC merlinfalcon), add
merlinfalcon specific vendor code.
BUG=b:none.
TEST=Tested later with padmelon board.
Change-Id: Id3341f6a1ef2561a6391d3db8c54f6bdd09b0c0e
Signed-off-by: Richard Spiegel <richard.spiegel(a)silverbackltd.com>
---
M src/vendorcode/amd/pi/Kconfig
M src/vendorcode/amd/pi/Makefile.inc
A src/vendorcode/amd/pi/merlinfalcon/AGESA.h
A src/vendorcode/amd/pi/merlinfalcon/AMD.h
A src/vendorcode/amd/pi/merlinfalcon/Include/Filecode.h
A src/vendorcode/amd/pi/merlinfalcon/Include/PlatformMemoryConfiguration.h
A src/vendorcode/amd/pi/merlinfalcon/Include/Topology.h
A src/vendorcode/amd/pi/merlinfalcon/Makefile.inc
A src/vendorcode/amd/pi/merlinfalcon/Porting.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/CPU/Family/cpuFamRegisters.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/CPU/Table.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/CPU/cpuFamilyTranslation.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/CPU/cpuRegisters.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/CPU/cpuServices.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/CPU/heapManager.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/Common/AmdFch.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/Fch/Common/FchCommonCfg.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/Fch/Fch.h
A src/vendorcode/amd/pi/merlinfalcon/Proc/Fch/FchPlatform.h
A src/vendorcode/amd/pi/merlinfalcon/agesa_headers.h
A src/vendorcode/amd/pi/merlinfalcon/binaryPI/AGESA.c
A src/vendorcode/amd/pi/merlinfalcon/binaryPI/OptionsIds.h
A src/vendorcode/amd/pi/merlinfalcon/binaryPI/gcccar.inc
A src/vendorcode/amd/pi/merlinfalcon/check_for_wrapper.h
A src/vendorcode/amd/pi/merlinfalcon/gcc-intrin.h
25 files changed, 15,459 insertions(+), 1 deletion(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/22/33622/1
--
To view, visit https://review.coreboot.org/c/coreboot/+/33622
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Id3341f6a1ef2561a6391d3db8c54f6bdd09b0c0e
Gerrit-Change-Number: 33622
Gerrit-PatchSet: 1
Gerrit-Owner: Richard Spiegel <richard.spiegel(a)silverbackltd.com>
Gerrit-MessageType: newchange