vpnor table: Set base address to actual offset

The base address for the partitions is used by mboxd to find
requested partitions, and for simplicity it's just a continous
number sequence.
But this data is used by the host as the partition offsets,
which are expected to match to the offsets in the openpower xml:
https://github.com/open-power/pnor/blob/21d66daff697f8c13fb067340ca621e9208ab1ea/p9Layouts/defaultPnorLayout_64.xml

This xml pnor layout has empty spaces in between the partitions,
ex: part ends at address 0x2000 and the next partition HBEL starts
at 0x8000. Need to set base address to the actual offset that
corresponds to the xml file, so that the host traces that display
the partition offsets match the data in documented in the xml.
This doesn't affect the memory address allocation.

Part of openbmc/openbmc#2677

Change-Id: Ica142129aabd195655018a84f9a993596c333457
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
diff --git a/pnor_partition_table.cpp b/pnor_partition_table.cpp
index 3e3f1d1..eafdca5 100644
--- a/pnor_partition_table.cpp
+++ b/pnor_partition_table.cpp
@@ -28,7 +28,6 @@
 Table::Table(fs::path&& directory,
              size_t blockSize, size_t pnorSize):
     szBlocks(0),
-    imgBlocks(0),
     directory(std::move(directory)),
     numParts(0),
     blockSize(blockSize),
@@ -76,16 +75,14 @@
                             (num * sizeof(pnor_partition));
     size_t totalSizeAligned = align_up(totalSizeBytes, blockSize);
     szBlocks = totalSizeAligned / blockSize;
-    imgBlocks = szBlocks;
     tbl.resize(totalSizeAligned);
 }
 
 inline void Table::writeSizes(pnor_partition& part, size_t start, size_t end)
 {
     size_t size = end - start;
-    part.data.base = imgBlocks;
+    part.data.base = align_up(start, blockSize) / blockSize;
     size_t sizeInBlocks = align_up(size, blockSize) / blockSize;
-    imgBlocks += sizeInBlocks;
     part.data.size = sizeInBlocks;
 
     // If a a patch partition file exists, populate actual size with its file
diff --git a/pnor_partition_table.hpp b/pnor_partition_table.hpp
index 1cabe23..2d0d007 100644
--- a/pnor_partition_table.hpp
+++ b/pnor_partition_table.hpp
@@ -218,9 +218,6 @@
          */
         size_t szBlocks;
 
-        /** @brief Size of virtual PNOR image, measured in erase-blocks */
-        size_t imgBlocks;
-
         /** @brief Partition table */
         PartitionTable tbl;
 
diff --git a/test/create_pnor_partition_table.cpp b/test/create_pnor_partition_table.cpp
index bfc4471..d542299 100644
--- a/test/create_pnor_partition_table.cpp
+++ b/test/create_pnor_partition_table.cpp
@@ -47,7 +47,7 @@
 
     pnor_partition expectedPartition{};
     strcpy(expectedPartition.data.name, partitionName);
-    expectedPartition.data.base = 1; // starts after 1 block
+    expectedPartition.data.base = 0; // starts at offset 0
     expectedPartition.data.size = 1; // 1 block
     expectedPartition.data.actual = 0x400; // 1024 bytes
     expectedPartition.data.id = 1;
@@ -71,7 +71,7 @@
                 sizeof(pnor_partition));
     assert(rc == 0);
 
-    const pnor_partition& first = table.partition(4096);
+    const pnor_partition& first = table.partition(0); // Partition at offset 0
     rc = memcmp(&first, &result.partitions[0], sizeof(pnor_partition));
     assert(rc == 0);
 
diff --git a/test/create_read_window_vpnor.cpp b/test/create_read_window_vpnor.cpp
index d9bcccc..7c344f7 100644
--- a/test/create_read_window_vpnor.cpp
+++ b/test/create_read_window_vpnor.cpp
@@ -13,7 +13,9 @@
 #include <fstream>
 #include <experimental/filesystem>
 
-constexpr auto line = "partition01=HBB,00000000,0001000,ECC,PRESERVED";
+// A read window assumes that the toc is located at offset 0,
+// so create dummy partition at arbitrary offset 0x100.
+constexpr auto line = "partition01=HBB,00000100,0001000,ECC,PRESERVED";
 constexpr auto partition = "HBB";
 char tmplt[] = "/tmp/create_read_test.XXXXXX";
 uint8_t data[8] = { 0xaa, 0x55, 0xaa, 0x66, 0x77, 0x88, 0x99, 0xab };
@@ -28,7 +30,7 @@
         0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
-// offset 1 and size 6
+// offset 0x100 and size 6
 static const uint8_t create_read_window[] = {
         0x04, 0x01, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/test/write_flash_vpnor.cpp b/test/write_flash_vpnor.cpp
index ceb24aa..b9ba7ec 100644
--- a/test/write_flash_vpnor.cpp
+++ b/test/write_flash_vpnor.cpp
@@ -54,9 +54,9 @@
     namespace fs = std::experimental::filesystem;
     using namespace std::string_literals;
 
-    std::string  tocData = "partition01=TEST1,00000000,00000400,ECC,READONLY\n"s
-                           + "partition02=TEST2,00000000,00000008,ECC,READWRITE\n"s
-                           + "partition03=TEST3,00000000,00000400,ECC,PRESERVED"s;
+    std::string  tocData = "partition01=TEST1,00001000,00001400,ECC,READONLY\n"s
+                           + "partition02=TEST2,00002000,00002008,ECC,READWRITE\n"s
+                           + "partition03=TEST3,00003000,00003400,ECC,PRESERVED"s;
 
     std::vector<std::string> templatePaths = { "/tmp/ro.XXXXXX",
                                                "/tmp/rw.XXXXXX" ,