xref: /openbmc/hiomapd/test/flash_write.c (revision 68a24c9e)
10293f2f5SAndrew Jeffery // SPDX-License-Identifier: Apache-2.0
20293f2f5SAndrew Jeffery // Copyright (C) 2018 IBM Corp.
30293f2f5SAndrew Jeffery 
40293f2f5SAndrew Jeffery #include <assert.h>
526558dbbSAndrew Jeffery #include <mtd/mtd-abi.h>
60293f2f5SAndrew Jeffery #include <stdio.h>
70293f2f5SAndrew Jeffery #include <stdlib.h>
826558dbbSAndrew Jeffery #include <string.h>
90293f2f5SAndrew Jeffery #include <sys/ioctl.h>
100293f2f5SAndrew Jeffery #include <sys/mman.h>
110293f2f5SAndrew Jeffery #include <unistd.h>
120293f2f5SAndrew Jeffery 
1326558dbbSAndrew Jeffery #include "common.h"
1426558dbbSAndrew Jeffery #include "mboxd.h"
15f1e547c7SEvan Lojewski #include "backend.h"
160293f2f5SAndrew Jeffery 
170293f2f5SAndrew Jeffery #include "test/tmpf.h"
180293f2f5SAndrew Jeffery 
190293f2f5SAndrew Jeffery struct tmpf _tmp, *tmp = &_tmp;
200293f2f5SAndrew Jeffery 
cleanup(void)210293f2f5SAndrew Jeffery void cleanup(void)
220293f2f5SAndrew Jeffery {
230293f2f5SAndrew Jeffery 	tmpf_destroy(tmp);
240293f2f5SAndrew Jeffery }
250293f2f5SAndrew Jeffery 
get_dev_mtd(void)260293f2f5SAndrew Jeffery char *get_dev_mtd(void)
270293f2f5SAndrew Jeffery {
280293f2f5SAndrew Jeffery 	int rc;
290293f2f5SAndrew Jeffery 
300293f2f5SAndrew Jeffery 	rc = tmpf_init(tmp, "flash-store.XXXXXX");
310293f2f5SAndrew Jeffery 	if (rc < 0)
320293f2f5SAndrew Jeffery 		return NULL;
330293f2f5SAndrew Jeffery 
34f1e547c7SEvan Lojewski 	return tmp->path;
350293f2f5SAndrew Jeffery }
360293f2f5SAndrew Jeffery 
370293f2f5SAndrew Jeffery #define MEM_SIZE 3
380293f2f5SAndrew Jeffery #define ERASE_SIZE 1
390293f2f5SAndrew Jeffery 
ioctl(int fd,unsigned long request,...)40*68a24c9eSPatrick Williams int ioctl(int fd __attribute__((unused)), unsigned long request, ...)
410293f2f5SAndrew Jeffery {
420293f2f5SAndrew Jeffery 	va_list ap;
430293f2f5SAndrew Jeffery 
440293f2f5SAndrew Jeffery 	if (request != MEMGETINFO)
450293f2f5SAndrew Jeffery 		return -1;
460293f2f5SAndrew Jeffery 
470293f2f5SAndrew Jeffery 	struct mtd_info_user *info;
480293f2f5SAndrew Jeffery 
490293f2f5SAndrew Jeffery 	va_start(ap, request);
500293f2f5SAndrew Jeffery 	info = va_arg(ap, struct mtd_info_user *);
510293f2f5SAndrew Jeffery 	info->size = MEM_SIZE;
520293f2f5SAndrew Jeffery 	info->erasesize = ERASE_SIZE;
530293f2f5SAndrew Jeffery 	va_end(ap);
540293f2f5SAndrew Jeffery 
550293f2f5SAndrew Jeffery 	return 0;
560293f2f5SAndrew Jeffery }
570293f2f5SAndrew Jeffery 
main(void)580293f2f5SAndrew Jeffery int main(void)
590293f2f5SAndrew Jeffery {
600293f2f5SAndrew Jeffery 	struct mbox_context _context, *context = &_context;
61f1e547c7SEvan Lojewski 	struct backend *backend = &context->backend;
62*68a24c9eSPatrick Williams 	uint8_t src[MEM_SIZE];
630293f2f5SAndrew Jeffery 	uint8_t *map;
640293f2f5SAndrew Jeffery 	int rc;
650293f2f5SAndrew Jeffery 
660293f2f5SAndrew Jeffery 	atexit(cleanup);
670293f2f5SAndrew Jeffery 
680293f2f5SAndrew Jeffery 	mbox_vlog = &mbox_log_console;
690293f2f5SAndrew Jeffery 
70f1e547c7SEvan Lojewski 	rc = backend_probe_mtd(backend, get_dev_mtd());
710293f2f5SAndrew Jeffery 	assert(rc == 0);
720293f2f5SAndrew Jeffery 
730293f2f5SAndrew Jeffery 	map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, tmp->fd, 0);
740293f2f5SAndrew Jeffery 	assert(map != MAP_FAILED);
750293f2f5SAndrew Jeffery 
760293f2f5SAndrew Jeffery 	memset(src, 0xaa, sizeof(src));
770297e5b8SAndrew Jeffery 	rc = backend_write(backend, 0, src, sizeof(src));
780293f2f5SAndrew Jeffery 	assert(rc == 0);
790293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
800293f2f5SAndrew Jeffery 	assert(rc == 0);
810293f2f5SAndrew Jeffery 
820293f2f5SAndrew Jeffery 	memset(src, 0x55, sizeof(src));
830297e5b8SAndrew Jeffery 	rc = backend_write(backend, 0, src, sizeof(src));
840293f2f5SAndrew Jeffery 	assert(rc == 0);
850293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
860293f2f5SAndrew Jeffery 	assert(rc == 0);
870293f2f5SAndrew Jeffery 
880293f2f5SAndrew Jeffery 	src[0] = 0xff;
890297e5b8SAndrew Jeffery 	rc = backend_write(backend, 0, src, 1);
900293f2f5SAndrew Jeffery 	assert(rc == 0);
910293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
920293f2f5SAndrew Jeffery 	assert(rc == 0);
930293f2f5SAndrew Jeffery 
940293f2f5SAndrew Jeffery 	src[1] = 0xff;
950297e5b8SAndrew Jeffery 	rc = backend_write(backend, 1, &src[1], 1);
960293f2f5SAndrew Jeffery 	assert(rc == 0);
970293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
980293f2f5SAndrew Jeffery 	assert(rc == 0);
990293f2f5SAndrew Jeffery 
1000293f2f5SAndrew Jeffery 	src[2] = 0xff;
1010297e5b8SAndrew Jeffery 	rc = backend_write(backend, 2, &src[2], 1);
1020293f2f5SAndrew Jeffery 	assert(rc == 0);
1030293f2f5SAndrew Jeffery 	rc = memcmp(src, map, sizeof(src));
1040293f2f5SAndrew Jeffery 	assert(rc == 0);
1050293f2f5SAndrew Jeffery 
106f1e547c7SEvan Lojewski 	backend_free(backend);
1070293f2f5SAndrew Jeffery 
1080293f2f5SAndrew Jeffery 	return rc;
1090293f2f5SAndrew Jeffery }
110