| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| ## | ||
| ## This file is part of the coreboot project. | ||
| ## | ||
| ## Copyright (C) 2016 Google 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. | ||
| ## | ||
|
|
||
| TAG-$(CONFIG_MEMTEST_MASTER)=origin/master | ||
| NAME-$(CONFIG_MEMTEST_MASTER)=Master | ||
| TAG-$(CONFIG_MEMTEST_STABLE)=485c4fd363fe8570b3da9f0cc5dacf20e1c40cbc | ||
| NAME-$(CONFIG_MEMTEST_STABLE)=Stable | ||
|
|
||
| project_name=Memtest86+ | ||
| project_dir=$(CURDIR)/memtest86plus | ||
| project_git_repo=https://review.coreboot.org/memtest86plus.git | ||
|
|
||
| all: build | ||
|
|
||
| $(project_dir): | ||
| echo " Cloning $(project_name) from Git" | ||
| git clone $(project_git_repo) $(project_dir) | ||
|
|
||
| fetch: $(project_dir) | ||
| -cd $(project_dir); git show $(TAG-y) >/dev/null 2>&1 ; \ | ||
| if [ $$? -ne 0 ] || [ "$(TAG-y)" = "origin/master" ]; then \ | ||
| echo " Fetching new commits from the $(project_name) git repo"; \ | ||
| git fetch; fi | ||
|
|
||
| checkout: fetch | ||
| echo " Checking out $(project_name) revision $(NAME-y) ($(TAG-y))" | ||
| cd $(project_dir); \ | ||
| git checkout master; \ | ||
| git branch -D coreboot 2>/dev/null; \ | ||
| git checkout -b coreboot $(TAG-y) | ||
|
|
||
| build: checkout | ||
| echo " MAKE $(project_name) $(NAME-y)" | ||
| $(MAKE) -C $(project_dir) all | ||
|
|
||
| clean: | ||
| test -d $(project_dir) && $(MAKE) -C $(project_dir) clean || exit 0 | ||
|
|
||
| distclean: | ||
| rm -rf $(project_dir) | ||
|
|
||
| print-repo-info: | ||
| echo "$(project_git_repo) $(project_dir)" | ||
|
|
||
| .PHONY: all build checkout clean distclean fetch print-repo-info |
| 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 |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| /* | ||
| * 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); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,146 @@ | ||
| /* | ||
| * 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 <stdlib.h> | ||
| #include <console/console.h> | ||
| #include <cpu/x86/msr.h> | ||
| #include <cpu/amd/microcode.h> | ||
| #include <cbfs_core.h> | ||
| #include <arch/io.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; | ||
| } | ||
|
|
||
| ucode = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, microcode_cbfs_file[i], | ||
| CBFS_TYPE_MICROCODE, &ucode_len); | ||
| if (!ucode) { | ||
| UCODE_DEBUG("microcode file not found. Skipping updates.\n"); | ||
| 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); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| Board name: apu2 apu3 apu4 apu5 | ||
| Board URL: http://www.pcengines.ch/apu2c2.htm | ||
| Category: half | ||
| ROM protocol: SPI | ||
| ROM socketed: n | ||
| Flashrom support: y |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,9 +10,8 @@ | |
| /rom@genroms/pxe.rom | ||
| pxen0 | ||
| scon1 | ||
| usben1 | ||
| uartc1 | ||
| uartd1 | ||
| ehcien1 | ||
| mpcie2_clk0 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,157 @@ | ||
| /* | ||
| * This file is part of the coreboot project. | ||
| * | ||
| * Copyright (C) 2012 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. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with this program; if not, write to the Free Software | ||
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| */ | ||
|
|
||
| #include <spi-generic.h> | ||
| #include <spi_flash.h> | ||
| #include <cbfs_core.h> | ||
| #include <console/console.h> | ||
| #include <string.h> | ||
| #include <stdlib.h> | ||
| #include "s1_button.h" | ||
|
|
||
| static int find_knob_index(const char *s, const char *pattern) | ||
| { | ||
|
|
||
| int pattern_index = 0; | ||
| char *result = (char *) s; | ||
| char *lpattern = (char *) pattern; | ||
|
|
||
| while (*result && *pattern ) { | ||
| if ( *lpattern == 0) // the pattern matches return the pointer | ||
| return pattern_index; | ||
| if ( *result == 0) // We're at the end of the file content but don't have a patter match yet | ||
| return -1; | ||
| if (*result == *lpattern ) { | ||
| // The string matches, simply advance | ||
| result++; | ||
| pattern_index++; | ||
| lpattern++; | ||
| } else { | ||
| // The string doesn't match restart the pattern | ||
| result++; | ||
| pattern_index++; | ||
| lpattern = (char *) pattern; | ||
| } | ||
| } | ||
|
|
||
| return -1; | ||
| } | ||
|
|
||
| static char* locate_and_map_bootorder(size_t *offset, size_t *length) | ||
| { | ||
| const char *file_name = "bootorder"; | ||
| size_t boot_file_len = 0; | ||
| size_t file_offset; | ||
| struct cbfs_file *bootorder_cbfs_file = NULL; | ||
| char* bootorder_copy; | ||
|
|
||
| char *boot_file = cbfs_get_file_content( | ||
| CBFS_DEFAULT_MEDIA, file_name, CBFS_TYPE_RAW, &boot_file_len); | ||
|
|
||
| if (boot_file == NULL) { | ||
| printk(BIOS_WARNING, "file [%s] not found in CBFS\n", file_name); | ||
| return NULL; | ||
| } | ||
|
|
||
| if (boot_file_len < 4096) { | ||
| printk(BIOS_WARNING, "Missing bootorder data.\n"); | ||
| return NULL; | ||
| } | ||
|
|
||
| if(boot_file_len & 0xFFF) { | ||
| printk(BIOS_WARNING,"Bootorder file not multiple size of 4k\n"); | ||
| return NULL; | ||
| } | ||
|
|
||
|
|
||
| file_offset = cbfs_locate_file(CBFS_DEFAULT_MEDIA, bootorder_cbfs_file, file_name); | ||
|
|
||
| if(file_offset == -1) { | ||
| printk(BIOS_WARNING,"Failed to retrieve bootorder file offset\n"); | ||
| return NULL; | ||
| } | ||
|
|
||
| bootorder_copy = (char *) malloc(boot_file_len); | ||
|
|
||
| if(bootorder_copy == NULL) { | ||
| printk(BIOS_WARNING,"Failed to allocate memory for bootorder\n"); | ||
| return NULL; | ||
| } | ||
|
|
||
| if(memcpy(bootorder_copy, boot_file, boot_file_len) == NULL) { | ||
| printk(BIOS_WARNING,"Copying bootorder failed\n"); | ||
| return NULL; | ||
| } | ||
|
|
||
| *offset = file_offset; | ||
| *length = boot_file_len; | ||
|
|
||
| return bootorder_copy; | ||
| } | ||
|
|
||
| static int flash_bootorder(size_t offset, size_t length, char *buffer) | ||
| { | ||
| const struct spi_flash *flash; | ||
|
|
||
| spi_init(); | ||
|
|
||
| flash = spi_flash_probe(0, 0); | ||
|
|
||
| if (flash == NULL) { | ||
| printk(BIOS_DEBUG, "Could not find SPI device\n"); | ||
| return -1; | ||
| } | ||
|
|
||
| if (spi_flash_erase(flash, (u32) offset, length)) { | ||
| printk(BIOS_WARNING, "SPI erase failed\n"); | ||
| return -1; | ||
| } | ||
|
|
||
| if (spi_flash_write(flash, (u32) offset, length, buffer)) { | ||
| printk(BIOS_WARNING, "SPI write failed\n"); | ||
| return -1; | ||
| } | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| void enable_console(void) | ||
| { | ||
| char *bootorder_file; | ||
| size_t bootorder_length; | ||
| size_t bootorder_offset; | ||
| int knob_index; | ||
|
|
||
| bootorder_file = locate_and_map_bootorder(&bootorder_offset, &bootorder_length); | ||
|
|
||
| knob_index = find_knob_index(bootorder_file, "scon"); | ||
|
|
||
| if(knob_index == -1){ | ||
| printk(BIOS_WARNING,"scon knob not found in bootorder\n"); | ||
| return; | ||
| } | ||
|
|
||
| *(bootorder_file + knob_index) = '1'; | ||
|
|
||
| if(flash_bootorder(bootorder_offset, bootorder_length, bootorder_file)) { | ||
| printk(BIOS_WARNING, "Failed to flash bootorder\n"); | ||
| } else { | ||
| printk(BIOS_INFO, "Bootorder write successed\n"); | ||
| } | ||
| } |