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