14fe996c2SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0 24fe996c2SAndrew Jeffery // Copyright (C) 2018 IBM Corp. 31a03647eSAndrew Jeffery 41a03647eSAndrew Jeffery #include <assert.h> 51a03647eSAndrew Jeffery #include <sys/mman.h> 61a03647eSAndrew Jeffery 726558dbbSAndrew Jeffery #include "mboxd.h" 8*f1e547c7SEvan Lojewski #include "mtd/backend.h" 9457a6e5fSAndrew Jeffery #include "transport_mbox.h" 101a03647eSAndrew Jeffery 111a03647eSAndrew Jeffery #include "test/mbox.h" 121a03647eSAndrew Jeffery #include "test/system.h" 131a03647eSAndrew Jeffery 141a03647eSAndrew Jeffery static const uint8_t get_info[] = { 151a03647eSAndrew Jeffery 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 161a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 171a03647eSAndrew Jeffery }; 181a03647eSAndrew Jeffery 191a03647eSAndrew Jeffery static const uint8_t create_write_window[] = { 201a03647eSAndrew Jeffery 0x06, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 211a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 221a03647eSAndrew Jeffery }; 231a03647eSAndrew Jeffery 241a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_middle[] = { 251a03647eSAndrew Jeffery 0x07, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 261a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 271a03647eSAndrew Jeffery }; 281a03647eSAndrew Jeffery 291a03647eSAndrew Jeffery static const uint8_t write_flush[] = { 301a03647eSAndrew Jeffery 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 311a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 321a03647eSAndrew Jeffery }; 331a03647eSAndrew Jeffery 341a03647eSAndrew Jeffery static const uint8_t response[] = { 351a03647eSAndrew Jeffery 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 361a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 371a03647eSAndrew Jeffery }; 381a03647eSAndrew Jeffery 391a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_left[] = { 401a03647eSAndrew Jeffery 0x07, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 411a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 421a03647eSAndrew Jeffery }; 431a03647eSAndrew Jeffery 441a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_right[] = { 451a03647eSAndrew Jeffery 0x07, 0x05, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 461a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 471a03647eSAndrew Jeffery }; 481a03647eSAndrew Jeffery 491a03647eSAndrew Jeffery static const uint8_t mark_write_dirty_all[] = { 501a03647eSAndrew Jeffery 0x07, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 511a03647eSAndrew Jeffery 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 521a03647eSAndrew Jeffery }; 531a03647eSAndrew Jeffery 541a03647eSAndrew Jeffery const uint8_t start_data[] = { 0xaa, 0x55, 0xaa }; 551a03647eSAndrew Jeffery const uint8_t flush_middle_data[] = { 0xaa, 0x00, 0xaa }; 561a03647eSAndrew Jeffery const uint8_t flush_ends_data[] = { 0x55, 0x00, 0x55 }; 571a03647eSAndrew Jeffery const uint8_t flush_all_data[] = { 0x01, 0x02, 0x03 }; 581a03647eSAndrew Jeffery 591a03647eSAndrew Jeffery #define MEM_SIZE sizeof(start_data) 601a03647eSAndrew Jeffery #define ERASE_SIZE 1 611a03647eSAndrew Jeffery #define N_WINDOWS 1 621a03647eSAndrew Jeffery #define WINDOW_SIZE sizeof(start_data) 631a03647eSAndrew Jeffery 641a03647eSAndrew Jeffery int main(void) 651a03647eSAndrew Jeffery { 661a03647eSAndrew Jeffery struct mbox_context *ctx; 671a03647eSAndrew Jeffery uint8_t *map; 681a03647eSAndrew Jeffery int rc; 691a03647eSAndrew Jeffery 701a03647eSAndrew Jeffery system_set_reserved_size(MEM_SIZE); 711a03647eSAndrew Jeffery system_set_mtd_sizes(MEM_SIZE, ERASE_SIZE); 721a03647eSAndrew Jeffery 731a03647eSAndrew Jeffery ctx = mbox_create_test_context(N_WINDOWS, WINDOW_SIZE); 741a03647eSAndrew Jeffery rc = mbox_set_mtd_data(ctx, start_data, sizeof(start_data)); 751a03647eSAndrew Jeffery assert(rc == 0); 761a03647eSAndrew Jeffery 771a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info)); 781a03647eSAndrew Jeffery assert(rc == 1); 791a03647eSAndrew Jeffery 801a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, create_write_window, 811a03647eSAndrew Jeffery sizeof(create_write_window)); 821a03647eSAndrew Jeffery assert(rc == 1); 831a03647eSAndrew Jeffery 841a03647eSAndrew Jeffery /* { clean, dirty, clean } */ 851a03647eSAndrew Jeffery 861a03647eSAndrew Jeffery ((uint8_t *)ctx->mem)[1] = 0x00; 871a03647eSAndrew Jeffery 881a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_middle, 891a03647eSAndrew Jeffery sizeof(mark_write_dirty_middle)); 901a03647eSAndrew Jeffery assert(rc == 1); 911a03647eSAndrew Jeffery 921a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); 931a03647eSAndrew Jeffery assert(rc == 1); 941a03647eSAndrew Jeffery 951a03647eSAndrew Jeffery rc = mbox_cmp(ctx, response, sizeof(response)); 961a03647eSAndrew Jeffery assert(rc == 0); 971a03647eSAndrew Jeffery 981a03647eSAndrew Jeffery map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, 99*f1e547c7SEvan Lojewski ((struct mtd_data *)ctx->backend.priv)->fd, 0); 1001a03647eSAndrew Jeffery assert(map != MAP_FAILED); 1011a03647eSAndrew Jeffery 1021a03647eSAndrew Jeffery rc = memcmp(flush_middle_data, map, sizeof(flush_middle_data)); 1031a03647eSAndrew Jeffery assert(rc == 0); 1041a03647eSAndrew Jeffery 1051a03647eSAndrew Jeffery /* { dirty, clean, dirty } */ 1061a03647eSAndrew Jeffery 1071a03647eSAndrew Jeffery ((uint8_t *)ctx->mem)[0] = 0x55; 1081a03647eSAndrew Jeffery 1091a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_left, 1101a03647eSAndrew Jeffery sizeof(mark_write_dirty_left)); 1111a03647eSAndrew Jeffery assert(rc == 1); 1121a03647eSAndrew Jeffery 1131a03647eSAndrew Jeffery ((uint8_t *)ctx->mem)[2] = 0x55; 1141a03647eSAndrew Jeffery 1151a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_right, 1161a03647eSAndrew Jeffery sizeof(mark_write_dirty_right)); 1171a03647eSAndrew Jeffery assert(rc == 1); 1181a03647eSAndrew Jeffery 1191a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); 1201a03647eSAndrew Jeffery assert(rc == 1); 1211a03647eSAndrew Jeffery 1221a03647eSAndrew Jeffery rc = mbox_cmp(ctx, response, sizeof(response)); 1231a03647eSAndrew Jeffery assert(rc == 0); 1241a03647eSAndrew Jeffery 1251a03647eSAndrew Jeffery rc = memcmp(flush_ends_data, map, sizeof(flush_ends_data)); 1261a03647eSAndrew Jeffery assert(rc == 0); 1271a03647eSAndrew Jeffery 1281a03647eSAndrew Jeffery /* { dirty, dirty, dirty } */ 1291a03647eSAndrew Jeffery 1301a03647eSAndrew Jeffery memcpy(ctx->mem, flush_all_data, sizeof(flush_all_data)); 1311a03647eSAndrew Jeffery 1321a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, mark_write_dirty_all, 1331a03647eSAndrew Jeffery sizeof(mark_write_dirty_all)); 1341a03647eSAndrew Jeffery assert(rc == 1); 1351a03647eSAndrew Jeffery 1361a03647eSAndrew Jeffery rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush)); 1371a03647eSAndrew Jeffery assert(rc == 1); 1381a03647eSAndrew Jeffery 1391a03647eSAndrew Jeffery rc = mbox_cmp(ctx, response, sizeof(response)); 1401a03647eSAndrew Jeffery assert(rc == 0); 1411a03647eSAndrew Jeffery 1421a03647eSAndrew Jeffery rc = memcmp(flush_all_data, map, sizeof(flush_all_data)); 1431a03647eSAndrew Jeffery assert(rc == 0); 1441a03647eSAndrew Jeffery 1451a03647eSAndrew Jeffery return rc; 1461a03647eSAndrew Jeffery }; 147