summaryrefslogtreecommitdiffstats
path: root/mboxd_pnor_partition_table.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mboxd_pnor_partition_table.cpp')
-rw-r--r--mboxd_pnor_partition_table.cpp40
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)
OpenPOWER on IntegriCloud