summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2012-12-03 16:17:40 -0600
committerRonald G. Minnich <rminnich@gmail.com>2013-03-17 22:53:51 +0100
commit6dcceddff53ad309b91b61661ae7deab37f272ec (patch)
tree21177990702c7fa3b99ca4d59def9fd4c548008e
parent239c2e843f976d5915964c8cb1923305c574f8b5 (diff)
downloadcoreboot-6dcceddff53ad309b91b61661ae7deab37f272ec.tar.xz
x86 intel: Add Firmware Interface Table support
Haswell CPUs require a FIT table in the firmware. This commit adds rudimentary support for a FIT table. The number of entries in the table is based on a configuration option. The code only generates a type 0 entry. A follow-on tool will need to be developed to populate the FIT entries as well as checksumming the table. Verified image has a FIT pointer and table when option is selected. Change-Id: I3a314016a09a1cc26bf1fb5d17aa50853d2ef4f8 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/2642 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
-rw-r--r--src/arch/x86/Makefile.inc6
-rw-r--r--src/cpu/intel/Kconfig2
-rw-r--r--src/cpu/intel/fit/Kconfig12
-rw-r--r--src/cpu/intel/fit/fit.inc30
-rw-r--r--src/cpu/intel/fit/fit.lds6
-rw-r--r--src/cpu/intel/haswell/Kconfig1
6 files changed, 57 insertions, 0 deletions
diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc
index 0892efd37b..cc7bfc2c56 100644
--- a/src/arch/x86/Makefile.inc
+++ b/src/arch/x86/Makefile.inc
@@ -299,12 +299,18 @@ bootblock_lds += $(src)/cpu/x86/16bit/entry16.lds
bootblock_lds += $(src)/cpu/x86/16bit/reset16.lds
bootblock_lds += $(src)/arch/x86/lib/id.lds
bootblock_lds += $(chipset_bootblock_lds)
+ifeq ($(CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE),y)
+bootblock_lds += $(src)/cpu/intel/fit/fit.lds
+endif
bootblock_inc = $(src)/arch/x86/init/prologue.inc
bootblock_inc += $(src)/cpu/x86/16bit/entry16.inc
bootblock_inc += $(src)/cpu/x86/16bit/reset16.inc
bootblock_inc += $(src)/cpu/x86/32bit/entry32.inc
bootblock_inc += $(src)/arch/x86/lib/id.inc
+ifeq ($(CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE),y)
+bootblock_inc += $(src)/cpu/intel/fit/fit.inc
+endif
bootblock_inc += $(chipset_bootblock_inc)
ifeq ($(CONFIG_SSE),y)
diff --git a/src/cpu/intel/Kconfig b/src/cpu/intel/Kconfig
index 45071d0c7e..106ce1d0d4 100644
--- a/src/cpu/intel/Kconfig
+++ b/src/cpu/intel/Kconfig
@@ -33,3 +33,5 @@ source src/cpu/intel/socket_441/Kconfig
source src/cpu/intel/socket_LGA771/Kconfig
source src/cpu/intel/socket_LGA775/Kconfig
source src/cpu/intel/socket_rPGA989/Kconfig
+# Architecture specific features
+source src/cpu/intel/fit/Kconfig
diff --git a/src/cpu/intel/fit/Kconfig b/src/cpu/intel/fit/Kconfig
new file mode 100644
index 0000000000..9b57556827
--- /dev/null
+++ b/src/cpu/intel/fit/Kconfig
@@ -0,0 +1,12 @@
+config CPU_INTEL_FIRMWARE_INTERFACE_TABLE
+ def_bool n
+ help
+ This option selects building a Firmware Interface Table (FIT).
+
+config CPU_INTEL_NUM_FIT_ENTRIES
+ int
+ default 4
+ depends on CPU_INTEL_FIRMWARE_INTERFACE_TABLE
+ help
+ This option selects the number of empty entries in the FIT table.
+
diff --git a/src/cpu/intel/fit/fit.inc b/src/cpu/intel/fit/fit.inc
new file mode 100644
index 0000000000..e4595c0d6d
--- /dev/null
+++ b/src/cpu/intel/fit/fit.inc
@@ -0,0 +1,30 @@
+.section ".fit_pointer", "a", @progbits
+ .code32
+.global fit_pointer
+fit_pointer:
+.long fit_table
+.long 0
+.previous
+
+.section ".rom.data", "a", @progbits
+.align 16
+.global fit_table
+.global fit_table_end
+fit_table:
+/* Address for type 0 is '_FIT_ ' */
+.long 0x5449465f
+.long 0x2020205f
+/*
+ * There is 1 entry in the table. Other tools will have to update the size
+ * and checksum when adding entries.
+ */
+.long 0x00000001
+/* Version */
+.word 0x0100
+/* Type 0 with checksum valid. */
+.byte 0x80
+/* Checksum byte - must add to zero. */
+.byte 0x7d
+.fill CONFIG_CPU_INTEL_NUM_FIT_ENTRIES*16
+fit_table_end:
+.previous
diff --git a/src/cpu/intel/fit/fit.lds b/src/cpu/intel/fit/fit.lds
new file mode 100644
index 0000000000..9ccfe82c5f
--- /dev/null
+++ b/src/cpu/intel/fit/fit.lds
@@ -0,0 +1,6 @@
+SECTIONS {
+ . = 0xffffffc0;
+ .fit_pointer (.): {
+ *(.fit_pointer)
+ }
+}
diff --git a/src/cpu/intel/haswell/Kconfig b/src/cpu/intel/haswell/Kconfig
index 5b24a8bce4..460b497dff 100644
--- a/src/cpu/intel/haswell/Kconfig
+++ b/src/cpu/intel/haswell/Kconfig
@@ -13,6 +13,7 @@ config CPU_SPECIFIC_OPTIONS
select CPU_MICROCODE_IN_CBFS
#select AP_IN_SIPI_WAIT
select TSC_SYNC_MFENCE
+ select CPU_INTEL_FIRMWARE_INTERFACE_TABLE
config BOOTBLOCK_CPU_INIT
string