diff mbox

[U-Boot,19/39] x86: Build a .rom file which can be flashed to an x86 machine

Message ID 1415305231-30180-20-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Nov. 6, 2014, 8:20 p.m. UTC
On x86 machines U-Boot needs to be added to a large ROM image which is
then flashed onto the target board. The ROM has a particular format so it
makes sense for U-Boot to build this image automatically. Unfortunately
it relies on binary blobs so we cannot require this for the default
build as yet.

Create a u-boot.rom output file for this purpose.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 Makefile                          | 27 ++++++++++++++++++++++++++-
 arch/x86/Kconfig                  |  4 ++++
 include/configs/chromebook_link.h |  2 ++
 3 files changed, 32 insertions(+), 1 deletion(-)

Comments

Bin Meng Nov. 10, 2014, 6:36 a.m. UTC | #1
Hi Simon,

On Fri, Nov 7, 2014 at 4:20 AM, Simon Glass <sjg@chromium.org> wrote:
> On x86 machines U-Boot needs to be added to a large ROM image which is
> then flashed onto the target board. The ROM has a particular format so it
> makes sense for U-Boot to build this image automatically. Unfortunately
> it relies on binary blobs so we cannot require this for the default
> build as yet.
>
> Create a u-boot.rom output file for this purpose.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  Makefile                          | 27 ++++++++++++++++++++++++++-
>  arch/x86/Kconfig                  |  4 ++++
>  include/configs/chromebook_link.h |  2 ++
>  3 files changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 9c8a580..86d0510 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -743,6 +743,9 @@ ALL-$(CONFIG_SPL) += $(CONFIG_SPL_TARGET:"%"=%)
>  endif
>  ALL-$(CONFIG_REMAKE_ELF) += u-boot.elf
>
> +# We can't do this yet due to the need for binary blobs
> +# ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
> +
>  # enable combined SPL/u-boot/dtb rules for tegra
>  ifneq ($(CONFIG_TEGRA),)
>  ifeq ($(CONFIG_SPL),y)
> @@ -804,7 +807,8 @@ OBJCOPYFLAGS_u-boot.srec := -O srec
>  u-boot.hex u-boot.srec: u-boot FORCE
>         $(call if_changed,objcopy)
>
> -OBJCOPYFLAGS_u-boot.bin := -O binary
> +OBJCOPYFLAGS_u-boot.bin := -O binary \
> +               $(if $(CONFIG_X86_RESET_VECTOR),-R .start16 -R .resetvec)
>
>  binary_size_check: u-boot.bin FORCE
>         @file_size=$(shell wc -c u-boot.bin | awk '{print $$1}') ; \
> @@ -943,6 +947,27 @@ u-boot-nand.gph: u-boot.bin FORCE
>         $(call if_changed,mkimage)
>         @dd if=/dev/zero bs=8 count=1 2>/dev/null >> $@
>
> +# x86 uses a large ROM. We fill it with 0xff, put the 16-bit stuff (including
> +# reset vector) at the top, Intel ME at the bottom, and U-Boot in the middle.
> +ifneq ($(CONFIG_X86_RESET_VECTOR),)
> +rom: u-boot.rom FORCE
> +
> +u-boot.rom: u-boot-x86-16bit.bin u-boot-dtb.bin \

The u-boot-dtb.bin means we have to use device tree for all x86 board
port. Is this a must-have?

> +               $(srctree)/board/$(BOARDDIR)/descriptor.bin

I don't see where the descriptor.bin is created?

> +       $(objtree)/tools/ifdtool -c -r $(CONFIG_ROM_SIZE) \
> +               -D $(srctree)/board/$(BOARDDIR)/descriptor.bin u-boot.tmp
> +       $(objtree)/tools/ifdtool -w \
> +               $(CONFIG_SYS_TEXT_BASE):$(objtree)/u-boot-dtb.bin u-boot.tmp
> +       $(objtree)/tools/ifdtool -w \
> +               $(CONFIG_SYS_X86_START16):$(objtree)/u-boot-x86-16bit.bin \
> +               u-boot.tmp
> +       mv u-boot.tmp $@
> +
> +OBJCOPYFLAGS_u-boot-x86-16bit.bin := -O binary -j .start16 -j .resetvec
> +u-boot-x86-16bit.bin: u-boot FORCE
> +       $(call if_changed,objcopy)
> +endif
> +

[snip]

Regards,
Bin
Simon Glass Nov. 11, 2014, 12:28 a.m. UTC | #2
Hi Bin,

On 9 November 2014 23:36, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Fri, Nov 7, 2014 at 4:20 AM, Simon Glass <sjg@chromium.org> wrote:
>> On x86 machines U-Boot needs to be added to a large ROM image which is
>> then flashed onto the target board. The ROM has a particular format so it
>> makes sense for U-Boot to build this image automatically. Unfortunately
>> it relies on binary blobs so we cannot require this for the default
>> build as yet.
>>
>> Create a u-boot.rom output file for this purpose.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>>  Makefile                          | 27 ++++++++++++++++++++++++++-
>>  arch/x86/Kconfig                  |  4 ++++
>>  include/configs/chromebook_link.h |  2 ++
>>  3 files changed, 32 insertions(+), 1 deletion(-)
>>
>> diff --git a/Makefile b/Makefile
>> index 9c8a580..86d0510 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -743,6 +743,9 @@ ALL-$(CONFIG_SPL) += $(CONFIG_SPL_TARGET:"%"=%)
>>  endif
>>  ALL-$(CONFIG_REMAKE_ELF) += u-boot.elf
>>
>> +# We can't do this yet due to the need for binary blobs
>> +# ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
>> +
>>  # enable combined SPL/u-boot/dtb rules for tegra
>>  ifneq ($(CONFIG_TEGRA),)
>>  ifeq ($(CONFIG_SPL),y)
>> @@ -804,7 +807,8 @@ OBJCOPYFLAGS_u-boot.srec := -O srec
>>  u-boot.hex u-boot.srec: u-boot FORCE
>>         $(call if_changed,objcopy)
>>
>> -OBJCOPYFLAGS_u-boot.bin := -O binary
>> +OBJCOPYFLAGS_u-boot.bin := -O binary \
>> +               $(if $(CONFIG_X86_RESET_VECTOR),-R .start16 -R .resetvec)
>>
>>  binary_size_check: u-boot.bin FORCE
>>         @file_size=$(shell wc -c u-boot.bin | awk '{print $$1}') ; \
>> @@ -943,6 +947,27 @@ u-boot-nand.gph: u-boot.bin FORCE
>>         $(call if_changed,mkimage)
>>         @dd if=/dev/zero bs=8 count=1 2>/dev/null >> $@
>>
>> +# x86 uses a large ROM. We fill it with 0xff, put the 16-bit stuff (including
>> +# reset vector) at the top, Intel ME at the bottom, and U-Boot in the middle.
>> +ifneq ($(CONFIG_X86_RESET_VECTOR),)
>> +rom: u-boot.rom FORCE
>> +
>> +u-boot.rom: u-boot-x86-16bit.bin u-boot-dtb.bin \
>
> The u-boot-dtb.bin means we have to use device tree for all x86 board
> port. Is this a must-have?

Yes I'd like to use device tree, since it is a convenient way of
getting configuration into U-Boot.

>
>> +               $(srctree)/board/$(BOARDDIR)/descriptor.bin
>
> I don't see where the descriptor.bin is created?

This needs to be downloaded and provided, as with mrc.bin, etc.

I think I will adjust it (later) so that it builds an empty u-boot.rom
and prints a warning on stdout if the binaries are not available. That
way the buildman build will still succeed, but the user will see the
problem. It might also be useful to have U-Boot report missing
binaries when it starts up.

Regards,
Simon
Bin Meng Nov. 11, 2014, 8:37 a.m. UTC | #3
Hi Simon,

On Tue, Nov 11, 2014 at 8:28 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Bin,
>

[snip]

>>
>>> +               $(srctree)/board/$(BOARDDIR)/descriptor.bin
>>
>> I don't see where the descriptor.bin is created?
>
> This needs to be downloaded and provided, as with mrc.bin, etc.

I thought the descriptor.bin is used to describe the u-boot.rom
layout, but seems you are saying it is coming from Intel(?). Is the
format defined by Intel so that all the BIOS for that platform
(u-boot.rom in our case) has to obey?

> I think I will adjust it (later) so that it builds an empty u-boot.rom
> and prints a warning on stdout if the binaries are not available. That
> way the buildman build will still succeed, but the user will see the
> problem. It might also be useful to have U-Boot report missing
> binaries when it starts up.

Sounds good.

Regards,
Bin
Simon Glass Nov. 11, 2014, 4:11 p.m. UTC | #4
Hi Bin,

On 11 November 2014 01:37, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Tue, Nov 11, 2014 at 8:28 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Bin,
>>
>
> [snip]
>
>>>
>>>> +               $(srctree)/board/$(BOARDDIR)/descriptor.bin
>>>
>>> I don't see where the descriptor.bin is created?
>>
>> This needs to be downloaded and provided, as with mrc.bin, etc.
>
> I thought the descriptor.bin is used to describe the u-boot.rom
> layout, but seems you are saying it is coming from Intel(?). Is the
> format defined by Intel so that all the BIOS for that platform
> (u-boot.rom in our case) has to obey?

Yes, but only if there is a management engine (the CONFIG option you asked for).

>
>> I think I will adjust it (later) so that it builds an empty u-boot.rom
>> and prints a warning on stdout if the binaries are not available. That
>> way the buildman build will still succeed, but the user will see the
>> problem. It might also be useful to have U-Boot report missing
>> binaries when it starts up.
>
> Sounds good.
>
> Regards,
> Bin

Regards,
Simon
Bin Meng Nov. 12, 2014, 1:17 a.m. UTC | #5
Hi Simon,

On Wed, Nov 12, 2014 at 12:11 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Bin,
>
> On 11 November 2014 01:37, Bin Meng <bmeng.cn@gmail.com> wrote:
>> Hi Simon,
>>
>> On Tue, Nov 11, 2014 at 8:28 AM, Simon Glass <sjg@chromium.org> wrote:
>>> Hi Bin,
>>>
>>
>> [snip]
>>
>>>>
>>>>> +               $(srctree)/board/$(BOARDDIR)/descriptor.bin
>>>>
>>>> I don't see where the descriptor.bin is created?
>>>
>>> This needs to be downloaded and provided, as with mrc.bin, etc.
>>
>> I thought the descriptor.bin is used to describe the u-boot.rom
>> layout, but seems you are saying it is coming from Intel(?). Is the
>> format defined by Intel so that all the BIOS for that platform
>> (u-boot.rom in our case) has to obey?
>
> Yes, but only if there is a management engine (the CONFIG option you asked for).

So we need bundle the descriptor.bin and me.bin together with a CONFIG
option, and has better documentation to describe this.

[snip]

Regards,
Bin
Simon Glass Nov. 12, 2014, 5:21 a.m. UTC | #6
Hi Bin,


On 11 November 2014 18:17, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Wed, Nov 12, 2014 at 12:11 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Bin,
>>
>> On 11 November 2014 01:37, Bin Meng <bmeng.cn@gmail.com> wrote:
>>> Hi Simon,
>>>
>>> On Tue, Nov 11, 2014 at 8:28 AM, Simon Glass <sjg@chromium.org> wrote:
>>>> Hi Bin,
>>>>
>>>
>>> [snip]
>>>
>>>>>
>>>>>> +               $(srctree)/board/$(BOARDDIR)/descriptor.bin
>>>>>
>>>>> I don't see where the descriptor.bin is created?
>>>>
>>>> This needs to be downloaded and provided, as with mrc.bin, etc.
>>>
>>> I thought the descriptor.bin is used to describe the u-boot.rom
>>> layout, but seems you are saying it is coming from Intel(?). Is the
>>> format defined by Intel so that all the BIOS for that platform
>>> (u-boot.rom in our case) has to obey?
>>
>> Yes, but only if there is a management engine (the CONFIG option you asked for).
>
> So we need bundle the descriptor.bin and me.bin together with a CONFIG
> option, and has better documentation to describe this.

Yes that sounds right.

Regards,
Simon
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 9c8a580..86d0510 100644
--- a/Makefile
+++ b/Makefile
@@ -743,6 +743,9 @@  ALL-$(CONFIG_SPL) += $(CONFIG_SPL_TARGET:"%"=%)
 endif
 ALL-$(CONFIG_REMAKE_ELF) += u-boot.elf
 
+# We can't do this yet due to the need for binary blobs
+# ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
+
 # enable combined SPL/u-boot/dtb rules for tegra
 ifneq ($(CONFIG_TEGRA),)
 ifeq ($(CONFIG_SPL),y)
@@ -804,7 +807,8 @@  OBJCOPYFLAGS_u-boot.srec := -O srec
 u-boot.hex u-boot.srec: u-boot FORCE
 	$(call if_changed,objcopy)
 
-OBJCOPYFLAGS_u-boot.bin := -O binary
+OBJCOPYFLAGS_u-boot.bin := -O binary \
+		$(if $(CONFIG_X86_RESET_VECTOR),-R .start16 -R .resetvec)
 
 binary_size_check: u-boot.bin FORCE
 	@file_size=$(shell wc -c u-boot.bin | awk '{print $$1}') ; \
@@ -943,6 +947,27 @@  u-boot-nand.gph: u-boot.bin FORCE
 	$(call if_changed,mkimage)
 	@dd if=/dev/zero bs=8 count=1 2>/dev/null >> $@
 
+# x86 uses a large ROM. We fill it with 0xff, put the 16-bit stuff (including
+# reset vector) at the top, Intel ME at the bottom, and U-Boot in the middle.
+ifneq ($(CONFIG_X86_RESET_VECTOR),)
+rom: u-boot.rom FORCE
+
+u-boot.rom: u-boot-x86-16bit.bin u-boot-dtb.bin \
+		$(srctree)/board/$(BOARDDIR)/descriptor.bin
+	$(objtree)/tools/ifdtool -c -r $(CONFIG_ROM_SIZE) \
+		-D $(srctree)/board/$(BOARDDIR)/descriptor.bin u-boot.tmp
+	$(objtree)/tools/ifdtool -w \
+		$(CONFIG_SYS_TEXT_BASE):$(objtree)/u-boot-dtb.bin u-boot.tmp
+	$(objtree)/tools/ifdtool -w \
+		$(CONFIG_SYS_X86_START16):$(objtree)/u-boot-x86-16bit.bin \
+		u-boot.tmp
+	mv u-boot.tmp $@
+
+OBJCOPYFLAGS_u-boot-x86-16bit.bin := -O binary -j .start16 -j .resetvec
+u-boot-x86-16bit.bin: u-boot FORCE
+	$(call if_changed,objcopy)
+endif
+
 ifneq ($(CONFIG_SUNXI),)
 OBJCOPYFLAGS_u-boot-sunxi-with-spl.bin = -I binary -O binary \
 				   --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 07ff149..d9ce129 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -34,6 +34,10 @@  config TARGET_CHROMEBOOK_LINK
 
 endchoice
 
+config ROM_SIZE
+	hex
+	default 0x800000
+
 source "arch/x86/cpu/ivybridge/Kconfig"
 
 source "board/chromebook-x86/coreboot/Kconfig"
diff --git a/include/configs/chromebook_link.h b/include/configs/chromebook_link.h
index 1d6f55b..5e8a747 100644
--- a/include/configs/chromebook_link.h
+++ b/include/configs/chromebook_link.h
@@ -18,8 +18,10 @@ 
 #define CONFIG_SYS_CAR_ADDR			0xff7e0000
 #define CONFIG_SYS_CAR_SIZE			(128 * 1024)
 #define CONFIG_SYS_MONITOR_LEN			(1 << 20)
+#define CONFIG_SYS_X86_START16			0xfffff800
 #define CONFIG_BOARD_EARLY_INIT_R
 
+#define CONFIG_X86_RESET_VECTOR
 #define CONFIG_NR_DRAM_BANKS			8
 
 /*