xref: /openbmc/hiomapd/test/implicit_flush.c (revision 4fe996c2)
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