diff options
Diffstat (limited to 'mboxd_pnor_partition_table.cpp')
-rw-r--r-- | mboxd_pnor_partition_table.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/mboxd_pnor_partition_table.cpp b/mboxd_pnor_partition_table.cpp index 2464e6c..d2fdba3 100644 --- a/mboxd_pnor_partition_table.cpp +++ b/mboxd_pnor_partition_table.cpp @@ -1,5 +1,7 @@ #include "mboxd_pnor_partition_table.h" +#include "common.h" #include "mbox.h" +#include "mboxd_flash.h" #include "pnor_partition_table.hpp" #include <experimental/filesystem> @@ -57,6 +59,44 @@ const struct pnor_partition* vpnor_get_partition( &(context->vpnor->table->partition(offset)) : nullptr; } +void vpnor_copy_bootloader_partition(const struct mbox_context *context) +{ + // The hostboot bootloader has certain size/offset assumptions, so + // we need a special partition table here. + // It assumes the PNOR is 64M, the TOC size is 32K, the erase block is + // 4K, the page size is 4K. + // It also assumes the TOC is at the 'end of pnor - toc size - 1 page size' + // offset, and first looks for the TOC here, before proceeding to move up + // page by page looking for the TOC. So it is optimal to place the TOC at + // this offset. + constexpr size_t eraseSize = 0x1000; + constexpr size_t pageSize = 0x1000; + constexpr size_t pnorSize = 0x4000000; + constexpr size_t tocMaxSize = 0x8000; + constexpr size_t tocStart = pnorSize - tocMaxSize - pageSize; + constexpr auto blPartitionName = "HBB"; + + openpower::virtual_pnor::partition::Table blTable(eraseSize, pnorSize); + vpnor_partition_table vtbl{}; + vtbl.table = &blTable; + struct mbox_context local{}; + local.vpnor = &vtbl; + local.block_size_shift = log_2(eraseSize); + memcpy(&local.paths, &context->paths, sizeof(local.paths)); + + size_t tocOffset = 0; + // Copy TOC + copy_flash(&local, tocOffset, + static_cast<uint8_t*>(context->mem) + tocStart, + blTable.size() * eraseSize); + const pnor_partition& partition = blTable.partition(blPartitionName); + size_t hbbOffset = partition.data.base * eraseSize; + size_t hbbSize = partition.data.actual; + // Copy HBB + copy_flash(&local, hbbOffset, + static_cast<uint8_t*>(context->mem) + hbbOffset, hbbSize); +} + void vpnor_destroy_partition_table(struct mbox_context *context) { if(context && context->vpnor) |