| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,136 @@ | ||
| /* | ||
| * Network protocols | ||
| * | ||
| */ | ||
|
|
||
| #define NET_PROTO_IPV4 /* IPv4 protocol */ | ||
| #define NET_PROTO_IPV6 /* IPv6 protocol */ | ||
| #undef NET_PROTO_FCOE /* Fibre Channel over Ethernet protocol */ | ||
| #define NET_PROTO_STP /* Spanning Tree protocol */ | ||
|
|
||
| /* | ||
| * PXE support | ||
| * | ||
| */ | ||
| #define PXE_STACK /* PXE stack in iPXE - you want this! */ | ||
| #define PXE_MENU /* PXE menu booting */ | ||
|
|
||
| /* | ||
| * Download protocols | ||
| * | ||
| */ | ||
|
|
||
| #define DOWNLOAD_PROTO_TFTP /* Trivial File Transfer Protocol */ | ||
| #define DOWNLOAD_PROTO_HTTP /* Hypertext Transfer Protocol */ | ||
| #define DOWNLOAD_PROTO_HTTPS /* Secure Hypertext Transfer Protocol */ | ||
| #define DOWNLOAD_PROTO_FTP /* File Transfer Protocol */ | ||
| #define DOWNLOAD_PROTO_SLAM /* Scalable Local Area Multicast */ | ||
| #define DOWNLOAD_PROTO_NFS /* Network File System Protocol */ | ||
|
|
||
| /* | ||
| * SAN boot protocols | ||
| * | ||
| */ | ||
|
|
||
| #define SANBOOT_PROTO_ISCSI /* iSCSI protocol */ | ||
| #define SANBOOT_PROTO_AOE /* AoE protocol */ | ||
| #undef SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */ | ||
| #undef SANBOOT_PROTO_FCP /* Fibre Channel protocol */ | ||
| #define SANBOOT_PROTO_HTTP /* HTTP SAN protocol */ | ||
|
|
||
| /* | ||
| * HTTP extensions | ||
| * | ||
| */ | ||
| #define HTTP_AUTH_BASIC /* Basic authentication */ | ||
| #define HTTP_AUTH_DIGEST /* Digest authentication */ | ||
| #define HTTP_ENC_PEERDIST /* PeerDist content encoding */ | ||
|
|
||
| /* | ||
| * 802.11 cryptosystems and handshaking protocols | ||
| * | ||
| */ | ||
| #define CRYPTO_80211_WEP /* WEP encryption (deprecated and insecure!) */ | ||
| #define CRYPTO_80211_WPA /* WPA Personal, authenticating with passphrase */ | ||
| #define CRYPTO_80211_WPA2 /* Add support for stronger WPA cryptography */ | ||
|
|
||
| /* | ||
| * Name resolution modules | ||
| * | ||
| */ | ||
|
|
||
| #define DNS_RESOLVER /* DNS resolver */ | ||
| /* | ||
| * Image types | ||
| * | ||
| * Etherboot supports various image formats. Select whichever ones | ||
| * you want to use. | ||
| * | ||
| */ | ||
| #define IMAGE_NBI /* NBI image support */ | ||
| #define IMAGE_ELF /* ELF image support */ | ||
| #define IMAGE_MULTIBOOT /* MultiBoot image support */ | ||
| #define IMAGE_PXE /* PXE image support */ | ||
| #define IMAGE_SCRIPT /* iPXE script image support */ | ||
| #define IMAGE_BZIMAGE /* Linux bzImage image support */ | ||
| #define IMAGE_COMBOOT /* SYSLINUX COMBOOT image support */ | ||
| #undef IMAGE_EFI /* EFI image support */ | ||
| #define IMAGE_SDI /* SDI image support */ | ||
| #define IMAGE_PNM /* PNM image support */ | ||
| #define IMAGE_PNG /* PNG image support */ | ||
|
|
||
| /* | ||
| * Command-line commands to include | ||
| * | ||
| */ | ||
| #define AUTOBOOT_CMD /* Automatic booting */ | ||
| #define NVO_CMD /* Non-volatile option storage commands */ | ||
| #define CONFIG_CMD /* Option configuration console */ | ||
| #define IFMGMT_CMD /* Interface management commands */ | ||
| #define IWMGMT_CMD /* Wireless interface management commands */ | ||
| #define IBMGMT_CMD /* Infiniband management commands */ | ||
| #define FCMGMT_CMD /* Fibre Channel management commands */ | ||
| #define ROUTE_CMD /* Routing table management commands */ | ||
| #define IMAGE_CMD /* Image management commands */ | ||
| #define DHCP_CMD /* DHCP management commands */ | ||
| #define SANBOOT_CMD /* SAN boot commands */ | ||
| #define MENU_CMD /* Menu commands */ | ||
| #define LOGIN_CMD /* Login command */ | ||
| #define SYNC_CMD /* Sync command */ | ||
| #define NSLOOKUP_CMD /* DNS resolving command */ | ||
| #define TIME_CMD /* Time commands */ | ||
| #define DIGEST_CMD /* Image crypto digest commands */ | ||
| #define LOTEST_CMD /* Loopback testing commands */ | ||
| #define VLAN_CMD /* VLAN commands */ | ||
| #define PXE_CMD /* PXE commands */ | ||
| #define REBOOT_CMD /* Reboot command */ | ||
| #define POWEROFF_CMD /* Power off command */ | ||
| #define IMAGE_TRUST_CMD /* Image trust management commands */ | ||
| #define PCI_CMD /* PCI commands */ | ||
| #define PARAM_CMD /* Form parameter commands */ | ||
| #define NEIGHBOUR_CMD /* Neighbour management commands */ | ||
| #define PING_CMD /* Ping command */ | ||
| #define CONSOLE_CMD /* Console command */ | ||
| #define IPSTAT_CMD /* IP statistics commands */ | ||
| #define PROFSTAT_CMD /* Profiling commands */ | ||
|
|
||
|
|
||
| /* | ||
| * ROM-specific options | ||
| * | ||
| */ | ||
| #undef NONPNP_HOOK_INT19 /* Hook INT19 on non-PnP BIOSes */ | ||
| #define AUTOBOOT_ROM_FILTER /* Autoboot only devices matching our ROM */ | ||
|
|
||
| /* | ||
| * Virtual network devices | ||
| * | ||
| */ | ||
| #define VNIC_IPOIB /* Infiniband IPoIB virtual NICs */ | ||
| //#define VNIC_XSIGO /* Infiniband Xsigo virtual NICs */ | ||
|
|
||
| /* | ||
| * Error message tables to include | ||
| * | ||
| */ | ||
| #define ERRMSG_80211 /* All 802.11 error descriptions (~3.3kb) */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| #!ipxe | ||
| :MENU | ||
| menu | ||
| item --gap -- ---------------- iPXE boot menu ---------------- | ||
| item shell ipxe shell | ||
| item boot autoboot | ||
| choose --default boot --timeout 3000 target && goto ${target} | ||
|
|
||
| :boot | ||
| autoboot net0 | ||
| goto MENU | ||
|
|
||
| :shell | ||
| shell || | ||
| goto MENU | ||
|
|
||
| autoboot net0 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,2 @@ | ||
| romstage-$(CONFIG_CPU_MICROCODE_MULTIPLE_FILES) += microcode.c | ||
| ramstage-$(CONFIG_CPU_MICROCODE_MULTIPLE_FILES) += microcode.c |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,163 @@ | ||
| /* | ||
| * This file is part of the coreboot project. | ||
| * | ||
| * Copyright (C) 2007 Advanced Micro Devices, Inc. | ||
| * Copyright (C) 2015 Raptor Engineering | ||
| * Copyright (C) 2018 PC Engines GmbH | ||
| * | ||
| * 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 | ||
| * the Free Software Foundation; version 2 of the License. | ||
| * | ||
| * This program is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| */ | ||
|
|
||
| #include <stdint.h> | ||
| #include <console/console.h> | ||
| #include <cpu/x86/msr.h> | ||
| #include <cpu/amd/microcode.h> | ||
| #include <cbfs.h> | ||
| #include <arch/io.h> | ||
| #include <smp/spinlock.h> | ||
|
|
||
| #define UCODE_DEBUG(fmt, args...) \ | ||
| do { printk(BIOS_DEBUG, "[microcode] "fmt, ##args); } while (0) | ||
|
|
||
| #define F16H_MPB_MAX_SIZE 3458 | ||
| #define F16H_MPB_DATA_OFFSET 32 | ||
|
|
||
| /* | ||
| * STRUCTURE OF A MICROCODE (UCODE) FILE FOR FAM16h | ||
| * Microcode Patch Block | ||
| * Microcode Header | ||
| * Microcode "Blob" | ||
| * ... | ||
| * ... | ||
| * (end of file) | ||
| * | ||
| * | ||
| * MICROCODE HEADER (offset 0 bytes from start of file) | ||
| * Total size = 32 bytes | ||
| * [0:3] Date code (32 bits) | ||
| * [4:7] Patch level (32 bits) | ||
| * [8:9] Microcode patch data ID (16 bits) | ||
| * [10:15] Reserved (48 bits) | ||
| * [16:19] Chipset 1 device ID (32 bits) | ||
| * [20:23] Chipset 2 device ID (32 bits) | ||
| * [24:25] Processor Revisions ID (16 bits) | ||
| * [26] Chipset 1 revision ID (8 bits) | ||
| * [27] Chipset 2 revision ID (8 bits) | ||
| * [28:31] Reserved (32 bits) | ||
| * | ||
| * MICROCODE BLOB (offset += 32) | ||
| * Total size = m bytes | ||
| * | ||
| */ | ||
|
|
||
| struct microcode { | ||
| uint32_t date_code; | ||
| uint32_t patch_id; | ||
|
|
||
| uint16_t mc_patch_data_id; | ||
| uint8_t reserved1[6]; | ||
|
|
||
| uint32_t chipset1_dev_id; | ||
| uint32_t chipset2_dev_id; | ||
|
|
||
| uint16_t processor_rev_id; | ||
|
|
||
| uint8_t chipset1_rev_id; | ||
| uint8_t chipset2_rev_id; | ||
|
|
||
| uint8_t reserved2[4]; | ||
|
|
||
| uint8_t m_patch_data[F16H_MPB_MAX_SIZE-F16H_MPB_DATA_OFFSET]; | ||
|
|
||
| }; | ||
|
|
||
| static void apply_microcode_patch(const struct microcode *m) | ||
| { | ||
| uint32_t new_patch_id; | ||
| msr_t msr; | ||
|
|
||
| /* apply patch */ | ||
| msr.hi = 0; | ||
| msr.lo = (uint32_t)m; | ||
|
|
||
| wrmsr(0xc0010020, msr); | ||
|
|
||
| UCODE_DEBUG("patch id to apply = 0x%08x\n", m->patch_id); | ||
|
|
||
| /* patch authentication */ | ||
| msr = rdmsr(0x8b); | ||
| new_patch_id = msr.lo; | ||
|
|
||
| UCODE_DEBUG("updated to patch id = 0x%08x %s\n", new_patch_id , | ||
| (new_patch_id == m->patch_id) ? "success" : "fail"); | ||
| } | ||
|
|
||
| static void amd_update_microcode(const void *ucode, size_t ucode_len, | ||
| uint32_t equivalent_processor_rev_id) | ||
| { | ||
| const struct microcode *m; | ||
| const uint8_t *c = ucode; | ||
|
|
||
| m = (struct microcode *)c; | ||
|
|
||
| if (m->processor_rev_id == equivalent_processor_rev_id) { | ||
| apply_microcode_patch(m); | ||
| } | ||
| } | ||
|
|
||
| static const char *microcode_cbfs_file[] = { | ||
| "cpu_microcode_blob.bin", | ||
| }; | ||
|
|
||
| void amd_update_microcode_from_cbfs(uint32_t equivalent_processor_rev_id) | ||
| { | ||
| const void *ucode; | ||
| size_t ucode_len; | ||
|
|
||
| uint32_t i; | ||
|
|
||
| for (i = 0; i < ARRAY_SIZE(microcode_cbfs_file); i++) | ||
| { | ||
| if (equivalent_processor_rev_id == 0) { | ||
| UCODE_DEBUG("rev id not found. Skipping microcode patch!\n"); | ||
| return; | ||
| } | ||
|
|
||
| #ifdef __PRE_RAM__ | ||
| #if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK) | ||
| spin_lock(romstage_microcode_cbfs_lock()); | ||
| #endif | ||
| #endif | ||
|
|
||
| ucode = cbfs_boot_map_with_leak(microcode_cbfs_file[i], | ||
| CBFS_TYPE_MICROCODE, &ucode_len); | ||
| if (!ucode) { | ||
| UCODE_DEBUG("microcode file not found. Skipping updates.\n"); | ||
| #ifdef __PRE_RAM__ | ||
| #if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK) | ||
| spin_unlock(romstage_microcode_cbfs_lock()); | ||
| #endif | ||
| #endif | ||
| return; | ||
| } | ||
|
|
||
| if(ucode_len > F16H_MPB_MAX_SIZE) { | ||
| UCODE_DEBUG("microcode file invalid. Skipping updates.\n"); | ||
| } | ||
|
|
||
| amd_update_microcode(ucode, ucode_len, equivalent_processor_rev_id); | ||
|
|
||
| #ifdef __PRE_RAM__ | ||
| #if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK) | ||
| spin_unlock(romstage_microcode_cbfs_lock()); | ||
| #endif | ||
| #endif | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,56 @@ | ||
| /* | ||
| * This file is part of the coreboot project. | ||
| * | ||
| * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering | ||
| * Copyright (C) 2007 Advanced Micro Devices, Inc. | ||
| * | ||
| * 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 | ||
| * the Free Software Foundation; version 2 of the License. | ||
| * | ||
| * This program is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| */ | ||
|
|
||
| #include <stdint.h> | ||
| #include <cpu/amd/microcode.h> | ||
|
|
||
| struct id_mapping { | ||
| uint32_t orig_id; | ||
| uint16_t new_id; | ||
| }; | ||
|
|
||
| static u16 get_equivalent_processor_rev_id(u32 orig_id) { | ||
| static const struct id_mapping id_mapping_table[] = { | ||
| /* Family 16h */ | ||
|
|
||
| /* TODO This equivalent processor revisions ID needs verification */ | ||
| { 0x730f01, 0x7301 }, | ||
|
|
||
| /* Array terminator */ | ||
| { 0xffffff, 0x0000 }, | ||
| }; | ||
|
|
||
| u32 new_id; | ||
| int i; | ||
|
|
||
| new_id = 0; | ||
|
|
||
| for (i = 0; id_mapping_table[i].orig_id != 0xffffff; i++) { | ||
| if (id_mapping_table[i].orig_id == orig_id) { | ||
| new_id = id_mapping_table[i].new_id; | ||
| break; | ||
| } | ||
| } | ||
|
|
||
| return new_id; | ||
|
|
||
| } | ||
|
|
||
| void update_microcode(u32 cpu_deviceid) | ||
| { | ||
| u32 equivalent_processor_rev_id = get_equivalent_processor_rev_id(cpu_deviceid); | ||
| amd_update_microcode_from_cbfs(equivalent_processor_rev_id); | ||
| } |