1*4fe996c2SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0 2*4fe996c2SAndrew Jeffery // Copyright (C) 2018 IBM Corp. 3d4a5fc8bSAndrew Jeffery 4d4a5fc8bSAndrew Jeffery #include <assert.h> 5d4a5fc8bSAndrew Jeffery #include <sys/mman.h> 6d4a5fc8bSAndrew Jeffery 7d4a5fc8bSAndrew Jeffery #include "mbox.h" 8d4a5fc8bSAndrew Jeffery #include "mboxd_msg.h" 9d4a5fc8bSAndrew Jeffery 10d4a5fc8bSAndrew Jeffery #include "test/mbox.h" 11d4a5fc8bSAndrew Jeffery #include "test/system.h" 12d4a5fc8bSAndrew Jeffery 13d4a5fc8bSAndrew Jeffery static const uint8_t get_info[] = { 14d4a5fc8bSAndrew Jeffery 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 15d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 16d4a5fc8bSAndrew Jeffery }; 17d4a5fc8bSAndrew Jeffery 18d4a5fc8bSAndrew Jeffery static const uint8_t create_write_window[] = { 19d4a5fc8bSAndrew Jeffery 0x06, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 20d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 21d4a5fc8bSAndrew Jeffery }; 22d4a5fc8bSAndrew Jeffery 23d4a5fc8bSAndrew Jeffery static const uint8_t mark_write_dirty[] = { 24d4a5fc8bSAndrew Jeffery 0x07, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 25d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 26d4a5fc8bSAndrew Jeffery }; 27d4a5fc8bSAndrew Jeffery 28d4a5fc8bSAndrew Jeffery static const uint8_t create_read_window[] = { 29d4a5fc8bSAndrew Jeffery 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 30d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 31d4a5fc8bSAndrew Jeffery }; 32d4a5fc8bSAndrew Jeffery 33d4a5fc8bSAndrew Jeffery static const uint8_t create_read_window_response[] = { 34d4a5fc8bSAndrew Jeffery 0x04, 0x03, 0xfd, 0xff, 0x03, 0x00, 0x00, 0x00, 35d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 36d4a5fc8bSAndrew Jeffery }; 37d4a5fc8bSAndrew Jeffery 38d4a5fc8bSAndrew Jeffery static const uint8_t close_window[] = { 39d4a5fc8bSAndrew Jeffery 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 41d4a5fc8bSAndrew Jeffery }; 42d4a5fc8bSAndrew Jeffery 43d4a5fc8bSAndrew Jeffery static const uint8_t close_window_response[] = { 44d4a5fc8bSAndrew Jeffery 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45d4a5fc8bSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 46d4a5fc8bSAndrew Jeffery }; 47d4a5fc8bSAndrew Jeffery 48d4a5fc8bSAndrew Jeffery const uint8_t start_data[] = { 0xaa, 0x55, 0xaa }; 49d4a5fc8bSAndrew Jeffery const uint8_t finish_data[] = { 0xaa, 0x00, 0xaa }; 50d4a5fc8bSAndrew Jeffery 51d4a5fc8bSAndrew Jeffery #define MEM_SIZE sizeof(start_data) 52d4a5fc8bSAndrew Jeffery #define ERASE_SIZE 1 53d4a5fc8bSAndrew Jeffery #define N_WINDOWS 1 54d4a5fc8bSAndrew Jeffery #define WINDOW_SIZE sizeof(start_data) 55d4a5fc8bSAndrew Jeffery 56d4a5fc8bSAndrew Jeffery int setup(struct mbox_context *ctx) 57d4a5fc8bSAndrew Jeffery { 58d4a5fc8bSAndrew Jeffery int rc; 59d4a5fc8bSAndrew Jeffery 60d4a5fc8bSAndrew Jeffery rc = mbox_set_mtd_data(ctx, start_data, sizeof(start_data)); 61d4a5fc8bSAndrew Jeffery assert(rc == 0); 62d4a5fc8bSAndrew Jeffery 63d4a5fc8bSAndrew Jeffery rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info)); 64d4a5fc8bSAndrew Jeffery assert(rc == 1); 65d4a5fc8bSAndrew Jeffery 66d4a5fc8bSAndrew Jeffery rc = mbox_command_dispatch(ctx, create_write_window, 67d4a5fc8bSAndrew Jeffery sizeof(create_write_window)); 68d4a5fc8bSAndrew Jeffery assert(rc == 1); 69d4a5fc8bSAndrew Jeffery 70d4a5fc8bSAndrew Jeffery return rc; 71d4a5fc8bSAndrew Jeffery } 72d4a5fc8bSAndrew Jeffery 73d4a5fc8bSAndrew Jeffery int flush_on_close(struct mbox_context *ctx) 74d4a5fc8bSAndrew Jeffery { 75d4a5fc8bSAndrew Jeffery uint8_t *map; 76d4a5fc8bSAndrew Jeffery int rc; 77d4a5fc8bSAndrew Jeffery 78d4a5fc8bSAndrew Jeffery rc = setup(ctx); 79d4a5fc8bSAndrew Jeffery assert(rc == 1); 80d4a5fc8bSAndrew Jeffery 81d4a5fc8bSAndrew Jeffery ((uint8_t *)ctx->mem)[1] = 0x00; 82d4a5fc8bSAndrew Jeffery 83d4a5fc8bSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty, 84d4a5fc8bSAndrew Jeffery sizeof(mark_write_dirty)); 85d4a5fc8bSAndrew Jeffery assert(rc == 1); 86d4a5fc8bSAndrew Jeffery 87d4a5fc8bSAndrew Jeffery rc = mbox_command_dispatch(ctx, close_window, sizeof(close_window)); 88d4a5fc8bSAndrew Jeffery assert(rc == 1); 89d4a5fc8bSAndrew Jeffery 90d4a5fc8bSAndrew Jeffery rc = mbox_cmp(ctx, close_window_response, 91d4a5fc8bSAndrew Jeffery sizeof(close_window_response)); 92d4a5fc8bSAndrew Jeffery assert(rc == 0); 93d4a5fc8bSAndrew Jeffery 94d4a5fc8bSAndrew Jeffery map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, 95d4a5fc8bSAndrew Jeffery ctx->fds[MTD_FD].fd, 0); 96d4a5fc8bSAndrew Jeffery assert(map != MAP_FAILED); 97d4a5fc8bSAndrew Jeffery 98d4a5fc8bSAndrew Jeffery rc = memcmp(finish_data, map, sizeof(finish_data)); 99d4a5fc8bSAndrew Jeffery assert(rc == 0); 100d4a5fc8bSAndrew Jeffery 101d4a5fc8bSAndrew Jeffery return rc; 102d4a5fc8bSAndrew Jeffery } 103d4a5fc8bSAndrew Jeffery 104d4a5fc8bSAndrew Jeffery int flush_on_create(struct mbox_context *ctx) 105d4a5fc8bSAndrew Jeffery { 106d4a5fc8bSAndrew Jeffery uint8_t *map; 107d4a5fc8bSAndrew Jeffery int rc; 108d4a5fc8bSAndrew Jeffery 109d4a5fc8bSAndrew Jeffery rc = setup(ctx); 110d4a5fc8bSAndrew Jeffery assert(rc == 1); 111d4a5fc8bSAndrew Jeffery 112d4a5fc8bSAndrew Jeffery ((uint8_t *)ctx->mem)[1] = 0x00; 113d4a5fc8bSAndrew Jeffery 114d4a5fc8bSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty, 115d4a5fc8bSAndrew Jeffery sizeof(mark_write_dirty)); 116d4a5fc8bSAndrew Jeffery assert(rc == 1); 117d4a5fc8bSAndrew Jeffery 118d4a5fc8bSAndrew Jeffery rc = mbox_command_dispatch(ctx, create_read_window, 119d4a5fc8bSAndrew Jeffery sizeof(create_read_window)); 120d4a5fc8bSAndrew Jeffery assert(rc == 1); 121d4a5fc8bSAndrew Jeffery 122d4a5fc8bSAndrew Jeffery rc = mbox_cmp(ctx, create_read_window_response, 123d4a5fc8bSAndrew Jeffery sizeof(create_read_window_response)); 124d4a5fc8bSAndrew Jeffery assert(rc == 0); 125d4a5fc8bSAndrew Jeffery 126d4a5fc8bSAndrew Jeffery map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, 127d4a5fc8bSAndrew Jeffery ctx->fds[MTD_FD].fd, 0); 128d4a5fc8bSAndrew Jeffery assert(map != MAP_FAILED); 129d4a5fc8bSAndrew Jeffery 130d4a5fc8bSAndrew Jeffery rc = memcmp(finish_data, map, sizeof(finish_data)); 131d4a5fc8bSAndrew Jeffery assert(rc == 0); 132d4a5fc8bSAndrew Jeffery 133d4a5fc8bSAndrew Jeffery return rc; 134d4a5fc8bSAndrew Jeffery } 135d4a5fc8bSAndrew Jeffery 136d4a5fc8bSAndrew Jeffery int main(void) 137d4a5fc8bSAndrew Jeffery { 138d4a5fc8bSAndrew Jeffery struct mbox_context *ctx; 139d4a5fc8bSAndrew Jeffery 140d4a5fc8bSAndrew Jeffery system_set_reserved_size(MEM_SIZE); 141d4a5fc8bSAndrew Jeffery system_set_mtd_sizes(MEM_SIZE, ERASE_SIZE); 142d4a5fc8bSAndrew Jeffery 143d4a5fc8bSAndrew Jeffery ctx = mbox_create_test_context(N_WINDOWS, WINDOW_SIZE); 144d4a5fc8bSAndrew Jeffery 145d4a5fc8bSAndrew Jeffery flush_on_close(ctx); 146d4a5fc8bSAndrew Jeffery 147d4a5fc8bSAndrew Jeffery flush_on_create(ctx); 148d4a5fc8bSAndrew Jeffery 149d4a5fc8bSAndrew Jeffery return 0; 150d4a5fc8bSAndrew Jeffery }; 151