commit
1a2728ae4f
@ -0,0 +1,64 @@ |
||||
/* |
||||
* (C) Copyright 2015 Google, Inc |
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <asm/global_data.h> |
||||
#include <asm/msr-index.h> |
||||
#include <asm/processor-flags.h> |
||||
|
||||
/* |
||||
* rdi - 32-bit code segment selector |
||||
* rsi - target address |
||||
* rdx - table address (0 if none) |
||||
*/ |
||||
.code64 |
||||
.globl cpu_call32
|
||||
cpu_call32: |
||||
cli |
||||
|
||||
/* Save table pointer */ |
||||
mov %edx, %ebx |
||||
|
||||
/* |
||||
* Debugging option, this outputs characters to the console UART |
||||
* mov $0x3f8,%edx |
||||
* mov $'a',%al |
||||
* out %al,(%dx) |
||||
*/ |
||||
|
||||
pushf |
||||
push %rdi /* 32-bit code segment */ |
||||
lea compat(%rip), %rax |
||||
push %rax |
||||
.byte 0x48 /* REX prefix to force 64-bit far return */ |
||||
retf |
||||
.code32 |
||||
compat: |
||||
/* |
||||
* We are now in compatibility mode with a default operand size of |
||||
* 32 bits. First disable paging. |
||||
*/ |
||||
movl %cr0, %eax |
||||
andl $~X86_CR0_PG, %eax |
||||
movl %eax, %cr0 |
||||
|
||||
/* Invalidate TLB */ |
||||
xorl %eax, %eax |
||||
movl %eax, %cr3 |
||||
|
||||
/* Disable Long mode in EFER (Extended Feature Enable Register) */ |
||||
movl $MSR_EFER, %ecx |
||||
rdmsr |
||||
btr $_EFER_LME, %eax |
||||
wrmsr |
||||
|
||||
/* Set up table pointer for _x86boot_start */ |
||||
mov %ebx, %ecx |
||||
|
||||
/* Jump to the required target */ |
||||
pushl %edi /* 32-bit code segment */ |
||||
pushl %esi /* 32-bit target address */ |
||||
retf |
@ -0,0 +1,8 @@ |
||||
#
|
||||
# Copyright (c) 2015 Google, Inc
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += efi.o
|
||||
obj-y += sdram.o
|
@ -0,0 +1,42 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <fdtdec.h> |
||||
#include <netdev.h> |
||||
|
||||
int arch_cpu_init(void) |
||||
{ |
||||
#ifdef CONFIG_SYS_X86_TSC_TIMER |
||||
timer_set_base(rdtsc()); |
||||
#endif |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int board_early_init_f(void) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
int print_cpuinfo(void) |
||||
{ |
||||
return default_print_cpuinfo(); |
||||
} |
||||
|
||||
void board_final_cleanup(void) |
||||
{ |
||||
} |
||||
|
||||
int misc_init_r(void) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
int arch_misc_init(void) |
||||
{ |
||||
return 0; |
||||
} |
@ -0,0 +1,94 @@ |
||||
/* |
||||
* U-Boot EFI linker script |
||||
* |
||||
* SPDX-License-Identifier: BSD-2-Clause |
||||
* |
||||
* Modified from usr/lib32/elf_ia32_efi.lds in gnu-efi |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
|
||||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") |
||||
OUTPUT_ARCH(i386) |
||||
ENTRY(_start) |
||||
SECTIONS |
||||
{ |
||||
image_base = .; |
||||
.hash : { *(.hash) } /* this MUST come first, EFI expects it */ |
||||
. = ALIGN(4096); |
||||
.text : |
||||
{ |
||||
*(.text) |
||||
*(.text.*) |
||||
*(.gnu.linkonce.t.*) |
||||
} |
||||
. = ALIGN(4096); |
||||
.sdata : |
||||
{ |
||||
*(.got.plt) |
||||
*(.got) |
||||
*(.srodata) |
||||
*(.sdata) |
||||
*(.sbss) |
||||
*(.scommon) |
||||
} |
||||
. = ALIGN(4096); |
||||
.data : |
||||
{ |
||||
*(.rodata*) |
||||
*(.data) |
||||
*(.data1) |
||||
*(.data.*) |
||||
*(.sdata) |
||||
*(.got.plt) |
||||
*(.got) |
||||
/* |
||||
* the EFI loader doesn't seem to like a .bss section, so we |
||||
* stick it all into .data: |
||||
*/ |
||||
*(.sbss) |
||||
*(.scommon) |
||||
*(.dynbss) |
||||
*(.bss) |
||||
*(COMMON) |
||||
|
||||
/* U-Boot lists and device tree */ |
||||
. = ALIGN(8); |
||||
*(SORT(.u_boot_list*)); |
||||
. = ALIGN(8); |
||||
*(.dtb*); |
||||
} |
||||
|
||||
. = ALIGN(4096); |
||||
.dynamic : { *(.dynamic) } |
||||
. = ALIGN(4096); |
||||
.rel : |
||||
{ |
||||
*(.rel.data) |
||||
*(.rel.data.*) |
||||
*(.rel.got) |
||||
*(.rel.stab) |
||||
*(.data.rel.ro.local) |
||||
*(.data.rel.local) |
||||
*(.data.rel.ro) |
||||
*(.data.rel*) |
||||
*(.rel.u_boot_list*) |
||||
} |
||||
. = ALIGN(4096); |
||||
.reloc : /* This is the PECOFF .reloc section! */ |
||||
{ |
||||
*(.reloc) |
||||
} |
||||
. = ALIGN(4096); |
||||
.dynsym : { *(.dynsym) } |
||||
. = ALIGN(4096); |
||||
.dynstr : { *(.dynstr) } |
||||
. = ALIGN(4096); |
||||
/DISCARD/ : |
||||
{ |
||||
*(.rel.reloc) |
||||
*(.eh_frame) |
||||
*(.note.GNU-stack) |
||||
} |
||||
.comment 0 : { *(.comment) } |
||||
} |
@ -0,0 +1,83 @@ |
||||
/* |
||||
* U-Boot EFI linker script |
||||
* |
||||
* SPDX-License-Identifier: BSD-2-Clause |
||||
* |
||||
* Modified from usr/lib32/elf_x86_64_efi.lds in gnu-efi |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
|
||||
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") |
||||
OUTPUT_ARCH(i386:x86-64) |
||||
ENTRY(_start) |
||||
SECTIONS |
||||
{ |
||||
image_base = .; |
||||
.hash : { *(.hash) } /* this MUST come first, EFI expects it */ |
||||
. = ALIGN(4096); |
||||
.eh_frame : { |
||||
*(.eh_frame) |
||||
} |
||||
|
||||
. = ALIGN(4096); |
||||
|
||||
.text : { |
||||
*(.text) |
||||
*(.text.*) |
||||
*(.gnu.linkonce.t.*) |
||||
} |
||||
|
||||
. = ALIGN(4096); |
||||
|
||||
.reloc : { |
||||
*(.reloc) |
||||
} |
||||
|
||||
. = ALIGN(4096); |
||||
|
||||
.data : { |
||||
*(.rodata*) |
||||
*(.got.plt) |
||||
*(.got) |
||||
*(.data*) |
||||
*(.sdata) |
||||
/* the EFI loader doesn't seem to like a .bss section, so we stick |
||||
* it all into .data: */ |
||||
*(.sbss) |
||||
*(.scommon) |
||||
*(.dynbss) |
||||
*(.bss) |
||||
*(COMMON) |
||||
*(.rel.local) |
||||
|
||||
/* U-Boot lists and device tree */ |
||||
. = ALIGN(8); |
||||
*(SORT(.u_boot_list*)); |
||||
. = ALIGN(8); |
||||
*(.dtb*); |
||||
} |
||||
|
||||
. = ALIGN(4096); |
||||
.dynamic : { *(.dynamic) } |
||||
. = ALIGN(4096); |
||||
|
||||
.rela : { |
||||
*(.rela.data*) |
||||
*(.rela.got) |
||||
*(.rela.stab) |
||||
} |
||||
|
||||
. = ALIGN(4096); |
||||
.dynsym : { *(.dynsym) } |
||||
. = ALIGN(4096); |
||||
.dynstr : { *(.dynstr) } |
||||
. = ALIGN(4096); |
||||
.ignored.reloc : { |
||||
*(.rela.reloc) |
||||
*(.eh_frame) |
||||
*(.note.GNU-stack) |
||||
} |
||||
|
||||
.comment 0 : { *(.comment) } |
||||
} |
@ -0,0 +1,29 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <efi.h> |
||||
#include <asm/u-boot-x86.h> |
||||
|
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
ulong board_get_usable_ram_top(ulong total_size) |
||||
{ |
||||
return (ulong)efi_get_ram_base() + gd->ram_size; |
||||
} |
||||
|
||||
int dram_init(void) |
||||
{ |
||||
/* gd->ram_size is set as part of EFI init */ |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void dram_init_banksize(void) |
||||
{ |
||||
gd->bd->bi_dram[0].start = efi_get_ram_base(); |
||||
gd->bd->bi_dram[0].size = CONFIG_EFI_RAM_SIZE; |
||||
} |
@ -0,0 +1,197 @@ |
||||
/* |
||||
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
/dts-v1/; |
||||
|
||||
#include <dt-bindings/gpio/x86-gpio.h> |
||||
#include <dt-bindings/interrupt-router/intel-irq.h> |
||||
|
||||
/include/ "skeleton.dtsi" |
||||
/include/ "serial.dtsi" |
||||
/include/ "rtc.dtsi" |
||||
|
||||
/ { |
||||
model = "Intel Bayley Bay"; |
||||
compatible = "intel,bayleybay", "intel,baytrail"; |
||||
|
||||
aliases { |
||||
serial0 = &serial; |
||||
spi0 = "/spi"; |
||||
}; |
||||
|
||||
config { |
||||
silent_console = <0>; |
||||
}; |
||||
|
||||
chosen { |
||||
stdout-path = "/serial"; |
||||
}; |
||||
|
||||
cpus { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
|
||||
cpu@0 { |
||||
device_type = "cpu"; |
||||
compatible = "intel,baytrail-cpu"; |
||||
reg = <0>; |
||||
intel,apic-id = <0>; |
||||
}; |
||||
|
||||
cpu@1 { |
||||
device_type = "cpu"; |
||||
compatible = "intel,baytrail-cpu"; |
||||
reg = <1>; |
||||
intel,apic-id = <2>; |
||||
}; |
||||
|
||||
cpu@2 { |
||||
device_type = "cpu"; |
||||
compatible = "intel,baytrail-cpu"; |
||||
reg = <2>; |
||||
intel,apic-id = <4>; |
||||
}; |
||||
|
||||
cpu@3 { |
||||
device_type = "cpu"; |
||||
compatible = "intel,baytrail-cpu"; |
||||
reg = <3>; |
||||
intel,apic-id = <6>; |
||||
}; |
||||
}; |
||||
|
||||
spi { |
||||
#address-cells = <1>; |
||||
#size-cells = <0>; |
||||
compatible = "intel,ich-spi"; |
||||
spi-flash@0 { |
||||
reg = <0>; |
||||
compatible = "winbond,w25q64dw", "spi-flash"; |
||||
memory-map = <0xff800000 0x00800000>; |
||||
}; |
||||
}; |
||||
|
||||
gpioa { |
||||
compatible = "intel,ich6-gpio"; |
||||
u-boot,dm-pre-reloc; |
||||
reg = <0 0x20>; |
||||
bank-name = "A"; |
||||
}; |
||||
|
||||
gpiob { |
||||
compatible = "intel,ich6-gpio"; |
||||
u-boot,dm-pre-reloc; |
||||
reg = <0x20 0x20>; |
||||
bank-name = "B"; |
||||
}; |
||||
|
||||
gpioc { |
||||
compatible = "intel,ich6-gpio"; |
||||
u-boot,dm-pre-reloc; |
||||
reg = <0x40 0x20>; |
||||
bank-name = "C"; |
||||
}; |
||||
|
||||
gpiod { |
||||
compatible = "intel,ich6-gpio"; |
||||
u-boot,dm-pre-reloc; |
||||
reg = <0x60 0x20>; |
||||
bank-name = "D"; |
||||
}; |
||||
|
||||
gpioe { |
||||
compatible = "intel,ich6-gpio"; |
||||
u-boot,dm-pre-reloc; |
||||
reg = <0x80 0x20>; |
||||
bank-name = "E"; |
||||
}; |
||||
|
||||
gpiof { |
||||
compatible = "intel,ich6-gpio"; |
||||
u-boot,dm-pre-reloc; |
||||
reg = <0xA0 0x20>; |
||||
bank-name = "F"; |
||||
}; |
||||
|
||||
pci { |
||||
compatible = "pci-x86"; |
||||
#address-cells = <3>; |
||||
#size-cells = <2>; |
||||
u-boot,dm-pre-reloc; |
||||
ranges = <0x02000000 0x0 0x80000000 0x80000000 0 0x40000000 |
||||
0x42000000 0x0 0xc0000000 0xc0000000 0 0x20000000 |
||||
0x01000000 0x0 0x2000 0x2000 0 0xe000>; |
||||
|
||||
irq-router@1f,0 { |
||||
reg = <0x0000f800 0 0 0 0>; |
||||
compatible = "intel,irq-router"; |
||||
intel,pirq-config = "ibase"; |
||||
intel,ibase-offset = <0x50>; |
||||
intel,pirq-link = <8 8>; |
||||
intel,pirq-mask = <0xdee0>; |
||||
intel,pirq-routing = < |
||||
/* BayTrail PCI devices */ |
||||
PCI_BDF(0, 2, 0) INTA PIRQA |
||||
PCI_BDF(0, 3, 0) INTA PIRQA |
||||
PCI_BDF(0, 16, 0) INTA PIRQA |
||||
PCI_BDF(0, 17, 0) INTA PIRQA |
||||
PCI_BDF(0, 18, 0) INTA PIRQA |
||||
PCI_BDF(0, 19, 0) INTA PIRQA |
||||
PCI_BDF(0, 20, 0) INTA PIRQA |
||||
PCI_BDF(0, 21, 0) INTA PIRQA |
||||
PCI_BDF(0, 22, 0) INTA PIRQA |
||||
PCI_BDF(0, 23, 0) INTA PIRQA |
||||
PCI_BDF(0, 24, 0) INTA PIRQA |
||||
PCI_BDF(0, 24, 1) INTC PIRQC |
||||
PCI_BDF(0, 24, 2) INTD PIRQD |
||||
PCI_BDF(0, 24, 3) INTB PIRQB |
||||
PCI_BDF(0, 24, 4) INTA PIRQA |
||||
PCI_BDF(0, 24, 5) INTC PIRQC |
||||
PCI_BDF(0, 24, 6) INTD PIRQD |
||||
PCI_BDF(0, 24, 7) INTB PIRQB |
||||
PCI_BDF(0, 26, 0) INTA PIRQA |
||||
PCI_BDF(0, 27, 0) INTA PIRQA |
||||
PCI_BDF(0, 28, 0) INTA PIRQA |
||||
PCI_BDF(0, 28, 1) INTB PIRQB |
||||
PCI_BDF(0, 28, 2) INTC PIRQC |
||||
PCI_BDF(0, 28, 3) INTD PIRQD |
||||
PCI_BDF(0, 29, 0) INTA PIRQA |
||||
PCI_BDF(0, 30, 0) INTA PIRQA |
||||
PCI_BDF(0, 30, 1) INTD PIRQD |
||||
PCI_BDF(0, 30, 2) INTB PIRQB |
||||
PCI_BDF(0, 30, 3) INTC PIRQC |
||||
PCI_BDF(0, 30, 4) INTD PIRQD |
||||
PCI_BDF(0, 30, 5) INTB PIRQB |
||||
PCI_BDF(0, 31, 3) INTB PIRQB |
||||
|
||||
/* PCIe root ports downstream interrupts */ |
||||
PCI_BDF(1, 0, 0) INTA PIRQA |
||||
PCI_BDF(1, 0, 0) INTB PIRQB |
||||
PCI_BDF(1, 0, 0) INTC PIRQC |
||||
PCI_BDF(1, 0, 0) INTD PIRQD |
||||
PCI_BDF(2, 0, 0) INTA PIRQB |
||||
PCI_BDF(2, 0, 0) INTB PIRQC |
||||
PCI_BDF(2, 0, 0) INTC PIRQD |
||||
PCI_BDF(2, 0, 0) INTD PIRQA |
||||
PCI_BDF(3, 0, 0) INTA PIRQC |
||||
PCI_BDF(3, 0, 0) INTB PIRQD |
||||
PCI_BDF(3, 0, 0) INTC PIRQA |
||||
PCI_BDF(3, 0, 0) INTD PIRQB |
||||
PCI_BDF(4, 0, 0) INTA PIRQD |
||||
PCI_BDF(4, 0, 0) INTB PIRQA |
||||
PCI_BDF(4, 0, 0) INTC PIRQB |
||||
PCI_BDF(4, 0, 0) INTD PIRQC |
||||
>; |
||||
}; |
||||
}; |
||||
|
||||
microcode { |
||||
update@0 { |
||||
#include "microcode/m0230671117.dtsi" |
||||
}; |
||||
}; |
||||
|
||||
}; |
@ -0,0 +1,22 @@ |
||||
/* |
||||
* Copyright (c) 2015 Google, Inc |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
/dts-v1/; |
||||
|
||||
/include/ "skeleton.dtsi" |
||||
|
||||
/ { |
||||
model = "EFI"; |
||||
compatible = "efi,app"; |
||||
|
||||
chosen { |
||||
stdout-path = &serial; |
||||
}; |
||||
|
||||
serial: serial { |
||||
compatible = "efi,uart"; |
||||
}; |
||||
}; |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,10 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef _X86_ARCH_GPIO_H_ |
||||
#define _X86_ARCH_GPIO_H_ |
||||
|
||||
#endif /* _X86_ARCH_GPIO_H_ */ |
@ -0,0 +1,46 @@ |
||||
/*
|
||||
* Brought in from Linux 4.1, removed things not useful to U-Boot. |
||||
* The definitions perhaps came from the GNU Library which is GPL. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef _ASM_X86_ELF_H |
||||
#define _ASM_X86_ELF_H |
||||
|
||||
/* ELF register definitions */ |
||||
#define R_386_NONE 0 |
||||
#define R_386_32 1 |
||||
#define R_386_PC32 2 |
||||
#define R_386_GOT32 3 |
||||
#define R_386_PLT32 4 |
||||
#define R_386_COPY 5 |
||||
#define R_386_GLOB_DAT 6 |
||||
#define R_386_JMP_SLOT 7 |
||||
#define R_386_RELATIVE 8 |
||||
#define R_386_GOTOFF 9 |
||||
#define R_386_GOTPC 10 |
||||
#define R_386_NUM 11 |
||||
|
||||
/* x86-64 relocation types */ |
||||
#define R_X86_64_NONE 0 /* No reloc */ |
||||
#define R_X86_64_64 1 /* Direct 64 bit */ |
||||
#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ |
||||
#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ |
||||
#define R_X86_64_PLT32 4 /* 32 bit PLT address */ |
||||
#define R_X86_64_COPY 5 /* Copy symbol at runtime */ |
||||
#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ |
||||
#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ |
||||
#define R_X86_64_RELATIVE 8 /* Adjust by program base */ |
||||
/* 32 bit signed pc relative offset to GOT */ |
||||
#define R_X86_64_GOTPCREL 9 |
||||
#define R_X86_64_32 10 /* Direct 32 bit zero extended */ |
||||
#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ |
||||
#define R_X86_64_16 12 /* Direct 16 bit zero extended */ |
||||
#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ |
||||
#define R_X86_64_8 14 /* Direct 8 bit sign extended */ |
||||
#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ |
||||
|
||||
#define R_X86_64_NUM 16 |
||||
|
||||
#endif |
@ -0,0 +1,11 @@ |
||||
if EFI |
||||
|
||||
config SYS_CAR_ADDR |
||||
hex |
||||
default 0x100000 |
||||
|
||||
config SYS_CAR_SIZE |
||||
hex |
||||
default 0x20000 |
||||
|
||||
endif |
@ -0,0 +1,27 @@ |
||||
#
|
||||
# (C) Copyright 2002-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-$(CONFIG_EFI_STUB) += car.o
|
||||
obj-$(CONFIG_EFI_STUB) += efi.o
|
||||
|
||||
obj-$(CONFIG_EFI_APP) += crt0-efi-ia32.o reloc_ia32.o
|
||||
|
||||
ifneq ($(CONFIG_EFI_STUB),) |
||||
|
||||
CFLAGS_REMOVE_reloc_ia32.o += -mregparm=3
|
||||
CFLAGS_reloc_ia32.o += -fpic -fshort-wchar
|
||||
|
||||
# When building for 64-bit we must remove the i386-specific flags
|
||||
CFLAGS_REMOVE_reloc_x86_64.o += -mregparm=3 -march=i386 -m32
|
||||
CFLAGS_reloc_x86_64.o += -fpic -fshort-wchar
|
||||
|
||||
AFLAGS_REMOVE_crt0-efi-x86_64.o += -mregparm=3 -march=i386 -m32
|
||||
AFLAGS_crt0-efi-x86_64.o += -fpic -fshort-wchar
|
||||
|
||||
extra-$(CONFIG_EFI_STUB_32BIT) += crt0-efi-ia32.o reloc_ia32.o
|
||||
extra-$(CONFIG_EFI_STUB_64BIT) += crt0-efi-x86_64.o reloc_x86_64.o
|
||||
endif |
@ -0,0 +1,10 @@ |
||||
/* |
||||
* Copyright (c) 2015 Google, Inc |
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
.globl car_init
|
||||
car_init: |
||||
jmp car_init_ret |
@ -0,0 +1,52 @@ |
||||
/* |
||||
* crt0-efi-ia32.S - x86 EFI startup code. |
||||
* |
||||
* Copyright (C) 1999 Hewlett-Packard Co. |
||||
* Contributed by David Mosberger <davidm@hpl.hp.com>.
|
||||
* All rights reserved. |
||||
* |
||||
* SPDX-License-Identifier: BSD-3-Clause |
||||
*/ |
||||
|
||||
.text |
||||
.align 4
|
||||
|
||||
.globl _start
|
||||
_start: |
||||
pushl %ebp |
||||
movl %esp,%ebp |
||||
|
||||
pushl 12(%ebp) # copy "image" argument |
||||
pushl 8(%ebp) # copy "systab" argument |
||||
|
||||
call 0f |
||||
0: popl %eax |
||||
movl %eax,%ebx |
||||
|
||||
addl $image_base-0b,%eax # %eax = ldbase |
||||
addl $_DYNAMIC-0b,%ebx # %ebx = _DYNAMIC |
||||
|
||||
pushl %ebx # pass _DYNAMIC as second argument |
||||
pushl %eax # pass ldbase as first argument |
||||
call _relocate |
||||
popl %ebx |
||||
popl %ebx |
||||
testl %eax,%eax |
||||
jne .exit |
||||
call efi_main # call app with "image" and "systab" argument |
||||
|
||||
.exit: leave |
||||
ret |
||||
|
||||
/* |
||||
* hand-craft a dummy .reloc section so EFI knows it's a relocatable |
||||
* executable: |
||||
*/ |
||||
.data |
||||
dummy: .long 0 |
||||
|
||||
#define IMAGE_REL_ABSOLUTE 0 |
||||
.section .reloc |
||||
.long dummy /* Page RVA */ |
||||
.long 10 /* Block Size (2*4+2) */ |
||||
.word (IMAGE_REL_ABSOLUTE << 12) + 0 /* reloc for dummy */ |
@ -0,0 +1,51 @@ |
||||
/* |
||||
* crt0-efi-x86_64.S - x86_64 EFI startup code. |
||||
* Copyright (C) 1999 Hewlett-Packard Co. |
||||
* Contributed by David Mosberger <davidm@hpl.hp.com>.
|
||||
* Copyright (C) 2005 Intel Co. |
||||
* Contributed by Fenghua Yu <fenghua.yu@intel.com>.
|
||||
* |
||||
* All rights reserved. |
||||
* SPDX-License-Identifier: BSD-3-Clause |
||||
*/ |
||||
.text |
||||
.align 4
|
||||
|
||||
.globl _start
|
||||
_start: |
||||
subq $8, %rsp |
||||
pushq %rcx |
||||
pushq %rdx |
||||
|
||||
0: |
||||
lea image_base(%rip), %rdi |
||||
lea _DYNAMIC(%rip), %rsi |
||||
|
||||
popq %rcx |
||||
popq %rdx |
||||
pushq %rcx |
||||
pushq %rdx |
||||
call _relocate |
||||
|
||||
popq %rdi |
||||
popq %rsi |
||||
|
||||
call efi_main |
||||
addq $8, %rsp |
||||
|
||||
.exit: |
||||
ret |
||||
|
||||
/* |
||||
* hand-craft a dummy .reloc section so EFI knows it's a relocatable |
||||
* executable: |
||||
*/ |
||||
.data |
||||
dummy: .long 0 |
||||
|
||||
#define IMAGE_REL_ABSOLUTE 0 |
||||
.section .reloc, "a" |
||||
label1: |
||||
.long dummy-label1 /* Page RVA */ |
||||
.long 10 /* Block Size (2*4+2) */ |
||||
.word (IMAGE_REL_ABSOLUTE << 12) + 0 /* reloc for dummy */ |
@ -0,0 +1,151 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc |
||||
* Written by Simon Glass <sjg@chromium.org> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <debug_uart.h> |
||||
#include <efi.h> |
||||
#include <errno.h> |
||||
#include <linux/err.h> |
||||
#include <linux/types.h> |
||||
|
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
/*
|
||||
* This function looks for the highest region of memory lower than 4GB which |
||||
* has enough space for U-Boot where U-Boot is aligned on a page boundary. |
||||
* It overrides the default implementation found elsewhere which simply |
||||
* picks the end of ram, wherever that may be. The location of the stack, |
||||
* the relocation address, and how far U-Boot is moved by relocation are |
||||
* set in the global data structure. |
||||
*/ |
||||
ulong board_get_usable_ram_top(ulong total_size) |
||||
{ |
||||
struct efi_mem_desc *desc, *end; |
||||
struct efi_entry_memmap *map; |
||||
int ret, size; |
||||
uintptr_t dest_addr = 0; |
||||
struct efi_mem_desc *largest = NULL; |
||||
|
||||
/*
|
||||
* Find largest area of memory below 4GB. We could |
||||
* call efi_build_mem_table() for a more accurate picture since it |
||||
* merges areas together where possible. But that function uses more |
||||
* pre-relocation memory, and it's not critical that we find the |
||||
* absolute largest region. |
||||
*/ |
||||
ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size); |
||||
if (ret) { |
||||
/* We should have stopped in dram_init(), something is wrong */ |
||||
debug("%s: Missing memory map\n", __func__); |
||||
goto err; |
||||
} |
||||
|
||||
end = (struct efi_mem_desc *)((ulong)map + size); |
||||
desc = map->desc; |
||||
for (; desc < end; desc = efi_get_next_mem_desc(map, desc)) { |
||||
if (desc->type != EFI_CONVENTIONAL_MEMORY || |
||||
desc->physical_start >= 1ULL << 32) |
||||
continue; |
||||
if (!largest || desc->num_pages > largest->num_pages) |
||||
largest = desc; |
||||
} |
||||
|
||||
/* If no suitable area was found, return an error. */ |
||||
assert(largest); |
||||
if (!largest || (largest->num_pages << EFI_PAGE_SHIFT) < (2 << 20)) |
||||
goto err; |
||||
|
||||
dest_addr = largest->physical_start + (largest->num_pages << |
||||
EFI_PAGE_SHIFT); |
||||
|
||||
return (ulong)dest_addr; |
||||
err: |
||||
panic("No available memory found for relocation"); |
||||
return 0; |
||||
} |
||||
|
||||
int dram_init(void) |
||||
{ |
||||
struct efi_mem_desc *desc, *end; |
||||
struct efi_entry_memmap *map; |
||||
int size, ret; |
||||
|
||||
ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size); |
||||
if (ret) { |
||||
printf("Cannot find EFI memory map tables, ret=%d\n", ret); |
||||
|
||||
return -ENODEV; |
||||
} |
||||
|
||||
end = (struct efi_mem_desc *)((ulong)map + size); |
||||
gd->ram_size = 0; |
||||
desc = map->desc; |
||||
for (; desc < end; desc = efi_get_next_mem_desc(map, desc)) { |
||||
if (desc->type < EFI_MMAP_IO) |
||||
gd->ram_size += desc->num_pages << EFI_PAGE_SHIFT; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void dram_init_banksize(void) |
||||
{ |
||||
struct efi_mem_desc *desc, *end; |
||||
struct efi_entry_memmap *map; |
||||
int ret, size; |
||||
int num_banks; |
||||
|
||||
ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size); |
||||
if (ret) { |
||||
/* We should have stopped in dram_init(), something is wrong */ |
||||
debug("%s: Missing memory map\n", __func__); |
||||
return; |
||||
} |
||||
end = (struct efi_mem_desc *)((ulong)map + size); |
||||
desc = map->desc; |
||||
for (num_banks = 0; |
||||
desc < end && num_banks < CONFIG_NR_DRAM_BANKS; |
||||
desc = efi_get_next_mem_desc(map, desc)) { |
||||
/*
|
||||
* We only use conventional memory below 4GB, and ignore |
||||
* anything less than 1MB. |
||||
*/ |
||||
if (desc->type != EFI_CONVENTIONAL_MEMORY || |
||||
desc->physical_start >= 1ULL << 32 || |
||||
(desc->num_pages << EFI_PAGE_SHIFT) < 1 << 20) |
||||
continue; |
||||
gd->bd->bi_dram[num_banks].start = desc->physical_start; |
||||
gd->bd->bi_dram[num_banks].size = desc->num_pages << |
||||
EFI_PAGE_SHIFT; |
||||
num_banks++; |
||||
} |
||||
} |
||||
|
||||
int print_cpuinfo(void) |
||||
{ |
||||
return default_print_cpuinfo(); |
||||
} |
||||
|
||||
/* Find any available tables and copy them to a safe place */ |
||||
int reserve_arch(void) |
||||
{ |
||||
struct efi_info_hdr *hdr; |
||||
|
||||
debug("table=%lx\n", gd->arch.table); |
||||
if (!gd->arch.table) |
||||
return 0; |
||||
|
||||
hdr = (struct efi_info_hdr *)gd->arch.table; |
||||
|
||||
gd->start_addr_sp -= hdr->total_size; |
||||
memcpy((void *)gd->start_addr_sp, hdr, hdr->total_size); |
||||
debug("Stashing EFI table at %lx to %lx, size %x\n", |
||||
gd->arch.table, gd->start_addr_sp, hdr->total_size); |
||||
gd->arch.table = gd->start_addr_sp; |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,72 @@ |
||||
/*
|
||||
* reloc_ia32.c - position independent x86 ELF shared object relocator |
||||
* Copyright (C) 1999 Hewlett-Packard Co. |
||||
* Contributed by David Mosberger <davidm@hpl.hp.com>. |
||||
* |
||||
* All rights reserved. |
||||
* |
||||
* SPDX-License-Identifier: BSD-3-Clause |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <efi.h> |
||||
#include <elf.h> |
||||
#include <asm/elf.h> |
||||
|
||||
efi_status_t _relocate(long ldbase, Elf32_Dyn *dyn, efi_handle_t image, |
||||
struct efi_system_table *systab) |
||||
{ |
||||
long relsz = 0, relent = 0; |
||||
Elf32_Rel *rel = 0; |
||||
unsigned long *addr; |
||||
int i; |
||||
|
||||
for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { |
||||
switch (dyn[i].d_tag) { |
||||
case DT_REL: |
||||
rel = (Elf32_Rel *)((unsigned long)dyn[i].d_un.d_ptr + |
||||
ldbase); |
||||
break; |
||||
|
||||
case DT_RELSZ: |
||||
relsz = dyn[i].d_un.d_val; |
||||
break; |
||||
|
||||
case DT_RELENT: |
||||
relent = dyn[i].d_un.d_val; |
||||
break; |
||||
|
||||
case DT_RELA: |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (!rel && relent == 0) |
||||
return EFI_SUCCESS; |
||||
|
||||
if (!rel || relent == 0) |
||||
return EFI_LOAD_ERROR; |
||||
|
||||
while (relsz > 0) { |
||||
/* apply the relocs */ |
||||
switch (ELF32_R_TYPE(rel->r_info)) { |
||||
case R_386_NONE: |
||||
break; |
||||
|
||||
case R_386_RELATIVE: |
||||
addr = (unsigned long *)(ldbase + rel->r_offset); |
||||
*addr += ldbase; |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
rel = (Elf32_Rel *)((char *)rel + relent); |
||||
relsz -= relent; |
||||
} |
||||
|
||||
return EFI_SUCCESS; |
||||
} |
@ -0,0 +1,66 @@ |
||||
/*
|
||||
* reloc_x86_64.c - position independent x86_64 ELF shared object relocator |
||||
* Copyright (C) 1999 Hewlett-Packard Co. |
||||
* Contributed by David Mosberger <davidm@hpl.hp.com>. |
||||
* Copyright (C) 2005 Intel Co. |
||||
* Contributed by Fenghua Yu <fenghua.yu@intel.com>. |
||||
* |
||||
* All rights reserved. |
||||
* |
||||
* SPDX-License-Identifier: BSD-3-Clause |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <efi.h> |
||||
#include <elf.h> |
||||
#include <asm/elf.h> |
||||
|
||||
efi_status_t _relocate(long ldbase, Elf64_Dyn *dyn, efi_handle_t image, |
||||
struct efi_system_table *systab) |
||||
{ |
||||
long relsz = 0, relent = 0; |
||||
Elf64_Rel *rel = 0; |
||||
unsigned long *addr; |
||||
int i; |
||||
|
||||
for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { |
||||
switch (dyn[i].d_tag) { |
||||
case DT_RELA: |
||||
rel = (Elf64_Rel *) |
||||
((unsigned long)dyn[i].d_un.d_ptr + ldbase); |
||||
break; |
||||
case DT_RELASZ: |
||||
relsz = dyn[i].d_un.d_val; |
||||
break; |
||||
case DT_RELAENT: |
||||
relent = dyn[i].d_un.d_val; |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (!rel && relent == 0) |
||||
return EFI_SUCCESS; |
||||
|
||||
if (!rel || relent == 0) |
||||
return EFI_LOAD_ERROR; |
||||
|
||||
while (relsz > 0) { |
||||
/* apply the relocs */ |
||||
switch (ELF64_R_TYPE(rel->r_info)) { |
||||
case R_X86_64_NONE: |
||||
break; |
||||
case R_X86_64_RELATIVE: |
||||
addr = (unsigned long *)(ldbase + rel->r_offset); |
||||
*addr += ldbase; |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
rel = (Elf64_Rel *)((char *)rel + relent); |
||||
relsz -= relent; |
||||
} |
||||
|
||||
return EFI_SUCCESS; |
||||
} |
@ -0,0 +1,19 @@ |
||||
if VENDOR_EFI |
||||
|
||||
choice |
||||
prompt "Mainboard model" |
||||
optional |
||||
|
||||
config TARGET_EFI |
||||
bool "efi" |
||||
help |
||||
This target is used for running U-Boot on top of EFI. In |
||||
this case EFI does the early initialisation, and U-Boot |
||||
takes over once the RAM, video and CPU are fully running. |
||||
U-Boot is loaded as an application from EFI. |
||||
|
||||
endchoice |
||||
|
||||
source "board/efi/efi-x86/Kconfig" |
||||
|
||||
endif |
@ -0,0 +1,15 @@ |
||||
if TARGET_EFI |
||||
|
||||
config SYS_BOARD |
||||
default "efi-x86" |
||||
|
||||
config SYS_VENDOR |
||||
default "efi" |
||||
|
||||
config SYS_SOC |
||||
default "efi" |
||||
|
||||
config SYS_CONFIG_NAME |
||||
default "efi-x86" |
||||
|
||||
endif |
@ -0,0 +1,6 @@ |
||||
EFI-X86 BOARD |
||||
M: Simon Glass <sjg@chromium.org> |
||||
S: Maintained |
||||
F: board/efi/efi-x86/ |
||||
F: include/configs/efi-x86.h |
||||
F: configs/efi-x86_defconfig |
@ -0,0 +1,7 @@ |
||||
#
|
||||
# Copyright (c) 2015 Google, Inc
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += efi.o
|
@ -0,0 +1,18 @@ |
||||
/*
|
||||
* Copyright (C) 2015 Google, Inc |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/gpio.h> |
||||
|
||||
int arch_early_init_r(void) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
void setup_pch_gpios(u16 gpiobase, const struct pch_gpio_map *gpio) |
||||
{ |
||||
return; |
||||
} |
@ -0,0 +1,27 @@ |
||||
if TARGET_BAYLEYBAY |
||||
|
||||
config SYS_BOARD |
||||
default "bayleybay" |
||||
|
||||
config SYS_VENDOR |
||||
default "intel" |
||||
|
||||
config SYS_SOC |
||||
default "baytrail" |
||||
|
||||
config SYS_CONFIG_NAME |
||||
default "bayleybay" |
||||
|
||||
config SYS_TEXT_BASE |
||||
default 0xfff00000 |
||||
|
||||
config BOARD_SPECIFIC_OPTIONS # dummy |
||||
def_bool y |
||||
select X86_RESET_VECTOR |
||||
select INTEL_BAYTRAIL |
||||
select BOARD_ROMSIZE_KB_8192 |
||||
|
||||
config PCIE_ECAM_BASE |
||||
default 0xe0000000 |
||||
|
||||
endif |
@ -0,0 +1,6 @@ |
||||
Intel Bayley Bay |
||||
M: Bin Meng <bmeng.cn@gmail.com> |
||||
S: Maintained |
||||
F: board/intel/bayleybay |
||||
F: include/configs/bayleybay.h |
||||
F: configs/bayleybay_defconfig |
@ -0,0 +1,7 @@ |
||||
#
|
||||
# Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
obj-y += bayleybay.o start.o
|
@ -0,0 +1,19 @@ |
||||
/*
|
||||
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/gpio.h> |
||||
#include <netdev.h> |
||||
|
||||
void setup_pch_gpios(u16 gpiobase, const struct pch_gpio_map *gpio) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
int board_eth_init(bd_t *bis) |
||||
{ |
||||
return pci_eth_init(bis); |
||||
} |
@ -0,0 +1,9 @@ |
||||
/* |
||||
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
|
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
.globl early_board_init
|
||||
early_board_init: |
||||
jmp early_board_init_ret |
@ -0,0 +1,257 @@ |
||||
/*
|
||||
* (C) Copyright 2015 Google, Inc |
||||
* Written by Simon Glass <sjg@chromium.org> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <command.h> |
||||
#include <efi.h> |
||||
#include <errno.h> |
||||
#include <malloc.h> |
||||
|
||||
static const char *const type_name[] = { |
||||
"reserved", |
||||
"loader_code", |
||||
"loader_data", |
||||
"bs_code", |
||||
"bs_data", |
||||
"rt_code", |
||||
"rt_data", |
||||
"conv", |
||||
"unusable", |
||||
"acpi_reclaim", |
||||
"acpi_nvs", |
||||
"io", |
||||
"io_port", |
||||
"pal_code", |
||||
}; |
||||
|
||||
static struct attr_info { |
||||
int shift; |
||||
const char *name; |
||||
} mem_attr[] = { |
||||
{ EFI_MEMORY_UC_SHIFT, "uncached" }, |
||||
{ EFI_MEMORY_WC_SHIFT, "write-coalescing" }, |
||||
{ EFI_MEMORY_WT_SHIFT, "write-through" }, |
||||
{ EFI_MEMORY_WB_SHIFT, "write-back" }, |
||||
{ EFI_MEMORY_UCE_SHIFT, "uncached & exported" }, |
||||
{ EFI_MEMORY_WP_SHIFT, "write-protect" }, |
||||
{ EFI_MEMORY_RP_SHIFT, "read-protect" }, |
||||
{ EFI_MEMORY_XP_SHIFT, "execute-protect" }, |
||||
{ EFI_MEMORY_RUNTIME_SHIFT, "needs runtime mapping" } |
||||
}; |
||||
|
||||
/* Maximum different attribute values we can track */ |
||||
#define ATTR_SEEN_MAX 30 |
||||
|
||||
static inline bool is_boot_services(int type) |
||||
{ |
||||
return type == EFI_LOADER_CODE || type == EFI_LOADER_DATA || |
||||
type == EFI_BOOT_SERVICES_CODE || |
||||
type == EFI_BOOT_SERVICES_DATA; |
||||
} |
||||
|
||||
static int h_cmp_entry(const void *v1, const void *v2) |
||||
{ |
||||
const struct efi_mem_desc *desc1 = v1; |
||||
const struct efi_mem_desc *desc2 = v2; |
||||
int64_t diff = desc1->physical_start - desc2->physical_start; |
||||
|
||||
/*
|
||||
* Manually calculate the difference to avoid sign loss in the 64-bit |
||||
* to 32-bit conversion |
||||
*/ |
||||
return diff < 0 ? -1 : diff > 0 ? 1 : 0; |
||||
} |
||||
|
||||
void *efi_build_mem_table(struct efi_entry_memmap *map, int size, bool skip_bs) |
||||
{ |
||||
struct efi_mem_desc *desc, *end, *base, *dest, *prev; |
||||
int count; |
||||
u64 addr; |
||||
|
||||
base = malloc(size + sizeof(*desc)); |
||||
if (!base) { |
||||
debug("%s: Cannot allocate %#x bytes\n", __func__, size); |
||||
return NULL; |
||||
} |
||||
end = (struct efi_mem_desc *)((ulong)map + size); |
||||
count = ((ulong)end - (ulong)map->desc) / map->desc_size; |
||||
memcpy(base, map->desc, (ulong)end - (ulong)map->desc); |
||||
qsort(base, count, map->desc_size, h_cmp_entry); |
||||
prev = NULL; |
||||
addr = 0; |
||||
dest = base; |
||||
end = base + count; |
||||
for (desc = base; desc < end; desc = efi_get_next_mem_desc(map, desc)) { |
||||
bool merge = true; |
||||
int type = desc->type; |
||||
|
||||
if (skip_bs && is_boot_services(desc->type)) |
||||
type = EFI_CONVENTIONAL_MEMORY; |
||||
|
||||
memcpy(dest, desc, map->desc_size); |
||||
dest->type = type; |
||||
if (!skip_bs || !prev) |
||||
merge = false; |
||||
else if (desc->physical_start != addr) |
||||
merge = false; |
||||
else if (type != EFI_CONVENTIONAL_MEMORY) |
||||
merge = false; |
||||
else if (prev->type != EFI_CONVENTIONAL_MEMORY) |
||||
merge = false; |
||||
|
||||
if (merge) { |
||||
prev->num_pages += desc->num_pages; |
||||
} else { |
||||
prev = dest; |
||||
dest = efi_get_next_mem_desc(map, dest); |
||||
} |
||||
addr = desc->physical_start + (desc->num_pages << |
||||
EFI_PAGE_SHIFT); |
||||
} |
||||
|
||||
/* Mark the end */ |
||||
dest->type = EFI_TABLE_END; |
||||
|
||||
return base; |
||||
} |
||||
|
||||
static void efi_print_mem_table(struct efi_entry_memmap *map, |
||||
struct efi_mem_desc *desc, bool skip_bs) |
||||
{ |
||||
u64 attr_seen[ATTR_SEEN_MAX]; |
||||
int attr_seen_count; |
||||
int upto, i; |
||||
u64 addr; |
||||
|
||||
printf(" # %-14s %10s %10s %10s %s\n", "Type", "Physical", |
||||
"Virtual", "Size", "Attributes"); |
||||
|
||||
/* Keep track of all the different attributes we have seen */ |
||||
attr_seen_count = 0; |
||||
addr = 0; |
||||
for (upto = 0; desc->type != EFI_TABLE_END; |
||||
upto++, desc = efi_get_next_mem_desc(map, desc)) { |
||||
const char *name; |
||||
u64 size; |
||||
|
||||
if (skip_bs && is_boot_services(desc->type)) |
||||
continue; |
||||
if (desc->physical_start != addr) { |
||||
printf(" %-14s %010llx %10s %010llx\n", "<gap>", |
||||
addr, "", desc->physical_start - addr); |
||||
} |
||||
size = desc->num_pages << EFI_PAGE_SHIFT; |
||||
|
||||
name = desc->type < ARRAY_SIZE(type_name) ? |
||||
type_name[desc->type] : "<invalid>"; |
||||
printf("%2d %x:%-12s %010llx %010llx %010llx ", upto, |
||||
desc->type, name, desc->physical_start, |
||||
desc->virtual_start, size); |
||||
if (desc->attribute & EFI_MEMORY_RUNTIME) |
||||
putc('r'); |
||||
printf("%llx", desc->attribute & ~EFI_MEMORY_RUNTIME); |
||||
putc('\n'); |
||||
|
||||
for (i = 0; i < attr_seen_count; i++) { |
||||
if (attr_seen[i] == desc->attribute) |
||||
break; |
||||
} |
||||
if (i == attr_seen_count && i < ATTR_SEEN_MAX) |
||||
attr_seen[attr_seen_count++] = desc->attribute; |
||||
addr = desc->physical_start + size; |
||||
} |
||||
|
||||
printf("\nAttributes key:\n"); |
||||
for (i = 0; i < attr_seen_count; i++) { |
||||
u64 attr = attr_seen[i]; |
||||
bool first; |
||||
int j; |
||||
|
||||
printf("%c%llx: ", attr & EFI_MEMORY_RUNTIME ? 'r' : ' ', |
||||
attr & ~EFI_MEMORY_RUNTIME); |
||||
for (j = 0, first = true; j < ARRAY_SIZE(mem_attr); j++) { |
||||
if (attr & (1ULL << mem_attr[j].shift)) { |
||||
if (first) |
||||
first = false; |
||||
else |
||||
printf(", "); |
||||
printf("%s", mem_attr[j].name); |
||||
} |
||||
} |
||||
putc('\n'); |
||||
} |
||||
if (skip_bs) |
||||
printf("*Some areas are merged (use 'all' to see)\n"); |
||||
} |
||||
|
||||
static int do_efi_mem(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
||||
{ |
||||
struct efi_mem_desc *desc; |
||||
struct efi_entry_memmap *map; |
||||
int size, ret; |
||||
bool skip_bs; |
||||
|
||||
skip_bs = !argc || *argv[0] != 'a'; |
||||
ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size); |
||||
switch (ret) { |
||||
case -ENOENT: |
||||
printf("No EFI table available\n"); |
||||
goto done; |
||||
case -EPROTONOSUPPORT: |
||||
printf("Incorrect EFI table version\n"); |
||||
goto done; |
||||
} |
||||
printf("EFI table at %lx, memory map %p, size %x, version %x, descr. size %#x\n", |
||||
gd->arch.table, map, size, map->version, map->desc_size); |
||||
if (map->version != EFI_MEM_DESC_VERSION) { |
||||
printf("Incorrect memory map version\n"); |
||||
ret = -EPROTONOSUPPORT; |
||||
goto done; |
||||
} |
||||
|
||||
desc = efi_build_mem_table(map, size, skip_bs); |
||||
if (!desc) { |
||||
ret = -ENOMEM; |
||||
goto done; |
||||
} |
||||
|
||||
efi_print_mem_table(map, desc, skip_bs); |
||||
free(desc); |
||||
done: |
||||
if (ret) |
||||
printf("Error: %d\n", ret); |
||||
|
||||
return ret ? CMD_RET_FAILURE : 0; |
||||
} |
||||
|
||||
static cmd_tbl_t efi_commands[] = { |
||||
U_BOOT_CMD_MKENT(mem, 1, 1, do_efi_mem, "", ""), |
||||
}; |
||||
|
||||
static int do_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
||||
{ |
||||
cmd_tbl_t *efi_cmd; |
||||
int ret; |
||||
|
||||
if (argc < 2) |
||||
return CMD_RET_USAGE; |
||||
efi_cmd = find_cmd_tbl(argv[1], efi_commands, ARRAY_SIZE(efi_commands)); |
||||
argc -= 2; |
||||
argv += 2; |
||||
if (!efi_cmd || argc > efi_cmd->maxargs) |
||||
return CMD_RET_USAGE; |
||||
|
||||
ret = efi_cmd->cmd(efi_cmd, flag, argc, argv); |
||||
|
||||
return cmd_process_error(efi_cmd, ret); |
||||
} |
||||
|
||||
U_BOOT_CMD( |
||||
efi, 3, 1, do_efi, |
||||
"EFI access", |
||||
"mem [all] Dump memory information [include boot services]" |
||||
); |
@ -0,0 +1,27 @@ |
||||
CONFIG_X86=y |
||||
CONFIG_VENDOR_INTEL=y |
||||
CONFIG_DEFAULT_DEVICE_TREE="bayleybay" |
||||
CONFIG_TARGET_BAYLEYBAY=y |
||||
CONFIG_HAVE_INTEL_ME=y |
||||
CONFIG_SMP=y |
||||
CONFIG_HAVE_VGA_BIOS=y |
||||
CONFIG_GENERATE_PIRQ_TABLE=y |
||||
CONFIG_GENERATE_MP_TABLE=y |
||||
CONFIG_CMD_CPU=y |
||||
# CONFIG_CMD_IMLS is not set |
||||
# CONFIG_CMD_FLASH is not set |
||||
# CONFIG_CMD_SETEXPR is not set |
||||
# CONFIG_CMD_NFS is not set |
||||
CONFIG_BOOTSTAGE=y |
||||
CONFIG_BOOTSTAGE_REPORT=y |
||||
CONFIG_CMD_BOOTSTAGE=y |
||||
CONFIG_OF_CONTROL=y |
||||
CONFIG_CPU=y |
||||
CONFIG_DM_PCI=y |
||||
CONFIG_SPI_FLASH=y |
||||
CONFIG_VIDEO_VESA=y |
||||
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y |
||||
CONFIG_FRAMEBUFFER_VESA_MODE_11A=y |
||||
CONFIG_DM_RTC=y |
||||
CONFIG_USE_PRIVATE_LIBGCC=y |
||||
CONFIG_SYS_VSNPRINTF=y |
@ -0,0 +1,16 @@ |
||||
CONFIG_X86=y |
||||
CONFIG_VENDOR_EFI=y |
||||
CONFIG_TARGET_EFI=y |
||||
CONFIG_TSC_CALIBRATION_BYPASS=y |
||||
CONFIG_OF_CONTROL=y |
||||
CONFIG_OF_EMBED=y |
||||
CONFIG_DM_PCI=y |
||||
CONFIG_DEFAULT_DEVICE_TREE="efi" |
||||
CONFIG_EFI=y |
||||
CONFIG_EFI_APP=y |
||||
CONFIG_DEBUG_UART=y |
||||
CONFIG_DEBUG_EFI_CONSOLE=y |
||||
CONFIG_DEBUG_UART_BASE=0 |
||||
CONFIG_DEBUG_UART_CLOCK=0 |
||||
# CONFIG_CMD_NET is not set |
||||
# CONFIG_CMD_BOOTM is not set |
@ -0,0 +1,237 @@ |
||||
# |
||||
# Copyright (C) 2015 Google, Inc |
||||
# |
||||
# SPDX-License-Identifier: GPL-2.0+ |
||||
# |
||||
|
||||
U-Boot on EFI |
||||
============= |
||||
This document provides information about U-Boot running on top of EFI, either |
||||
as an application or just as a means of getting U-Boot onto a new platform. |
||||
|
||||
|
||||
In God's Name, Why? |
||||
------------------- |
||||
This is useful in several situations: |
||||
|
||||
- You have EFI running on a board but U-Boot does not natively support it |
||||
fully yet. You can boot into U-Boot from EFI and use that until U-Boot is |
||||
fully ported |
||||
|
||||
- You need to use an EFI implementation (e.g. UEFI) because your vendor |
||||
requires it in order to provide support |
||||
|
||||
- You plan to use coreboot to boot into U-Boot but coreboot support does |
||||
not currently exist for your platform. In the meantime you can use U-Boot |
||||
on EFI and then move to U-Boot on coreboot when ready |
||||
|
||||
- You use EFI but want to experiment with a simpler alternative like U-Boot |
||||
|
||||
|
||||
Status |
||||
------ |
||||
Only x86 is supported at present. If you are using EFI on another architecture |
||||
you may want to reconsider. However, much of the code is generic so could be |
||||
ported. |
||||
|
||||
U-Boot supports running as an EFI application for 32-bit EFI only. This is |
||||
not very useful since only a serial port is provided. You can look around at |
||||
memory and type 'help' but that is about it. |
||||
|
||||
More usefully, U-Boot supports building itself as a payload for either 32-bit |
||||
or 64-bit EFI. U-Boot is packaged up and loaded in its entirety by EFI. Once |
||||
started, U-Boot changes to 32-bit mode (currently) and takes over the |
||||
machine. You can use devices, boot a kernel, etc. |
||||
|
||||
|
||||
Build Instructions |
||||
------------------ |
||||
First choose a board that has EFI support and obtain an EFI implementation |
||||
for that board. It will be either 32-bit or 64-bit. |
||||
|
||||
To build U-Boot as an EFI application (32-bit EFI required), enable |
||||
CONFIG_EFI and CONFIG_EFI_APP. The efi-x86 config is set up for this. |
||||
|
||||
To build U-Boot as an EFI payload (32-bit or 64-bit EFI can be used), adjust |
||||
an existing config to enable CONFIG_EFI, CONFIG_EFI_STUB and either |
||||
CONFIG_EFI_STUB_32BIT or CONFIG_EFI_STUB_64BIT. |
||||
|
||||
Then build U-Boot as normal, e.g. |
||||
|
||||
make qemu-x86_defconfig |
||||
make menuconfig (or make xconfig if you prefer) |
||||
# change the settings as above |
||||
make |
||||
|
||||
You will end up with one of these files: |
||||
|
||||
u-boot-app.efi - U-Boot EFI application |
||||
u-boot-payload.efi - U-Boot EFI payload application |
||||
|
||||
|
||||
Trying it out |
||||
------------- |
||||
Qemu is an emulator and it can emulate an x86 machine. You can run the |
||||
payload with something like this: |
||||
|
||||
mkdir /tmp/efi |
||||
cp /path/to/u-boot*.efi /tmp/efi |
||||
qemu-system-x86_64 -bios bios.bin -hda fat:/tmp/efi/ |
||||
|
||||
Add -nographic if you want to use the terminal for output. Once it starts |
||||
type 'fs0:u-boot-payload.efi' to run the payload or 'fs0:u-boot-app.efi' to |
||||
run the application. 'bios.bin' is the EFI 'BIOS'. |
||||
|
||||
To try it on real hardware, put u-boot-app.efi on a suitable boot medium, |
||||
such as a USB stick. Then you can type something like this to start it: |
||||
|
||||
fs0:u-boot-payload.efi |
||||
|
||||
(or fs0:u-boot-app.efi for the application) |
||||
|
||||
This will start the payload, copy U-Boot into RAM and start U-Boot. Note |
||||
that EFI does not support booting a 64-bit application from a 32-bit |
||||
EFI (or vice versa). Also it will often fail to print an error message if |
||||
you get this wrong. |
||||
|
||||
|
||||
Inner workings |
||||
============== |
||||
Here follow a few implementation notes for those who want to fiddle with |
||||
this and perhaps contribute patches. |
||||
|
||||
The application and payload approaches sound similar but are in fact |
||||
implemented completely differently. |
||||
|
||||
EFI Application |
||||
--------------- |
||||
For the application the whole of U-Boot is built as a shared library. The |
||||
efi_main() function is in lib/efi/efi_app.c. It sets up some basic EFI |
||||
functions with efi_init(), sets up U-Boot global_data, allocates memory for |
||||
U-Boot's malloc(), etc. and enters the normal init sequence (board_init_f() |
||||
and board_init_r()). |
||||
|
||||
Since U-Boot limits its memory access to the allocated regions very little |
||||
special code is needed. The CONFIG_EFI_APP option controls a few things |
||||
that need to change so 'git grep CONFIG_EFI_APP' may be instructive. |
||||
The CONFIG_EFI option controls more general EFI adjustments. |
||||
|
||||
The only available driver is the serial driver. This calls back into EFI |
||||
'boot services' to send and receive characters. Although it is implemented |
||||
as a serial driver the console device is not necessarilly serial. If you |
||||
boot EFI with video output then the 'serial' device will operate on your |
||||
target devices's display instead and the device's USB keyboard will also |
||||
work if connected. If you have both serial and video output, then both |
||||
consoles will be active. Even though U-Boot does the same thing normally, |
||||
These are features of EFI, not U-Boot. |
||||
|
||||
Very little code is involved in implementing the EFI application feature. |
||||
U-Boot is highly portable. Most of the difficulty is in modifying the |
||||
Makefile settings to pass the right build flags. In particular there is very |
||||
little x86-specific code involved - you can find most of it in |
||||
arch/x86/cpu. Porting to ARM (which can also use EFI if you are brave |
||||
enough) should be straightforward. |
||||
|
||||
Use the 'reset' command to get back to EFI. |
||||
|
||||
EFI Payload |
||||
----------- |
||||
The payload approach is a different kettle of fish. It works by building |
||||
U-Boot exactly as normal for your target board, then adding the entire |
||||
image (including device tree) into a small EFI stub application responsible |
||||
for booting it. The stub application is built as a normal EFI application |
||||
except that it has a lot of data attached to it. |
||||
|
||||
The stub application is implemented in lib/efi/efi_stub.c. The efi_main() |
||||
function is called by EFI. It is responsible for copying U-Boot from its |
||||
original location into memory, disabling EFI boot services and starting |
||||
U-Boot. U-Boot then starts as normal, relocates, starts all drivers, etc. |
||||
|
||||
The stub application is architecture-dependent. At present it has some |
||||
x86-specific code and a comment at the top of efi_stub.c describes this. |
||||
|
||||
While the stub application does allocate some memory from EFI this is not |
||||
used by U-Boot (the payload). In fact when U-Boot starts it has all of the |
||||
memory available to it and can operate as it pleases (but see the next |
||||
section). |
||||
|
||||
Tables |
||||
------ |
||||
The payload can pass information to U-Boot in the form of EFI tables. At |
||||
present this feature is used to pass the EFI memory map, an inordinately |
||||
large list of memory regions. You can use the 'efi mem all' command to |
||||
display this list. U-Boot uses the list to work out where to relocate |
||||
itself. |
||||
|
||||
Although U-Boot can use any memory it likes, EFI marks some memory as used |
||||
by 'run-time services', code that hangs around while U-Boot is running and |
||||
is even present when Linux is running. This is common on x86 and provides |
||||
a way for Linux to call back into the firmware to control things like CPU |
||||
fan speed. U-Boot uses only 'conventional' memory, in EFI terminology. It |
||||
will relocate itself to the top of the largest block of memory it can find |
||||
below 4GB. |
||||
|
||||
Interrupts |
||||
---------- |
||||
U-Boot drivers typically don't use interrupts. Since EFI enables interrupts |
||||
it is possible that an interrupt will fire that U-Boot cannot handle. This |
||||
seems to cause problems. For this reason the U-Boot payload runs with |
||||
interrupts disabled at present. |
||||
|
||||
32/64-bit |
||||
--------- |
||||
While the EFI application can in principle be built as either 32- or 64-bit, |
||||
only 32-bit is currently supported. This means that the application can only |
||||
be used with 32-bit EFI. |
||||
|
||||
The payload stub can be build as either 32- or 64-bits. Only a small amount |
||||
of code is built this way (see the extra- line in lib/efi/Makefile). |
||||
Everything else is built as a normal U-Boot, so is always 32-bit on x86 at |
||||
present. |
||||
|
||||
Future work |
||||
----------- |
||||
This work could be extended in a number of ways: |
||||
|
||||
- Add a generic x86 EFI payload configuration. At present you need to modify |
||||
an existing one, but mostly the low-level x86 code is disabled when booting |
||||
on EFI anyway, so a generic 'EFI' board could be created with a suitable set |
||||
of drivers enabled. |
||||
|
||||
- Add ARM support |
||||
|
||||
- Add 64-bit application support |
||||
|
||||
- Figure out how to solve the interrupt problem |
||||
|
||||
- Add more drivers to the application side (e.g. video, block devices, USB, |
||||
environment access). This would mostly be an academic exercise as a strong |
||||
use case is not readily apparent, but it might be fun. |
||||
|
||||
- Avoid turning off boot services in the stub. Instead allow U-Boot to make |
||||
use of boot services in case it wants to. It is unclear what it might want |
||||
though. |
||||
|
||||
Where is the code? |
||||
------------------ |
||||
lib/efi |
||||
payload stub, application, support code. Mostly arch-neutral |
||||
|
||||
arch/x86/lib/efi |
||||
helper functions for the fake DRAM init, etc. These can be used by |
||||
any board that runs as a payload. |
||||
|
||||
arch/x86/cpu/efi |
||||
x86 support code for running as an EFI application |
||||
|
||||
board/efi/efi-x86/efi.c |
||||
x86 board code for running as an EFI application |
||||
|
||||
common/cmd_efi.c |
||||
the 'efi' command |
||||
|
||||
|
||||
-- |
||||
Ben Stoltz, Simon Glass |
||||
Google, Inc |
||||
July 2015 |
@ -0,0 +1,157 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc |
||||
* Written by Simon Glass <sjg@chromium.org> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <debug_uart.h> |
||||
#include <dm.h> |
||||
#include <efi.h> |
||||
#include <efi_api.h> |
||||
#include <errno.h> |
||||
#include <fdtdec.h> |
||||
#include <linux/compiler.h> |
||||
#include <asm/io.h> |
||||
#include <serial.h> |
||||
|
||||
/* Information about the efi console */ |
||||
struct serial_efi_priv { |
||||
struct efi_simple_input_interface *con_in; |
||||
struct efi_simple_text_output_protocol *con_out; |
||||
struct efi_input_key key; |
||||
bool have_key; |
||||
}; |
||||
|
||||
int serial_efi_setbrg(struct udevice *dev, int baudrate) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
static int serial_efi_get_key(struct serial_efi_priv *priv) |
||||
{ |
||||
int ret; |
||||
|
||||
if (priv->have_key) |
||||
return 0; |
||||
ret = priv->con_in->read_key_stroke(priv->con_in, &priv->key); |
||||
if (ret == EFI_NOT_READY) |
||||
return -EAGAIN; |
||||
else if (ret != EFI_SUCCESS) |
||||
return -EIO; |
||||
|
||||
priv->have_key = true; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int serial_efi_getc(struct udevice *dev) |
||||
{ |
||||
struct serial_efi_priv *priv = dev_get_priv(dev); |
||||
int ret, ch; |
||||
|
||||
ret = serial_efi_get_key(priv); |
||||
if (ret) |
||||
return ret; |
||||
|
||||
priv->have_key = false; |
||||
ch = priv->key.unicode_char; |
||||
|
||||
/*
|
||||
* Unicode char 8 (for backspace) is never returned. Instead we get a |
||||
* key scan code of 8. Handle this so that backspace works correctly |
||||
* in the U-Boot command line. |
||||
*/ |
||||
if (!ch && priv->key.scan_code == 8) |
||||
ch = 8; |
||||
debug(" [%x %x %x] ", ch, priv->key.unicode_char, priv->key.scan_code); |
||||
|
||||
return ch; |
||||
} |
||||
|
||||
static int serial_efi_putc(struct udevice *dev, const char ch) |
||||
{ |
||||
struct serial_efi_priv *priv = dev_get_priv(dev); |
||||
uint16_t ucode[2]; |
||||
int ret; |
||||
|
||||
ucode[0] = ch; |
||||
ucode[1] = '\0'; |
||||
ret = priv->con_out->output_string(priv->con_out, ucode); |
||||
if (ret) |
||||
return -EIO; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int serial_efi_pending(struct udevice *dev, bool input) |
||||
{ |
||||
struct serial_efi_priv *priv = dev_get_priv(dev); |
||||
int ret; |
||||
|
||||
/* We assume that EFI will stall if its output buffer fills up */ |
||||
if (!input) |
||||
return 0; |
||||
|
||||
ret = serial_efi_get_key(priv); |
||||
if (ret == -EAGAIN) |
||||
return 0; |
||||
else if (ret) |
||||
return ret; |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
/*
|
||||
* There is nothing to init here since the EFI console is already running by |
||||
* the time we enter U-Boot. |
||||
*/ |
||||
void debug_uart_init(void) |
||||
{ |
||||
} |
||||
|
||||
static inline void _debug_uart_putc(int ch) |
||||
{ |
||||
struct efi_system_table *sys_table = efi_get_sys_table(); |
||||
uint16_t ucode[2]; |
||||
|
||||
ucode[0] = ch; |
||||
ucode[1] = '\0'; |
||||
sys_table->con_out->output_string(sys_table->con_out, ucode); |
||||
} |
||||
|
||||
DEBUG_UART_FUNCS |
||||
|
||||
static int serial_efi_probe(struct udevice *dev) |
||||
{ |
||||
struct efi_system_table *table = efi_get_sys_table(); |
||||
struct serial_efi_priv *priv = dev_get_priv(dev); |
||||
|
||||
priv->con_in = table->con_in; |
||||
priv->con_out = table->con_out; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static const struct dm_serial_ops serial_efi_ops = { |
||||
.putc = serial_efi_putc, |
||||
.getc = serial_efi_getc, |
||||
.pending = serial_efi_pending, |
||||
.setbrg = serial_efi_setbrg, |
||||
}; |
||||
|
||||
static const struct udevice_id serial_efi_ids[] = { |
||||
{ .compatible = "efi,uart" }, |
||||
{ } |
||||
}; |
||||
|
||||
U_BOOT_DRIVER(serial_efi) = { |
||||
.name = "serial_efi", |
||||
.id = UCLASS_SERIAL, |
||||
.of_match = serial_efi_ids, |
||||
.priv_auto_alloc_size = sizeof(struct serial_efi_priv), |
||||
.probe = serial_efi_probe, |
||||
.ops = &serial_efi_ops, |
||||
.flags = DM_FLAG_PRE_RELOC, |
||||
}; |
@ -0,0 +1,44 @@ |
||||
/*
|
||||
* Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
/*
|
||||
* board/config.h - configuration options, board specific |
||||
*/ |
||||
|
||||
#ifndef __CONFIG_H |
||||
#define __CONFIG_H |
||||
|
||||
#include <configs/x86-common.h> |
||||
|
||||
#define CONFIG_SYS_MONITOR_LEN (1 << 20) |
||||
#define CONFIG_ARCH_MISC_INIT |
||||
|
||||
#define CONFIG_PCI_CONFIG_HOST_BRIDGE |
||||
#define CONFIG_SYS_EARLY_PCI_INIT |
||||
#define CONFIG_PCI_PNP |
||||
#define CONFIG_E1000 |
||||
|
||||
#define CONFIG_STD_DEVICES_SETTINGS "stdin=serial,vga,usbkbd\0" \ |
||||
"stdout=serial,vga\0" \
|
||||
"stderr=serial,vga\0" |
||||
|
||||
#define CONFIG_SCSI_DEV_LIST \ |
||||
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VALLEYVIEW_SATA} |
||||
|
||||
#define CONFIG_MMC |
||||
#define CONFIG_SDHCI |
||||
#define CONFIG_GENERIC_MMC |
||||
#define CONFIG_MMC_SDMA |
||||
#define CONFIG_CMD_MMC |
||||
|
||||
/* BayTrail IGD support */ |
||||
#define CONFIG_VGA_AS_SINGLE_DEVICE |
||||
|
||||
/* Environment configuration */ |
||||
#define CONFIG_ENV_SECT_SIZE 0x1000 |
||||
#define CONFIG_ENV_OFFSET 0x006ff000 |
||||
|
||||
#endif /* __CONFIG_H */ |
@ -0,0 +1,34 @@ |
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef __CONFIG_H |
||||
#define __CONFIG_H |
||||
|
||||
#include <configs/x86-common.h> |
||||
|
||||
#undef CONFIG_CMD_SF_TEST |
||||
|
||||
#undef CONFIG_TPM |
||||
#undef CONFIG_TPM_TIS_LPC |
||||
#undef CONFIG_TPM_TIS_BASE_ADDRESS |
||||
|
||||
#undef CONFIG_CMD_IMLS |
||||
|
||||
#undef CONFIG_SYS_NS16550 |
||||
#undef CONFIG_X86_SERIAL |
||||
#undef CONFIG_ENV_IS_IN_SPI_FLASH |
||||
#define CONFIG_ENV_IS_NOWHERE |
||||
#undef CONFIG_VIDEO |
||||
#undef CONFIG_CFB_CONSOLE |
||||
#undef CONFIG_SCSI_AHCI |
||||
#undef CONFIG_CMD_SCSI |
||||
#undef CONFIG_INTEL_ICH6_GPIO |
||||
|
||||
#define CONFIG_STD_DEVICES_SETTINGS "stdin=usbkbd,vga,serial\0" \ |
||||
"stdout=vga,serial\0" \
|
||||
"stderr=vga,serial\0" |
||||
|
||||
#endif |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue