xref: /openbmc/hiomapd/test/write_flush_v2.c (revision 68a24c9e)
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"
8f1e547c7SEvan 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 
main(void)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,
99f1e547c7SEvan 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;
146*68a24c9eSPatrick Williams }
147