1*4fe996c2SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
2*4fe996c2SAndrew Jeffery // Copyright (C) 2018 IBM Corp.
34edb58c5SAndrew Jeffery 
44edb58c5SAndrew Jeffery #include <assert.h>
54edb58c5SAndrew Jeffery #include <sys/mman.h>
64edb58c5SAndrew Jeffery 
74edb58c5SAndrew Jeffery #include "mbox.h"
84edb58c5SAndrew Jeffery #include "mboxd_msg.h"
94edb58c5SAndrew Jeffery 
104edb58c5SAndrew Jeffery #include "test/mbox.h"
114edb58c5SAndrew Jeffery #include "test/system.h"
124edb58c5SAndrew Jeffery 
134edb58c5SAndrew Jeffery static const uint8_t get_info[] = {
144edb58c5SAndrew Jeffery 	0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
154edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
164edb58c5SAndrew Jeffery };
174edb58c5SAndrew Jeffery 
184edb58c5SAndrew Jeffery static const uint8_t create_write_window[] = {
194edb58c5SAndrew Jeffery 	0x06, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
204edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
214edb58c5SAndrew Jeffery };
224edb58c5SAndrew Jeffery 
234edb58c5SAndrew Jeffery static const uint8_t mark_write_dirty_left[] = {
244edb58c5SAndrew Jeffery 	0x07, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
254edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
264edb58c5SAndrew Jeffery };
274edb58c5SAndrew Jeffery 
284edb58c5SAndrew Jeffery static const uint8_t mark_write_dirty_right[] = {
294edb58c5SAndrew Jeffery 	0x07, 0x03, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
304edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
314edb58c5SAndrew Jeffery };
324edb58c5SAndrew Jeffery 
334edb58c5SAndrew Jeffery static const uint8_t mark_write_erase_middle[] = {
344edb58c5SAndrew Jeffery 	0x0a, 0x04, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
354edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
364edb58c5SAndrew Jeffery };
374edb58c5SAndrew Jeffery 
384edb58c5SAndrew Jeffery static const uint8_t mark_write_erase_left[] = {
394edb58c5SAndrew Jeffery 	0x0a, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
404edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
414edb58c5SAndrew Jeffery };
424edb58c5SAndrew Jeffery 
434edb58c5SAndrew Jeffery static const uint8_t mark_write_erase_right[] = {
444edb58c5SAndrew Jeffery 	0x0a, 0x06, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
454edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
464edb58c5SAndrew Jeffery };
474edb58c5SAndrew Jeffery 
484edb58c5SAndrew Jeffery static const uint8_t mark_write_dirty_middle[] = {
494edb58c5SAndrew Jeffery 	0x07, 0x07, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
504edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
514edb58c5SAndrew Jeffery };
524edb58c5SAndrew Jeffery 
534edb58c5SAndrew Jeffery static const uint8_t write_flush[] = {
544edb58c5SAndrew Jeffery 	0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
564edb58c5SAndrew Jeffery };
574edb58c5SAndrew Jeffery 
584edb58c5SAndrew Jeffery static const uint8_t flush_response[] = {
594edb58c5SAndrew Jeffery 	0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604edb58c5SAndrew Jeffery 	0x00, 0x00, 0x00, 0x00, 0x00, 0x01
614edb58c5SAndrew Jeffery };
624edb58c5SAndrew Jeffery 
634edb58c5SAndrew Jeffery const uint8_t start_data[] = { 0xaa, 0x55, 0xaa };
644edb58c5SAndrew Jeffery const uint8_t flush_dirty_erased_dirty_data[] = { 0x55, 0xff, 0x55 };
654edb58c5SAndrew Jeffery const uint8_t flush_erased_dirty_erased_data[] = { 0xff, 0x55, 0xff };
664edb58c5SAndrew Jeffery 
674edb58c5SAndrew Jeffery #define MEM_SIZE	sizeof(start_data)
684edb58c5SAndrew Jeffery #define ERASE_SIZE	1
694edb58c5SAndrew Jeffery #define N_WINDOWS	1
704edb58c5SAndrew Jeffery #define WINDOW_SIZE	sizeof(start_data)
714edb58c5SAndrew Jeffery 
724edb58c5SAndrew Jeffery int main(void)
734edb58c5SAndrew Jeffery {
744edb58c5SAndrew Jeffery 	struct mbox_context *ctx;
754edb58c5SAndrew Jeffery 	uint8_t *map;
764edb58c5SAndrew Jeffery 	int rc;
774edb58c5SAndrew Jeffery 
784edb58c5SAndrew Jeffery 	system_set_reserved_size(MEM_SIZE);
794edb58c5SAndrew Jeffery 	system_set_mtd_sizes(MEM_SIZE, ERASE_SIZE);
804edb58c5SAndrew Jeffery 
814edb58c5SAndrew Jeffery 	ctx = mbox_create_test_context(N_WINDOWS, WINDOW_SIZE);
824edb58c5SAndrew Jeffery 	rc = mbox_set_mtd_data(ctx, start_data, sizeof(start_data));
834edb58c5SAndrew Jeffery 	assert(rc == 0);
844edb58c5SAndrew Jeffery 
854edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, get_info, sizeof(get_info));
864edb58c5SAndrew Jeffery 	assert(rc == 1);
874edb58c5SAndrew Jeffery 
884edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, create_write_window,
894edb58c5SAndrew Jeffery 			sizeof(create_write_window));
904edb58c5SAndrew Jeffery 	assert(rc == 1);
914edb58c5SAndrew Jeffery 
924edb58c5SAndrew Jeffery 	/* { dirty, erased, dirty } */
934edb58c5SAndrew Jeffery 
944edb58c5SAndrew Jeffery 	((uint8_t *)ctx->mem)[0] = 0x55;
954edb58c5SAndrew Jeffery 
964edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, mark_write_dirty_left,
974edb58c5SAndrew Jeffery 			sizeof(mark_write_dirty_left));
984edb58c5SAndrew Jeffery 	assert(rc == 1);
994edb58c5SAndrew Jeffery 
1004edb58c5SAndrew Jeffery 	((uint8_t *)ctx->mem)[2] = 0x55;
1014edb58c5SAndrew Jeffery 
1024edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, mark_write_dirty_right,
1034edb58c5SAndrew Jeffery 			sizeof(mark_write_dirty_right));
1044edb58c5SAndrew Jeffery 	assert(rc == 1);
1054edb58c5SAndrew Jeffery 
1064edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, mark_write_erase_middle,
1074edb58c5SAndrew Jeffery 			sizeof(mark_write_erase_middle));
1084edb58c5SAndrew Jeffery 	assert(rc == 1);
1094edb58c5SAndrew Jeffery 
1104edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush));
1114edb58c5SAndrew Jeffery 	assert(rc == 1);
1124edb58c5SAndrew Jeffery 
1134edb58c5SAndrew Jeffery 	rc = mbox_cmp(ctx, flush_response, sizeof(flush_response));
1144edb58c5SAndrew Jeffery 	assert(rc == 0);
1154edb58c5SAndrew Jeffery 
1164edb58c5SAndrew Jeffery 	map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE,
1174edb58c5SAndrew Jeffery 			ctx->fds[MTD_FD].fd, 0);
1184edb58c5SAndrew Jeffery 	assert(map != MAP_FAILED);
1194edb58c5SAndrew Jeffery 
1204edb58c5SAndrew Jeffery 	rc = memcmp(flush_dirty_erased_dirty_data, map,
1214edb58c5SAndrew Jeffery 			sizeof(flush_dirty_erased_dirty_data));
1224edb58c5SAndrew Jeffery 	assert(rc == 0);
1234edb58c5SAndrew Jeffery 
1244edb58c5SAndrew Jeffery 	/* { erased, dirty, erased } */
1254edb58c5SAndrew Jeffery 
1264edb58c5SAndrew Jeffery 	((uint8_t *)ctx->mem)[1] = 0x55;
1274edb58c5SAndrew Jeffery 
1284edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, mark_write_dirty_middle,
1294edb58c5SAndrew Jeffery 			sizeof(mark_write_dirty_middle));
1304edb58c5SAndrew Jeffery 	assert(rc == 1);
1314edb58c5SAndrew Jeffery 
1324edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, mark_write_erase_left,
1334edb58c5SAndrew Jeffery 			sizeof(mark_write_erase_left));
1344edb58c5SAndrew Jeffery 	assert(rc == 1);
1354edb58c5SAndrew Jeffery 
1364edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, mark_write_erase_right,
1374edb58c5SAndrew Jeffery 			sizeof(mark_write_erase_right));
1384edb58c5SAndrew Jeffery 	assert(rc == 1);
1394edb58c5SAndrew Jeffery 
1404edb58c5SAndrew Jeffery 	rc = mbox_command_dispatch(ctx, write_flush, sizeof(write_flush));
1414edb58c5SAndrew Jeffery 	assert(rc == 1);
1424edb58c5SAndrew Jeffery 
1434edb58c5SAndrew Jeffery 	rc = mbox_cmp(ctx, flush_response, sizeof(flush_response));
1444edb58c5SAndrew Jeffery 	assert(rc == 0);
1454edb58c5SAndrew Jeffery 
1464edb58c5SAndrew Jeffery 	rc = memcmp(flush_erased_dirty_erased_data, map,
1474edb58c5SAndrew Jeffery 			sizeof(flush_erased_dirty_erased_data));
1484edb58c5SAndrew Jeffery 	assert(rc == 0);
1494edb58c5SAndrew Jeffery 
1504edb58c5SAndrew Jeffery 	return rc;
1514edb58c5SAndrew Jeffery }
152