coreboot: add vboot_handoff to coreboot tables

The vboot_handoff structure contians the VbInitParams as well as the
shared vboot data. In order for the boot loader to find it, the
structure address and size needs to be obtained from the coreboot
tables.

Change-Id: I6573d479009ccbf373a7325f861bebe8dc9f5cf8
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/2857
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Aaron Durbin 2013-03-07 23:15:06 -06:00 committed by Stefan Reinauer
parent d02bb62a4f
commit dd32a31fba
4 changed files with 50 additions and 1 deletions

View File

@ -36,6 +36,7 @@
#endif #endif
#if CONFIG_CHROMEOS #if CONFIG_CHROMEOS
#include <arch/acpi.h> #include <arch/acpi.h>
#include <vendorcode/google/chromeos/chromeos.h>
#include <vendorcode/google/chromeos/gnvs.h> #include <vendorcode/google/chromeos/gnvs.h>
#endif #endif
@ -219,7 +220,27 @@ static void lb_vbnv(struct lb_header *header)
vbnv->vbnv_start = CONFIG_VBNV_OFFSET + 14; vbnv->vbnv_start = CONFIG_VBNV_OFFSET + 14;
vbnv->vbnv_size = CONFIG_VBNV_SIZE; vbnv->vbnv_size = CONFIG_VBNV_SIZE;
} }
#endif
#if CONFIG_VBOOT_VERIFY_FIRMWARE
static void lb_vboot_handoff(struct lb_header *header)
{
void *addr;
uint32_t size;
struct lb_vboot_handoff* vbho;
if (vboot_get_handoff_info(&addr, &size))
return;
vbho = (struct lb_vboot_handoff *)lb_new_record(header);
vbho->tag = LB_TAB_VBOOT_HANDOFF;
vbho->size = sizeof(*vbho);
vbho->vboot_handoff_addr = addr;
vbho->vboot_handoff_size = size;
}
#else
static inline void lb_vboot_handoff(struct lb_header *header) {}
#endif /* CONFIG_VBOOT_VERIFY_FIRMWARE */
#endif /* CONFIG_CHROMEOS */
static void add_cbmem_pointers(struct lb_header *header) static void add_cbmem_pointers(struct lb_header *header)
{ {
@ -697,6 +718,9 @@ unsigned long write_coreboot_table(
/* pass along VBNV offsets in CMOS */ /* pass along VBNV offsets in CMOS */
lb_vbnv(head); lb_vbnv(head);
/* pass along the vboot_handoff address. */
lb_vboot_handoff(head);
#endif #endif
add_cbmem_pointers(head); add_cbmem_pointers(head);

View File

@ -241,6 +241,15 @@ struct lb_vbnv {
uint32_t vbnv_size; uint32_t vbnv_size;
}; };
#define LB_TAB_VBOOT_HANDOFF 0x0020
struct lb_vboot_handoff {
uint32_t tag;
uint32_t size;
void *vboot_handoff_addr;
uint32_t vboot_handoff_size;
};
/* The following structures are for the cmos definitions table */ /* The following structures are for the cmos definitions table */
#define LB_TAG_CMOS_OPTION_TABLE 200 #define LB_TAG_CMOS_OPTION_TABLE 200
/* cmos header record */ /* cmos header record */

View File

@ -66,4 +66,18 @@ void *vboot_get_payload(int *len)
return (void *)fwc->address; return (void *)fwc->address;
} }
int vboot_get_handoff_info(void **addr, uint32_t *size)
{
struct vboot_handoff *vboot_handoff;
vboot_handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF);
if (vboot_handoff == NULL)
return -1;
*addr = vboot_handoff;
*size = sizeof(*vboot_handoff);
return 0;
}
#endif #endif

View File

@ -49,6 +49,8 @@ void init_chromeos(int bootmode);
struct romstage_handoff; struct romstage_handoff;
void vboot_verify_firmware(struct romstage_handoff *handoff); void vboot_verify_firmware(struct romstage_handoff *handoff);
void *vboot_get_payload(int *len); void *vboot_get_payload(int *len);
/* Returns 0 on success < 0 on error. */
int vboot_get_handoff_info(void **addr, uint32_t *size);
#endif #endif
#endif #endif