18a0efd5eSAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
28a0efd5eSAndrew Jeffery // Copyright (C) 2018 IBM Corp.
38a0efd5eSAndrew Jeffery #include "config.h"
48a0efd5eSAndrew Jeffery 
5035ad76bSAndrew Jeffery extern "C" {
6035ad76bSAndrew Jeffery #include "backend.h"
7035ad76bSAndrew Jeffery #include "test/mbox.h"
8035ad76bSAndrew Jeffery #include "test/system.h"
9dec59b47SAndrew Jeffery #include "vpnor/ffs.h"
10035ad76bSAndrew Jeffery }
11035ad76bSAndrew Jeffery 
12*de08ca2dSAndrew Jeffery #include "vpnor/table.hpp"
13035ad76bSAndrew Jeffery #include "vpnor/test/tmpd.hpp"
148a0efd5eSAndrew Jeffery 
158a0efd5eSAndrew Jeffery #include <endian.h>
168a0efd5eSAndrew Jeffery #include <sys/mman.h>
178a0efd5eSAndrew Jeffery 
18261f61a1SAndrew Jeffery #include <cassert>
19261f61a1SAndrew Jeffery #include <cstring>
20261f61a1SAndrew Jeffery 
218a0efd5eSAndrew Jeffery static constexpr auto BLOCK_SIZE = 4 * 1024;
228a0efd5eSAndrew Jeffery static constexpr auto PNOR_SIZE = BLOCK_SIZE;
238a0efd5eSAndrew Jeffery static constexpr auto MEM_SIZE = BLOCK_SIZE;
248a0efd5eSAndrew Jeffery static constexpr auto ERASE_SIZE = BLOCK_SIZE;
258a0efd5eSAndrew Jeffery static constexpr auto N_WINDOWS = 1;
268a0efd5eSAndrew Jeffery static constexpr auto WINDOW_SIZE = BLOCK_SIZE;
278a0efd5eSAndrew Jeffery static constexpr auto TOC_PART_SIZE = BLOCK_SIZE;
288a0efd5eSAndrew Jeffery 
298a0efd5eSAndrew Jeffery const std::string toc[] = {
308a0efd5eSAndrew Jeffery     "partition00=part,00000000,00001000,80,READWRITE",
318a0efd5eSAndrew Jeffery     "partition01=ONE,00001000,00002000,80,READWRITE",
328a0efd5eSAndrew Jeffery };
338a0efd5eSAndrew Jeffery 
348a0efd5eSAndrew Jeffery static const uint8_t get_info[] = {0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
358a0efd5eSAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368a0efd5eSAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00};
378a0efd5eSAndrew Jeffery 
388a0efd5eSAndrew Jeffery static const uint8_t read_toc[] = {0x04, 0x04, 0x00, 0x00, 0x01, 0x00,
398a0efd5eSAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408a0efd5eSAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00};
418a0efd5eSAndrew Jeffery 
main()428a0efd5eSAndrew Jeffery int main()
438a0efd5eSAndrew Jeffery {
448a0efd5eSAndrew Jeffery     namespace test = openpower::virtual_pnor::test;
458a0efd5eSAndrew Jeffery     namespace vpnor = openpower::virtual_pnor;
468a0efd5eSAndrew Jeffery 
478a0efd5eSAndrew Jeffery     struct pnor_partition_table* htable;
488a0efd5eSAndrew Jeffery     struct mbox_context* ctx;
498a0efd5eSAndrew Jeffery     uint32_t perms;
508a0efd5eSAndrew Jeffery     int rc;
518a0efd5eSAndrew Jeffery 
528a0efd5eSAndrew Jeffery     system_set_reserved_size(MEM_SIZE);
538a0efd5eSAndrew Jeffery     system_set_mtd_sizes(PNOR_SIZE, ERASE_SIZE);
548a0efd5eSAndrew Jeffery 
55f1e547c7SEvan Lojewski     ctx = mbox_create_frontend_context(N_WINDOWS, WINDOW_SIZE);
56f1e547c7SEvan Lojewski     test::VpnorRoot root(&ctx->backend, toc, BLOCK_SIZE);
57f1e547c7SEvan Lojewski     vpnor::partition::Table table(&ctx->backend);
588a0efd5eSAndrew Jeffery 
598a0efd5eSAndrew Jeffery     assert(table.capacity() == TOC_PART_SIZE);
608a0efd5eSAndrew Jeffery 
618a0efd5eSAndrew Jeffery     rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info));
628a0efd5eSAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
638a0efd5eSAndrew Jeffery 
648a0efd5eSAndrew Jeffery     rc = mbox_command_dispatch(ctx, read_toc, sizeof(read_toc));
658a0efd5eSAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
668a0efd5eSAndrew Jeffery 
678a0efd5eSAndrew Jeffery     htable = reinterpret_cast<struct pnor_partition_table*>(ctx->mem);
688a0efd5eSAndrew Jeffery     perms = be32toh(htable->partitions[0].data.user.data[1]);
698a0efd5eSAndrew Jeffery     assert(perms & PARTITION_READONLY);
708a0efd5eSAndrew Jeffery 
718a0efd5eSAndrew Jeffery     htable = reinterpret_cast<struct pnor_partition_table*>(ctx->mem);
728a0efd5eSAndrew Jeffery     perms = be32toh(htable->partitions[1].data.user.data[1]);
738a0efd5eSAndrew Jeffery     assert(!(perms & PARTITION_READONLY));
748a0efd5eSAndrew Jeffery 
758a0efd5eSAndrew Jeffery     return 0;
768a0efd5eSAndrew Jeffery }
77