diff options
author | Claudio Carvalho <cclaudio@linux.vnet.ibm.com> | 2016-09-28 05:10:55 -0300 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-10-10 15:29:37 +1100 |
commit | cf39c2a7dd1a2ee9b19a5490f7fa25690b8e8ae3 (patch) | |
tree | e4520a2f3879ce8332449b5fc71efedf1bcd00cd | |
parent | 0657bccb778cbe71fc8c00879826ca0217b7010d (diff) | |
download | skiboot-cf39c2a7dd1a2ee9b19a5490f7fa25690b8e8ae3.zip skiboot-cf39c2a7dd1a2ee9b19a5490f7fa25690b8e8ae3.tar.gz skiboot-cf39c2a7dd1a2ee9b19a5490f7fa25690b8e8ae3.tar.bz2 |
hw/phb3.c: adjust offset to run CAPP containers
This adjusts the CAPP header offset if CAPP is a secure boot container.
Signed-off-by: Claudio Carvalho <cclaudio@linux.vnet.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r-- | hw/phb3.c | 24 |
1 files changed, 22 insertions, 2 deletions
@@ -34,6 +34,7 @@ #include <fsp.h> #include <chip.h> #include <chiptod.h> +#include <libstb/container.h> /* Enable this to disable error interrupts for debug purposes */ #undef DISABLE_ERR_INTS @@ -2309,9 +2310,27 @@ static int64_t capp_load_ucode(struct phb3 *p) if (rc) return rc; - prlog(PR_INFO, "CHIP%i: CAPP ucode lid loaded at %p\n", - p->chip_id, capp_ucode_info.lid); lid = capp_ucode_info.lid; + + /* skip secure boot headers */ + if (stb_is_container(lid, capp_ucode_info.size)) + lid = (struct capp_lid_hdr*) ((uint8_t*)lid + SECURE_BOOT_HEADERS_SIZE); + + /* + * CAPP partition header may be present on BMC machines. It will tell + * us what sub-partition should be used + */ + if (be64_to_cpu(lid->eyecatcher) == 0x4341505000000001) { + uint32_t subpart_offset=0, subpart_size=0; + flash_subpart_info(lid, CAPP_UCODE_MAX_SIZE, + capp_ucode_info.ec_level, + &subpart_offset, &subpart_size); + if (rc) + return rc; + + lid = (struct capp_lid_hdr*) ((uint8_t*)lid + subpart_offset); + } + /* * If lid header is present (on FSP machines), it'll tell us where to * find the ucode. Otherwise this is the ucode. @@ -2382,6 +2401,7 @@ static int64_t capp_load_ucode(struct phb3 *p) } chip->capp_ucode_loaded |= (1 << p->index); + prlog(PR_INFO, "CHIP%i: CAPP ucode loaded\n", p->chip_id); return OPAL_SUCCESS; } |