xref: /openbmc/hiomapd/vpnor/test/write_toc.cpp (revision de08ca2d69609f58e7787620f13d3b05c19697e5)
189985754SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
289985754SAndrew Jeffery // Copyright (C) 2018 IBM Corp.
389985754SAndrew Jeffery #include "config.h"
489985754SAndrew Jeffery 
5035ad76bSAndrew Jeffery extern "C" {
6035ad76bSAndrew Jeffery #include "backend.h"
7035ad76bSAndrew Jeffery #include "test/mbox.h"
8035ad76bSAndrew Jeffery #include "test/system.h"
9035ad76bSAndrew Jeffery }
10035ad76bSAndrew Jeffery 
11*de08ca2dSAndrew Jeffery #include "vpnor/table.hpp"
12035ad76bSAndrew Jeffery #include "vpnor/test/tmpd.hpp"
1389985754SAndrew Jeffery 
1489985754SAndrew Jeffery #include <sys/mman.h>
1589985754SAndrew Jeffery 
16261f61a1SAndrew Jeffery #include <cassert>
17261f61a1SAndrew Jeffery #include <cstring>
18261f61a1SAndrew Jeffery 
1989985754SAndrew Jeffery static constexpr auto BLOCK_SIZE = 4 * 1024;
2089985754SAndrew Jeffery static constexpr auto PNOR_SIZE = 2 * BLOCK_SIZE;
2189985754SAndrew Jeffery static constexpr auto MEM_SIZE = BLOCK_SIZE;
2289985754SAndrew Jeffery static constexpr auto ERASE_SIZE = BLOCK_SIZE;
2389985754SAndrew Jeffery static constexpr auto N_WINDOWS = 1;
2489985754SAndrew Jeffery static constexpr auto WINDOW_SIZE = BLOCK_SIZE;
2589985754SAndrew Jeffery static constexpr auto TOC_PART_SIZE = BLOCK_SIZE;
2689985754SAndrew Jeffery 
2789985754SAndrew Jeffery const std::string toc[] = {
2889985754SAndrew Jeffery     "partition00=part,00000000,00001000,80,READWRITE",
2989985754SAndrew Jeffery     "partition01=ONE,00001000,00002000,80,READWRITE",
3089985754SAndrew Jeffery };
3189985754SAndrew Jeffery 
3289985754SAndrew Jeffery static const uint8_t get_info[] = {0x02, 0x00, 0x02, 0x00, 0x00, 0x00,
3389985754SAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3489985754SAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00};
3589985754SAndrew Jeffery 
3689985754SAndrew Jeffery static const uint8_t write_toc[] = {0x06, 0x01, 0x00, 0x00, 0x01, 0x00,
3789985754SAndrew Jeffery                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3889985754SAndrew Jeffery                                     0x00, 0x00, 0x00, 0x00};
3989985754SAndrew Jeffery 
4089985754SAndrew Jeffery static const uint8_t erase_toc[] = {0x0a, 0x02, 0x00, 0x00, 0x01, 0x00,
4189985754SAndrew Jeffery                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4289985754SAndrew Jeffery                                     0x00, 0x00, 0x00, 0x00};
4389985754SAndrew Jeffery 
4489985754SAndrew Jeffery static const uint8_t read_one[] = {0x04, 0x03, 0x01, 0x00, 0x01, 0x00,
4589985754SAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4689985754SAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00};
4789985754SAndrew Jeffery 
4889985754SAndrew Jeffery static const uint8_t read_toc[] = {0x04, 0x04, 0x00, 0x00, 0x01, 0x00,
4989985754SAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
5089985754SAndrew Jeffery                                    0x00, 0x00, 0x00, 0x00};
5189985754SAndrew Jeffery 
main()5289985754SAndrew Jeffery int main()
5389985754SAndrew Jeffery {
5489985754SAndrew Jeffery     namespace test = openpower::virtual_pnor::test;
5589985754SAndrew Jeffery     namespace vpnor = openpower::virtual_pnor;
5689985754SAndrew Jeffery 
5789985754SAndrew Jeffery     struct mbox_context* ctx;
5889985754SAndrew Jeffery     int rc;
5989985754SAndrew Jeffery 
6089985754SAndrew Jeffery     void* erased;
6189985754SAndrew Jeffery 
6289985754SAndrew Jeffery     erased = malloc(BLOCK_SIZE);
6389985754SAndrew Jeffery     assert(erased);
6489985754SAndrew Jeffery 
6589985754SAndrew Jeffery     memset(erased, 0xff, BLOCK_SIZE);
6689985754SAndrew Jeffery 
6789985754SAndrew Jeffery     system_set_reserved_size(MEM_SIZE);
6889985754SAndrew Jeffery     system_set_mtd_sizes(PNOR_SIZE, ERASE_SIZE);
6989985754SAndrew Jeffery 
70f1e547c7SEvan Lojewski     ctx = mbox_create_frontend_context(N_WINDOWS, WINDOW_SIZE);
71f1e547c7SEvan Lojewski     test::VpnorRoot root(&ctx->backend, toc, BLOCK_SIZE);
72f1e547c7SEvan Lojewski     vpnor::partition::Table table(&ctx->backend);
7389985754SAndrew Jeffery 
7489985754SAndrew Jeffery     assert(table.capacity() == TOC_PART_SIZE);
7589985754SAndrew Jeffery 
7689985754SAndrew Jeffery     rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info));
7789985754SAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
7889985754SAndrew Jeffery 
7989985754SAndrew Jeffery     rc = mbox_command_dispatch(ctx, write_toc, sizeof(write_toc));
8089985754SAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
8189985754SAndrew Jeffery 
8289985754SAndrew Jeffery     rc = mbox_command_dispatch(ctx, erase_toc, sizeof(erase_toc));
8389985754SAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
8489985754SAndrew Jeffery 
8589985754SAndrew Jeffery     rc = memcmp(ctx->mem, erased, BLOCK_SIZE);
8689985754SAndrew Jeffery     assert(rc == 0);
8789985754SAndrew Jeffery 
8889985754SAndrew Jeffery     rc = mbox_command_dispatch(ctx, read_one, sizeof(read_one));
8989985754SAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
9089985754SAndrew Jeffery 
9189985754SAndrew Jeffery     rc = mbox_command_dispatch(ctx, read_toc, sizeof(read_toc));
9289985754SAndrew Jeffery     assert(rc == MBOX_R_SUCCESS);
9389985754SAndrew Jeffery 
9489985754SAndrew Jeffery     rc = memcmp(ctx->mem, erased, BLOCK_SIZE);
9589985754SAndrew Jeffery     assert(rc == 0);
9689985754SAndrew Jeffery 
9789985754SAndrew Jeffery     free(erased);
9889985754SAndrew Jeffery 
9989985754SAndrew Jeffery     return 0;
10089985754SAndrew Jeffery }
101