aboutsummaryrefslogtreecommitdiff
path: root/hw/phb3.c
diff options
context:
space:
mode:
authorClaudio Carvalho <cclaudio@linux.vnet.ibm.com>2016-09-28 05:10:55 -0300
committerStewart Smith <stewart@linux.vnet.ibm.com>2016-10-10 15:29:37 +1100
commitcf39c2a7dd1a2ee9b19a5490f7fa25690b8e8ae3 (patch)
treee4520a2f3879ce8332449b5fc71efedf1bcd00cd /hw/phb3.c
parent0657bccb778cbe71fc8c00879826ca0217b7010d (diff)
downloadskiboot-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>
Diffstat (limited to 'hw/phb3.c')
-rw-r--r--hw/phb3.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/hw/phb3.c b/hw/phb3.c
index eb30c36..e327225 100644
--- a/hw/phb3.c
+++ b/hw/phb3.c
@@ -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;
}