nb/intel/i945: Fix PEG port on 945gc
Vendor BIOS leaves UPMC1 untouched (on 945gc the default is 0x0203). Not running PCIEx16 init which is valid for 945gm seems to fix all issues and instabilities related to the PEG port. According to lspci the link width is at the desired x16. It is unknown if devices requesting a lower width work automatically or need more configuration. What happens is that IGD gets disabled by the disable function in gma.c when an external GPU is found unless CONFIG_ONBOARD_VGA_IS_PRIMARY is set. Setting IGD as secondary makes Linux (4.10) hang, so this behavior is a requirement for now. TESTED on P5GC-MX with a discrete GPU and both CONFIG_ONBOARD_VGA_IS_PRIMARY set and unset. Change-Id: I6da8aa7714073f4b34df5ae3c1eb4c19e27ddc97 Signed-off-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-on: https://review.coreboot.org/18549 Tested-by: build bot (Jenkins) Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
parent
f13e250152
commit
2f6b52e3a0
|
@ -939,6 +939,7 @@ void i945_late_initialization(int s3resume)
|
||||||
|
|
||||||
i945_setup_dmi_rcrb();
|
i945_setup_dmi_rcrb();
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_NORTHBRIDGE_INTEL_SUBTYPE_I945GM))
|
||||||
i945_setup_pci_express_x16();
|
i945_setup_pci_express_x16();
|
||||||
|
|
||||||
i945_setup_root_complex_topology();
|
i945_setup_root_complex_topology();
|
||||||
|
|
|
@ -2576,6 +2576,7 @@ static void sdram_power_management(struct sys_info *sysinfo)
|
||||||
reg32 |= (1 << 12) | (1 << 11);
|
reg32 |= (1 << 12) | (1 << 11);
|
||||||
MCHBAR32(C1DRC1) = reg32;
|
MCHBAR32(C1DRC1) = reg32;
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_NORTHBRIDGE_INTEL_SUBTYPE_I945GM)) {
|
||||||
if (i945_silicon_revision() > 1) {
|
if (i945_silicon_revision() > 1) {
|
||||||
/* FIXME bits 5 and 0 only if PCIe graphics is disabled */
|
/* FIXME bits 5 and 0 only if PCIe graphics is disabled */
|
||||||
u16 peg_bits = (1 << 5) | (1 << 0);
|
u16 peg_bits = (1 << 5) | (1 << 0);
|
||||||
|
@ -2588,6 +2589,7 @@ static void sdram_power_management(struct sys_info *sysinfo)
|
||||||
/* Rev 0 and 1 */
|
/* Rev 0 and 1 */
|
||||||
MCHBAR16(UPMC1) = 0x0010 | peg_bits;
|
MCHBAR16(UPMC1) = 0x0010 | peg_bits;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
reg16 = MCHBAR16(UPMC2);
|
reg16 = MCHBAR16(UPMC2);
|
||||||
reg16 &= 0xfc00;
|
reg16 &= 0xfc00;
|
||||||
|
|
Loading…
Reference in New Issue