blob: 8c6a6ef8dbae923e88314315076e02299ea71f1c [file] [log] [blame]
Angel Pons32abdd62020-04-05 15:47:03 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aamir Bohra3ee54bb2018-10-17 11:55:01 +05302
3#include <arch/cpu.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02004#include <device/pci_ops.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +05305#include <console/console.h>
Subrata Banik8993e672021-07-16 13:17:44 +05306#include <cpu/intel/cpu_ids.h>
Subrata Banikb7db12b2020-08-04 18:01:27 +05307#include <cpu/intel/microcode.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +05308#include <cpu/x86/msr.h>
9#include <device/pci.h>
10#include <device/pci_ids.h>
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053011#include <soc/bootblock.h>
12#include <soc/pch.h>
13#include <soc/pci_devs.h>
14#include <string.h>
15
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053016static struct {
17 u32 cpuid;
18 const char *name;
19} cpu_table[] = {
Aamir Bohra9eac0392018-06-30 12:07:04 +053020 { CPUID_ICELAKE_A0, "Icelake A0" },
21 { CPUID_ICELAKE_B0, "Icelake B0" },
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053022};
23
24static struct {
25 u16 mchid;
26 const char *name;
27} mch_table[] = {
Aamir Bohra9eac0392018-06-30 12:07:04 +053028 { PCI_DEVICE_ID_INTEL_ICL_ID_U, "Icelake-U" },
29 { PCI_DEVICE_ID_INTEL_ICL_ID_U_2_2, "Icelake-U-2-2" },
30 { PCI_DEVICE_ID_INTEL_ICL_ID_Y, "Icelake-Y" },
31 { PCI_DEVICE_ID_INTEL_ICL_ID_Y_2, "Icelake-Y-2" },
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053032};
33
34static struct {
Subrata Banik3d152ac2018-10-31 23:08:14 +053035 u16 espiid;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053036 const char *name;
37} pch_table[] = {
Subrata Banik3d152ac2018-10-31 23:08:14 +053038 { PCI_DEVICE_ID_INTEL_ICL_BASE_U_ESPI, "Icelake-U Base" },
39 { PCI_DEVICE_ID_INTEL_ICL_BASE_Y_ESPI, "Icelake-Y Base" },
40 { PCI_DEVICE_ID_INTEL_ICL_U_PREMIUM_ESPI, "Icelake-U Premium" },
41 { PCI_DEVICE_ID_INTEL_ICL_U_SUPER_U_ESPI, "Icelake-U Super" },
42 { PCI_DEVICE_ID_INTEL_ICL_U_SUPER_U_ESPI_REV0, "Icelake-U Super REV0" },
43 { PCI_DEVICE_ID_INTEL_ICL_SUPER_Y_ESPI, "Icelake-Y Super" },
44 { PCI_DEVICE_ID_INTEL_ICL_Y_PREMIUM_ESPI, "Icelake-Y Premium" },
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053045};
46
47static struct {
48 u16 igdid;
49 const char *name;
50} igd_table[] = {
Aamir Bohra9eac0392018-06-30 12:07:04 +053051 { PCI_DEVICE_ID_INTEL_ICL_GT0_ULT, "Icelake ULT GT0" },
52 { PCI_DEVICE_ID_INTEL_ICL_GT0_5_ULT, "Icelake ULT GT0.5" },
53 { PCI_DEVICE_ID_INTEL_ICL_GT1_ULT, "Icelake U GT1" },
54 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULX_0, "Icelake Y GT2" },
55 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULX_1, "Icelake Y GT2_1" },
56 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULT_1, "Icelake U GT2_1" },
57 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULX_2, "Icelake Y GT2_2" },
58 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULT_2, "Icelake U GT2_2" },
59 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULX_3, "Icelake Y GT2_3" },
60 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULT_3, "Icelake U GT2_3" },
61 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULX_4, "Icelake Y GT2_4" },
62 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULT_4, "Icelake U GT2_4" },
63 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULX_5, "Icelake Y GT2_5" },
64 { PCI_DEVICE_ID_INTEL_ICL_GT2_ULT_5, "Icelake U GT2_5" },
65 { PCI_DEVICE_ID_INTEL_ICL_GT3_ULT, "Icelake U GT3" },
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053066};
67
68static uint8_t get_dev_revision(pci_devfn_t dev)
69{
70 return pci_read_config8(dev, PCI_REVISION_ID);
71}
72
73static uint16_t get_dev_id(pci_devfn_t dev)
74{
75 return pci_read_config16(dev, PCI_DEVICE_ID);
76}
77
78static void report_cpu_info(void)
79{
80 struct cpuid_result cpuidr;
Subrata Banik53b08c32018-12-10 14:11:35 +053081 u32 i, index, cpu_id, cpu_feature_flag;
Subrata Banik522b7c02019-11-01 13:55:39 +053082 const char cpu_not_found[] = "Platform info not available";
83 const char *cpu_name = cpu_not_found; /* 48 bytes are reported */
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053084 int vt, txt, aes;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053085 static const char *const mode[] = {"NOT ", ""};
86 const char *cpu_type = "Unknown";
87 u32 p[13];
88
89 index = 0x80000000;
90 cpuidr = cpuid(index);
Subrata Banik522b7c02019-11-01 13:55:39 +053091 if (cpuidr.eax >= 0x80000004) {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +053092 int j = 0;
93
94 for (i = 2; i <= 4; i++) {
95 cpuidr = cpuid(index + i);
96 p[j++] = cpuidr.eax;
97 p[j++] = cpuidr.ebx;
98 p[j++] = cpuidr.ecx;
99 p[j++] = cpuidr.edx;
100 }
101 p[12] = 0;
102 cpu_name = (char *)p;
Subrata Banik522b7c02019-11-01 13:55:39 +0530103
104 /* Skip leading spaces in CPU name string */
105 while (cpu_name[0] == ' ' && strlen(cpu_name) > 0)
106 cpu_name++;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530107 }
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530108
Subrata Banik53b08c32018-12-10 14:11:35 +0530109 cpu_id = cpu_get_cpuid();
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530110
111 /* Look for string to match the name */
112 for (i = 0; i < ARRAY_SIZE(cpu_table); i++) {
Subrata Banik53b08c32018-12-10 14:11:35 +0530113 if (cpu_table[i].cpuid == cpu_id) {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530114 cpu_type = cpu_table[i].name;
115 break;
116 }
117 }
118
119 printk(BIOS_DEBUG, "CPU: %s\n", cpu_name);
120 printk(BIOS_DEBUG, "CPU: ID %x, %s, ucode: %08x\n",
Subrata Banikb7db12b2020-08-04 18:01:27 +0530121 cpu_id, cpu_type, get_current_microcode_rev());
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530122
Subrata Banik53b08c32018-12-10 14:11:35 +0530123 cpu_feature_flag = cpu_get_feature_flags_ecx();
124 aes = (cpu_feature_flag & CPUID_AES) ? 1 : 0;
125 txt = (cpu_feature_flag & CPUID_SMX) ? 1 : 0;
126 vt = (cpu_feature_flag & CPUID_VMX) ? 1 : 0;
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530127 printk(BIOS_DEBUG,
128 "CPU: AES %ssupported, TXT %ssupported, VT %ssupported\n",
129 mode[aes], mode[txt], mode[vt]);
130}
131
132static void report_mch_info(void)
133{
134 int i;
135 pci_devfn_t dev = SA_DEV_ROOT;
136 uint16_t mchid = get_dev_id(dev);
137 uint8_t mch_revision = get_dev_revision(dev);
138 const char *mch_type = "Unknown";
139
140 for (i = 0; i < ARRAY_SIZE(mch_table); i++) {
141 if (mch_table[i].mchid == mchid) {
142 mch_type = mch_table[i].name;
143 break;
144 }
145 }
146
147 printk(BIOS_DEBUG, "MCH: device id %04x (rev %02x) is %s\n",
148 mchid, mch_revision, mch_type);
149}
150
151static void report_pch_info(void)
152{
153 int i;
Subrata Banik3d152ac2018-10-31 23:08:14 +0530154 pci_devfn_t dev = PCH_DEV_ESPI;
155 uint16_t espiid = get_dev_id(dev);
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530156 const char *pch_type = "Unknown";
157
158 for (i = 0; i < ARRAY_SIZE(pch_table); i++) {
Subrata Banik3d152ac2018-10-31 23:08:14 +0530159 if (pch_table[i].espiid == espiid) {
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530160 pch_type = pch_table[i].name;
161 break;
162 }
163 }
164 printk(BIOS_DEBUG, "PCH: device id %04x (rev %02x) is %s\n",
Subrata Banik3d152ac2018-10-31 23:08:14 +0530165 espiid, get_dev_revision(dev), pch_type);
Aamir Bohra3ee54bb2018-10-17 11:55:01 +0530166}
167
168static void report_igd_info(void)
169{
170 int i;
171 pci_devfn_t dev = SA_DEV_IGD;
172 uint16_t igdid = get_dev_id(dev);
173 const char *igd_type = "Unknown";
174
175 for (i = 0; i < ARRAY_SIZE(igd_table); i++) {
176 if (igd_table[i].igdid == igdid) {
177 igd_type = igd_table[i].name;
178 break;
179 }
180 }
181 printk(BIOS_DEBUG, "IGD: device id %04x (rev %02x) is %s\n",
182 igdid, get_dev_revision(dev), igd_type);
183}
184
185void report_platform_info(void)
186{
187 report_cpu_info();
188 report_mch_info();
189 report_pch_info();
190 report_igd_info();
191}