nb/intel/sandybridge: Use SA devid to identify PC type
Instead of using MSR IA32_PLATFORM_ID read the SystemAgent device id to figure out the PC type. This follows the BWG which suggest to not use MSR IA32_PLATFORM_ID for system identification. Tested: Lenovo X220 still boots. Change-Id: Ibddf6c75d15ca7a99758c377ed956d483abe7ec1 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78826 Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
This commit is contained in:
parent
8685205ad1
commit
51518e585d
|
@ -9,10 +9,6 @@ subdirs-y += ../turbo
|
||||||
|
|
||||||
ramstage-y += acpi.c
|
ramstage-y += acpi.c
|
||||||
|
|
||||||
ramstage-y += common.c
|
|
||||||
romstage-y += common.c
|
|
||||||
smm-y += common.c
|
|
||||||
|
|
||||||
smm-y += finalize.c
|
smm-y += finalize.c
|
||||||
|
|
||||||
cpu_microcode_bins += $(wildcard 3rdparty/intel-microcode/intel-ucode/06-2a-*)
|
cpu_microcode_bins += $(wildcard 3rdparty/intel-microcode/intel-ucode/06-2a-*)
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
||||||
|
|
||||||
#include <cpu/x86/msr.h>
|
|
||||||
#include "model_206ax.h"
|
|
||||||
|
|
||||||
int get_platform_id(void)
|
|
||||||
{
|
|
||||||
msr_t msr;
|
|
||||||
|
|
||||||
msr = rdmsr(IA32_PLATFORM_ID);
|
|
||||||
/* Read Platform Id Bits 52:50 */
|
|
||||||
return (msr.hi >> 18) & 0x7;
|
|
||||||
}
|
|
|
@ -131,7 +131,6 @@ void intel_model_206ax_finalize_smm(void);
|
||||||
/* Configure power limits for turbo mode */
|
/* Configure power limits for turbo mode */
|
||||||
void set_power_limits(u8 power_limit_1_time);
|
void set_power_limits(u8 power_limit_1_time);
|
||||||
int cpu_config_tdp_levels(void);
|
int cpu_config_tdp_levels(void);
|
||||||
int get_platform_id(void);
|
|
||||||
|
|
||||||
static inline u8 cpu_stepping(void)
|
static inline u8 cpu_stepping(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -323,9 +323,6 @@ static void model_206ax_report(void)
|
||||||
fill_processor_name(processor_name);
|
fill_processor_name(processor_name);
|
||||||
printk(BIOS_INFO, "CPU: %s.\n", processor_name);
|
printk(BIOS_INFO, "CPU: %s.\n", processor_name);
|
||||||
|
|
||||||
/* Print platform ID */
|
|
||||||
printk(BIOS_INFO, "CPU: platform id %x\n", get_platform_id());
|
|
||||||
|
|
||||||
/* CPUID and features */
|
/* CPUID and features */
|
||||||
cpu_id = cpu_get_cpuid();
|
cpu_id = cpu_get_cpuid();
|
||||||
printk(BIOS_INFO, "CPU: cpuid(1) 0x%x\n", cpu_id);
|
printk(BIOS_INFO, "CPU: cpuid(1) 0x%x\n", cpu_id);
|
||||||
|
|
|
@ -2,14 +2,19 @@
|
||||||
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <cpu/intel/model_206ax/model_206ax.h>
|
#include <device/pci_def.h>
|
||||||
|
#include <device/pci_ops.h>
|
||||||
#include "sandybridge.h"
|
#include "sandybridge.h"
|
||||||
|
|
||||||
enum platform_type get_platform_type(void)
|
enum platform_type get_platform_type(void)
|
||||||
{
|
{
|
||||||
const int id = get_platform_id();
|
switch (pci_s_read_config16(HOST_BRIDGE, PCI_DEVICE_ID) & 0xc) {
|
||||||
if (id != 1 && id != 4)
|
case 0x0: /* Desktop */
|
||||||
printk(BIOS_WARNING, "Unknown platform id 0x%x\n", id);
|
return PLATFORM_DESKTOP_SERVER;
|
||||||
|
case 0x4: /* Mobile */
|
||||||
return (id == 4) ? PLATFORM_MOBILE : PLATFORM_DESKTOP_SERVER;
|
return PLATFORM_MOBILE;
|
||||||
|
case 0x8: /* Server */
|
||||||
|
default:
|
||||||
|
return PLATFORM_DESKTOP_SERVER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,14 +150,13 @@ static void start_peg_link_training(void)
|
||||||
|
|
||||||
void systemagent_early_init(void)
|
void systemagent_early_init(void)
|
||||||
{
|
{
|
||||||
|
const size_t is_mobile = get_platform_type() == PLATFORM_MOBILE;
|
||||||
u32 capid0_a;
|
u32 capid0_a;
|
||||||
u8 reg8;
|
u8 reg8;
|
||||||
|
|
||||||
/* Device ID Override Enable should be done very early */
|
/* Device ID Override Enable should be done very early */
|
||||||
capid0_a = pci_read_config32(HOST_BRIDGE, CAPID0_A);
|
capid0_a = pci_read_config32(HOST_BRIDGE, CAPID0_A);
|
||||||
if (capid0_a & (1 << 10)) {
|
if (capid0_a & (1 << 10)) {
|
||||||
const size_t is_mobile = get_platform_type() == PLATFORM_MOBILE;
|
|
||||||
|
|
||||||
reg8 = pci_read_config8(HOST_BRIDGE, DIDOR);
|
reg8 = pci_read_config8(HOST_BRIDGE, DIDOR);
|
||||||
reg8 &= ~7; /* Clear 2:0 */
|
reg8 &= ~7; /* Clear 2:0 */
|
||||||
|
|
||||||
|
@ -167,6 +166,9 @@ void systemagent_early_init(void)
|
||||||
pci_write_config8(HOST_BRIDGE, DIDOR, reg8);
|
pci_write_config8(HOST_BRIDGE, DIDOR, reg8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Print platform type */
|
||||||
|
printk(BIOS_INFO, "Detected system type: %s\n", is_mobile ? "mobile" : "desktop");
|
||||||
|
|
||||||
/* Setup all BARs required for early PCIe and raminit */
|
/* Setup all BARs required for early PCIe and raminit */
|
||||||
sandybridge_setup_bars();
|
sandybridge_setup_bars();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue